Repository: cordova-windows
Updated Branches:
  refs/heads/master c996a31bd -> a7b8b348d


CB-11022 Duplicate www files on plugin installtion

 This closes #167


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

Branch: refs/heads/master
Commit: a7b8b348da2de9de62a41951f95c0e6e39740422
Parents: c996a31
Author: Vladimir Kotikov <kotikov.vladi...@gmail.com>
Authored: Thu Apr 14 12:55:55 2016 +0300
Committer: Vladimir Kotikov <kotikov.vladi...@gmail.com>
Committed: Mon Apr 18 12:21:49 2016 +0300

----------------------------------------------------------------------
 spec/unit/pluginHandler/windows.spec.js | 112 +++++++++++++++++++++++++++
 template/cordova/Api.js                 |  42 +++++-----
 template/cordova/lib/PluginHandler.js   |  35 +++++----
 3 files changed, 156 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-windows/blob/a7b8b348/spec/unit/pluginHandler/windows.spec.js
----------------------------------------------------------------------
diff --git a/spec/unit/pluginHandler/windows.spec.js 
b/spec/unit/pluginHandler/windows.spec.js
index 89fe7f8..38cad37 100644
--- a/spec/unit/pluginHandler/windows.spec.js
+++ b/spec/unit/pluginHandler/windows.spec.js
@@ -326,6 +326,55 @@ describe('windows project handler', function () {
                 process.chdir(path.join(curDir, '..', '..', '..'));
             });
         });
+
+        describe('of <js-module> elements', function() {
+            var jsModule = {src: 'www/dummyplugin.js'};
+            var wwwDest, platformWwwDest;
+
+            var install = PluginHandler.getInstaller('js-module');
+
+            beforeEach(function () {
+                spyOn(fs, 'writeFileSync');
+                wwwDest = path.resolve(dummyProject.www, 'plugins', 
dummyPluginInfo.id, jsModule.src);
+                platformWwwDest = path.resolve(dummyProject.platformWww, 
'plugins', dummyPluginInfo.id, jsModule.src);
+            });
+
+            it('should put module to both www and platform_www when 
options.usePlatformWww flag is specified', function () {
+                install(jsModule, dummyPluginInfo, dummyProject, 
{usePlatformWww: true});
+                expect(fs.writeFileSync).toHaveBeenCalledWith(wwwDest, 
jasmine.any(String), 'utf-8');
+                expect(fs.writeFileSync).toHaveBeenCalledWith(platformWwwDest, 
jasmine.any(String), 'utf-8');
+            });
+
+            it('should put module to www only when options.usePlatformWww flag 
is not specified', function () {
+                install(jsModule, dummyPluginInfo, dummyProject);
+                expect(fs.writeFileSync).toHaveBeenCalledWith(wwwDest, 
jasmine.any(String), 'utf-8');
+                
expect(fs.writeFileSync).not.toHaveBeenCalledWith(platformWwwDest, 
jasmine.any(String), 'utf-8');
+            });
+        });
+
+        describe('of <asset> elements', function() {
+            var asset = {src: 'www/dummyplugin.js', target: 'foo/dummy.js'};
+            var wwwDest, platformWwwDest;
+            var install = PluginHandler.getInstaller('asset');
+
+            beforeEach(function () {
+                copyFileSpy.reset();
+                wwwDest = path.resolve(dummyProject.www, asset.target);
+                platformWwwDest = path.resolve(dummyProject.platformWww, 
asset.target);
+            });
+
+            it('should put asset to both www and platform_www when 
options.usePlatformWww flag is specified', function () {
+                install(asset, dummyPluginInfo, dummyProject, {usePlatformWww: 
true});
+                expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, 
asset.src, dummyProject.www, asset.target);
+                expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, 
asset.src, dummyProject.platformWww, asset.target);
+            });
+
+            it('should put asset to www only when options.usePlatformWww flag 
is not specified', function () {
+                install(asset, dummyPluginInfo, dummyProject);
+                expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, 
asset.src, dummyProject.www, asset.target);
+                
expect(copyFileSpy).not.toHaveBeenCalledWith(dummyPluginInfo.dir, asset.src, 
dummyProject.platformWww, asset.target);
+            });
+        });
     });
 
     describe('uninstallation', function () {
@@ -526,5 +575,68 @@ describe('windows project handler', function () {
                 process.chdir(path.join(curDir, '..', '..', '..'));
             });
         });
