in src/github/activityBarViewProvider.ts [125:220]
public async updatePullRequest(pullRequestModel: PullRequestModel): Promise<void> {
if (!this._prChangeListener || (pullRequestModel.number !== this._item.number)) {
this._prChangeListener?.dispose();
this._prChangeListener = pullRequestModel.onDidInvalidate(() => this.updatePullRequest(pullRequestModel));
}
return Promise.all([
this._folderRepositoryManager.resolvePullRequest(
pullRequestModel.remote.owner,
pullRequestModel.remote.repositoryName,
pullRequestModel.number,
),
this._folderRepositoryManager.getPullRequestRepositoryAccessAndMergeMethods(pullRequestModel),
pullRequestModel.getTimelineEvents(),
pullRequestModel.getReviewRequests(),
this._folderRepositoryManager.getBranchNameForPullRequest(pullRequestModel),
])
.then(result => {
const [pullRequest, repositoryAccess, timelineEvents, requestedReviewers, branchInfo] = result;
if (!pullRequest) {
throw new Error(
`Fail to resolve Pull Request #${pullRequestModel.number} in ${pullRequestModel.remote.owner}/${pullRequestModel.remote.repositoryName}`,
);
}
this._item = pullRequest;
if (!this._view) {
// If the there is no PR webview, then there is nothing else to update.
return;
}
this._view.title = `${pullRequest.title} #${pullRequestModel.number.toString()}`;
const isCurrentlyCheckedOut = pullRequestModel.equals(this._folderRepositoryManager.activePullRequest);
const hasWritePermission = repositoryAccess!.hasWritePermission;
const mergeMethodsAvailability = repositoryAccess!.mergeMethodsAvailability;
const canEdit = hasWritePermission || this._item.canEdit();
const preferredMergeMethod = vscode.workspace
.getConfiguration('githubPullRequests')
.get<MergeMethod>('defaultMergeMethod');
const defaultMergeMethod = getDefaultMergeMethod(mergeMethodsAvailability, preferredMergeMethod);
const currentUser = this._folderRepositoryManager.getCurrentUser(this._item);
this._existingReviewers = parseReviewers(
requestedReviewers ?? [],
timelineEvents ?? [],
pullRequest.author,
);
const isCrossRepository =
pullRequest.base &&
pullRequest.head &&
!pullRequest.base.repositoryCloneUrl.equals(pullRequest.head.repositoryCloneUrl);
const continueOnGitHub = isCrossRepository && isInCodespaces();
this._postMessage({
command: 'pr.initialize',
pullrequest: {
number: pullRequest.number,
title: pullRequest.title,
url: pullRequest.html_url,
createdAt: pullRequest.createdAt,
body: pullRequest.body,
bodyHTML: pullRequest.bodyHTML,
labels: pullRequest.item.labels,
author: {
login: pullRequest.author.login,
name: pullRequest.author.name,
avatarUrl: pullRequest.userAvatar,
url: pullRequest.author.url,
},
state: pullRequest.state,
isCurrentlyCheckedOut: isCurrentlyCheckedOut,
isRemoteBaseDeleted: pullRequest.isRemoteBaseDeleted,
base: pullRequest.base.label,
isRemoteHeadDeleted: pullRequest.isRemoteHeadDeleted,
isLocalHeadDeleted: !branchInfo,
head: pullRequest.head?.label ?? '',
canEdit: canEdit,
hasWritePermission,
mergeable: pullRequest.item.mergeable,
isDraft: pullRequest.isDraft,
status: { statuses: [] },
events: [],
mergeMethodsAvailability,
defaultMergeMethod,
isIssue: false,
isAuthor: currentUser.login === pullRequest.author.login,
reviewers: this._existingReviewers,
continueOnGitHub,
},
});
})
.catch(e => {
vscode.window.showErrorMessage(formatError(e));
});
}