diff --git a/packages/source-control-azure-devops/src/server/AzureDevOpsCli.test.ts b/packages/source-control-azure-devops/src/server/AzureDevOpsCli.test.ts index ff2ddd0339979..3cb69661997b6 100644 --- a/packages/source-control-azure-devops/src/server/AzureDevOpsCli.test.ts +++ b/packages/source-control-azure-devops/src/server/AzureDevOpsCli.test.ts @@ -198,6 +198,41 @@ describe("AzureDevOpsCli.layer", () => { }).pipe(Effect.provide(layer)), ); + it.effect("looks up a project/repository path as that project's repository", () => + Effect.gen(function* () { + mockRun.mockReturnValueOnce( + Effect.succeed( + processOutput( + JSON.stringify({ + name: "repo", + webUrl: "https://dev.azure.com/acme/project/_git/repo", + remoteUrl: "https://dev.azure.com/acme/project/_git/repo", + sshUrl: "git@ssh.dev.azure.com:v3/acme/project/repo", + project: { name: "project" }, + }), + ), + ), + ); + + const az = yield* AzureDevOpsCli.AzureDevOpsCli; + yield* az.getRepositoryCloneUrls({ cwd: "/somewhere", repository: "project/repo" }); + + assert.deepStrictEqual(mockRun.mock.calls.at(-1)?.[0].args, [ + "repos", + "show", + "--detect", + "true", + "--repository", + "repo", + "--project", + "project", + "--only-show-errors", + "--output", + "json", + ]); + }).pipe(Effect.provide(layer)), + ); + it.effect("preserves VCS causes without copying upstream details into messages", () => Effect.gen(function* () { const cause = new VcsProcessExitError({ diff --git a/packages/source-control-azure-devops/src/server/AzureDevOpsCli.ts b/packages/source-control-azure-devops/src/server/AzureDevOpsCli.ts index ec3985fa6a2ce..57b9f4086cdaa 100644 --- a/packages/source-control-azure-devops/src/server/AzureDevOpsCli.ts +++ b/packages/source-control-azure-devops/src/server/AzureDevOpsCli.ts @@ -477,9 +477,18 @@ export const make = Effect.gen(function* () { ); }), getRepositoryCloneUrls: Effect.fn("AzureDevOpsCli.getRepositoryCloneUrls")(function (input) { + const repository = parseRepositorySpecifier(input.repository); return executeJson({ cwd: input.cwd, - args: ["repos", "show", "--detect", "true", "--repository", input.repository], + args: [ + "repos", + "show", + "--detect", + "true", + "--repository", + repository.name, + ...(repository.project ? ["--project", repository.project] : []), + ], }).pipe( Effect.map((result) => result.stdout.trim()), Effect.flatMap((raw) =>