diff --git a/src/vs/workbench/services/label/common/labelService.ts b/src/vs/workbench/services/label/common/labelService.ts index 75c13506c35d2ada2431ead79a6dec1fd4e847a5..9137da77e95aaf16ad55f7f1781aa2c8e37cddaf 100644 --- a/src/vs/workbench/services/label/common/labelService.ts +++ b/src/vs/workbench/services/label/common/labelService.ts @@ -149,6 +149,8 @@ export class LabelService extends Disposable implements ILabelService { while (relativeLabel[overlap] && relativeLabel[overlap] === baseResourceLabel[overlap]) { overlap++; } if (!relativeLabel[overlap] || relativeLabel[overlap] === formatting.separator) { relativeLabel = relativeLabel.substring(1 + overlap); + } else if (overlap === baseResourceLabel.length && baseResource.uri.path === '/') { + relativeLabel = relativeLabel.substring(overlap); } const hasMultipleRoots = this.contextService.getWorkspace().folders.length > 1; diff --git a/src/vs/workbench/services/label/test/browser/label.test.ts b/src/vs/workbench/services/label/test/browser/label.test.ts index 7f25ff89245e8e6850fe2081e32c1d22893442c2..7a032c47729c106b09b9564009e2a5b6c3d9f0ea 100644 --- a/src/vs/workbench/services/label/test/browser/label.test.ts +++ b/src/vs/workbench/services/label/test/browser/label.test.ts @@ -160,7 +160,7 @@ suite('URI Label', () => { }); -suite('multi-root worksapce', () => { +suite('multi-root workspace', () => { let labelService: LabelService; setup(() => { @@ -171,7 +171,7 @@ suite('multi-root worksapce', () => { labelService = new LabelService( TestEnvironmentService, new TestContextService( - new Workspace('test-workspaace', [ + new Workspace('test-workspace', [ new WorkspaceFolder({ uri: sources, index: 0, name: 'Sources' }, { uri: sources.toString() }), new WorkspaceFolder({ uri: tests, index: 1, name: 'Tests' }, { uri: tests.toString() }), new WorkspaceFolder({ uri: other, index: 2, name: resources.basename(other) }, { uri: other.toString() }), @@ -179,7 +179,7 @@ suite('multi-root worksapce', () => { new TestPathService()); }); - test('labels of files in multiroot workspaces are the foldername folloed by offset from the folder', () => { + test('labels of files in multiroot workspaces are the foldername followed by offset from the folder', () => { labelService.registerFormatter({ scheme: 'file', formatting: { @@ -250,3 +250,57 @@ suite('multi-root worksapce', () => { }); }); }); + +suite('workspace at FSP root', () => { + let labelService: LabelService; + + setup(() => { + const rootFolder = URI.parse('myscheme://myauthority/'); + + labelService = new LabelService( + TestEnvironmentService, + new TestContextService( + new Workspace('test-workspace', [ + new WorkspaceFolder({ uri: rootFolder, index: 0, name: 'FSProotFolder' }, { uri: rootFolder.toString() }), + ])), + new TestPathService()); + labelService.registerFormatter({ + scheme: 'myscheme', + formatting: { + label: '${scheme}://${authority}${path}', + separator: '/', + tildify: false, + normalizeDriveLetter: false, + workspaceSuffix: '', + authorityPrefix: '', + stripPathStartingSeparator: false + } + }); + }); + + test('non-relative label', () => { + + const tests = { + 'myscheme://myauthority/myFile1.txt': 'myscheme://myauthority/myFile1.txt', + 'myscheme://myauthority/folder/myFile2.txt': 'myscheme://myauthority/folder/myFile2.txt', + }; + + Object.entries(tests).forEach(([uriString, label]) => { + const generated = labelService.getUriLabel(URI.parse(uriString), { relative: false }); + assert.equal(generated, label); + }); + }); + + test('relative label', () => { + + const tests = { + 'myscheme://myauthority/myFile1.txt': 'myFile1.txt', + 'myscheme://myauthority/folder/myFile2.txt': 'folder/myFile2.txt', + }; + + Object.entries(tests).forEach(([uriString, label]) => { + const generated = labelService.getUriLabel(URI.parse(uriString), { relative: true }); + assert.equal(generated, label); + }); + }); +});