veendor
Version:
a tool for stroing your npm dependencies in arbitraty storage
200 lines (199 loc) • 8.2 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = __importDefault(require("path"));
const helpers = __importStar(require("./helpers"));
const helpers_1 = require("./helpers");
const errors = __importStar(require("../errors"));
const logger_1 = require("../util/logger");
class NotAGitRepoError extends errors.VeendorError {
}
exports.NotAGitRepoError = NotAGitRepoError;
class GitIsNotADirectoryError extends errors.VeendorError {
}
exports.GitIsNotADirectoryError = GitIsNotADirectoryError;
class GitLfsNotAvailableError extends errors.VeendorError {
}
exports.GitLfsNotAvailableError = GitLfsNotAvailableError;
class TooOldRevisionError extends errors.VeendorError {
}
exports.TooOldRevisionError = TooOldRevisionError;
class RefAlreadyExistsError extends errors.VeendorError {
}
exports.RefAlreadyExistsError = RefAlreadyExistsError;
function isGitRepo(directory) {
return __awaiter(this, void 0, void 0, function* () {
const logger = logger_1.getLogger();
logger.trace(`isGitRepo: ${directory}`);
try {
yield helpers.getOutput('git', ['rev-parse', '--git-dir'], { cwd: directory });
return true;
}
catch (e) {
return false;
}
});
}
exports.isGitRepo = isGitRepo;
function isGitLfsAvailable() {
return __awaiter(this, void 0, void 0, function* () {
return helpers.getOutput('git', ['lfs'])
.then(() => {
return helpers.getOutput('git', ['config', '--list']);
})
.then(gitConfig => {
if (gitConfig.indexOf('filter.lfs.clean=') === -1
|| gitConfig.indexOf('filter.lfs.smudge=') === -1
|| gitConfig.indexOf('filter.lfs.process=') === -1) {
throw new Error();
}
})
.then(() => true, () => { throw new GitLfsNotAvailableError; });
});
}
exports.isGitLfsAvailable = isGitLfsAvailable;
/**
* Returns contents of older revision of files
* age == 1 means latest revision, age == 2 means previous, and so on
*/
function olderRevision(gitDirectory, filenames, age) {
return __awaiter(this, void 0, void 0, function* () {
const gitRoot = yield resolveGitRoot(gitDirectory);
const relativeFilenames = filenames.map(filename => {
if (typeof filename === 'string') {
if (!path_1.default.isAbsolute(filename)) {
return path_1.default.relative(gitRoot, path_1.default.resolve(gitDirectory, filename));
}
return path_1.default.relative(gitRoot, filename);
}
return null;
});
const gitArgs = ['--no-pager', 'log', `-${age}`, '--pretty=format:%h'].concat(relativeFilenames.filter(filename => typeof filename === 'string'));
const revisionsText = yield helpers.getOutput('git', gitArgs, {
cwd: gitRoot,
});
const revisions = revisionsText.trim().split('\n');
if (revisions.length < age) {
throw new TooOldRevisionError();
}
return Promise.all(relativeFilenames.map(filename => {
if (typeof filename === 'string') {
return helpers.getOutput('git', ['--no-pager', 'show', revisions[revisions.length - 1] + ':' + filename], {
cwd: gitRoot,
});
}
else {
return Promise.resolve(null);
}
}));
});
}
exports.olderRevision = olderRevision;
function clone(repo, directory) {
return __awaiter(this, void 0, void 0, function* () {
return helpers.getOutput('git', ['clone', repo, directory], {
stdout: helpers_1.StdioPolicy.copy, stderr: helpers_1.StdioPolicy.inherit
});
});
}
exports.clone = clone;
function fetch(gitDirectory) {
return __awaiter(this, void 0, void 0, function* () {
return helpers.getOutput('git', ['fetch', '--tags'], {
cwd: gitDirectory, stdout: helpers_1.StdioPolicy.copy, stderr: helpers_1.StdioPolicy.inherit
});
});
}
exports.fetch = fetch;
function lfsPull(gitDirectory) {
return __awaiter(this, void 0, void 0, function* () {
return helpers.getOutput('git', ['lfs', 'pull'], {
cwd: gitDirectory, stdout: helpers_1.StdioPolicy.copy, stderr: helpers_1.StdioPolicy.inherit
});
});
}
exports.lfsPull = lfsPull;
function checkout(gitDirectory, gitId) {
return __awaiter(this, void 0, void 0, function* () {
return helpers.getOutput('git', ['checkout', gitId], { cwd: gitDirectory });
});
}
exports.checkout = checkout;
function add(gitDirectory, paths, force = false) {
return __awaiter(this, void 0, void 0, function* () {
const args = ['add'];
if (force) {
args.push('--force');
}
return helpers.getOutput('git', args.concat(paths), { cwd: gitDirectory });
});
}
exports.add = add;
function commit(gitDirectory, message) {
return __awaiter(this, void 0, void 0, function* () {
return helpers.getOutput('git', ['commit', '-m', message], { cwd: gitDirectory });
});
}
exports.commit = commit;
function push(gitDirectory, gitId) {
return __awaiter(this, void 0, void 0, function* () {
return helpers.getOutput('git', ['remote'], { cwd: gitDirectory })
.then(remote => {
return helpers.getOutput('git', ['push', remote.trim(), gitId], { cwd: gitDirectory, stdout: helpers_1.StdioPolicy.copy, stderr: helpers_1.StdioPolicy.inherit });
}).catch(error => {
if (!(error instanceof helpers.CommandReturnedNonZeroError)) {
throw error;
}
if (error.output.indexOf(' already exists') !== -1) {
throw new RefAlreadyExistsError();
}
throw error;
});
});
}
exports.push = push;
function tag(gitDirectory, tagName) {
return __awaiter(this, void 0, void 0, function* () {
return helpers.getOutput('git', ['tag', tagName], { cwd: gitDirectory })
.catch(error => {
if (!(error instanceof helpers.CommandReturnedNonZeroError)) {
throw error;
}
if (error.output.indexOf(' already exists') !== -1) {
throw new RefAlreadyExistsError();
}
throw error;
});
});
}
exports.tag = tag;
function resetToRemote(gitDirectory, branch) {
return __awaiter(this, void 0, void 0, function* () {
return helpers.getOutput('git', ['remote'], { cwd: gitDirectory })
.then(remote => helpers.getOutput('git', ['reset', '--hard', `${remote.trim()}/${branch}`], { cwd: gitDirectory, stdout: helpers_1.StdioPolicy.copy, stderr: helpers_1.StdioPolicy.inherit }));
});
}
exports.resetToRemote = resetToRemote;
function resolveGitRoot(directory) {
return __awaiter(this, void 0, void 0, function* () {
return (yield helpers.getOutput('git', ['rev-parse', '--show-toplevel'], { cwd: directory })).trim();
});
}