diff --git a/src/vs/base/common/labels.ts b/src/vs/base/common/labels.ts index 781725e6e0ab1208b8b502cbc9c70b6cd6037349..74f71985712dc77bf50b2565c9c0cb6461dea6e3 100644 --- a/src/vs/base/common/labels.ts +++ b/src/vs/base/common/labels.ts @@ -83,19 +83,22 @@ function getPath(arg1: URI | string | IWorkspaceProvider): string { */ export function shorten(paths: string[]): string[] { const ellipsis = '\u2026'; + const separator = '/'; const shortenedPaths: string[] = new Array(paths.length); + paths = paths.map(path => normalize(path)); + // for every path let match = false; for (let pathIndex = 0; pathIndex < paths.length; pathIndex++) { - const segments: string[] = paths[pathIndex].split(nativeSep); + const segments: string[] = paths[pathIndex].split(separator); match = true; // pick the first shortest subpath found for (let subpathLength = 1; match && subpathLength <= segments.length; subpathLength++) { for (let start = segments.length - subpathLength; match && start >= 0; start--) { match = false; - const subpath = segments.slice(start, start + subpathLength).join(nativeSep); + const subpath = segments.slice(start, start + subpathLength).join(separator); // that is unique to any other path for (let otherPathIndex = 0; !match && otherPathIndex < paths.length; otherPathIndex++) { @@ -113,11 +116,11 @@ export function shorten(paths: string[]): string[] { if (!match) { let result = subpath; if (start + subpathLength < segments.length) { - result = result + nativeSep + ellipsis; + result = result + separator + ellipsis; } if (start > 0) { - result = ellipsis + nativeSep + result; + result = ellipsis + separator + result; } shortenedPaths[pathIndex] = result; diff --git a/src/vs/base/test/common/labels.test.ts b/src/vs/base/test/common/labels.test.ts index ad3a39beb78cf008340f58e9954f80a0507e8e21..fa65f0868116197325770166ec343a1f199aaa8c 100644 --- a/src/vs/base/test/common/labels.test.ts +++ b/src/vs/base/test/common/labels.test.ts @@ -6,48 +6,45 @@ 'use strict'; import * as assert from 'assert'; -// import labels = require('vs/base/common/labels'); +import labels = require('vs/base/common/labels'); suite('Labels', () => { test('shorten', () => { - assert.ok(true); - // nothing to shorten - // assert.deepEqual(labels.shorten(['a']), ['a']); - // assert.deepEqual(labels.shorten(['a', 'b']), ['a', 'b']); - // assert.deepEqual(labels.shorten(['a', 'b', 'c']), ['a', 'b', 'c']); - - // // completely different paths - // assert.deepEqual(labels.shorten(['a\\b', 'c\\d', 'e\\f']), ['…\\b', '…\\d', '…\\f']); - - // // same beginning - // assert.deepEqual(labels.shorten(['a', 'a\\b']), ['a', '…\\b']); - // assert.deepEqual(labels.shorten(['a\\b', 'a\\b\\c']), ['…\\b', '…\\c']); - // assert.deepEqual(labels.shorten(['a', 'a\\b', 'a\\b\\c']), ['a', '…\\b', '…\\c']); - // assert.deepEqual(labels.shorten(['x:\\a\\b', 'x:\\a\\c']), ['…\\b', '…\\c'], 'TODO: drive letter (or schema) should be preserved'); - // assert.deepEqual(labels.shorten(['\\\\a\\b', '\\\\a\\c']), ['…\\b', '…\\c'], 'TODO: root uri should be preserved'); - - // // same ending - // assert.deepEqual(labels.shorten(['a', 'b\\a']), ['a', 'b\\…']); - // assert.deepEqual(labels.shorten(['a\\b\\c', 'd\\b\\c']), ['a\\…', 'd\\…']); - // assert.deepEqual(labels.shorten(['a\\b\\c\\d', 'f\\b\\c\\d']), ['a\\…', 'f\\…']); - // assert.deepEqual(labels.shorten(['d\\e\\a\\b\\c', 'd\\b\\c']), ['…\\a\\…', 'd\\b\\…']); - // assert.deepEqual(labels.shorten(['a\\b\\c\\d', 'a\\f\\b\\c\\d']), ['a\\b\\…', '…\\f\\…']); - // assert.deepEqual(labels.shorten(['a\\b\\a', 'b\\b\\a']), ['a\\b\\…', 'b\\b\\…']); - // assert.deepEqual(labels.shorten(['d\\f\\a\\b\\c', 'h\\d\\b\\c']), ['…\\a\\…', 'h\\…']); - // assert.deepEqual(labels.shorten(['a\\b\\c', 'x:\\0\\a\\b\\c']), ['a\\b\\c', '…\\0\\…'], 'TODO: drive letter (or schema) should be always preserved'); - // assert.deepEqual(labels.shorten(['x:\\a\\b', 'y:\\a\\b']), ['x:\\…', 'y:\\…']); - // assert.deepEqual(labels.shorten(['\\\\x\\b', '\\\\y\\b']), ['…\\x\\…', '…\\y\\…'], 'TODO: \\\\x instead of …\\x'); - - // // same in the middle - // assert.deepEqual(labels.shorten(['a\\b\\c', 'd\\b\\e']), ['…\\c', '…\\e']); - - // // case-sensetive - // assert.deepEqual(labels.shorten(['a\\b\\c', 'd\\b\\C']), ['…\\c', '…\\C']); - - // assert.deepEqual(labels.shorten(['a', 'a\\b', 'a\\b\\c', 'd\\b\\c', 'd\\b']), ['a', 'a\\b', 'a\\b\\c', 'd\\b\\c', 'd\\b']); - // assert.deepEqual(labels.shorten(['a', 'a\\b', 'b']), ['a', 'a\\b', 'b']); - // assert.deepEqual(labels.shorten(['', 'a', 'b', 'b\\c', 'a\\c']), ['', 'a', 'b', 'b\\c', 'a\\c']); - // assert.deepEqual(labels.shorten(['src\\vs\\workbench\\parts\\execution\\electron-browser', 'src\\vs\\workbench\\parts\\execution\\electron-browser\\something', 'src\\vs\\workbench\\parts\\terminal\\electron-browser']), ['…\\execution\\electron-browser', '…\\something', '…\\terminal\\…']); + assert.deepEqual(labels.shorten(['a']), ['a']); + assert.deepEqual(labels.shorten(['a', 'b']), ['a', 'b']); + assert.deepEqual(labels.shorten(['a', 'b', 'c']), ['a', 'b', 'c']); + + // completely different paths + assert.deepEqual(labels.shorten(['a/b', 'c/d', 'e/f']), ['…/b', '…/d', '…/f']); + + // same beginning + assert.deepEqual(labels.shorten(['a', 'a/b']), ['a', '…/b']); + assert.deepEqual(labels.shorten(['a/b', 'a/b/c']), ['…/b', '…/c']); + assert.deepEqual(labels.shorten(['a', 'a/b', 'a/b/c']), ['a', '…/b', '…/c']); + assert.deepEqual(labels.shorten(['x:/a/b', 'x:/a/c']), ['…/b', '…/c'], 'TODO: drive letter (or schema) should be preserved'); + assert.deepEqual(labels.shorten(['//a/b', '//a/c']), ['…/b', '…/c'], 'TODO: root uri should be preserved'); + + // same ending + assert.deepEqual(labels.shorten(['a', 'b/a']), ['a', 'b/…']); + assert.deepEqual(labels.shorten(['a/b/c', 'd/b/c']), ['a/…', 'd/…']); + assert.deepEqual(labels.shorten(['a/b/c/d', 'f/b/c/d']), ['a/…', 'f/…']); + assert.deepEqual(labels.shorten(['d/e/a/b/c', 'd/b/c']), ['…/a/…', 'd/b/…']); + assert.deepEqual(labels.shorten(['a/b/c/d', 'a/f/b/c/d']), ['a/b/…', '…/f/…']); + assert.deepEqual(labels.shorten(['a/b/a', 'b/b/a']), ['a/b/…', 'b/b/…']); + assert.deepEqual(labels.shorten(['d/f/a/b/c', 'h/d/b/c']), ['…/a/…', 'h/…']); + assert.deepEqual(labels.shorten(['a/b/c', 'x:/0/a/b/c']), ['a/b/c', '…/0/…'], 'TODO: drive letter (or schema) should be always preserved'); + assert.deepEqual(labels.shorten(['x:/a/b', 'y:/a/b']), ['x:/…', 'y:/…']); + assert.deepEqual(labels.shorten(['//x/b', '//y/b']), ['…/x/…', '…/y/…'], 'TODO: //x instead of …/x'); + + // same in the middle + assert.deepEqual(labels.shorten(['a/b/c', 'd/b/e']), ['…/c', '…/e']); + + // case-sensitive + assert.deepEqual(labels.shorten(['a/b/c', 'd/b/C']), ['…/c', '…/C']); + + assert.deepEqual(labels.shorten(['a', 'a/b', 'a/b/c', 'd/b/c', 'd/b']), ['a', 'a/b', 'a/b/c', 'd/b/c', 'd/b']); + assert.deepEqual(labels.shorten(['a', 'a/b', 'b']), ['a', 'a/b', 'b']); + assert.deepEqual(labels.shorten(['', 'a', 'b', 'b/c', 'a/c']), ['.', 'a', 'b', 'b/c', 'a/c']); }); }); \ No newline at end of file