Adds arbitrary branch support to getVersionedFile[Text]

This commit is contained in:
Eric Amodio
2017-03-17 16:28:26 -04:00
parent 332b2c3b91
commit dad85b3c0a

View File

@@ -12,6 +12,7 @@ export * from './enrichers/logParserEnricher';
let git: IGit; let git: IGit;
const UncommittedRegex = /^[0]+$/; const UncommittedRegex = /^[0]+$/;
const ShaRegex = /\b[0-9a-f]{40}\b/;
const DefaultLogParams = [`log`, `--name-status`, `--full-history`, `-m`, `--date=iso8601-strict`, `--format=%H -%nauthor %an%nauthor-date %ai%ncommitter %cn%ncommitter-date %ci%nparent %P%nsummary %B%nfilename ?`]; const DefaultLogParams = [`log`, `--name-status`, `--full-history`, `-m`, `--date=iso8601-strict`, `--format=%H -%nauthor %an%nauthor-date %ai%ncommitter %cn%ncommitter-date %ci%nparent %P%nsummary %B%nfilename ?`];
@@ -112,20 +113,20 @@ export class Git {
return gitCommand(repoPath, ...params); return gitCommand(repoPath, ...params);
} }
static async getVersionedFile(fileName: string, repoPath: string, sha: string) { static async getVersionedFile(fileName: string, repoPath: string, branchOrSha: string) {
const data = await Git.getVersionedFileText(fileName, repoPath, sha); const data = await Git.getVersionedFileText(fileName, repoPath, branchOrSha);
const shortSha = sha.substring(0, 8); const suffix = Git.isSha(branchOrSha) ? branchOrSha.substring(0, 8) : branchOrSha;
const ext = path.extname(fileName); const ext = path.extname(fileName);
return new Promise<string>((resolve, reject) => { return new Promise<string>((resolve, reject) => {
tmp.file({ prefix: `${path.basename(fileName, ext)}-${shortSha}__`, postfix: ext }, tmp.file({ prefix: `${path.basename(fileName, ext)}-${suffix}__`, postfix: ext },
(err, destination, fd, cleanupCallback) => { (err, destination, fd, cleanupCallback) => {
if (err) { if (err) {
reject(err); reject(err);
return; return;
} }
Logger.log(`getVersionedFile(${fileName}, ${repoPath}, ${sha}); destination=${destination}`); Logger.log(`getVersionedFile(${fileName}, ${repoPath}, ${branchOrSha}); destination=${destination}`);
fs.appendFile(destination, data, err => { fs.appendFile(destination, data, err => {
if (err) { if (err) {
reject(err); reject(err);
@@ -138,12 +139,12 @@ export class Git {
}); });
} }
static getVersionedFileText(fileName: string, repoPath: string, sha: string) { static getVersionedFileText(fileName: string, repoPath: string, branchOrSha: string) {
const [file, root] = Git.splitPath(Git.normalizePath(fileName), repoPath); const [file, root] = Git.splitPath(Git.normalizePath(fileName), repoPath);
sha = sha.replace('^', ''); branchOrSha = branchOrSha.replace('^', '');
if (Git.isUncommitted(sha)) return Promise.reject(new Error(`sha=${sha} is uncommitted`)); if (Git.isUncommitted(branchOrSha)) return Promise.reject(new Error(`sha=${branchOrSha} is uncommitted`));
return gitCommand(root, 'show', `${sha}:./${file}`); return gitCommand(root, 'show', `${branchOrSha}:./${file}`);
} }
static gitInfo(): IGit { static gitInfo(): IGit {
@@ -218,6 +219,10 @@ export class Git {
return gitCommand(repoPath, ...params); return gitCommand(repoPath, ...params);
} }
static isSha(sha: string) {
return ShaRegex.test(sha);
}
static isUncommitted(sha: string) { static isUncommitted(sha: string) {
return UncommittedRegex.test(sha); return UncommittedRegex.test(sha);
} }