Skip to content

Commit a95ad23

Browse files
committed
1 parent 29d1368 commit a95ad23

4 files changed

Lines changed: 23 additions & 18 deletions

File tree

extensions/git/src/contentProvider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { workspace, Uri, Disposable, Event, EventEmitter, window } from 'vscode'
99
import { debounce, throttle } from './decorators';
1010
import { fromGitUri, toGitUri } from './uri';
1111
import { Model, ModelChangeEvent, OriginalResourceChangeEvent } from './model';
12-
import { filterEvent, eventToPromise } from './util';
12+
import { filterEvent, eventToPromise, isDescendant } from './util';
1313

1414
interface CacheRow {
1515
uri: Uri;
@@ -72,7 +72,7 @@ export class GitContentProvider {
7272
const fsPath = uri.fsPath;
7373

7474
for (const root of this.changedRepositoryRoots) {
75-
if (fsPath.startsWith(root)) {
75+
if (isDescendant(root, fsPath)) {
7676
this._onDidChange.fire(uri);
7777
return;
7878
}

extensions/git/src/model.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import { workspace, WorkspaceFoldersChangeEvent, Uri, window, Event, EventEmitter, QuickPickItem, Disposable, SourceControl, SourceControlResourceGroup, TextEditor, Memento, ConfigurationChangeEvent } from 'vscode';
99
import { Repository, RepositoryState } from './repository';
1010
import { memoize, sequentialize, debounce } from './decorators';
11-
import { dispose, anyEvent, filterEvent, IDisposable } from './util';
11+
import { dispose, anyEvent, filterEvent, IDisposable, isDescendant } from './util';
1212
import { Git, GitErrorCodes } from './git';
1313
import * as path from 'path';
1414
import * as fs from 'fs';
@@ -44,14 +44,6 @@ interface OpenRepository extends Disposable {
4444
repository: Repository;
4545
}
4646

47-
function isParent(parent: string, child: string): boolean {
48-
if (parent.charAt(parent.length - 1) !== path.sep) {
49-
parent += path.sep;
50-
}
51-
52-
return child.startsWith(parent);
53-
}
54-
5547
export class Model {
5648

5749
private _onDidOpenRepository = new EventEmitter<Repository>();
@@ -136,7 +128,7 @@ export class Model {
136128
.map(folder => this.getOpenRepository(folder.uri))
137129
.filter(r => !!r)
138130
.filter(r => !activeRepositories.has(r!.repository))
139-
.filter(r => !(workspace.workspaceFolders || []).some(f => isParent(f.uri.fsPath, r!.repository.root))) as OpenRepository[];
131+
.filter(r => !(workspace.workspaceFolders || []).some(f => isDescendant(f.uri.fsPath, r!.repository.root))) as OpenRepository[];
140132

141133
possibleRepositoryFolders.forEach(p => this.tryOpenRepository(p.uri.fsPath));
142134
openRepositoriesToDispose.forEach(r => r.dispose());
@@ -285,7 +277,7 @@ export class Model {
285277
for (const liveRepository of this.openRepositories) {
286278
const relativePath = path.relative(liveRepository.repository.root, resourcePath);
287279

288-
if (!/^\.\./.test(relativePath)) {
280+
if (isDescendant(liveRepository.repository.root, resourcePath)) {
289281
return liveRepository;
290282
}
291283
}

extensions/git/src/repository.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import { Uri, Command, EventEmitter, Event, scm, SourceControl, SourceControlInputBox, SourceControlResourceGroup, SourceControlResourceState, SourceControlResourceDecorations, Disposable, ProgressLocation, window, workspace, WorkspaceEdit, ThemeColor, DecorationData, Memento } from 'vscode';
99
import { Repository as BaseRepository, Ref, Branch, Remote, Commit, GitErrorCodes, Stash, RefType, GitError } from './git';
10-
import { anyEvent, filterEvent, eventToPromise, dispose, find } from './util';
10+
import { anyEvent, filterEvent, eventToPromise, dispose, find, isDescendant } from './util';
1111
import { memoize, throttle, debounce } from './decorators';
1212
import { toGitUri } from './uri';
1313
import { AutoFetcher } from './autofetch';
@@ -473,7 +473,7 @@ export class Repository implements Disposable {
473473
this.disposables.push(fsWatcher);
474474

475475
const onWorkspaceChange = anyEvent(fsWatcher.onDidChange, fsWatcher.onDidCreate, fsWatcher.onDidDelete);
476-
const onRepositoryChange = filterEvent(onWorkspaceChange, uri => !/^\.\./.test(path.relative(repository.root, uri.fsPath)));
476+
const onRepositoryChange = filterEvent(onWorkspaceChange, uri => isDescendant(repository.root, uri.fsPath));
477477
const onRelevantRepositoryChange = filterEvent(onRepositoryChange, uri => !/\/\.git\/index\.lock$/.test(uri.path));
478478
onRelevantRepositoryChange(this.onFSChange, this, this.disposables);
479479

@@ -760,7 +760,8 @@ export class Repository implements Disposable {
760760
return this.run(Operation.CheckIgnore, () => {
761761
return new Promise<Set<string>>((resolve, reject) => {
762762

763-
filePaths = filePaths.filter(filePath => !path.relative(this.root, filePath).startsWith('..'));
763+
filePaths = filePaths
764+
.filter(filePath => isDescendant(this.root, filePath));
764765

765766
if (filePaths.length === 0) {
766767
// nothing left

extensions/git/src/util.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
'use strict';
77

88
import { Event } from 'vscode';
9-
import { dirname } from 'path';
9+
import { dirname, sep } from 'path';
1010
import { Readable } from 'stream';
1111
import * as fs from 'fs';
1212
import * as byline from 'byline';
@@ -273,4 +273,16 @@ export function detectUnicodeEncoding(buffer: Buffer): Encoding | null {
273273
}
274274

275275
return null;
276-
}
276+
}
277+
278+
export function isDescendant(parent: string, descendant: string): boolean {
279+
if (parent === descendant) {
280+
return true;
281+
}
282+
283+
if (parent.charAt(parent.length - 1) !== sep) {
284+
parent += sep;
285+
}
286+
287+
return descendant.startsWith(parent);
288+
}

0 commit comments

Comments
 (0)