+
+        describe('of <js-module> elements', function() {
+            var jsModule = {src: 'www/dummyPlugin.js'};
+            var wwwDest, platformWwwDest;
+
+            var uninstall = PluginHandler.getUninstaller('js-module');
+
+            beforeEach(function () {
+                wwwDest = path.resolve(dummyProject.www, 'plugins', 
dummyPluginInfo.id, jsModule.src);
+                platformWwwDest = path.resolve(dummyProject.platformWww, 
'plugins', dummyPluginInfo.id, jsModule.src);
+
+                spyOn(shell, 'rm');
+
+                var existsSyncOrig = fs.existsSync;
+                spyOn(fs, 'existsSync').andCallFake(function (file) {
+                    if ([wwwDest, platformWwwDest].indexOf(file) >= 0 ) return 
true;
+                    return existsSyncOrig.call(fs, file);
+                });
+            });
+
+            it('should put module to both www and platform_www when 
options.usePlatformWww flag is specified', function () {
+                uninstall(jsModule, dummyPluginInfo, dummyProject, 
{usePlatformWww: true});
+                expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), 
wwwDest);
+                expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), 
platformWwwDest);
+            });
+
+            it('should put module to www only when options.usePlatformWww flag 
is not specified', function () {
+                uninstall(jsModule, dummyPluginInfo, dummyProject);
+                expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), 
wwwDest);
+                expect(shell.rm).not.toHaveBeenCalledWith(jasmine.any(String), 
platformWwwDest);
+            });
+        });
+
+        describe('of <asset> elements', function() {
+            var asset = {src: 'www/dummyPlugin.js', target: 'foo/dummy.js'};
+            var wwwDest, platformWwwDest;
+            var uninstall = PluginHandler.getUninstaller('asset');
+
+            beforeEach(function () {
+                wwwDest = path.resolve(dummyProject.www, asset.target);
+                platformWwwDest = path.resolve(dummyProject.platformWww, 
asset.target);
+
+                spyOn(shell, 'rm');
+
+                var existsSyncOrig = fs.existsSync;
+                spyOn(fs, 'existsSync').andCallFake(function (file) {
+                    if ([wwwDest, platformWwwDest].indexOf(file) >= 0 ) return 
true;
+                    return existsSyncOrig.call(fs, file);
+                });
+            });
+
+            it('should put module to both www and platform_www when 
options.usePlatformWww flag is specified', function () {
+                uninstall(asset, dummyPluginInfo, dummyProject, 
{usePlatformWww: true});
+                expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), 
wwwDest);
+                expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), 
platformWwwDest);
+            });
+
+            it('should put module to www only when options.usePlatformWww flag 
is not specified', function () {
+                uninstall(asset, dummyPluginInfo, dummyProject);
+                expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), 
wwwDest);
+                expect(shell.rm).not.toHaveBeenCalledWith(jasmine.any(String), 
platformWwwDest);
+            });
+        });
     });
 });

http://git-wip-us.apache.org/repos/asf/cordova-windows/blob/a7b8b348/template/cordova/Api.js
----------------------------------------------------------------------
diff --git a/template/cordova/Api.js b/template/cordova/Api.js
index c78e922..56a42bc 100644
--- a/template/cordova/Api.js
+++ b/template/cordova/Api.js
@@ -230,11 +230,12 @@ Api.prototype.addPlugin = function (plugin, 
installOptions) {
             .add_plugin_changes(plugin, installOptions.variables, 
/*is_top_level=*/true, /*should_increment=*/true)
             .save_all();
 
-        var targetDir = installOptions.usePlatformWww ?
-            self.getPlatformInfo().locations.platformWww :
-            self.getPlatformInfo().locations.www;
+        var targetDirs = [self.getPlatformInfo().locations.www];
+        if (installOptions.usePlatformWww) 
targetDirs.push(self.getPlatformInfo().locations.platformWww);
+        self._addModulesInfo(plugin, targetDirs);
 
-        self._addModulesInfo(plugin, targetDir);
+        // CB-11022 return non-falsy value to indicate that there is no need 
to run prepare after that
+        return true;
     });
 };
 
