diff --git a/CHANGELOG.md b/CHANGELOG.md index bd57175..738a27e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p ## Fixed +- Fixes [#1882](https://github.com/gitkraken/vscode-gitlens/issues/1882) - Blame annotations not showing anymore after update - Fixes [#1787](https://github.com/gitkraken/vscode-gitlens/issues/1787) - Remove '-review' from Gerrit Remote reviewDomain() — thanks to [PR #1954](https://github.com/gitkraken/vscode-gitlens/pull/1954) by Felipe Santos ([@felipecrs](https://github.com/felipecrs)) - Fixes [#1902](https://github.com/gitkraken/vscode-gitlens/issues/1902) - Support replacing mirror/replica domain with main domain for remote provider — thanks to [PR #1954](https://github.com/gitkraken/vscode-gitlens/pull/1954) by Felipe Santos ([@felipecrs](https://github.com/felipecrs)) diff --git a/src/env/node/git/localGitProvider.ts b/src/env/node/git/localGitProvider.ts index 9515646..99c56d4 100644 --- a/src/env/node/git/localGitProvider.ts +++ b/src/env/node/git/localGitProvider.ts @@ -913,51 +913,57 @@ export class LocalGitProvider implements GitProvider, Disposable { let repoPath: string | undefined; try { + let isSymLink = undefined; + if (!isDirectory) { const stats = await workspace.fs.stat(uri); uri = stats?.type === FileType.Directory ? uri : Uri.file(dirname(uri.fsPath)); + + isSymLink = ((stats?.type ?? 0) & FileType.SymbolicLink) === FileType.SymbolicLink; } repoPath = await this.git.rev_parse__show_toplevel(uri.fsPath); if (!repoPath) return undefined; - if (isWindows) { - // On Git 2.25+ if you call `rev-parse --show-toplevel` on a mapped drive, instead of getting the mapped drive path back, you get the UNC path for the mapped drive. - // So try to normalize it back to the mapped drive path, if possible + const repoUri = Uri.file(repoPath); - const repoUri = Uri.file(repoPath); - - if (repoUri.authority.length !== 0 && uri.authority.length === 0) { - const match = driveLetterRegex.exec(uri.path); - if (match != null) { - const [, letter] = match; + // On Git 2.25+ if you call `rev-parse --show-toplevel` on a mapped drive, instead of getting the mapped drive path back, you get the UNC path for the mapped drive. + // So try to normalize it back to the mapped drive path, if possible + if (isWindows && repoUri.authority.length !== 0 && uri.authority.length === 0) { + const match = driveLetterRegex.exec(uri.path); + if (match != null) { + const [, letter] = match; - try { - const networkPath = await new Promise(resolve => - realpath.native(`${letter}:\\`, { encoding: 'utf8' }, (err, resolvedPath) => - resolve(err != null ? undefined : resolvedPath), + try { + const networkPath = await new Promise(resolve => + realpath.native(`${letter}:\\`, { encoding: 'utf8' }, (err, resolvedPath) => + resolve(err != null ? undefined : resolvedPath), + ), + ); + if (networkPath != null) { + repoPath = normalizePath( + repoUri.fsPath.replace( + networkPath, + `${letter.toLowerCase()}:${networkPath.endsWith('\\') ? '\\' : ''}`, ), ); - if (networkPath != null) { - repoPath = normalizePath( - repoUri.fsPath.replace( - networkPath, - `${letter.toLowerCase()}:${networkPath.endsWith('\\') ? '\\' : ''}`, - ), - ); - return Uri.file(repoPath); - } - } catch {} - } - - return Uri.file(normalizePath(uri.fsPath)); + return Uri.file(repoPath); + } + } catch {} } - return repoUri; + return Uri.file(normalizePath(uri.fsPath)); } - // If we are not on Windows (symlinks don't seem to have the same issue on Windows), check if we are a symlink and if so, use the symlink path (not its resolved path) + // Check if we are a symlink and if so, use the symlink path (not its resolved path) // This is because VS Code will provide document Uris using the symlinked path + if (isSymLink == null) { + const stats = await workspace.fs.stat(uri); + isSymLink = ((stats?.type ?? 0) & FileType.SymbolicLink) === FileType.SymbolicLink; + } + + if (!isSymLink) return repoUri; + repoPath = await new Promise(resolve => { realpath(uri.fsPath, { encoding: 'utf8' }, (err, resolvedPath) => { if (err != null) {