cordova-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ste...@apache.org
Subject [7/9] cordova-lib git commit: CB-9976 Reinstall plugins for platform if they were installed with cordova@<5.4.0. This closes #344
Date Fri, 20 Nov 2015 01:08:54 GMT
CB-9976 Reinstall plugins for platform if they were installed with cordova@<5.4.0. This
closes #344


Project: http://git-wip-us.apache.org/repos/asf/cordova-lib/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-lib/commit/874a44fe
Tree: http://git-wip-us.apache.org/repos/asf/cordova-lib/tree/874a44fe
Diff: http://git-wip-us.apache.org/repos/asf/cordova-lib/diff/874a44fe

Branch: refs/heads/5.4.x
Commit: 874a44fec208abce3ec663c9b4175be5cdafeb2f
Parents: 4d5926a
Author: Vladimir Kotikov <v-vlkoti@microsoft.com>
Authored: Mon Nov 16 18:19:47 2015 +0300
Committer: Steve Gill <stevengill97@gmail.com>
Committed: Thu Nov 19 16:40:45 2015 -0800

----------------------------------------------------------------------
 cordova-lib/src/cordova/prepare.js           | 98 +++++++++++++++++++----
 cordova-lib/src/platforms/PlatformApiPoly.js | 19 ++---
 2 files changed, 93 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/874a44fe/cordova-lib/src/cordova/prepare.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/prepare.js b/cordova-lib/src/cordova/prepare.js
index 38c2e4d..b26449c 100644
--- a/cordova-lib/src/cordova/prepare.js
+++ b/cordova-lib/src/cordova/prepare.js
@@ -19,6 +19,9 @@
 
 var cordova_util      = require('./util'),
     ConfigParser      = require('cordova-common').ConfigParser,
+    PlatformJson      = require('cordova-common').PlatformJson,
+    PluginInfoProvider = require('cordova-common').PluginInfoProvider,
+    events            = require('cordova-common').events,
     platforms         = require('../platforms/platforms'),
     HooksRunner       = require('../hooks/HooksRunner'),
     Q                 = require('q'),
@@ -46,8 +49,7 @@ function prepare(options) {
             return platforms.getPlatformApi(p, platform_path).getPlatformInfo().locations.www;
         });
         options.paths = paths;
-    })
-    .then(function() {
+    }).then(function() {
         options = cordova_util.preProcessOptions(options);
         options.searchpath = options.searchpath || config_json.plugin_search_path;
         // Iterate over each added platform
@@ -83,21 +85,87 @@ function preparePlatforms (platformList, projectRoot, options) {
             }
         };
 
-        // platformApi prepare takes care of all functionality
-        // which previously had been executed by cordova.prepare:
-        //   - reset config.xml and then merge changes from project's one,
-        //   - update www directory from project's one and merge assets from platform_www,
-        //   - reapply config changes, made by plugins,
-        //   - update platform's project
-        // Please note that plugins' changes, such as installes js files, assets and
-        // config changes is not being reinstalled on each prepare.
-        var platformApi = platforms.getPlatformApi(platform);
-        return platformApi.prepare(project)
-        .then(function () {
-            if (options.browserify)
-                return browserify(project, platformApi);
+        // CB-9987 We need to reinstall the plugins for the platform it they were added by
cordova@<5.4.0
+        return restoreMissingPluginsForPlatform(platform, projectRoot, options)
+        .then(function (argument) {
+            // platformApi prepare takes care of all functionality
+            // which previously had been executed by cordova.prepare:
+            //   - reset config.xml and then merge changes from project's one,
+            //   - update www directory from project's one and merge assets from platform_www,
+            //   - reapply config changes, made by plugins,
+            //   - update platform's project
+            // Please note that plugins' changes, such as installes js files, assets and
+            // config changes is not being reinstalled on each prepare.
+            var platformApi = platforms.getPlatformApi(platform);
+            return platformApi.prepare(project)
+            .then(function () {
+                if (options.browserify)
+                    return browserify(project, platformApi);
+            });
         });
     }));
 }
 
 module.exports.preparePlatforms = preparePlatforms;
