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