in src/plugman/install.js [401:483]
function tryFetchDependency (dep, install, options) {
// Handle relative dependency paths by expanding and resolving them.
// The easy case of relative paths is to have a URL of '.' and a different subdir.
// TODO: Implement the hard case of different repo URLs, rather than the special case of
// same-repo-different-subdir.
let relativePath;
if (dep.url === '.') {
// Look up the parent plugin's fetch metadata and determine the correct URL.
const fetchdata = require('./util/metadata').get_fetch_metadata(install.plugins_dir, install.top_plugin_id);
if (!fetchdata || !(fetchdata.source && fetchdata.source.type)) {
relativePath = dep.subdir || dep.id;
events.emit('warn', 'No fetch metadata found for plugin ' + install.top_plugin_id + '. checking for ' + relativePath + ' in ' + options.searchpath.join(','));
return Promise.resolve(relativePath);
}
// Now there are two cases here: local directory, and git URL.
if (fetchdata.source.type === 'local') {
dep.url = fetchdata.source.path;
return execa.command('git rev-parse --show-toplevel', { cwd: dep.url })
.catch(err => {
if (err.exitCode === 128) {
throw new Error('Plugin ' + dep.id + ' is not in git repository. All plugins must be in a git repository.');
} else {
throw new Error('Failed to locate git repository for ' + dep.id + ' plugin.');
}
})
.then(({ stdout: git_repo }) => {
// Clear out the subdir since the url now contains it
const url = path.join(git_repo, dep.subdir);
dep.subdir = '';
return Promise.resolve(url);
}).catch(function () {
return Promise.resolve(dep.url);
});
} else if (fetchdata.source.type === 'git') {
return Promise.resolve(fetchdata.source.url);
} else if (fetchdata.source.type === 'dir') {
// Note: With fetch() independant from install()
// $md5 = md5(uri)
// Need a Hash(uri) --> $tmpDir/cordova-fetch/git-hostname.com-$md5/
// plugin[id].install.source --> searchpath that matches fetch uri
// mapping to a directory of OS containing fetched plugins
let tmpDir = fetchdata.source.url;
tmpDir = tmpDir.replace('$tmpDir', os.tmpdir());
let pluginSrc = '';
if (dep.subdir.length) {
// Plugin is relative to directory
pluginSrc = path.join(tmpDir, dep.subdir);
}
// Try searchpath in dir, if that fails re-fetch
if (!pluginSrc.length || !fs.existsSync(pluginSrc)) {
pluginSrc = dep.id;
// Add search path
if (options.searchpath.indexOf(tmpDir) === -1) { options.searchpath.unshift(tmpDir); } // place at top of search
}
return Promise.resolve(pluginSrc);
}
}
// Test relative to parent folder
if (dep.url && !isAbsolutePath(dep.url)) {
relativePath = path.resolve(install.top_plugin_dir, '../' + dep.url);
if (fs.existsSync(relativePath)) {
dep.url = relativePath;
}
}
// CB-4770: registry fetching
if (dep.url === undefined) {
dep.url = dep.id;
}
return Promise.resolve(dep.url);
}