Merge branch 'master' into issue/88294

This commit is contained in:
Jiayue. Zhang
2020-01-31 15:49:40 +09:00
committed by GitHub
55 changed files with 776 additions and 644 deletions

View File

@@ -327,6 +327,12 @@ function getGitErrorCode(stderr: string): string | undefined {
return undefined;
}
// https://github.com/microsoft/vscode/issues/89373
// https://github.com/git-for-windows/git/issues/2478
function sanitizePath(path: string): string {
return path.replace(/^([a-z]):\\/i, (_, letter) => `${letter.toUpperCase()}:\\`);
}
const COMMIT_FORMAT = '%H\n%aN\n%aE\n%at\n%ct\n%P\n%B';
export class Git {
@@ -496,6 +502,10 @@ export class Git {
LANG: 'en_US.UTF-8'
});
if (options.cwd) {
options.cwd = sanitizePath(options.cwd);
}
if (options.log !== false) {
this.log(`> git ${args.join(' ')}\n`);
}
@@ -890,12 +900,12 @@ export class Repository {
}
async lstree(treeish: string, path: string): Promise<LsTreeElement[]> {
const { stdout } = await this.run(['ls-tree', '-l', treeish, '--', path]);
const { stdout } = await this.run(['ls-tree', '-l', treeish, '--', sanitizePath(path)]);
return parseLsTree(stdout);
}
async lsfiles(path: string): Promise<LsFilesElement[]> {
const { stdout } = await this.run(['ls-files', '--stage', '--', path]);
const { stdout } = await this.run(['ls-files', '--stage', '--', sanitizePath(path)]);
return parseLsFiles(stdout);
}
@@ -989,7 +999,7 @@ export class Repository {
return await this.diffFiles(false);
}
const args = ['diff', '--', path];
const args = ['diff', '--', sanitizePath(path)];
const result = await this.run(args);
return result.stdout;
}
@@ -1002,7 +1012,7 @@ export class Repository {
return await this.diffFiles(false, ref);
}
const args = ['diff', ref, '--', path];
const args = ['diff', ref, '--', sanitizePath(path)];
const result = await this.run(args);
return result.stdout;
}
@@ -1015,7 +1025,7 @@ export class Repository {
return await this.diffFiles(true);
}
const args = ['diff', '--cached', '--', path];
const args = ['diff', '--cached', '--', sanitizePath(path)];
const result = await this.run(args);
return result.stdout;
}
@@ -1028,7 +1038,7 @@ export class Repository {
return await this.diffFiles(true, ref);
}
const args = ['diff', '--cached', ref, '--', path];
const args = ['diff', '--cached', ref, '--', sanitizePath(path)];
const result = await this.run(args);
return result.stdout;
}
@@ -1048,7 +1058,7 @@ export class Repository {
return await this.diffFiles(false, range);
}
const args = ['diff', range, '--', path];
const args = ['diff', range, '--', sanitizePath(path)];
const result = await this.run(args);
return result.stdout.trim();
@@ -1161,7 +1171,7 @@ export class Repository {
args.push('--');
if (paths && paths.length) {
args.push.apply(args, paths);
args.push.apply(args, paths.map(sanitizePath));
} else {
args.push('.');
}
@@ -1176,13 +1186,13 @@ export class Repository {
return;
}
args.push(...paths);
args.push(...paths.map(sanitizePath));
await this.run(args);
}
async stage(path: string, data: string): Promise<void> {
const child = this.stream(['hash-object', '--stdin', '-w', '--path', path], { stdio: [null, null, null] });
const child = this.stream(['hash-object', '--stdin', '-w', '--path', sanitizePath(path)], { stdio: [null, null, null] });
child.stdin!.end(data, 'utf8');
const { exitCode, stdout } = await exec(child);
@@ -1227,7 +1237,7 @@ export class Repository {
try {
if (paths && paths.length > 0) {
for (const chunk of splitInChunks(paths, MAX_CLI_LENGTH)) {
for (const chunk of splitInChunks(paths.map(sanitizePath), MAX_CLI_LENGTH)) {
await this.run([...args, '--', ...chunk]);
}
} else {
@@ -1366,7 +1376,7 @@ export class Repository {
}
async clean(paths: string[]): Promise<void> {
const pathsByGroup = groupBy(paths, p => path.dirname(p));
const pathsByGroup = groupBy(paths.map(sanitizePath), p => path.dirname(p));
const groups = Object.keys(pathsByGroup).map(k => pathsByGroup[k]);
const limiter = new Limiter(5);
@@ -1412,7 +1422,7 @@ export class Repository {
}
if (paths && paths.length) {
args.push.apply(args, paths);
args.push.apply(args, paths.map(sanitizePath));
} else {
args.push('.');
}
@@ -1563,11 +1573,8 @@ export class Repository {
async blame(path: string): Promise<string> {
try {
const args = ['blame'];
args.push(path);
let result = await this.run(args);
const args = ['blame', sanitizePath(path)];
const result = await this.run(args);
return result.stdout.trim();
} catch (err) {
if (/^fatal: no such path/.test(err.stderr || '')) {
@@ -1897,7 +1904,7 @@ export class Repository {
async updateSubmodules(paths: string[]): Promise<void> {
const args = ['submodule', 'update', '--'];
for (const chunk of splitInChunks(paths, MAX_CLI_LENGTH)) {
for (const chunk of splitInChunks(paths.map(sanitizePath), MAX_CLI_LENGTH)) {
await this.run([...args, ...chunk]);
}
}