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);