+
+/**
+ * Ensures that plugins, installed with previous versions of CLI (<5.4.0) are
+ *   readded to platform correctly. Also triggers regeneration of
+ *   cordova_plugins.js file.
+ *
+ * @param   {String}  platform     Platform name to check for installed plugins
+ * @param   {String}  projectRoot  A current cordova project location
+ * @param   {Object}  [options]    Options that will be passed to
+ *   PlatformApi.pluginAdd/Remove. This object will be extended with plugin
+ *   variables, used to install the plugin initially (picked from "old"
+ *   plugins/<platform>.json)
+ *
+ * @return  {Promise}               Promise that'll be fulfilled if all the
+ *   plugins reinstalled properly.
+ */
+function restoreMissingPluginsForPlatform(platform, projectRoot, options) {
+    events.emit('verbose', 'Searching PlatformJson files for differences between project
vs. platform installed plugins');
+
+    // Flow:
+    // 1. Compare <platform>.json file in <project>/plugins ("old") and platforms/<platform>
("new")
+    // 2. If there is any differences - merge "old" one into "new"
+    // 3. Reinstall plugins that are missing and was merged on previous step
+
+    var oldPlatformJson = PlatformJson.load(path.join(projectRoot, 'plugins'), platform);
+    var platformJson = PlatformJson.load(path.join(projectRoot, 'platforms', platform), platform);
+
+    var missingPlugins = Object.keys(oldPlatformJson.root.installed_plugins)
+        .concat(Object.keys(oldPlatformJson.root.dependent_plugins))
+        .reduce(function (result, candidate) {
+            if (!platformJson.isPluginInstalled(candidate))
+                result.push({name: candidate,
+                    // Note: isPluginInstalled is actually returns not a boolean,
+                    // but object which corresponds to this particular plugin
+                    variables: oldPlatformJson.isPluginInstalled(candidate)});
+
+            return result;
+        }, []);
+
+    if (missingPlugins.length === 0) {
+        events.emit('verbose', 'No differences found between project and ' +
+            platform + ' platform. Continuing...');
+        return Q.resolve();
+    }
+
+    var api = platforms.getPlatformApi(platform);
+    var provider = new PluginInfoProvider();
+    return missingPlugins.reduce(function (promise, plugin) {
+        return promise.then(function () {
+            var pluginOptions = options || {};
+            pluginOptions.variables = plugin.variables;
+            pluginOptions.usePlatformWww = true;
+
+            events.emit('verbose', 'Reinstalling missing plugin ' + plugin.name + ' to '
+ platform + ' platform');
+            var pluginInfo = provider.get(path.join(projectRoot, 'plugins', plugin.name));
+            return api.removePlugin(pluginInfo, pluginOptions)
+            .then(function () {
+                return api.addPlugin(pluginInfo, pluginOptions);
+            });
+        });
+    }, Q());
+}

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/874a44fe/cordova-lib/src/platforms/PlatformApiPoly.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/platforms/PlatformApiPoly.js b/cordova-lib/src/platforms/PlatformApiPoly.js
index 5563028..47277e8 100644
--- a/cordova-lib/src/platforms/PlatformApiPoly.js
+++ b/cordova-lib/src/platforms/PlatformApiPoly.js
@@ -577,6 +577,11 @@ PlatformApiPoly.prototype._addModulesInfo = function(plugin, targetDir)
{
     });
 
     this._platformJson.root.modules = installedModules.concat(modulesToInstall);
+    if (!this._platformJson.root.plugin_metadata) {
+        this._platformJson.root.plugin_metadata = {};
+    }
+    this._platformJson.root.plugin_metadata[plugin.id] = plugin.version;
+
     this._writePluginModules(targetDir);
     this._platformJson.save();
 };
@@ -603,6 +608,10 @@ PlatformApiPoly.prototype._removeModulesInfo = function(plugin, targetDir)
{
     });
 
     this._platformJson.root.modules = updatedModules;
+    if (this._platformJson.root.plugin_metadata) {
+        delete this._platformJson.root.plugin_metadata[plugin.id];
+    }
+
     this._writePluginModules(targetDir);
     this._platformJson.save();
 };
@@ -616,20 +625,12 @@ PlatformApiPoly.prototype._removeModulesInfo = function(plugin, targetDir)
{
  *   directories.
  */
 PlatformApiPoly.prototype._writePluginModules = function (targetDir) {
-    var self = this;
     // Write out moduleObjects as JSON wrapped in a cordova module to cordova_plugins.js
     var final_contents = 'cordova.define(\'cordova/plugin_list\', function(require, exports,
module) {\n';
     final_contents += 'module.exports = ' + JSON.stringify(this._platformJson.root.modules,
null, '    ') + ';\n';
     final_contents += 'module.exports.metadata = \n';
     final_contents += '// TOP OF METADATA\n';
-
-    var pluginMetadata = Object.keys(this._platformJson.root.installed_plugins)
-    .reduce(function (metadata, plugin) {
-        metadata[plugin] = self._platformJson.root.installed_plugins[plugin].version;
-        return metadata;
-    }, {});
-
-    final_contents += JSON.stringify(pluginMetadata, null, '    ') + '\n';
+    final_contents += JSON.stringify(this._platformJson.root.plugin_metadata || {}, null,
'    ') + '\n';
     final_contents += '// BOTTOM OF METADATA\n';
     final_contents += '});'; // Close cordova.define.
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org


Mime
View raw message