projects
Version:
You're a prolific developer (or you want to be). Manage, keep track of, and show off your projects.
85 lines (63 loc) • 2.08 kB
JavaScript
// description: add the specified project directories
// arguments: <path>
var async = require('async');
var fs = require('fs');
var path = require('path');
var exec = require('child_process').exec;
var storage = require('../lib/storage.js');
var utilities = require('../lib/utilities.js');
var RE_GITHUB_HOMEPAGE = /[\/:]([^\/]*?\/[^\/]*?)\.git$/;
var program = utilities.programDefaultsParse('import', '<path>');
if (!program.args) {
console.error('Please specify at least one path');
process.exit(1);
}
function addProject(directory, callback) {
console.log('Importing %s', utilities.expand(directory));
// TODO: Get active status based on last commit
exec('git ls-remote --get-url', {cwd: directory}, function (err, stdout) {
var repository;
if (!err && stdout) {
repository = stdout.trim();
}
var project = {
name: path.basename(directory),
directory: directory
};
if (repository) {
project.repository = repository;
if (/github/.test(repository)) {
var matches = RE_GITHUB_HOMEPAGE.exec(repository);
if (matches) {
project.homepage = 'https://github.com/' + matches[1];
}
}
}
// XXX: Should we attempt to upsert based on the path here first?
storage.upsertProject(project.name, project, callback);
});
}
storage.setup(function () {
async.eachSeries(program.args, function (directory, cbEachSeries) {
fs.stat(directory, function (err, stats) {
// Sometimes there are broken symlinks
if (err && err.code === 'ENOENT') {
return console.log('Ignore broken symlink:', directory);
} else if (err) {
throw err;
}
if (!stats.isDirectory()) {
console.log('Ignoring non-directory "%s"', directory);
return cbEachSeries();
}
return addProject(utilities.expand(directory), cbEachSeries);
});
}, function (err) {
if (err) {
return console.error('Error adding paths:', err);
}
console.log('Done.');
});
});
;