Repository: cordova-lib
Updated Branches:
  refs/heads/master 1b48c2506 -> f393d91f5


CB-6756 Adds save and restore command for platforms.

It also enhances the ConfigParser to support engine elements and cordova 
namespace.

Conflicts:
        cordova-lib/spec-cordova/restore.spec.js
        cordova-lib/src/configparser/ConfigParser.js
        cordova-lib/src/cordova/restore.js
        cordova-lib/src/cordova/save.js

github: close #18


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

Branch: refs/heads/master
Commit: f393d91f529828216335929fbc534e872ef993ce
Parents: 1b48c25
Author: Gorkem Ercan <[email protected]>
Authored: Sun May 25 19:11:57 2014 -0400
Committer: Andrew Grieve <[email protected]>
Committed: Tue Jul 22 20:33:50 2014 -0400

----------------------------------------------------------------------
 cordova-lib/spec-cordova/restore.spec.js     | 30 ++++++++----
 cordova-lib/spec-cordova/save.spec.js        | 13 ++++--
 cordova-lib/src/configparser/ConfigParser.js | 56 ++++++++++++++++++++++-
 cordova-lib/src/cordova/restore.js           | 24 +++++++++-
 cordova-lib/src/cordova/save.js              | 52 +++++++++++++++++++--
 5 files changed, 155 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/f393d91f/cordova-lib/spec-cordova/restore.spec.js
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-cordova/restore.spec.js 
b/cordova-lib/spec-cordova/restore.spec.js
index e69fa2a..07f1157 100644
--- a/cordova-lib/spec-cordova/restore.spec.js
+++ b/cordova-lib/spec-cordova/restore.spec.js
@@ -48,17 +48,27 @@ describe('restore command', function(){
   });
 
   it('should not try to restore features from config.xml', function(){
-
-
-    cd_project_root = spyOn(cordova_util, 
'cdProjectRoot').andReturn(project_dir);
-    var parserWriter = spyOn(ConfigParser.prototype, 'write');
-    expect(ConfigParser.prototype.write).not.toHaveBeenCalled();
-    cordova.restore('plugins');
-    expect(ConfigParser.prototype.write).not.toHaveBeenCalled();
-    parserWriter.andCallThrough();
+      cd_project_root = spyOn(cordova_util, 
'cdProjectRoot').andReturn(project_dir);
+      var call_count =0;
+      expect(installPluginsFromConfigXML).toBeDefined();
+      function installPluginsFromConfigXML(cfg){
+          call_count++;
+      }
+      expect(call_count).toEqual(0);
+      cordova.restore('plugins');
+      expect(call_count).toEqual(0);
   });
 
-
-
+  it('should not try to restore platforms from config.xml', function(){
+      cd_project_root = spyOn(cordova_util, 
'cdProjectRoot').andReturn(project_dir);
+      var call_count =0;
+      expect(installPlatformsFromConfigXML).toBeDefined();
+      function installPlatformsFromConfigXML(cfg){
+          call_count++;
+      }
+      expect(call_count).toEqual(0);
+      cordova.restore('platforms');
+      expect(call_count).toEqual(0);
+  });
 
 });

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/f393d91f/cordova-lib/spec-cordova/save.spec.js
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-cordova/save.spec.js 
b/cordova-lib/spec-cordova/save.spec.js
index c764581..242042f 100644
--- a/cordova-lib/spec-cordova/save.spec.js
+++ b/cordova-lib/spec-cordova/save.spec.js
@@ -56,7 +56,14 @@ describe('save command', function(){
     parserWriter.andCallThrough();
   });
 
-
-
-
+  it('should not try to add platforms to config.xml', function(){
+    cd_project_root = spyOn(cordova_util, 
'cdProjectRoot').andReturn(project_dir);
+    var call_count =0;
+    ConfigParser.prototype.write = function(){
+      call_count++;
+    }
+    expect(call_count).toEqual(0);
+    cordova.save('platforms');
+    expect(call_count).toEqual(0);
+  });
 });

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/f393d91f/cordova-lib/src/configparser/ConfigParser.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/configparser/ConfigParser.js 
b/cordova-lib/src/configparser/ConfigParser.js
index e274afc..4d749c4 100644
--- a/cordova-lib/src/configparser/ConfigParser.js
+++ b/cordova-lib/src/configparser/ConfigParser.js
@@ -27,11 +27,14 @@ var et = require('elementtree'),
     CordovaError = require('../CordovaError'),
     fs = require('fs');
 