@@ -278,13 +279,14 @@ Api.prototype.removePlugin = function (plugin, 
uninstallOptions) {
             .remove_plugin_changes(plugin, /*is_top_level=*/true)
             .save_all();
 
-        var targetDir = uninstallOptions.usePlatformWww ?
-            self.getPlatformInfo().locations.platformWww :
-            self.getPlatformInfo().locations.www;
-
-        self._removeModulesInfo(plugin, targetDir);
+        var targetDirs = [self.getPlatformInfo().locations.www];
+        if (uninstallOptions.usePlatformWww) 
targetDirs.push(self.getPlatformInfo().locations.platformWww);
+        self._removeModulesInfo(plugin, targetDirs);
         // Remove stale plugin directory
         shell.rm('-rf', path.resolve(self.root, 'Plugins', plugin.id));
+
+        // CB-11022 return non-falsy value to indicate that there is no need 
to run prepare after that
+        return true;
     });
 };
 
@@ -390,10 +392,10 @@ module.exports = Api;
  *
  * @param   {PluginInfo}  plugin  PluginInfo instance for plugin, which modules
  *   needs to be added.
- * @param   {String}  targetDir  The directory, where updated 
cordova_plugins.js
+ * @param   {String[]}  targetDirs  The directories, where updated 
cordova_plugins.js
  *   should be written to.
  */
