Skip to content

Commit c1d98c5

Browse files
sheetalkamatsnovader
authored andcommitted
Special case "/workspaces" for watching root so that codespaces work correctly (microsoft#55738)
1 parent d7bd5ae commit c1d98c5

File tree

32 files changed

+24886
-5
lines changed

32 files changed

+24886
-5
lines changed

src/compiler/resolutionCache.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ export function removeIgnoredPath(path: Path): Path | undefined {
226226
function perceivedOsRootLengthForWatching(pathComponents: Readonly<PathPathComponents>, length: number) {
227227
// Ignore "/", "c:/"
228228
if (length <= 1) return 1;
229-
let userCheckIndex = 1;
229+
let indexAfterOsRoot = 1;
230230
let isDosStyle = pathComponents[0].search(/[a-zA-Z]:/) === 0;
231231
if (
232232
pathComponents[0] !== directorySeparator &&
@@ -235,20 +235,25 @@ function perceivedOsRootLengthForWatching(pathComponents: Readonly<PathPathCompo
235235
) {
236236
// ignore "//vda1cs4850/c$/folderAtRoot"
237237
if (length === 2) return 2;
238-
userCheckIndex = 2;
238+
indexAfterOsRoot = 2;
239239
isDosStyle = true;
240240
}
241241

242242
if (
243243
isDosStyle &&
244-
!pathComponents[userCheckIndex].match(/^users$/i)
244+
!pathComponents[indexAfterOsRoot].match(/^users$/i)
245245
) {
246246
// Paths like c:/notUsers
247-
return userCheckIndex;
247+
return indexAfterOsRoot;
248+
}
249+
250+
if (pathComponents[indexAfterOsRoot].match(/^workspaces$/i)) {
251+
// Paths like: /workspaces as codespaces hoist the repos in /workspaces so we have to exempt these from "2" level from root rule
252+
return indexAfterOsRoot + 1;
248253
}
249254

250255
// Paths like: c:/users/username or /home/username
251-
return userCheckIndex + 2;
256+
return indexAfterOsRoot + 2;
252257
}
253258

254259
/**

src/testRunner/unittests/canWatch.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ describe("unittests:: canWatch::", () => {
158158
getPathsOfDifferentFoldersWithUsers("user");
159159
getPathsOfDifferentFoldersWithUsers("usr");
160160
getPathsOfDifferentFoldersWithUsers("home");
161+
getPathsOfDifferentFoldersWithWorkspaces();
161162
baselineOsRoot(paths, longestPathLength, baseline);
162163
Baseline.runBaseline(`canWatch/${scenario}${suffix}.baseline.md`, baseline.join("\r\n"));
163164
function getPathsOfDifferentFoldersAt(root: ts.Path) {
@@ -175,6 +176,9 @@ describe("unittests:: canWatch::", () => {
175176
paths.push(users);
176177
getPathsOfDifferentFoldersAt(combinePaths(users, "username"));
177178
}
179+
function getPathsOfDifferentFoldersWithWorkspaces() {
180+
getPathsOfDifferentFoldersAt(combinePaths(osRoot, "workspaces"));
181+
}
178182
}
179183

180184
function combinePaths(path: string, addition: string, anotherAddition?: string): ts.Path {

src/testRunner/unittests/tsserver/watchEnvironment.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
setCompilerOptionsForInferredProjectsRequestForSession,
1616
TestSession,
1717
toExternalFiles,
18+
verifyGetErrRequest,
1819
} from "../helpers/tsserver";
1920
import {
2021
createServerHost,
@@ -495,3 +496,34 @@ describe("unittests:: tsserver:: watchEnvironment:: watchFile is single watcher
495496
baselineTsserverLogs("watchEnvironment", "when watchFile is single watcher per file", session);
496497
});
497498
});
499+
500+
describe("unittests:: tsserver:: watchEnvironment:: watching at workspaces codespaces style", () => {
501+
it("watching npm install in codespaces where workspaces folder is hosted at root", () => {
502+
const config: File = {
503+
path: "/workspaces/somerepo/src/tsconfig.json",
504+
content: "{}",
505+
};
506+
const main: File = {
507+
path: "/workspaces/somerepo/src/main.ts",
508+
content: `import { randomSeed } from "random-seed";\nrandomSeed();`,
509+
};
510+
const randomSeed: File = {
511+
path: "/workspaces/somerepo/node_modules/@types/random-seed/index.d.ts",
512+
content: `export function randomSeed(): string;`,
513+
};
514+
const host = createServerHost([config, main, randomSeed, libFile], { inodeWatching: true, runWithoutRecursiveWatches: true });
515+
const session = createSession(host, { logger: createLoggerWithInMemoryLogs(host), canUseEvents: true, noGetErrOnBackgroundUpdate: true });
516+
openFilesForSession([main], session);
517+
verifyGetErrRequest({ session, files: [main] });
518+
// npm ci
519+
// clear part
520+
host.deleteFolder("/workspaces/somerepo/node_modules", /*recursive*/ true);
521+
verifyGetErrRequest({ session, files: [main], existingTimeouts: true });
522+
host.runQueuedTimeoutCallbacks();
523+
// Install part
524+
host.ensureFileOrFolder(randomSeed);
525+
verifyGetErrRequest({ session, files: [main], existingTimeouts: true });
526+
host.runQueuedTimeoutCallbacks();
527+
baselineTsserverLogs("watchEnvironment", "watching npm install in codespaces where workspaces folder is hosted at root", session);
528+
});
529+
});

