CB-6698 Automatically copy sub-libraries to project's directory

Github: close #29


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

Branch: refs/heads/master
Commit: ffc17dd1bdc89b515cfff0a14a31f4bd0e097234
Parents: 95772a1
Author: Martin Bektchiev <[email protected]>
Authored: Fri Jun 13 19:00:36 2014 +0300
Committer: Andrew Grieve <[email protected]>
Committed: Mon Jun 16 23:08:39 2014 -0400

----------------------------------------------------------------------
 .../spec-plugman/platforms/android.spec.js      | 28 ++++++++++-------
 cordova-lib/src/plugman/platforms/android.js    | 33 +++++++++++++++++---
 2 files changed, 44 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/ffc17dd1/cordova-lib/spec-plugman/platforms/android.spec.js
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-plugman/platforms/android.spec.js 
b/cordova-lib/spec-plugman/platforms/android.spec.js
index 00dac74..637df5f 100644
--- a/cordova-lib/spec-plugman/platforms/android.spec.js
+++ b/cordova-lib/spec-plugman/platforms/android.spec.js
@@ -137,30 +137,32 @@ describe('android project handler', function() {
             afterEach(function() {
                 android.purgeProjectFileCache(temp);
             });
-            it('should update the main and library projects', function() {
+            it('with custom=true should update the main and library projects', 
function() {
                 var frameworkElement = { attrib: { src: "LibraryPath", custom: 
true } };
-                var subDir = path.resolve(temp, frameworkElement.attrib.src);
+                var subDir = path.resolve(temp, dummy_id, 
frameworkElement.attrib.src);
                 var mainProjectPropsFile = path.resolve(temp, 
"project.properties");
                 var subProjectPropsFile = path.resolve(subDir, 
"project.properties");
 
                 var existsSync = spyOn( fs, 'existsSync').andReturn(true);
                 var writeFileSync = spyOn(fs, 'writeFileSync');
+                var copyNewFile = spyOn(common, 'copyNewFile');
                 var readFileSync = spyOn(fs, 
'readFileSync').andCallFake(function (file) {
-                    if (path.normalize(file) === mainProjectPropsFile) {
+                    file = path.normalize(file);
+                    if (file === mainProjectPropsFile) {
                         return '#Some 
comment\ntarget=android-19\nandroid.library.reference.1=ExistingLibRef1\nandroid.library.reference.2=ExistingLibRef2';
-                    } else if (path.normalize(file) === subProjectPropsFile) {
+                    } else if (file === subProjectPropsFile) {
                         return '#Some 
comment\ntarget=android-17\nandroid.library=true';
                     } else {
-                        throw new Error("Trying to read from an unexpected 
file " + file);
+                        throw new Error("Trying to read from an unexpected 
file " + file + '\n expected: ' + mainProjectPropsFile + '\n' + 
subProjectPropsFile);
                     }
                 })
                 var exec = spyOn(shell, 'exec');
 
-                android['framework'].install(frameworkElement, dummyplugin, 
temp);
+                android['framework'].install(frameworkElement, dummyplugin, 
temp, dummy_id);
                 android.parseProjectFile(temp).write();
 
                 expect(_.any(writeFileSync.argsForCall, function (callArgs) {
-                    return callArgs[0] === mainProjectPropsFile && 
callArgs[1].indexOf('\nandroid.library.reference.3=LibraryPath') > -1;
+                    return callArgs[0] === mainProjectPropsFile && 
callArgs[1].indexOf('\nandroid.library.reference.3='+dummy_id+'/LibraryPath') > 
-1;
                 })).toBe(true, 'Reference to library not added');
                 expect(_.any(writeFileSync.argsForCall, function (callArgs) {
                     return callArgs[0] === subProjectPropsFile && 
callArgs[1].indexOf('\ntarget=android-19') > -1;
@@ -176,6 +178,7 @@ describe('android project handler', function() {
 
                 var existsSync = spyOn( fs, 'existsSync').andReturn(true);
                 var writeFileSync = spyOn(fs, 'writeFileSync');
+                var copyNewFile = spyOn(common, 'copyNewFile');
                 var readFileSync = spyOn(fs, 
'readFileSync').andCallFake(function (file) {
                     if (path.normalize(file) === mainProjectPropsFile) {
                         return '#Some 
comment\ntarget=android-19\nandroid.library.reference.1=ExistingLibRef1\nandroid.library.reference.2=ExistingLibRef2';
@@ -189,7 +192,7 @@ describe('android project handler', function() {
                 })
                 var exec = spyOn(shell, 'exec');
 
-                android['framework'].install(frameworkElement, dummyplugin, 
temp);
+                android['framework'].install(frameworkElement, dummyplugin, 
temp, dummy_id);
                 android.parseProjectFile(temp).write();
 
                 var relativePath = 
android_project.getRelativeLibraryPath(temp, subDir);
@@ -246,18 +249,19 @@ describe('android project handler', function() {
                 android.purgeProjectFileCache(temp);
             });
             it('should remove library reference from the main project', 
function () {
-                var frameworkElement = { attrib: { src: "LibraryPath" } };
-                var sub_dir = path.resolve(temp, frameworkElement.attrib.src);
+                var frameworkElement = { attrib: { src: "LibraryPath", custom: 
true } };
+                var sub_dir = path.resolve(temp, dummy_id, 
frameworkElement.attrib.src);
                 var mainProjectProps = path.resolve(temp, 
"project.properties");
                 var existsSync = spyOn(fs, 'existsSync').andReturn(true);
                 var writeFileSync = spyOn(fs, 'writeFileSync');
+                var removeFile = spyOn(common, 'removeFile');
                 var readFileSync = spyOn(fs, 
'readFileSync').andCallFake(function (file) {
                     if (path.normalize(file) === mainProjectProps)
-                        return '#Some 
comment\ntarget=android-19\nandroid.library.reference.1=ExistingLibRef1\nandroid.library.reference.2=LibraryPath\nandroid.library.reference.3=ExistingLibRef2\n';
+                        return '#Some 
comment\ntarget=android-19\nandroid.library.reference.1=ExistingLibRef1\nandroid.library.reference.2='+dummy_id+'/LibraryPath\nandroid.library.reference.3=ExistingLibRef2\n';
                 })
                 var exec = spyOn(shell, 'exec');
 
-                android['framework'].uninstall(frameworkElement, temp);
+                android['framework'].uninstall(frameworkElement, temp, 
dummy_id);
                 android.parseProjectFile(temp).write();
 
                 expect(_.any(writeFileSync.argsForCall, function (callArgs) {

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/ffc17dd1/cordova-lib/src/plugman/platforms/android.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/plugman/platforms/android.js 
b/cordova-lib/src/plugman/platforms/android.js
index 06aee30..47669ae 100644
--- a/cordova-lib/src/plugman/platforms/android.js
+++ b/cordova-lib/src/plugman/platforms/android.js
@@ -90,25 +90,40 @@ module.exports = {
 
             events.emit('verbose', "Installing Android library: " + src);
             var parent = source_el.attrib.parent;
-            var parentDir = parent ? path.resolve(project_dir, parent) : 
project_dir;
+            var parentDir = parent ? path.resolve(project_dir, 
module.exports.getCustomSubprojectRelativeDir(plugin_id, parent)) : project_dir;
             var subDir;
             if (custom) {
-                subDir = path.resolve(project_dir, src);
+                var subRelativeDir = 
module.exports.getCustomSubprojectRelativeDir(plugin_id, src);
+                common.copyNewFile(plugin_dir, src, project_dir, 
subRelativeDir);
+                subDir = path.resolve(project_dir, subRelativeDir);
             } else {
-                var localProperties = 
properties_parser.createEditor(path.resolve(project_dir, "local.properties"));
-                subDir = path.resolve(localProperties.get("sdk.dir"), src);
+                var sdk_dir = module.exports.getProjectSdkDir(project_dir);
+                subDir = path.resolve(sdk_dir, src);
             }
+
             var projectConfig = module.exports.parseProjectFile(project_dir);
             projectConfig.addSubProject(parentDir, subDir);
         },
         uninstall:function(source_el, project_dir, plugin_id) {
             var src = source_el.attrib.src;
+            var custom = source_el.attrib.custom;
             if (!src) throw new Error('src not specified in framework 
element');
 
             events.emit('verbose', "Uninstalling Android library: " + src);
             var parent = source_el.attrib.parent;
             var parentDir = parent ? path.resolve(project_dir, parent) : 
project_dir;
-            var subDir = path.resolve(project_dir, src);
+            var subRelativeDir = path.join(plugin_id, path.basename(src));
+            var subDir;
+
+            if (custom) {
+                var subRelativeDir = 
module.exports.getCustomSubprojectRelativeDir(plugin_id, src);
+                common.removeFile(project_dir, subRelativeDir);
+                subDir = path.resolve(project_dir, subRelativeDir);
+            } else {
+                var sdk_dir = module.exports.getProjectSdkDir(project_dir);
+                subDir = path.resolve(sdk_dir, src);
+            }
+
             var projectConfig = module.exports.parseProjectFile(project_dir);
             projectConfig.removeSubProject(parentDir, subDir);
         }
@@ -122,6 +137,14 @@ module.exports = {
     },
     purgeProjectFileCache:function(project_dir) {
         delete projectFileCache[project_dir];
+    },
+    getProjectSdkDir: function (project_dir) {
+        var localProperties = 
properties_parser.createEditor(path.resolve(project_dir, "local.properties"));
+        return localProperties.get("sdk.dir");
+    },
+    getCustomSubprojectRelativeDir: function (plugin_id, src) {
+        var subRelativeDir = path.join(plugin_id, path.basename(src));
+        return subRelativeDir;
     }
 };
 

Reply via email to