Skip to content

Commit 25ccf69

Browse files
sergeibbbaxosoft-ramint
authored andcommitted
Implements getPullRequestForCommit for AzureDevOps
(#4192, #4243)
1 parent db6e8b3 commit 25ccf69

File tree

2 files changed

+70
-6
lines changed

2 files changed

+70
-6
lines changed

src/plus/integrations/providers/azure/azure.ts

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,63 @@ export class AzureDevOpsApi implements Disposable {
113113
}
114114
}
115115

116+
@debug<AzureDevOpsApi['getPullRequestForCommit']>({ args: { 0: p => p.name, 1: '<token>' } })
117+
async getPullRequestForCommit(
118+
provider: Provider,
119+
token: string,
120+
owner: string,
121+
repo: string,
122+
rev: string,
123+
baseUrl: string,
124+
_options?: {
125+
avatarSize?: number;
126+
},
127+
cancellation?: CancellationToken,
128+
): Promise<PullRequest | undefined> {
129+
const scope = getLogScope();
130+
const [projectName, _, repoName] = repo.split('/');
131+
try {
132+
const prResult = await this.request<{ results: Record<string, AzurePullRequest[]>[] }>(
133+
provider,
134+
token,
135+
baseUrl,
136+
`${owner}/${projectName}/_apis/git/repositories/${repoName}/pullrequestquery?api-version=7.1`,
137+
{
138+
method: 'POST',
139+
body: JSON.stringify({
140+
queries: [
141+
{
142+
items: [rev],
143+
type: 'commit',
144+
},
145+
],
146+
}),
147+
},
148+
scope,
149+
cancellation,
150+
);
151+
152+
const pr = prResult?.results[0]?.[rev]?.[0];
153+
if (pr == null) return undefined;
154+
155+
const pullRequest = await this.request<AzurePullRequestWithLinks>(
156+
provider,
157+
token,
158+
undefined,
159+
pr.url,
160+
{ method: 'GET' },
161+
scope,
162+
cancellation,
163+
);
164+
if (pullRequest == null) return undefined;
165+
166+
return fromAzurePullRequest(pullRequest, provider, owner);
167+
} catch (ex) {
168+
Logger.error(ex, scope);
169+
return undefined;
170+
}
171+
}
172+
116173
@debug<AzureDevOpsApi['getIssueOrPullRequest']>({ args: { 0: p => p.name, 1: '<token>' } })
117174
public async getIssueOrPullRequest(
118175
provider: Provider,
@@ -311,13 +368,13 @@ export class AzureDevOpsApi implements Disposable {
311368
private async request<T>(
312369
provider: Provider,
313370
token: string,
314-
baseUrl: string,
371+
baseUrl: string | undefined,
315372
route: string,
316373
options: { method: RequestInit['method'] } & Record<string, unknown>,
317374
scope: LogScope | undefined,
318375
cancellation?: CancellationToken | undefined,
319376
): Promise<T | undefined> {
320-
const url = `${baseUrl}/${route}`;
377+
const url = baseUrl ? `${baseUrl}/${route}` : route;
321378

322379
let rsp: Response;
323380
try {

src/plus/integrations/providers/azureDevOps.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -302,11 +302,18 @@ export class AzureDevOpsIntegration extends HostingIntegration<
302302
}
303303

304304
protected override async getProviderPullRequestForCommit(
305-
_session: AuthenticationSession,
306-
_repo: AzureRepositoryDescriptor,
307-
_rev: string,
305+
{ accessToken }: AuthenticationSession,
306+
repo: AzureRepositoryDescriptor,
307+
rev: string,
308308
): Promise<PullRequest | undefined> {
309-
return Promise.resolve(undefined);
309+
return (await this.container.azure)?.getPullRequestForCommit(
310+
this,
311+
accessToken,
312+
repo.owner,
313+
repo.name,
314+
rev,
315+
this.apiBaseUrl,
316+
);
310317
}
311318

312319
public override async getRepoInfo(repo: {

0 commit comments

Comments
 (0)