Skip to content

Commit b48ffae

Browse files
committed
Fix merging as admin
1 parent ee59f86 commit b48ffae

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

src/browser/components/pr-overview.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ export const PROverview = memo(function PROverview() {
140140

141141
// Viewer permissions from GraphQL (more reliable than REST)
142142
const [viewerPermission, setViewerPermission] = useState<string | null>(null);
143+
// Whether the viewer can bypass branch protections (from GraphQL pullRequest.viewerCanMergeAsAdmin)
144+
const [viewerCanMergeAsAdmin, setViewerCanMergeAsAdmin] = useState(false);
143145

144146
// Repo permissions - use GraphQL viewerPermission as primary source
145147
const isArchived = pr.base?.repo?.archived ?? false;
@@ -272,6 +274,7 @@ export const PROverview = memo(function PROverview() {
272274
github.getReviewThreads(owner, repo, pr.number).catch(() => ({
273275
threads: [] as ReviewThread[],
274276
viewerPermission: null,
277+
viewerCanMergeAsAdmin: false,
275278
})),
276279
]);
277280

@@ -294,6 +297,7 @@ export const PROverview = memo(function PROverview() {
294297
setTimeline(timelineData);
295298
setReviewThreads(reviewThreadsResult.threads);
296299
setViewerPermission(reviewThreadsResult.viewerPermission);
300+
setViewerCanMergeAsAdmin(reviewThreadsResult.viewerCanMergeAsAdmin);
297301

298302
// Check if branch was already deleted (and not restored) from timeline
299303
// Branch is deleted if there are more delete events than restore events
@@ -1107,7 +1111,7 @@ export const PROverview = memo(function PROverview() {
11071111
}
11081112
approvingWorkflows={approvingWorkflows}
11091113
onApproveWorkflows={handleApproveWorkflows}
1110-
canBypassBranchProtections={viewerPermission === "ADMIN"}
1114+
canBypassBranchProtections={viewerCanMergeAsAdmin}
11111115
/>
11121116
{/* Still in progress - only show if NOT a draft and user can merge */}
11131117
{canMergeRepo && !pr.draft && (
@@ -3046,8 +3050,10 @@ function MergeSection({
30463050
<p className="text-sm text-destructive">{mergeError}</p>
30473051
)}
30483052

3049-
{/* Bypass rules checkbox - only show for users who can bypass branch protections */}
3050-
{canBypassBranchProtections && (
3053+
{/* Bypass rules checkbox - only show when:
3054+
1. User can bypass branch protections (viewerCanMergeAsAdmin)
3055+
2. AND there are actually unmet requirements (something to bypass) */}
3056+
{canBypassBranchProtections && overallStatus !== "success" && (
30513057
<label className="flex items-start gap-2 cursor-pointer group">
30523058
<Checkbox
30533059
checked={bypassRules}

src/browser/components/pr-review.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ export function PRReviewContent({
197197
const [files, setFiles] = useState<PullRequestFile[]>([]);
198198
const [comments, setComments] = useState<ReviewComment[]>([]);
199199
const [viewerPermission, setViewerPermission] = useState<string | null>(null);
200+
const [viewerCanMergeAsAdmin, setViewerCanMergeAsAdmin] = useState(false);
200201
const [loading, setLoading] = useState(true);
201202
const [error, setError] = useState<string | null>(null);
202203

@@ -219,13 +220,15 @@ export function PRReviewContent({
219220
github.getReviewThreads(owner, repo, number).catch(() => ({
220221
threads: [],
221222
viewerPermission: null,
223+
viewerCanMergeAsAdmin: false,
222224
})),
223225
]);
224226

225227
setPr(prData);
226228
setFiles(filesData);
227229
setComments(commentsData as ReviewComment[]);
228230
setViewerPermission(reviewThreadsResult.viewerPermission);
231+
setViewerCanMergeAsAdmin(reviewThreadsResult.viewerCanMergeAsAdmin);
229232

230233
// Track PR viewed
231234
track("pr_viewed", {

src/browser/contexts/github.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2267,13 +2267,18 @@ function createGitHubStore() {
22672267
owner: string,
22682268
repo: string,
22692269
number: number
2270-
): Promise<{ threads: ReviewThread[]; viewerPermission: string | null }> {
2270+
): Promise<{
2271+
threads: ReviewThread[];
2272+
viewerPermission: string | null;
2273+
viewerCanMergeAsAdmin: boolean;
2274+
}> {
22712275
if (!batcher) throw new Error("Not initialized");
22722276

22732277
const data = await batcher.query<{
22742278
repository: {
22752279
viewerPermission: string | null;
22762280
pullRequest: {
2281+
viewerCanMergeAsAdmin: boolean;
22772282
reviewThreads: { nodes: ReviewThread[] };
22782283
};
22792284
};
@@ -2283,6 +2288,7 @@ function createGitHubStore() {
22832288
repository(owner: $owner, name: $repo) {
22842289
viewerPermission
22852290
pullRequest(number: $number) {
2291+
viewerCanMergeAsAdmin
22862292
reviewThreads(first: 100) {
22872293
nodes {
22882294
id
@@ -2316,6 +2322,7 @@ function createGitHubStore() {
23162322
return {
23172323
threads: data.repository.pullRequest.reviewThreads.nodes,
23182324
viewerPermission: data.repository.viewerPermission,
2325+
viewerCanMergeAsAdmin: data.repository.pullRequest.viewerCanMergeAsAdmin,
23192326
};
23202327
}
23212328

0 commit comments

Comments
 (0)