Mwalker has submitted this change and it was merged.

Change subject: Report status of bundler
......................................................................


Report status of bundler

Change-Id: I3995d86bb71d99463fe59cbeb576ae54f730552a
---
M bin/mw-bundler
M lib/index.js
A lib/status.js
3 files changed, 52 insertions(+), 0 deletions(-)

Approvals:
  Mwalker: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/bin/mw-bundler b/bin/mw-bundler
index f08f9a9..9a4b380 100755
--- a/bin/mw-bundler
+++ b/bin/mw-bundler
@@ -12,6 +12,7 @@
 var Api = require('../lib/api');
 var P = require('../lib/p');
 var Siteinfo = require('../lib/siteinfo');
+var status = require('../lib/status');
 
 program
        .version(bundler.version)
@@ -114,6 +115,9 @@
        filerepos: undefined
 };
 
+// TODO: Update this number if we ever add more bundling stages
+status.setNumStages(4);
+
 // Load metabook.json
 if (program.metabook) {
        // Load from file and parse JSON
@@ -203,10 +207,12 @@
 // add our extension fields, if missing
 p = p.then(function() {
        var pp = when.resolve();
+       status.createStage(metabook.wikis.length + 1 /* commons wiki */);
        if (program.toc !== 'auto') {
                metabook.toc = !/^(no|false|off)$/i.test(program.toc);
        }
        metabook.wikis.forEach(function(w, idx) {
+               status.report('Obtaining source wiki metadata', w.baseurl);
                if (!w.parsoid) {
                        w.parsoid = program.api;
                }
@@ -228,6 +234,7 @@
 });
 // fudge a pointer to commonswiki if needed
 p = p.then(function() {
+       status.report('Loading commons metadata');
        if (needsCommonsWiki) {
                metabook.wikis.push(COMMONSWIKI);
                return fetchFileRepos(metabook.wikis.length - 1);
diff --git a/lib/index.js b/lib/index.js
index 9728047..3a1ec0d 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -4,6 +4,7 @@
 var path = require('path');
 var rimraf = require('rimraf');
 var when = require('when');
+var status = require('./status');
 
 var P = require('./p');
 
@@ -57,6 +58,8 @@
 
        // returns a promise which is resolved when the sourceMap has been
        // filled with all the parsoid sources.
+       var articleCount = 0;
+       var imageCount = 0;
        var fetchParsed = function() {
                log('Fetching parsed article contents');
                var parsoidDb = new Db(path.join(options.output, "parsoid.db"));
@@ -66,6 +69,7 @@
                // a promise to parse a single item (from parsoid & php)
                var doOneItem = function(item) {
                        item.wiki = item.wiki || 0;
+                       status.report('Fetching articles', item.title);
                        return parsoid.fetch(item.wiki, item.title, 
item.revision)
                                .then(function(result) {
                                        var revid = result.getRevisionId();
@@ -73,6 +77,7 @@
                                        item.revision = '' + revid;
                                        sourceMap.set(revid, result);
                                        
result.getImages().forEach(function(img) {
+                                               imageCount += 1;
                                                imageMap.set(img.resource, img);
                                        });
                                        return parsoidDb.put(item.revision, 
result.text);
@@ -84,8 +89,19 @@
                };
 
                // recursively visit all items in the metabook info structure
+               // we do this twice; once to get the article count; and another 
to push tasks
+               (function visitToCount(item) {
+                       if (item.type === 'article') {
+                               articleCount += 1;
+                       } else if (item.type === 'collection' || item.type === 
'chapter') {
+                               item.items.forEach(visitToCount);
+                       }
+               })(metabook);
+
+               status.createStage(articleCount);
                (function visit(item) {
                        if (item.type === 'article') {
+                               articleCount += 1;
                                tasks.push(doOneItem(item));
                        } else if (item.type === 'collection' || item.type === 
'chapter') {
                                item.items.forEach(visit);
@@ -110,10 +126,12 @@
        // are downloaded.
        var fetchImages = function() {
                log('Fetching images');
+               status.createStage(imageCount);
                var imageDb = new Db(path.join(options.output, "imageinfo.db"));
 
                var tasks = [];
                imageMap.forEach(function(img) {
+                       status.report('Fetching media resources', img.filename);
                        var p = imageloader.fetchMetadata(img).then(function() {
                                if (img.imageinfo.mediatype === 'BITMAP' ||
                                        img.imageinfo.mediatype === 'DRAWING') {
@@ -197,6 +215,8 @@
        // promise to create the desired bundle!
        var createBundle = function() {
                log('Creating bundle');
+               status.createStage(0);
+               status.report('Compositing data bundle for renderer');
                if (options.nozip) {
                        // make the directory readable, then we're done.
                        return P.call(fs.chmod, fs, options.output, 0755);
diff --git a/lib/status.js b/lib/status.js
new file mode 100644
index 0000000..d5a4c04
--- /dev/null
+++ b/lib/status.js
@@ -0,0 +1,25 @@
+var percentComplete = 0;
+var currentStage = 0.0;
+var stagesInv = 1.0;
+var stageLen = 0;
+
+module.exports.setNumStages = function(num) {
+       stagesInv = 1.0 / num;
+};
+
+module.exports.createStage = function(len) {
+       percentComplete = currentStage * stagesInv;
+       currentStage += 1;
+       if (len) {
+               stageLen = 1.0 / len;
+       } else {
+               stageLen = 0;
+       }
+};
+
+module.exports.report = function(message, file) {
+       percentComplete += 100.0 * (stagesInv * stageLen);
+       if (process.send) {
+               process.send(JSON.stringify({status: message, file: file, 
percent: percentComplete}));
+       }
+};
\ No newline at end of file

-- 
To view, visit https://gerrit.wikimedia.org/r/96969
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I3995d86bb71d99463fe59cbeb576ae54f730552a
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Collection/OfflineContentGenerator/bundler
Gerrit-Branch: master
Gerrit-Owner: Mwalker <mwal...@wikimedia.org>
Gerrit-Reviewer: Mwalker <mwal...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to