You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by an...@apache.org on 2015/03/06 23:37:43 UTC

[3/3] cordova-lib git commit: CB-8499 `cordova platform save`: save installed platforms and their sources (versions/git_urls/folders) into config.xml

CB-8499 `cordova platform save`: save installed platforms and their
sources (versions/git_urls/folders) into config.xml


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

Branch: refs/heads/master
Commit: 764c9cb12539cff50b4eaee807366c425cd1dd8a
Parents: fc96f49
Author: Omar Mefire <om...@microsoft.com>
Authored: Wed Feb 18 13:59:18 2015 -0800
Committer: Vladimir Kotikov <an...@ya.ru>
Committed: Fri Mar 6 23:26:50 2015 +0300

----------------------------------------------------------------------
 cordova-lib/src/cordova/platform.js          |  73 +++++---------
 cordova-lib/src/cordova/platform_metadata.js | 113 ++++++++++++++++++++++
 2 files changed, 137 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/764c9cb1/cordova-lib/src/cordova/platform.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/platform.js b/cordova-lib/src/cordova/platform.js
index 6b902d3..c0116de 100644
--- a/cordova-lib/src/cordova/platform.js
+++ b/cordova-lib/src/cordova/platform.js
@@ -35,7 +35,8 @@ var config            = require('./config'),
     semver            = require('semver'),
     unorm             = require('unorm'),
     shell             = require('shelljs'),
