Repository: cordova-fetch Updated Branches: refs/heads/master f0b030478 -> 07a3b30c6
CB-13010: Improve logic for searching packages which being installed from git url close #1 Project: http://git-wip-us.apache.org/repos/asf/cordova-fetch/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-fetch/commit/07a3b30c Tree: http://git-wip-us.apache.org/repos/asf/cordova-fetch/tree/07a3b30c Diff: http://git-wip-us.apache.org/repos/asf/cordova-fetch/diff/07a3b30c Branch: refs/heads/master Commit: 07a3b30c653ed4a34fa4bb62a678d318d2574554 Parents: f0b0304 Author: Nikita Matrosov <[email protected]> Authored: Mon Aug 14 17:32:02 2017 +0300 Committer: Steve Gill <[email protected]> Committed: Wed Aug 16 11:40:33 2017 -0700 ---------------------------------------------------------------------- index.js | 48 ++++++++++++++++++++++++++++++------- spec/fetch.spec.js | 63 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 82 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-fetch/blob/07a3b30c/index.js ---------------------------------------------------------------------- diff --git a/index.js b/index.js index b1d37ec..25b60fe 100644 --- a/index.js +++ b/index.js @@ -22,6 +22,7 @@ var shell = require('shelljs'); var superspawn = require('cordova-common').superspawn; var events = require('cordova-common').events; var depls = require('dependency-ls'); +var url = require('url'); var path = require('path'); var fs = require('fs'); var CordovaError = require('cordova-common').CordovaError; @@ -89,7 +90,7 @@ module.exports = function(target, dest, opts) { //This could happen on a platform update. var id = getJsonDiff(tree1, tree2) || trimID(target); - return getPath(id, dest); + return getPath(id, dest, target); }) .fail(function(err){ return Q.reject(new CordovaError(err)); @@ -184,13 +185,44 @@ function trimID(target) { * */ -function getPath(id, dest) { - var finalDest = path.resolve(path.join(dest, id)); - - //Sanity check it exists - if(fs.existsSync(finalDest)){ - return finalDest; - } else return Q.reject(new CordovaError('Failed to get absolute path to installed module')); +function getPath(id, dest, target) { + var destination = path.resolve(path.join(dest, id)); + var finalDest = fs.existsSync(destination) ? destination : searchDirForTarget(dest, target); + + if (!finalDest) { + throw new CordovaError('Failed to get absolute path to installed module'); + } + + return finalDest; +} + +/* + * Make an additional search in destination folder using repository.url property from package.json + * + * @param {String} dest destination of where to fetch the modules + * @param {String} target target that was passed into cordova-fetch. can be moduleID, moduleID@version or gitURL + * + * @return {String} Returns the absolute url for the module or null + * + */ + +function searchDirForTarget(dest, target) { + if (!isUrl(target)) { + return; + } + + var targetPathname = url.parse(target).pathname; + + var pkgJsonPath = fs.readdirSync(dest).map(function(dir) { + return path.join(dest, dir, 'package.json'); + }) + .filter(fs.existsSync) + .find(function(pkgJsonPath) { + var repo = JSON.parse(fs.readFileSync(pkgJsonPath)).repository; + return repo && url.parse(repo.url).pathname === targetPathname; + }); + + return pkgJsonPath && path.dirname(pkgJsonPath); } /* http://git-wip-us.apache.org/repos/asf/cordova-fetch/blob/07a3b30c/spec/fetch.spec.js ---------------------------------------------------------------------- diff --git a/spec/fetch.spec.js b/spec/fetch.spec.js index 4059bbf..8cdc6e2 100644 --- a/spec/fetch.spec.js +++ b/spec/fetch.spec.js @@ -32,34 +32,34 @@ describe('platform fetch/uninstall tests via npm & git', function () { beforeEach(function() { process.chdir(tmpDir); }); - + afterEach(function() { process.chdir(path.join(__dirname, '..')); // Needed to rm the dir on Windows. shell.rm('-rf', tmpDir); }); it('should fetch and uninstall a cordova platform via npm & git', function(done) { - + fetch('cordova-android', tmpDir, opts) .then(function(result) { var pkgJSON = require(path.join(result,'package.json')); expect(result).toBeDefined(); expect(fs.existsSync(result)).toBe(true); expect(pkgJSON.name).toBe('cordova-android'); - + return uninstall('cordova-android', tmpDir, opts); }) .then(function() { expect(fs.existsSync(path.join(tmpDir,'node_modules', 'cordova-android'))).toBe(false); - - return fetch('https://github.com/apache/cordova-ios.git', tmpDir, opts); + + return fetch('https://github.com/apache/cordova-ios.git', tmpDir, opts); }) .then(function(result) { var pkgJSON = require(path.join(result,'package.json')); expect(result).toBeDefined(); expect(fs.existsSync(result)).toBe(true); expect(pkgJSON.name).toBe('cordova-ios'); - + return uninstall('cordova-ios', tmpDir, opts); }) .then(function() { @@ -87,13 +87,13 @@ describe('platform fetch/uninstall test via npm & git tags with --save', functio var tmpDir = helpers.tmpDir('plat_fetch_save'); var opts = {'save':true}; - + beforeEach(function() { //copy package.json from spec directory to tmpDir shell.cp('spec/testpkg.json', path.join(tmpDir,'package.json')); process.chdir(tmpDir); }); - + afterEach(function() { process.chdir(path.join(__dirname, '..')); // Needed to rm the dir on Windows. shell.rm('-rf', tmpDir); @@ -118,7 +118,7 @@ describe('platform fetch/uninstall test via npm & git tags with --save', functio expect(Object.keys(rootPJ.dependencies).length).toBe(0); expect(fs.existsSync(path.join(tmpDir,'node_modules', 'cordova-android'))).toBe(false); - return fetch('https://github.com/apache/cordova-ios.git#rel/4.1.1', tmpDir, opts); + return fetch('https://github.com/apache/cordova-ios.git#rel/4.1.1', tmpDir, opts); }) .then(function(result) { var pkgJSON = require(path.join(result,'package.json')); @@ -163,13 +163,13 @@ describe('plugin fetch/uninstall test with --save', function () { var tmpDir = helpers.tmpDir('plug_fetch_save'); var opts = {'save':true}; - + beforeEach(function() { //copy package.json from spec directory to tmpDir shell.cp('spec/testpkg.json', path.join(tmpDir,'package.json')); process.chdir(tmpDir); }); - + afterEach(function() { process.chdir(path.join(__dirname, '..')); // Needed to rm the dir on Windows. shell.rm('-rf', tmpDir); @@ -204,13 +204,14 @@ describe('plugin fetch/uninstall test with --save', function () { describe('test trimID method for npm and git', function () { - var tmpDir = helpers.tmpDir('plug_trimID'); + var tmpDir; var opts = {}; - + beforeEach(function() { + tmpDir = helpers.tmpDir('plug_trimID'); process.chdir(tmpDir); }); - + afterEach(function() { process.chdir(path.join(__dirname, '..')); // Needed to rm the dir on Windows. shell.rm('-rf', tmpDir); @@ -223,7 +224,7 @@ describe('test trimID method for npm and git', function () { expect(result).toBeDefined(); expect(fs.existsSync(result)).toBe(true); expect(pkgJSON.name).toBe('cordova-plugin-device'); - + return fetch('https://github.com/apache/cordova-plugin-media.git', tmpDir, opts); }) .then(function(result) { @@ -234,7 +235,7 @@ describe('test trimID method for npm and git', function () { //refetch to trigger trimID return fetch('cordova-plugin-device', tmpDir, opts); - + }) .then(function(result) { expect(result).toBeDefined(); @@ -263,17 +264,37 @@ describe('test trimID method for npm and git', function () { }) .fin(done); }, 40000); + + it('should fetch same plugin twice in a row if git repo name differ from plugin id', function(done) { + fetch('https://github.com/AzureAD/azure-activedirectory-library-for-cordova.git', tmpDir, opts) + .then(function(result) { + expect(result).toBeDefined(); + expect(fs.existsSync(result)).toBe(true); + expect(result).toMatch('cordova-plugin-ms-adal'); + return fetch('https://github.com/AzureAD/azure-activedirectory-library-for-cordova.git', tmpDir, opts); + }) + .then(function(result) { + expect(result).toBeDefined(); + expect(fs.existsSync(result)).toBe(true); + expect(result).toMatch('cordova-plugin-ms-adal'); + }) + .fail(function(err) { + console.error(err); + expect(err).toBeUndefined(); + }) + .fin(done); + }, 30000); }); describe('fetch failure with unknown module', function () { var tmpDir = helpers.tmpDir('fetch_fails_npm'); var opts = {}; - + beforeEach(function() { process.chdir(tmpDir); }); - + afterEach(function() { process.chdir(path.join(__dirname, '..')); // Needed to rm the dir on Windows. shell.rm('-rf', tmpDir); @@ -300,7 +321,7 @@ describe('fetch failure with git subdirectory', function () { beforeEach(function() { process.chdir(tmpDir); }); - + afterEach(function() { process.chdir(path.join(__dirname, '..')); // Needed to rm the dir on Windows. shell.rm('-rf', tmpDir); @@ -327,13 +348,13 @@ describe('scoped plugin fetch/uninstall tests via npm', function () { beforeEach(function() { process.chdir(tmpDir); }); - + afterEach(function() { process.chdir(path.join(__dirname, '..')); // Needed to rm the dir on Windows. shell.rm('-rf', tmpDir); }); - it('should fetch a scoped plugin from npm', function(done) { + it('should fetch a scoped plugin from npm', function(done) { fetch('@stevegill/cordova-plugin-device', tmpDir, opts) .then(function(result) { var pkgJSON = require(path.join(result,'package.json')); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