+
 /** Wraps a config.xml file */
 function ConfigParser(path) {
     this.path = path;
     try {
         this.doc = xml.parseElementtreeSync(path);
+        this.cdvNamespacePrefix = getCordovaNamespacePrefix(this.doc);
+        et.register_namespace(this.cdvNamespacePrefix, 
'http://cordova.apache.org/ns/1.0');
     } catch (e) {
         console.error('Parsing '+path+' failed');
         throw e;
@@ -55,6 +58,20 @@ function findOrCreate(doc, name) {
     return ret;
 }
 
+function getCordovaNamespacePrefix(doc){
+    var rootAtribs = Object.getOwnPropertyNames(doc.getroot().attrib);
+    var prefix = 'cdv';
+    for (var j = 0; j < rootAtribs.length; j++ ) {
+        if(rootAtribs[j].indexOf('xmlns:') === 0 &&
+            doc.getroot().attrib[rootAtribs[j]] === 
'http://cordova.apache.org/ns/1.0'){
+            var strings = rootAtribs[j].split(':');
+            prefix = strings[1];
+            break;
+        }
+    }
+    return prefix;
+}
+
 ConfigParser.prototype = {
     packageName: function(id) {
         return this.doc.getroot().attrib['id'];
@@ -121,10 +138,11 @@ ConfigParser.prototype = {
         // root level resources
         staticResources = 
staticResources.concat(this.doc.findall(resourceName));
         // parse resource elements
+        var that = this;
         staticResources.forEach(function (elt) {
             var res = {};
             res.src = elt.attrib.src;
-            res.density = elt.attrib['density'] || elt.attrib['cdv:density'] 
|| elt.attrib['gap:density'];
+            res.density = elt.attrib['density'] || 
elt.attrib[that.cdvNamespacePrefix+':density'] || elt.attrib['gap:density'];
             res.platform = elt.platform || null; // null means icon represents 
default icon (shared between platforms)
             res.width = elt.attrib.width;
             res.height = elt.attrib.height;
@@ -202,6 +220,7 @@ ConfigParser.prototype = {
      *This does not check for duplicate feature entries
      */
     addFeature: function (name, params){
+        if(!name) return;
         var el = new et.Element('feature');
         el.attrib.name = name;
         if (params) {
@@ -214,6 +233,41 @@ ConfigParser.prototype = {
         }
         this.doc.getroot().append(el);
     },
+
+    /**
+     * Adds an engine. Does not check for duplicates.
+     * @param  {String} id the engine id
+     * @param  {String} version engine version (optional)
+     */
+    addEngine: function(id, version){
+        if(!id) return;
+        var el = et.Element('{http://cordova.apache.org/ns/1.0}engine');
+        el.attrib.id = id;
+        if(version){
+            el.attrib.version = version;
+        }
+        this.doc.getroot().append(el);
+    },
+    /**
+     * Removes all the engines with given id
+     * @param  {String} id the engine id.
+     */
+    removeEngine: function(id){
+         var engines = 
this.doc.findall('./'+this.cdvNamespacePrefix+':engine/[@id="' +id+'"]');
+         for(var i=0; i < engines.length; i++){
+            var childs = this.doc.getroot().getchildren();
+            var idx = childs.indexOf(engines[i]);
+            if(idx > -1){
+                childs.splice(idx,1);
+             }
+         }
+    },
+    getEngines: function(){
+        var engines = this.doc.findall('./'+this.cdvNamespacePrefix+':engine');
+        return engines.map(function(engine){
+           return {'id':engine.attrib.id};
+        });
+    },
     write:function() {
         fs.writeFileSync(this.path, this.doc.write({indent: 4}), 'utf-8');
     }

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/f393d91f/cordova-lib/src/cordova/restore.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/restore.js 
b/cordova-lib/src/cordova/restore.js
index 2ef3f66..9a37270 100644
--- a/cordova-lib/src/cordova/restore.js
+++ b/cordova-lib/src/cordova/restore.js
@@ -27,16 +27,36 @@ var cordova_util    = require('./util'),
     Q                = require('q'),
     fs               = require('fs'),
     plugin           = require('./plugin'),
-    events           = require('../events');
+    events           = require('../events'),
+    platform         = require('./platform'),
+    hooker           = require('./hooker'),
+    CordovaError     = require('../CordovaError');
 
 module.exports = restore;
 function restore(target){
     var projectHome = cordova_util.cdProjectRoot();
     var configPath = cordova_util.projectConfig(projectHome);
     var configXml = new ConfigParser(configPath);
-    return installPluginsFromConfigXML(configXml);
+    if( 'plugins' === target ){
+        return installPluginsFromConfigXML(configXml);
+    }
+    if( 'platforms' === target ){
+        return installPlatformsFromConfigXML(configXml);
+    }
+    return Q.reject( new CordovaError('Unknown target only "plugins" and 
"platforms" are supported'));
 }
 
+function installPlatformsFromConfigXML(cfg){
+    var projectHome = cordova_util.cdProjectRoot();
+    var engines = cfg.getEngines(projectHome);
+    var targets = engines.map(function(engine){
+            return engine.id;
+    });
+    if(!targets || !targets.length  ){
+        return Q.all("No platforms are listed in config.xml to restore");
+    }
+    return platform('add', targets);
+}
 
 //returns a Promise
 function installPluginsFromConfigXML(cfg) {

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/f393d91f/cordova-lib/src/cordova/save.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/save.js b/cordova-lib/src/cordova/save.js
index af0460b..68d08f2 100644
--- a/cordova-lib/src/cordova/save.js
+++ b/cordova-lib/src/cordova/save.js
@@ -22,15 +22,59 @@
 */
 
 
-var cordova_util    = require('./util'),
+var path             = require('path'),
+    et               = require('elementtree'),
+    Q                = require('q'),
+    cordova_util     = require('./util'),
     ConfigParser     = require('../configparser/ConfigParser'),
-    path             = require('path'),
     xml              = require('../util/xml-helpers'),
-    Q                = require('q'),
-    events           = require('../events');
+    events           = require('../events'),
+    superspawn       = require('./superspawn'),
+    CordovaError     = require('../CordovaError');
 
 module.exports = save;
 function save(target, opts){
+    var projectHome = cordova_util.cdProjectRoot();//checks if this is a 
cordova project
+    if( 'plugins' === target ){
+       return savePlugins(opts);
+    }
+    if( 'platforms' === target ){
+        return savePlatforms(opts);
+    }
+    throw new CordovaError('Unknown target only "plugins" and "platforms" are 
supported');
+}
+
+function savePlatforms(opts){
+    opts = opts || {};
+    var projectHome = cordova_util.cdProjectRoot();
+    var configPath = cordova_util.projectConfig(projectHome);
+    var configXml = new ConfigParser(configPath);
+    var platforms_on_fs = cordova_util.listPlatforms(projectHome);
+    return Q.all( platforms_on_fs.map(function(p){
+        var promise = new Q({'id':p});
+        if(opts.shrinkwrap){//retrieve and save platform version
+            var script = path.join(projectHome, 'platforms', p, 'cordova', 
'version');
+             promise= superspawn.spawn(script).then(function(v){
+                return {'id':p ,'version':v};
+            });
+        }
+        //Clear the engines first
+        var engines = configXml.getEngines();
+        engines.forEach(function(e){
+            configXml.removeEngine(e.id);
+        });
+
+        return Q.when(promise,
+            function(theEngine){
+                configXml.addEngine(theEngine.id,theEngine.version);
+                configXml.write();
+                events.emit('results', 'Saved platform info for "'+p+'" to 
config.xml');
+            }
+        )
+    }));
+}
+
+function savePlugins(opts){
     opts = opts || {};
     var projectHome = cordova_util.cdProjectRoot();
     var configPath = cordova_util.projectConfig(projectHome);

Reply via email to