-Api.prototype._addModulesInfo = function(plugin, targetDir) {
+Api.prototype._addModulesInfo = function(plugin, targetDirs) {
     var installedModules = this._platformJson.root.modules || [];
 
     var installedPaths = installedModules.map(function (installedModule) {
@@ -429,7 +431,7 @@ Api.prototype._addModulesInfo = function(plugin, targetDir) 
{
     }
     this._platformJson.root.plugin_metadata[plugin.id] = plugin.version;
 
-    this._writePluginModules(targetDir);
+    this._writePluginModules(targetDirs);
     this._platformJson.save();
 };
 
@@ -439,10 +441,10 @@ Api.prototype._addModulesInfo = function(plugin, 
targetDir) {
  *
  * @param   {PluginInfo}  plugin  PluginInfo instance for plugin, which modules
  *   needs to be removed.
- * @param   {String}  targetDir  The directory, where updated 
cordova_plugins.js
+ * @param   {String[]}  targetDirs  The directory, where updated 
cordova_plugins.js
  *   should be written to.
  */
-Api.prototype._removeModulesInfo = function(plugin, targetDir) {
+Api.prototype._removeModulesInfo = function(plugin, targetDirs) {
     var installedModules = this._platformJson.root.modules || [];
     var modulesToRemove = plugin.getJsModules(this.platform)
     .map(function (jsModule) {
@@ -459,7 +461,7 @@ Api.prototype._removeModulesInfo = function(plugin, 
targetDir) {
         delete this._platformJson.root.plugin_metadata[plugin.id];
     }
 
-    this._writePluginModules(targetDir);
+    this._writePluginModules(targetDirs);
     this._platformJson.save();
 };
 
@@ -467,11 +469,11 @@ Api.prototype._removeModulesInfo = function(plugin, 
targetDir) {
  * Fetches all installed modules, generates cordova_plugins contents and writes
  *   it to file.
  *
- * @param   {String}  targetDir  Directory, where write cordova_plugins.js to.
+ * @param   {String[]}  targetDirs  Directory, where write cordova_plugins.js 
to.
  *   Ususally it is either <platform>/www or <platform>/platform_www
  *   directories.
  */
-Api.prototype._writePluginModules = function (targetDir) {
+Api.prototype._writePluginModules = function (targetDirs) {
     // 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';
@@ -482,6 +484,8 @@ Api.prototype._writePluginModules = function (targetDir) {
     final_contents += '// BOTTOM OF METADATA\n';
     final_contents += '});'; // Close cordova.define.
 
-    shell.mkdir('-p', targetDir);
-    fs.writeFileSync(path.join(targetDir, 'cordova_plugins.js'), 
final_contents, 'utf-8');
+    targetDirs.forEach(function (targetDir) {
+        shell.mkdir('-p', targetDir);
+        fs.writeFileSync(path.join(targetDir, 'cordova_plugins.js'), 
final_contents, 'utf-8');
+    });
 };

http://git-wip-us.apache.org/repos/asf/cordova-windows/blob/a7b8b348/template/cordova/lib/PluginHandler.js
----------------------------------------------------------------------
diff --git a/template/cordova/lib/PluginHandler.js 
b/template/cordova/lib/PluginHandler.js
index ab2f315..7ec0795 100644
--- a/template/cordova/lib/PluginHandler.js
+++ b/template/cordova/lib/PluginHandler.js
@@ -25,8 +25,8 @@ var shell = require('shelljs');
 var events = require('cordova-common').events;
 var CordovaError = require('cordova-common').CordovaError;
 
-// returns relative file path for a file in the plugin's folder that can be 
referenced 
-// from a project file. 
+// returns relative file path for a file in the plugin's folder that can be 
referenced
+// from a project file.
 function getPluginFilePath(plugin, pluginFile, targetDir) {
     var src = path.resolve(plugin.dir, pluginFile);
     return '$(ProjectDir)' + path.relative(targetDir, src);
@@ -53,10 +53,10 @@ var handlers = {
     },
     'resource-file':{
         install:function(obj, plugin, project, options) {
-            // do not copy, but reference the file in the plugin folder. This 
allows to 
+            // do not copy, but reference the file in the plugin folder. This 
allows to
             // have multiple source files map to the same target and select 
the appropriate
             // one based on the current build settings, e.g. architecture.
-            // also, we don't check for existence. This allows to insert build 
variables 
+            // also, we don't check for existence. This allows to insert build 
variables
             // into the source file name, e.g.
             // <resource-file src="$(Platform)/My.dll" target="My.dll" />
             var relativeSrcPath = getPluginFilePath(plugin, obj.src, 
project.projectFolder);
@@ -123,24 +123,27 @@ var handlers = {
                 throw new CordovaError('<asset> tag without required "target" 
attribute');
             }
 
-            var www = options.usePlatformWww ? project.platformWww : 
project.www;
-            copyFile(plugin.dir, obj.src, www, obj.target);
+            copyFile(plugin.dir, obj.src, project.www, obj.target);
+            if (options && options.usePlatformWww) copyFile(plugin.dir, 
obj.src, project.platformWww, obj.target);
         },
         uninstall:function(obj, plugin, project, options) {
             var target = obj.target || obj.src;
 
             if (!target) throw new CordovaError('<asset> tag without required 
"target" attribute');
 
-            var www = options.usePlatformWww ? project.platformWww : 
project.www;
-            removeFile(www, target);
-            shell.rm('-Rf', path.resolve(www, 'plugins', plugin.id));
+            removeFile(project.www, target);
+            removeFile(project.www, path.join('plugins', plugin.id));
+            if (options && options.usePlatformWww) {
+                removeFile(project.platformWww, target);
+                removeFile(project.platformWww, path.join('plugins', 
plugin.id));
+            }
         }
     },
     'js-module': {
         install: function (obj, plugin, project, options) {
             // Copy the plugin's files into the www directory.
             var moduleSource = path.resolve(plugin.dir, obj.src);
-            var moduleName = plugin.id + '.' + (obj.name || 
path.parse(obj.src).name);
+            var moduleName = plugin.id + '.' + (obj.name || 
path.basename(obj.src, path.extname (obj.src)));
 
             // Read in the file, prepend the cordova.define, and write it back 
out.
             var scriptContent = fs.readFileSync(moduleSource, 
'utf-8').replace(/^\ufeff/, ''); // Window BOM
@@ -149,15 +152,19 @@ var handlers = {
             }
             scriptContent = 'cordova.define("' + moduleName + '", 
function(require, exports, module) {\n' + scriptContent + '\n});\n';
 
-            var www = options.usePlatformWww ? project.platformWww : 
project.www;
-            var moduleDestination = path.resolve(www, 'plugins', plugin.id, 
obj.src);
+            var moduleDestination = path.resolve(project.www, 'plugins', 
plugin.id, obj.src);
             shell.mkdir('-p', path.dirname(moduleDestination));
             fs.writeFileSync(moduleDestination, scriptContent, 'utf-8');
+            if (options && options.usePlatformWww) {
+                var platformWwwDestination = path.resolve(project.platformWww, 
'plugins', plugin.id, obj.src);
+                shell.mkdir('-p', path.dirname(platformWwwDestination));
+                fs.writeFileSync(platformWwwDestination, scriptContent, 
'utf-8');
+            }
         },
         uninstall: function (obj, plugin, project, options) {
             var pluginRelativePath = path.join('plugins', plugin.id, obj.src);
-            var www = options.usePlatformWww ? project.platformWww : 
project.www;
-            removeFileAndParents(www, pluginRelativePath);
+            removeFileAndParents(project.www, pluginRelativePath);
+            if (options && options.usePlatformWww) 
removeFileAndParents(project.platformWww, pluginRelativePath);
         }
     }
 };


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

Reply via email to