From fc5e037116911b9c5bc56a986c5ed168e12683c2 Mon Sep 17 00:00:00 2001 From: ole1986 Date: Sat, 30 Oct 2021 10:43:33 +0200 Subject: [PATCH 1/6] Fixed github link in header when using ssh as remote url --- browser/src/components/Header/index.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/browser/src/components/Header/index.tsx b/browser/src/components/Header/index.tsx index 6d6b04d5..385cbc08 100644 --- a/browser/src/components/Header/index.tsx +++ b/browser/src/components/Header/index.tsx @@ -77,7 +77,13 @@ export class Header extends React.Component { From f882470891529394a55d2e02427cc80807f7554f Mon Sep 17 00:00:00 2001 From: ole1986 Date: Sat, 30 Oct 2021 13:12:59 +0200 Subject: [PATCH 2/6] Fixed #678 using git config core.quotePath=false --- package-lock.json | 79 ++++++++++++++++++++---- package.json | 2 +- src/adapter/exec/gitCommandExec.ts | 10 +-- src/adapter/repository/gitArgsService.ts | 4 +- 4 files changed, 74 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6c2f87a3..b2206bcc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "githistory", - "version": "0.6.18", + "version": "0.6.19", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2042,8 +2042,12 @@ }, "prismjs": { "version": "1.17.1", - "resolved": "", - "dev": true + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.17.1.tgz", + "integrity": "sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q==", + "dev": true, + "requires": { + "clipboard": "^2.0.0" + } }, "react-popper": { "version": "1.3.11", @@ -7746,6 +7750,18 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, + "clipboard": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", + "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", + "dev": true, + "optional": true, + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -8952,6 +8968,13 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "dev": true, + "optional": true + }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -10798,7 +10821,8 @@ }, "ini": { "version": "1.3.5", - "resolved": "", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, @@ -11373,6 +11397,16 @@ } } }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "dev": true, + "optional": true, + "requires": { + "delegate": "^3.1.2" + } + }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz", @@ -11391,7 +11425,8 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "" + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "emoji-regex": { "version": "8.0.0", @@ -11916,11 +11951,11 @@ "dev": true }, "iconv-lite": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.1.tgz", - "integrity": "sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "icss-replace-symbols": { @@ -12986,7 +13021,8 @@ }, "ansi-regex": { "version": "5.0.0", - "resolved": "", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { @@ -13455,7 +13491,8 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { @@ -15207,7 +15244,8 @@ }, "ansi-regex": { "version": "5.0.0", - "resolved": "", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { @@ -22065,6 +22103,13 @@ "ajv-keywords": "^3.1.0" } }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "dev": true, + "optional": true + }, "semver": { "version": "5.7.1", "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz", @@ -23207,6 +23252,13 @@ "setimmediate": "^1.0.4" } }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "dev": true, + "optional": true + }, "tiny-invariant": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", @@ -23442,7 +23494,8 @@ }, "ansi-regex": { "version": "5.0.0", - "resolved": "", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { diff --git a/package.json b/package.json index 01f02206..646bb484 100644 --- a/package.json +++ b/package.json @@ -513,7 +513,7 @@ "fs-extra": "^8.1.0", "gravatar": "^1.8.1", "hash.js": "^1.1.7", - "iconv-lite": "^0.5.1", + "iconv-lite": "^0.6.3", "inversify": "^5.0.1", "query-string": "^6.13.7", "reflect-metadata": "^0.1.12", diff --git a/src/adapter/exec/gitCommandExec.ts b/src/adapter/exec/gitCommandExec.ts index c0b70a77..b2b3da00 100644 --- a/src/adapter/exec/gitCommandExec.ts +++ b/src/adapter/exec/gitCommandExec.ts @@ -53,19 +53,19 @@ export class GitCommandExecutor implements IGitCommandExecutor { const stopWatch = new StopWatch(); const gitShow = spawn(gitPathCommand, args, childProcOptions); - let stdout: Buffer = new Buffer(''); - let stderr: Buffer = new Buffer(''); + let stdout: Buffer; + let stderr: Buffer; if (binaryOuput) { gitShow.stdout.pipe(destination); } else { gitShow.stdout.on('data', data => { - stdout = Buffer.concat([stdout, data as Buffer]); + stdout = Buffer.from(data, childProcOptions.encoding); }); } gitShow.stderr.on('data', data => { - stderr = Buffer.concat([stderr, data as Buffer]); + stderr = Buffer.from(data, childProcOptions.encoding); }); return new Promise((resolve, reject) => { @@ -78,7 +78,7 @@ export class GitCommandExecutor implements IGitCommandExecutor { if (code === 0) { const stdOut = binaryOuput ? undefined : decode(stdout, childProcOptions.encoding); this.loggers.forEach(logger => { - logger.trace(binaryOuput ? '' : stdout); + logger.trace(binaryOuput ? '' : stdOut); }); resolve(stdOut); } else { diff --git a/src/adapter/repository/gitArgsService.ts b/src/adapter/repository/gitArgsService.ts index 54150ad1..cc1fb5d4 100644 --- a/src/adapter/repository/gitArgsService.ts +++ b/src/adapter/repository/gitArgsService.ts @@ -31,10 +31,10 @@ export class GitArgsService implements IGitArgsService { return ['shortlog', '-e', '-s', '-n', 'HEAD']; } public getDiffCommitWithNumStatArgs(hash1: string, hash2: string): string[] { - return ['diff', '--numstat', hash1, hash2]; + return ['-c', 'core.quotePath=false', 'diff', '--numstat', hash1, hash2]; } public getDiffCommitNameStatusArgs(hash1: string, hash2: string): string[] { - return ['diff', '--name-status', hash1, hash2]; + return ['-c', 'core.quotePath=false', 'diff', '--name-status', hash1, hash2]; } public getPreviousCommitHashForFileArgs(hash: string, file: string): string[] { return ['log', '--format=%H-%h', `${hash}^1`, '-n', '1', '--', file]; From e5d4f7208cafc26f3faa5b832c8a0f6b5d4895db Mon Sep 17 00:00:00 2001 From: ole1986 Date: Sat, 6 Nov 2021 12:40:48 +0100 Subject: [PATCH 3/6] let spawn decide the encoding --- package-lock.json | 11 ++----- package.json | 1 - src/adapter/exec/gitCommandExec.ts | 51 ++++++++---------------------- src/adapter/exec/types.ts | 9 +----- 4 files changed, 17 insertions(+), 55 deletions(-) diff --git a/package-lock.json b/package-lock.json index b2206bcc..5947c6e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11950,14 +11950,6 @@ "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==", "dev": true }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, "icss-replace-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", @@ -22003,7 +21995,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "dev": true }, "sane": { "version": "4.1.0", diff --git a/package.json b/package.json index 646bb484..59d76a32 100644 --- a/package.json +++ b/package.json @@ -513,7 +513,6 @@ "fs-extra": "^8.1.0", "gravatar": "^1.8.1", "hash.js": "^1.1.7", - "iconv-lite": "^0.6.3", "inversify": "^5.0.1", "query-string": "^6.13.7", "reflect-metadata": "^0.1.12", diff --git a/src/adapter/exec/gitCommandExec.ts b/src/adapter/exec/gitCommandExec.ts index b2b3da00..f7790f0c 100644 --- a/src/adapter/exec/gitCommandExec.ts +++ b/src/adapter/exec/gitCommandExec.ts @@ -1,14 +1,11 @@ import { spawn } from 'child_process'; -import * as iconv from 'iconv-lite'; import { injectable, multiInject } from 'inversify'; -import { Writable } from 'stream'; import { extensions } from 'vscode'; import { IGitCommandExecutor } from './types'; import { GitExtension, API } from '../repository/git.d'; import { StopWatch } from '../../common/stopWatch'; import { ILogService } from '../../common/types'; -const DEFAULT_ENCODING = 'utf8'; const isWindows = /^win/.test(process.platform); @injectable() @@ -35,37 +32,23 @@ export class GitCommandExecutor implements IGitCommandExecutor { }); this.gitExecutablePath = this.gitApi.then(api => api.git.path); } - public exec(cwd: string, ...args: string[]): Promise; - // tslint:disable-next-line:unified-signatures - public exec(options: { cwd: string; shell?: boolean }, ...args: string[]): Promise; - public exec(options: { cwd: string; encoding: 'binary' }, destination: Writable, ...args: string[]): Promise; + // tslint:disable-next-line:no-any - public async exec(options: any, ...args: any[]): Promise { + public async exec(cwd: any, ...args: any[]): Promise { let gitPath = await this.gitExecutablePath; gitPath = isWindows ? gitPath.replace(/\\/g, '/') : gitPath; - const childProcOptions = typeof options === 'string' ? { cwd: options, encoding: DEFAULT_ENCODING } : options; - if (typeof childProcOptions.encoding !== 'string' || childProcOptions.encoding.length === 0) { - childProcOptions.encoding = DEFAULT_ENCODING; - } - const binaryOuput = childProcOptions.encoding === 'binary'; - const destination: Writable = binaryOuput ? args.shift() : undefined; - const gitPathCommand = childProcOptions.shell && gitPath.indexOf(' ') > 0 ? `"${gitPath}"` : gitPath; - const stopWatch = new StopWatch(); - const gitShow = spawn(gitPathCommand, args, childProcOptions); - let stdout: Buffer; - let stderr: Buffer; + const stopWatch = new StopWatch(); + const gitShow = spawn(gitPath, args, { cwd: cwd }); - if (binaryOuput) { - gitShow.stdout.pipe(destination); - } else { - gitShow.stdout.on('data', data => { - stdout = Buffer.from(data, childProcOptions.encoding); - }); - } + let stdout = ''; + let stderr = ''; + gitShow.stdout.on('data', data => { + stdout += data; + }); gitShow.stderr.on('data', data => { - stderr = Buffer.from(data, childProcOptions.encoding); + stderr += data; }); return new Promise((resolve, reject) => { @@ -76,23 +59,17 @@ export class GitCommandExecutor implements IGitCommandExecutor { }); if (code === 0) { - const stdOut = binaryOuput ? undefined : decode(stdout, childProcOptions.encoding); this.loggers.forEach(logger => { - logger.trace(binaryOuput ? '' : stdOut); + logger.trace(stdout); }); - resolve(stdOut); + resolve(stdout); } else { - const stdErr = binaryOuput ? undefined : decode(stderr, childProcOptions.encoding); this.loggers.forEach(logger => { - logger.error(stdErr); + logger.error(stderr); }); - reject({ code, error: stdErr }); + reject({ code, error: stderr }); } }); }); } } - -function decode(buffers: Buffer, encoding: string): string { - return iconv.decode(buffers, encoding); -} diff --git a/src/adapter/exec/types.ts b/src/adapter/exec/types.ts index d549015d..6d6c6f0e 100644 --- a/src/adapter/exec/types.ts +++ b/src/adapter/exec/types.ts @@ -1,15 +1,8 @@ -import { Writable } from 'stream'; import { API } from '../repository/git.d'; export const IGitCommandExecutor = Symbol.for('IGitCommandExecutor'); export interface IGitCommandExecutor { readonly gitApi: Promise; - exec(cwd: string, ...args: string[]): Promise; - exec(options: { cwd: string; shell?: boolean }, ...args: string[]): Promise; - exec( - options: { cwd: string; shell?: boolean; encoding: 'binary' }, - destination: Writable, - ...args: string[] - ): Promise; + exec(cwd: string, ...args: string[]): Promise; } From 48d47304c689632ef2327e7f016e1f79f54846e1 Mon Sep 17 00:00:00 2001 From: ole1986 Date: Sat, 13 Nov 2021 11:44:07 +0100 Subject: [PATCH 4/6] refactoring --- src/adapter/repository/git.ts | 2 +- src/adapter/repository/gitRemoteService.ts | 30 +--------------------- 2 files changed, 2 insertions(+), 30 deletions(-) diff --git a/src/adapter/repository/git.ts b/src/adapter/repository/git.ts index 6d33c3ac..e0beed4a 100644 --- a/src/adapter/repository/git.ts +++ b/src/adapter/repository/git.ts @@ -27,7 +27,7 @@ export class Git implements IGitService { @inject(ILogParser) private logParser: ILogParser, @inject(IGitArgsService) private gitArgsService: IGitArgsService, ) { - this.remotesService = new GitRemoteService(repo, this.gitCmdExecutor); + this.remotesService = new GitRemoteService(repo); } /** diff --git a/src/adapter/repository/gitRemoteService.ts b/src/adapter/repository/gitRemoteService.ts index 81e611c8..248e104e 100644 --- a/src/adapter/repository/gitRemoteService.ts +++ b/src/adapter/repository/gitRemoteService.ts @@ -1,40 +1,12 @@ import { Repository } from './git.d'; -import { IGitCommandExecutor } from '..'; import { GitOriginType } from '.'; import { captureTelemetry } from '../../common/telemetry'; export class GitRemoteService { - constructor(private readonly repo: Repository, private readonly gitCmdExecutor: IGitCommandExecutor) {} + constructor(private readonly repo: Repository) {} private get currentBranch(): string { return this.repo.state.HEAD!.name || ''; } - - public async getBranchesConfiguredForPullForRemote(remoteName: string): Promise { - const gitShowRemoteOutput = await this.gitCmdExecutor.exec( - this.repo.rootUri.fsPath, - ...['remote', 'show', remoteName, '-n'], - ); - - const lines = gitShowRemoteOutput - .split(/\r?\n/g) - .map(line => line.trim()) - .filter(line => line.length > 0); - - const startLineIndex = lines.findIndex(line => line.startsWith('Local branches configured for')); - const endLineIndex = lines.findIndex(line => line.startsWith('Local ref configured for')); - - if (startLineIndex === -1 || endLineIndex == -1) { - // TODO: Capture telemetry, something is wrong. - return []; - } - if (startLineIndex > endLineIndex) { - // TODO: Capture telemetry, something is wrong. - return []; - } - - // Branch name is first word in the line - return lines.slice(startLineIndex + 1, endLineIndex).map(line => line.split(' ')[0]); - } public async getOriginType(url?: string): Promise { if (!url) { url = await this.getOriginUrl(); From 02566606ad16cb095ac581045d6a7dfb945e9ea6 Mon Sep 17 00:00:00 2001 From: ole1986 Date: Sun, 14 Nov 2021 10:32:27 +0100 Subject: [PATCH 5/6] #644 Added capability "virtualWorkspaces" to be false --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 59d76a32..f0ee81f4 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,9 @@ "*" ], "main": "./dist/src/extension", + "capabilities": { + "virtualWorkspaces": false + }, "contributes": { "views": { "explorer": [ From 3d3fff6a1814cf0d6e2b5c10318fa6b90282a515 Mon Sep 17 00:00:00 2001 From: ole1986 Date: Sun, 14 Nov 2021 10:38:40 +0100 Subject: [PATCH 6/6] #643 Disable support for untrusted workspaces --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f0ee81f4..70a718af 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,10 @@ ], "main": "./dist/src/extension", "capabilities": { - "virtualWorkspaces": false + "virtualWorkspaces": false, + "untrustedWorkspaces": { + "supported": false + } }, "contributes": { "views": {