Files
bower/lib/util/save.js
Andre Cruz fd31f247a6 Unit of work implementation.
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.
2012-10-11 13:40:54 +01:00

56 lines
1.6 KiB
JavaScript

// ==========================================
// BOWER: SAVE
// ==========================================
// Copyright 2012 Twitter, Inc
// Licensed under The MIT License
// http://opensource.org/licenses/MIT
// ==========================================
var path = require('path');
var fs = require('fs');
var _ = require('lodash');
var config = require('../core/config');
function save (eventType, modifier, emitter, manager, paths) {
manager.on(eventType, manager.on('loadJSON', function () {
if (!this.json) return emitter.emit('error', new Error('Please define a ' + config.json));
var pkgs = paths.map(function (path) {
path = path.split('#')[0];
return _.find(Object.keys(this.dependencies), function (key) {
var dep = this.dependencies[key][0];
return dep.name == path
|| (dep.url && dep.url == path)
|| (dep.path && dep.path == path);
}.bind(this));
}.bind(this));
pkgs = _.compact(pkgs).map(function (name) {
return this.dependencies[name][0];
}.bind(this));
pkgs.forEach(modifier.bind(this));
fs.writeFileSync(path.join(this.cwd, config.json), JSON.stringify(this.json, null, 2));
}).loadJSON.bind(manager));
}
function addDependency(pkg) {
var path = (pkg.gitUrl || pkg.assetUrl || pkg.path || '');
var tag = pkg.tag ? '#' + pkg.tag : '';
this.json.dependencies[pkg.name] = path + tag;
}
function removeDependency(pkg) {
delete this.json.dependencies[pkg.name];
}
module.exports = save.bind(this, 'resolve', addDependency);
module.exports.discard = save.bind(this, 'resolveLocal', removeDependency);