tests/baselines/reference/canWatch/canWatchAffectingLocationDos.baseline.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,11 @@ Determines if package.json that was found during module resolution and change in
4545
| c:/home/username/folderAtRoot/folder1/folder2/folder3/package.json | true |
4646
| c:/home/username/folderAtRoot/folder1/folder2/folder3/folder4/package.json | true |
4747
| c:/home/username/folderAtRoot/folder1/folder2/folder3/folder4/folder5/package.json | true |
48+
| c:/workspaces/package.json | true |
49+
| c:/workspaces/folderAtRoot/package.json | true |
50+
| c:/workspaces/folderAtRoot/folder1/package.json | true |
51+
| c:/workspaces/folderAtRoot/folder1/folder2/package.json | true |
52+
| c:/workspaces/folderAtRoot/folder1/folder2/folder3/package.json | true |
53+
| c:/workspaces/folderAtRoot/folder1/folder2/folder3/folder4/package.json | true |
54+
| c:/workspaces/folderAtRoot/folder1/folder2/folder3/folder4/folder5/package.json | true |
4855

tests/baselines/reference/canWatch/canWatchAffectingLocationPosix.baseline.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,11 @@ Determines if package.json that was found during module resolution and change in
4545
| /home/username/folderAtRoot/folder1/folder2/folder3/package.json | true |
4646
| /home/username/folderAtRoot/folder1/folder2/folder3/folder4/package.json | true |
4747
| /home/username/folderAtRoot/folder1/folder2/folder3/folder4/folder5/package.json | true |
48+
| /workspaces/package.json | false |
49+
| /workspaces/folderAtRoot/package.json | true |
50+
| /workspaces/folderAtRoot/folder1/package.json | true |
51+
| /workspaces/folderAtRoot/folder1/folder2/package.json | true |
52+
| /workspaces/folderAtRoot/folder1/folder2/folder3/package.json | true |
53+
| /workspaces/folderAtRoot/folder1/folder2/folder3/folder4/package.json | true |
54+
| /workspaces/folderAtRoot/folder1/folder2/folder3/folder4/folder5/package.json | true |
4855

tests/baselines/reference/canWatch/canWatchAffectingLocationUnc.baseline.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,11 @@ Determines if package.json that was found during module resolution and change in
4545
| //vda1cs4850/home/username/folderAtRoot/folder1/folder2/folder3/package.json | true |
4646
| //vda1cs4850/home/username/folderAtRoot/folder1/folder2/folder3/folder4/package.json | true |
4747
| //vda1cs4850/home/username/folderAtRoot/folder1/folder2/folder3/folder4/folder5/package.json | true |
48+
| //vda1cs4850/workspaces/package.json | false |
49+
| //vda1cs4850/workspaces/folderAtRoot/package.json | true |
50+
| //vda1cs4850/workspaces/folderAtRoot/folder1/package.json | true |
51+
| //vda1cs4850/workspaces/folderAtRoot/folder1/folder2/package.json | true |
52+
| //vda1cs4850/workspaces/folderAtRoot/folder1/folder2/folder3/package.json | true |
53+
| //vda1cs4850/workspaces/folderAtRoot/folder1/folder2/folder3/folder4/package.json | true |
54+
| //vda1cs4850/workspaces/folderAtRoot/folder1/folder2/folder3/folder4/folder5/package.json | true |
4855