-    _                 = require('underscore');
+    _                 = require('underscore'),
+    platformMetadata  = require('./platform_metadata');
 
 // Expose the platform parsers on top of this command
 for (var p in platforms) {
@@ -163,7 +164,11 @@ function addHelper(cmd, hooksRunner, projectRoot, targets, opts) {
                         return installPluginsForNewPlatform(platform, projectRoot, cfg, opts);
                     }
                 }).then(function() {
-                    savePlatformVersion(platformsDir, platform, version);
+                    // Save platform@version into platforms.json. i.e: 'android@https://github.com/apache/cordova-android.git'
+                    // If no version was specified, save the edge version                    
+                    var versionToSave = version || platforms[platform].version;
+                    events.emit('verbose', 'saving ' + platform + '@' + versionToSave + ' into platforms.json');
+                    platformMetadata.save(projectRoot, platform, versionToSave);
                 }).then(function() {
                     if(opts.save || autosave){
                         // Save target into config.xml, overriding already existing settings
@@ -181,51 +186,22 @@ function addHelper(cmd, hooksRunner, projectRoot, targets, opts) {
     });
 }
 
-// save the platform's installed or updated version
-// tests: add, update
-// 
-function savePlatformVersion(platformsDir, platform, version) {
-    debugger;
-    // if no version set, save current edge version
-    if(!version){
-        version = platforms[platform].version;
-    }
-
-    events.emit('verbose', 'saving ' + platform + '@' + version + ' into platforms.json');
-    
-    // test: what if platforms.json already contains this platform and version => override it
-    // test: what if platforms.json is empty ?
-    // test: what if platforms.json hasn't been created yet ? => create it and write into it
-    var jsonPath = path.join(platformsDir, 'platforms.json');
-    if(!fs.existsSync(jsonPath)){
-        // ugly. create in a better way
-        var fd = fs.openSync(jsonPath, 'w'); // test: what if there is an error while creating ? 
-        fs.writeFileSync(jsonPath, JSON.stringify({}, null, 4), 'utf-8');
-        fs.closeSync(fd);
-    }
-    var data = getJson(jsonPath);
-
-    // test: what if version is null ? non-null ?
-    data[platform] = version; //test: what if data[platform] is null? non-null?
-    // how does JSON.stringify() work ?
-    fs.writeFileSync(jsonPath, JSON.stringify(data, null, 4), 'utf-8');
-}
-
-function removePlatformVersion(platformsDir, platform){
-    var jsonPath = path.join(platformsDir, 'platforms.json');
-    if(!fs.existsSync(jsonPath)){
-        return;
-    }
-    var data = getJson(jsonPath);
+function save(hooksRunner, projectRoot, opts) {
+    var xml = cordova_util.projectConfig(projectRoot);
+    var cfg = new ConfigParser(xml);
 
-    // test: what if version is null ? non-null ?
-    delete data[platform]; //test: what if data[platform] is null? non-null?
-    // how does JSON.stringify() work ?
-    fs.writeFileSync(jsonPath, JSON.stringify(data, null, 4), 'utf-8');
-}
+    // First, remove all platforms that are already in config.xml
+    cfg.getEngines().forEach(function(engine){
+        cfg.removeEngine(engine.name);
+    });
 
-function getJson(jsonPath) {  // jsonPath -> jsonFile  
-    return JSON.parse(fs.readFileSync(jsonPath, 'utf-8'));
+    // Save installed platforms into config.xml
+    return platformMetadata.getPlatformVersions(projectRoot).then(function(platformVersions){
+        platformVersions.forEach(function(platVer){
+            cfg.addEngine(platVer.platform, platVer.version);
+        });
+        cfg.write();
+    });
 }
 
 // Downloads via npm or via git clone (tries both)
@@ -326,10 +302,9 @@ function remove(hooksRunner, projectRoot, targets, opts) {
 	}
     }).then(function() {
         // Remove targets from platforms.json
-        var platformsDir = path.join(projectRoot, 'platforms');
         targets.forEach(function(target) {
             events.emit('verbose', 'Removing ' + target + ' from platforms.json file ...');
-            removePlatformVersion(platformsDir, target);
+            platformMetadata.remove(projectRoot, target);
         });
     }).then(function() {
         return hooksRunner.fire('after_platform_rm', opts);
@@ -554,8 +529,8 @@ function platform(command, targets, opts) {
             return update(hooksRunner, projectRoot, targets, opts);
         case 'check':
             return check(hooksRunner, projectRoot);
-        //case 'save':
-            //return save(hooksRunner, projectRoot);
+        case 'save':
+            return save(hooksRunner, projectRoot, opts);
         default:
             return list(hooksRunner, projectRoot);
     }

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/764c9cb1/cordova-lib/src/cordova/platform_metadata.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/cordova/platform_metadata.js b/cordova-lib/src/cordova/platform_metadata.js
new file mode 100644
index 0000000..5eef58d
--- /dev/null
+++ b/cordova-lib/src/cordova/platform_metadata.js
@@ -0,0 +1,113 @@
+/**
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+
+var path         = require('path'),
+    cordova_util = require('./util'),
+    fs           = require('fs'),
+    Q            = require('q'),
+    child_process = require('child_process');
+
+
+function getJson(jsonFile) {
+    return JSON.parse(fs.readFileSync(jsonFile, 'utf-8'));
+}
+
+// Retrieves the platforms and their versions from the platforms.json file
+// Returns an array of {platform: platform, version: version} ...
+// ... where version could be '3.4.0', '/path/to/platform' or 'git://...'
+function getVersions(projectRoot) {
+    var platformsDir = path.join(projectRoot, 'platforms');
+    var platformsJsonFile = path.join(platformsDir, 'platforms.json');
+
+    // If the platforms.json file doesn't exist, retrieve versions from platforms installed on the filesystem...
+    // ...Note that in this case, we won't be able to know what source(folder, git-url) the platform came from, we'll just use versions
+    return getPlatVersionsFromFile(platformsJsonFile).fail(function(){
+        return getPlatVersionsFromFileSystem(projectRoot);
+    });
+}
+
+// Returns a promise
+function getPlatVersionsFromFile(platformsJsonFile){
+
+    var platformData;
+
+    // Handle 'file not found' exception and stay within the 'promise monad'
+    try{
+        platformData = getJson(platformsJsonFile);
+    } catch(e) {
+        return Q.reject(e);
+    }
+    
+    var platformVersions = [];
+    
+    platformVersions = Object.keys(platformData).map(function(p){
+        return {platform: p, version: platformData[p]};
+    });
+
+    return Q(platformVersions);
+}
+
+// Returns a promise
+function getPlatVersionsFromFileSystem(projectRoot){
+    var platforms_on_fs = cordova_util.listPlatforms(projectRoot);
+    var platformVersions = platforms_on_fs.map(function(platform){
+        var script = path.join(projectRoot, 'platforms', platform, 'cordova', 'version');
+        return Q.ninvoke(child_process, 'exec', script, {}).then(function(result){
+            var version = result[0];
+            
+            // clean the version we get back from the script
+            // This is necessary because the version script uses console.log to pass back
+            // the version. Using console.log ends up adding additional line breaks/newlines to the value returned. 
+            // ToDO: version scripts should be refactored to not use console.log()
+            var versionCleaned = version.replace(/\r?\n|\r/g, '');
+            return {platform: platform, version: versionCleaned};
+        });        
+    });
+
+    return Q.all(platformVersions);
+}
+
+// Saves platform@version into platforms.json
+function save(projectRoot, platform, version) {
+    var platformsDir = path.join(projectRoot, 'platforms');
+    var platformJsonFile = path.join(platformsDir, 'platforms.json');
+
+    var data = {};
+    if(fs.existsSync(platformJsonFile)){
+        data = getJson(platformJsonFile);
+    }
+    data[platform] = version;
+    fs.writeFileSync(platformJsonFile, JSON.stringify(data, null, 4), 'utf-8');
+}
+
+function remove(projectRoot, platform){
+    var platformsDir = path.join(projectRoot, 'platforms');
+    var platformJsonFile = path.join(platformsDir, 'platforms.json');
+    if(!fs.existsSync(platformJsonFile)){
+        return;
+    }
+    var data = getJson(platformJsonFile);
+    delete data[platform]; 
+    fs.writeFileSync(platformJsonFile, JSON.stringify(data, null, 4), 'utf-8');
+}
+
+module.exports.getPlatformVersions = getVersions;
+module.exports.save = save;
+module.exports.remove = remove;


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