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