Skip to content

Commit ced4a9b

Browse files
committed
Retrieves a pull request from Azure
(#3977, #3996)
1 parent 3283ac9 commit ced4a9b

File tree

2 files changed

+109
-3
lines changed

2 files changed

+109
-3
lines changed

Diff for: src/plus/integrations/providers/azure/azure.ts

+42-3
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,14 @@ import { Logger } from '../../../../system/logger';
2222
import type { LogScope } from '../../../../system/logger.scope';
2323
import { getLogScope } from '../../../../system/logger.scope';
2424
import { maybeStopWatch } from '../../../../system/stopwatch';
25-
import type { AzureWorkItemState, AzureWorkItemStateCategory, WorkItem } from './models';
26-
import { azureWorkItemsStateCategoryToState, isClosedAzureWorkItemStateCategory } from './models';
25+
import type { AzurePullRequest, AzureWorkItemState, AzureWorkItemStateCategory, WorkItem } from './models';
26+
import {
27+
azurePullRequestStatusToState,
28+
azureWorkItemsStateCategoryToState,
29+
getPullRequestUrl,
30+
isClosedAzurePullRequestStatus,
31+
isClosedAzureWorkItemStateCategory,
32+
} from './models';
2733

2834
export class AzureDevOpsApi implements Disposable {
2935
private readonly _disposable: Disposable;
@@ -71,7 +77,7 @@ export class AzureDevOpsApi implements Disposable {
7177
},
7278
): Promise<IssueOrPullRequest | undefined> {
7379
const scope = getLogScope();
74-
const [projectName] = repo.split('/');
80+
const [projectName, _, repoName] = repo.split('/');
7581

7682
try {
7783
// Try to get the Work item (wit) first with specific fields
@@ -112,6 +118,39 @@ export class AzureDevOpsApi implements Disposable {
112118
url: issueResult._links.html.href,
113119
};
114120
}
121+
} catch (ex) {
122+
if (ex.original?.status !== 404) {
123+
Logger.error(ex, scope);
124+
return undefined;
125+
}
126+
}
127+
128+
try {
129+
const prResult = await this.request<AzurePullRequest>(
130+
provider,
131+
token,
132+
options?.baseUrl,
133+
`${owner}/${projectName}/_apis/git/repositories/${repoName}/pullRequests/${id}`,
134+
{
135+
method: 'GET',
136+
},
137+
scope,
138+
);
139+
140+
if (prResult != null) {
141+
return {
142+
id: prResult.pullRequestId.toString(),
143+
type: 'pullrequest',
144+
nodeId: prResult.pullRequestId.toString(), // prResult.artifactId maybe?
145+
provider: provider,
146+
createdDate: new Date(prResult.creationDate),
147+
updatedDate: new Date(prResult.creationDate),
148+
state: azurePullRequestStatusToState(prResult.status),
149+
closed: isClosedAzurePullRequestStatus(prResult.status),
150+
title: prResult.title,
151+
url: getPullRequestUrl(options.baseUrl, owner, projectName, repoName, prResult.pullRequestId),
152+
};
153+
}
115154

116155
return undefined;
117156
} catch (ex) {

Diff for: src/plus/integrations/providers/azure/models.ts

+67
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,70 @@ export interface AzureWorkItemState {
7575
color: string;
7676
category: AzureWorkItemStateCategory;
7777
}
78+
79+
export type AzurePullRequestStatus = 'abandoned' | 'active' | 'completed' | 'notSet';
80+
export function azurePullRequestStatusToState(status: AzurePullRequestStatus): IssueOrPullRequestState {
81+
switch (status) {
82+
case 'abandoned':
83+
return 'closed';
84+
case 'completed':
85+
return 'merged';
86+
case 'active':
87+
case 'notSet':
88+
default:
89+
return 'opened';
90+
}
91+
}
92+
export function isClosedAzurePullRequestStatus(status: AzurePullRequestStatus): boolean {
93+
return azurePullRequestStatusToState(status) !== 'opened';
94+
}
95+
96+
export function getPullRequestUrl(
97+
baseUrl: string,
98+
owner: string,
99+
projectName: string,
100+
repoName: string,
101+
pullRequestId: number,
102+
): string {
103+
return `${baseUrl}/${owner}/${projectName}/_git/${repoName}/pullrequest/${pullRequestId}`;
104+
}
105+
106+
export interface AzurePullRequest {
107+
repository: unknown;
108+
pullRequestId: number;
109+
codeReviewId: number;
110+
status: AzurePullRequestStatus;
111+
createdBy: AzureUser;
112+
creationDate: string;
113+
closedDate: string;
114+
title: string;
115+
description: string;
116+
sourceRefName: string;
117+
targetRefName: string;
118+
isDraft: boolean;
119+
mergeId: string;
120+
lastMergeSourceCommit: {
121+
commitId: string;
122+
url: string;
123+
};
124+
lastMergeTargetCommit: {
125+
commitId: string;
126+
url: string;
127+
};
128+
reviewers: unknown[];
129+
url: string;
130+
_links: {
131+
self: AzureLink;
132+
repository: AzureLink;
133+
workItems: AzureLink;
134+
sourceBranch: AzureLink;
135+
targetBranch: AzureLink;
136+
statuses: AzureLink;
137+
sourceCommit: AzureLink;
138+
targetCommit: AzureLink;
139+
createdBy: AzureLink;
140+
iterations: AzureLink;
141+
};
142+
supportsIterations: boolean;
143+
artifactId: string;
144+
}

0 commit comments

Comments
 (0)