mirror of
https://github.com/bower/bower.git
synced 2026-02-03 18:44:55 -05:00
A unit of work is a simple storage with write lock/unlock. The manager/package now share a unit of work instance. The unit of work is used to prevent shared dependencies from being cloned/copied "at the same time" fixing issue #81. The prune and version resolving algorithm was also not correct. It now resolves versions correctly, fixing issue #57. - Fix I/O errors caused by copying/clone repos simultaneously to the same dest. - Optimize the clone/copy step by avoiding it if the last resolved resource is the same. - Fix failing test (at least on my windows machine) - Add some more tests - Fix CS.
65 lines
1.8 KiB
JavaScript
65 lines
1.8 KiB
JavaScript
// ==========================================
|
|
// BOWER: PRUNE
|
|
// ==========================================
|
|
// Copyright 2012 Twitter, Inc
|
|
// Licensed under The MIT License
|
|
// http://opensource.org/licenses/MIT
|
|
// ==========================================
|
|
|
|
var semver = require('semver');
|
|
|
|
var versionRequirements = function (dependencyMap) {
|
|
var result = {};
|
|
|
|
for (var name in dependencyMap) {
|
|
dependencyMap[name].forEach(function (pkg) {
|
|
result[name] = result[name] || [];
|
|
if (pkg.originalTag && result[name].indexOf(pkg.originalTag) === -1) {
|
|
result[name].push(pkg.originalTag);
|
|
}
|
|
});
|
|
}
|
|
|
|
return result;
|
|
};
|
|
|
|
var validVersions = function (versions, dependency) {
|
|
if (!versions || !versions.length) return true;
|
|
|
|
// If a non resolved dependency is passed, we simply ignore it
|
|
if (!dependency.version) return false;
|
|
|
|
if (!semver.valid(dependency.version)) {
|
|
throw new Error('Invalid semver version ' + dependency.version + ' specified in ' + dependency.name);
|
|
}
|
|
|
|
return versions.every(function (version) {
|
|
return semver.satisfies(dependency.version, version);
|
|
});
|
|
};
|
|
|
|
module.exports = function (dependencyMap) {
|
|
// generate version requirements
|
|
// compare dependency map with version requirements
|
|
// raise exceptions when requirements are not satisified
|
|
// remove duplicates
|
|
// select best version
|
|
// return a pruned dependencyMap
|
|
|
|
var result = {};
|
|
var versionMap = versionRequirements(dependencyMap);
|
|
|
|
for (var name in dependencyMap) {
|
|
dependencyMap[name] = dependencyMap[name]
|
|
.filter(validVersions.bind(this, versionMap[name]))
|
|
.sort(function (a, b) { return semver.gt(a.version, b.version) ? -1 : 1; });
|
|
|
|
if (!dependencyMap[name].length) {
|
|
throw new Error('No resolvable dependency for: ' + name);
|
|
}
|
|
|
|
result[name] = [ dependencyMap[name][0] ];
|
|
}
|
|
|
|
return result;
|
|
}; |