Copy Mobilespec App Template Instead of Linking It when `--copywww` option is supplied
diff --git a/createmobilespec/createmobilespec.js b/createmobilespec/createmobilespec.js
index f8f33c3..a43c438 100755
--- a/createmobilespec/createmobilespec.js
+++ b/createmobilespec/createmobilespec.js
@@ -29,6 +29,7 @@
 
 var startTime = Date.now();
 
+// helpers
 function quietshell(fn) {
     var config = shelljs.config,
         silent = config.silent;
@@ -54,6 +55,17 @@
     });
 }
 
+function pluginAdd(pluginName, searchPath, extraFlags) {
+    var command = cli + ' plugin add ' + pluginName;
+    if (searchPath) {
+        command += ' --searchpath ' + searchPath;
+    }
+    if (extraFlags) {
+        command + extraFlags;
+    }
+    shelljs.exec(command);
+}
+
 // Check that we can load dependencies
 try {
     shelljs = require("shelljs");
@@ -482,37 +494,44 @@
             popd();
         });
     } else {
+
         // don't use local git repos for plugins when using --global.
-        var searchpath = argv.global ? "" : " --searchpath " + top_dir;
+        var searchpath = argv.global ? "" : top_dir;
+
         console.log("Adding plugins using CLI...");
         console.log("Searchpath:", searchpath);
         if (!fs.existsSync('cordova-plugin-test-framework')) {
             couldNotFind('cordova-plugin-test-framework');
         }
         pushd(cli_project_dir);
+
         // we do need local plugin-test-framework
         console.log("Installing local test framework plugins...");
         var linkPluginsFlag = (argv.link || argv.linkplugins) ? ' --link' : '';
-        shelljs.exec(cli + " plugin add org.apache.cordova.test.whitelist org.apache.cordova.test.echo --searchpath " + mobile_spec_git_dir + linkPluginsFlag + browserifyFlag);
-        shelljs.exec(cli + " plugin add org.apache.cordova.test-framework --searchpath " + top_dir + linkPluginsFlag + browserifyFlag);
+
+        pluginAdd('org.apache.cordova.test.whitelist', mobile_spec_git_dir, linkPluginsFlag + browserifyFlag);
+        pluginAdd('org.apache.cordova.test.echo', mobile_spec_git_dir, linkPluginsFlag + browserifyFlag);
+        pluginAdd('org.apache.cordova.test-framework', top_dir, linkPluginsFlag + browserifyFlag);
+
         if (argv.android) {
-            shelljs.exec(cli + " plugin add " + path.join(top_dir, 'cordova-plugins', 'whitelist') + linkPluginsFlag + browserifyFlag);
+            pluginAdd(path.join(top_dir, 'cordova-plugin-whitelist'), null, linkPluginsFlag + browserifyFlag);
         }
 
         if (argv.webview == 'crosswalk') {
             var xwalkPluginId = fs.existsSync('cordova-crosswalk-engine') ? 'org.crosswalk.engine' : 'https://github.com/MobileChromeApps/cordova-crosswalk-engine.git';
-            shelljs.exec(cli + " plugin add " + xwalkPluginId + ' --searchpath ' + top_dir + linkPluginsFlag + browserifyFlag);
+            pluginAdd(xwalkPluginId, top_dir, linkPluginsFlag + browserifyFlag);
         }
+
         if (argv.globalplugins) {
-            shelljs.exec(cli + " plugin add " + path.join(mobile_spec_git_dir, "dependencies-plugin") + linkPluginsFlag + browserifyFlag);
+            pluginAdd(path.join(mobile_spec_git_dir, "dependencies-plugin"), null, linkPluginsFlag + browserifyFlag);
         } else {
-            shelljs.exec(cli + " plugin add " + path.join(mobile_spec_git_dir, "dependencies-plugin") + searchpath + linkPluginsFlag + browserifyFlag);
+            pluginAdd(path.join(mobile_spec_git_dir, "dependencies-plugin"), searchpath, linkPluginsFlag + browserifyFlag);
         }
 
         if (argv.thirdpartyplugins || argv.cprplugins) {
             var mapVars = ' --variable API_KEY_FOR_ANDROID="AIzaSyBICVSs9JqT7WdASuN5HSe7w-pCE0n_X88" --variable API_KEY_FOR_IOS="AIzaSyAikyYG24YYFvq5Vy41P5kppsfO2GgF9jM"';
             var fbVars = ' --variable APP_ID=value --variable APP_NAME=value';
-            shelljs.exec(cli + " plugin add " + CORDOVA_REGISTRY_PLUGINS.join(' ') + searchpath + browserifyFlag + mapVars + fbVars);
+            pluginAdd(CORDOVA_REGISTRY_PLUGINS.join(' '), searchpath, browserifyFlag + mapVars + fbVars);
             // Delete duplicate <uses-permission> due to maxSdk (CB-8401)
             if (argv.android) {
                 shelljs.sed('-i', /{[^{]*(maxSdk|WRITE_EXTERNAL_STORAGE).*?(maxSdk|WRITE_EXTERNAL_STORAGE)[^}]*},/, '', path.join('plugins', 'android.json'));
@@ -520,13 +539,13 @@
             }
         }
         if (argv.thirdpartyplugins || argv.telerikplugins) {
-            shelljs.exec(cli + " plugin add " + TELERIK_VERIFIED_PLUGINS.join(' ') + searchpath + browserifyFlag);
+            pluginAdd(TELERIK_VERIFIED_PLUGINS.join(' '), searchpath, browserifyFlag);
         }
         if (argv.thirdpartyplugins || argv.plugregplugins) {
-            shelljs.exec(cli + " plugin add " + PLUGREG_PLUGINS.join(' ') + searchpath + browserifyFlag);
+            pluginAdd(PLUGREG_PLUGINS.join(' '), searchpath, browserifyFlag);
         }
         if (argv.thirdpartyplugins) {
-            shelljs.exec(cli + " plugin add org.apache.cordova.mobilespec.thirdpartytests --searchpath " + mobile_spec_git_dir + linkPluginsFlag + browserifyFlag);
+            pluginAdd('org.apache.cordova.mobilespec.thirdpartytests', mobile_spec_git_dir, linkPluginsFlag + browserifyFlag);
         }
 
         // Install new-style test plugins
@@ -538,7 +557,7 @@
             pluginTestPaths.push(path.resolve(path.dirname(potential_tests_plugin_xml)));
           }
         });
-        shelljs.exec(cli + " plugin add " + pluginTestPaths.join(' ') + linkPluginsFlag + browserifyFlag);
+        pluginAdd(pluginTestPaths.join(' '), null, linkPluginsFlag + browserifyFlag);
 
         popd();
     }