tests/baselines/reference/canWatch/canWatchAffectingLocationUncDos.baseline.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,11 @@ Determines if package.json that was found during module resolution and change in
4545
| //vda1cs4850/c$/home/username/folderAtRoot/folder1/folder2/folder3/package.json | true |
4646
| //vda1cs4850/c$/home/username/folderAtRoot/folder1/folder2/folder3/folder4/package.json | true |
4747
| //vda1cs4850/c$/home/username/folderAtRoot/folder1/folder2/folder3/folder4/folder5/package.json | true |
48+
| //vda1cs4850/c$/workspaces/package.json | true |
49+
| //vda1cs4850/c$/workspaces/folderAtRoot/package.json | true |
50+
| //vda1cs4850/c$/workspaces/folderAtRoot/folder1/package.json | true |
51+
| //vda1cs4850/c$/workspaces/folderAtRoot/folder1/folder2/package.json | true |
52+
| //vda1cs4850/c$/workspaces/folderAtRoot/folder1/folder2/folder3/package.json | true |
53+
| //vda1cs4850/c$/workspaces/folderAtRoot/folder1/folder2/folder3/folder4/package.json | true |
54+
| //vda1cs4850/c$/workspaces/folderAtRoot/folder1/folder2/folder3/folder4/folder5/package.json | true |
4855

tests/baselines/reference/canWatch/canWatchAtTypesDos.baseline.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,11 @@ These are the typeRoots calculated because user didnt specify typeRoots in compi
4646
| c:/home/username/folderAtRoot/folder1/folder2/folder3/node_modules/@types | true |
4747
| c:/home/username/folderAtRoot/folder1/folder2/folder3/folder4/node_modules/@types | true |
4848
| c:/home/username/folderAtRoot/folder1/folder2/folder3/folder4/folder5/node_modules/@types | true |
49+
| c:/workspaces/node_modules/@types | true |
50+
| c:/workspaces/folderAtRoot/node_modules/@types | true |
51+
| c:/workspaces/folderAtRoot/folder1/node_modules/@types | true |
52+
| c:/workspaces/folderAtRoot/folder1/folder2/node_modules/@types | true |
53+
| c:/workspaces/folderAtRoot/folder1/folder2/folder3/node_modules/@types | true |
54+
| c:/workspaces/folderAtRoot/folder1/folder2/folder3/folder4/node_modules/@types | true |
55+
| c:/workspaces/folderAtRoot/folder1/folder2/folder3/folder4/folder5/node_modules/@types | true |
4956

tests/baselines/reference/canWatch/canWatchAtTypesPosix.baseline.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,11 @@ These are the typeRoots calculated because user didnt specify typeRoots in compi
4646
| /home/username/folderAtRoot/folder1/folder2/folder3/node_modules/@types | true |
4747
| /home/username/folderAtRoot/folder1/folder2/folder3/folder4/node_modules/@types | true |
4848
| /home/username/folderAtRoot/folder1/folder2/folder3/folder4/folder5/node_modules/@types | true |
49+
| /workspaces/node_modules/@types | false |
50+
| /workspaces/folderAtRoot/node_modules/@types | true |
51+
| /workspaces/folderAtRoot/folder1/node_modules/@types | true |
52+
| /workspaces/folderAtRoot/folder1/folder2/node_modules/@types | true |
53+
| /workspaces/folderAtRoot/folder1/folder2/folder3/node_modules/@types | true |
54+
| /workspaces/folderAtRoot/folder1/folder2/folder3/folder4/node_modules/@types | true |
55+
| /workspaces/folderAtRoot/folder1/folder2/folder3/folder4/folder5/node_modules/@types | true |
4956

tests/baselines/reference/canWatch/canWatchAtTypesUnc.baseline.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,11 @@ These are the typeRoots calculated because user didnt specify typeRoots in compi
4646
| //vda1cs4850/home/username/folderAtRoot/folder1/folder2/folder3/node_modules/@types | true |
4747
| //vda1cs4850/home/username/folderAtRoot/folder1/folder2/folder3/folder4/node_modules/@types | true |
4848
| //vda1cs4850/home/username/folderAtRoot/folder1/folder2/folder3/folder4/folder5/node_modules/@types | true |
49+
| //vda1cs4850/workspaces/node_modules/@types | false |
50+
| //vda1cs4850/workspaces/folderAtRoot/node_modules/@types | true |
51+
| //vda1cs4850/workspaces/folderAtRoot/folder1/node_modules/@types | true |
52+
| //vda1cs4850/workspaces/folderAtRoot/folder1/folder2/node_modules/@types | true |
53+
| //vda1cs4850/workspaces/folderAtRoot/folder1/folder2/folder3/node_modules/@types | true |
54+
| //vda1cs4850/workspaces/folderAtRoot/folder1/folder2/folder3/folder4/node_modules/@types | true |
55+
| //vda1cs4850/workspaces/folderAtRoot/folder1/folder2/folder3/folder4/folder5/node_modules/@types | true |
4956

0 commit comments

Comments
 (0)