Skip to content

Commit 81408f8

Browse files
committed
Retrieves a pull request from Azure
(#3977, #3996)
1 parent 348cdb8 commit 81408f8

File tree

2 files changed

+98
-3
lines changed

2 files changed

+98
-3
lines changed

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

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,13 @@ 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+
isClosedAzurePullRequestStatus,
30+
isClosedAzureWorkItemStateCategory,
31+
} from './models';
2732

2833
export class AzureDevOpsApi implements Disposable {
2934
private readonly _disposable: Disposable;
@@ -71,7 +76,7 @@ export class AzureDevOpsApi implements Disposable {
7176
},
7277
): Promise<IssueOrPullRequest | undefined> {
7378
const scope = getLogScope();
74-
const [projectName] = repo.split('/');
79+
const [projectName, _, repoName] = repo.split('/');
7580

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

116154
return undefined;
117155
} catch (ex) {

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,60 @@ 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 interface AzurePullRequest {
97+
repository: unknown;
98+
pullRequestId: number;
99+
codeReviewId: number;
100+
status: AzurePullRequestStatus;
101+
createdBy: AzureUser;
102+
creationDate: string;
103+
closedDate: string;
104+
title: string;
105+
description: string;
106+
sourceRefName: string;
107+
targetRefName: string;
108+
isDraft: boolean;
109+
mergeId: string;
110+
lastMergeSourceCommit: {
111+
commitId: string;
112+
url: string;
113+
};
114+
lastMergeTargetCommit: {
115+
commitId: string;
116+
url: string;
117+
};
118+
reviewers: unknown[];
119+
url: string;
120+
_links: {
121+
self: AzureLink;
122+
repository: AzureLink;
123+
workItems: AzureLink;
124+
sourceBranch: AzureLink;
125+
targetBranch: AzureLink;
126+
statuses: AzureLink;
127+
sourceCommit: AzureLink;
128+
targetCommit: AzureLink;
129+
createdBy: AzureLink;
130+
iterations: AzureLink;
131+
};
132+
supportsIterations: boolean;
133+
artifactId: string;
134+
}

0 commit comments

Comments
 (0)