Skip to content

Commit ac4f337

Browse files
committed
Add linked PR detection to GitHub workflow context
1 parent d276354 commit ac4f337

1 file changed

Lines changed: 77 additions & 45 deletions

File tree

.github/workflows/claude.yml

Lines changed: 77 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -100,88 +100,119 @@ jobs:
100100
uses: actions/github-script@v7
101101
with:
102102
script: |
103-
let issueNumber, prNumber, headRef, baseRef, headSha, isPR = false;
104-
let triggerText = '';
103+
let issueNumber, prNumber, headRef, baseRef, headSha
104+
let triggerText = ''
105+
let hasLinkedPR = false
106+
let isPR = false
105107
106108
if (context.eventName === 'pull_request_target') {
107109
// When a PR is created or updated
108-
isPR = true;
109-
issueNumber = context.payload.pull_request.number;
110-
prNumber = context.payload.pull_request.number;
111-
headRef = context.payload.pull_request.head.ref;
112-
baseRef = context.payload.pull_request.base.ref;
113-
headSha = context.payload.pull_request.head.sha;
114-
triggerText = context.payload.pull_request.body;
110+
isPR = true
111+
issueNumber = context.payload.pull_request.number
112+
prNumber = context.payload.pull_request.number
113+
headRef = context.payload.pull_request.head.ref
114+
baseRef = context.payload.pull_request.base.ref
115+
headSha = context.payload.pull_request.head.sha
116+
triggerText = context.payload.pull_request.body
115117
116-
console.log(`PR #${prNumber}: ${baseRef} <- ${headRef} (${headSha})`);
118+
console.log(`PR #${prNumber}: ${baseRef} <- ${headRef} (${headSha})`)
117119
118120
} else if (context.eventName === 'issues') {
119121
// When an Issue is created or assigned
120-
isPR = false;
121-
issueNumber = context.payload.issue.number;
122-
triggerText = `${context.payload.issue.title} ${context.payload.issue.body}`;
122+
isPR = false
123+
issueNumber = context.payload.issue.number
124+
triggerText = `${context.payload.issue.title} ${context.payload.issue.body}`
123125
124-
console.log(`Issue #${issueNumber} created`);
126+
console.log(`Issue #${issueNumber} created`)
125127
126128
} else if (context.eventName === 'issue_comment') {
127129
// Issue/PR comment
128-
issueNumber = context.payload.issue.number;
129-
triggerText = context.payload.comment.body;
130+
issueNumber = context.payload.issue.number
131+
triggerText = context.payload.comment.body
130132
131133
if (context.payload.issue.pull_request) {
132134
// Comment on a PR
133-
isPR = true;
135+
isPR = true
134136
try {
135137
const pr = await github.rest.pulls.get({
136138
owner: context.repo.owner,
137139
repo: context.repo.repo,
138140
pull_number: issueNumber
139-
});
140-
prNumber = issueNumber;
141-
headRef = pr.data.head.ref;
142-
baseRef = pr.data.base.ref;
143-
headSha = pr.data.head.sha;
141+
})
142+
prNumber = issueNumber
143+
headRef = pr.data.head.ref
144+
baseRef = pr.data.base.ref
145+
headSha = pr.data.head.sha
144146
145-
console.log(`PR Comment #${prNumber}: ${baseRef} <- ${headRef}`);
147+
console.log(`PR Comment #${prNumber}: ${baseRef} <- ${headRef}`)
146148
} catch (error) {
147-
console.error('Error fetching PR info:', error);
149+
console.error('Error fetching PR info:', error)
148150
// In case of error, treat as a regular Issue
149-
isPR = false;
151+
isPR = false
150152
}
151153
} else {
152-
// Regular Issue comment
153-
isPR = false;
154-
console.log(`Issue Comment #${issueNumber}`);
154+
// Regular Issue comment - check for existing linked PRs
155+
isPR = false
156+
157+
try {
158+
// Get timeline events to find linked pull requests
159+
const { data: timeline } = await github.rest.issues.listEventsForTimeline({
160+
owner: context.repo.owner,
161+
repo: context.repo.repo,
162+
issue_number: issueNumber,
163+
per_page: 100,
164+
headers: {
165+
accept: 'application/vnd.github.mockingbird-preview+json'
166+
}
167+
})
168+
169+
const linkedPRs = timeline.filter(event => event.event === 'connected')
170+
.map(event => event.source?.issue?.pull_request?.url)
171+
.filter(Boolean)
172+
173+
hasLinkedPR = linkedPRs.length > 0
174+
console.log(`Linked PRs: ${linkedPRs.join(', ') || 'None'}`)
175+
console.log(`Issue Comment #${issueNumber}, already has linked PR: ${hasLinkedPR}`)
176+
177+
} catch (error) {
178+
console.error('Error checking for linked PRs:', error)
179+
}
155180
}
156181
157182
} else if (context.eventName === 'pull_request_review_comment' || context.eventName === 'pull_request_review') {
158183
// PR review related
159-
isPR = true;
160-
issueNumber = context.payload.pull_request.number;
161-
prNumber = context.payload.pull_request.number;
162-
headRef = context.payload.pull_request.head.ref;
163-
baseRef = context.payload.pull_request.base.ref;
164-
headSha = context.payload.pull_request.head.sha;
184+
isPR = true
185+
issueNumber = context.payload.pull_request.number
186+
prNumber = context.payload.pull_request.number
187+
headRef = context.payload.pull_request.head.ref
188+
baseRef = context.payload.pull_request.base.ref
189+
headSha = context.payload.pull_request.head.sha
165190
166191
if (context.eventName === 'pull_request_review_comment') {
167-
triggerText = context.payload.comment.body;
192+
triggerText = context.payload.comment.body
168193
} else {
169-
triggerText = context.payload.review.body;
194+
triggerText = context.payload.review.body
170195
}
171196
172-
console.log(`PR Review #${prNumber}: ${baseRef} <- ${headRef}`);
197+
console.log(`PR Review #${prNumber}: ${baseRef} <- ${headRef}`)
173198
}
174199
175200
// Set outputs
176-
core.setOutput('issue-number', issueNumber);
177-
core.setOutput('pr-number', prNumber || '');
178-
core.setOutput('head-ref', headRef || '');
179-
core.setOutput('base-ref', baseRef || '');
180-
core.setOutput('head-sha', headSha || '');
181-
core.setOutput('is-pr', isPR);
182-
core.setOutput('trigger-text', triggerText);
201+
core.setOutput('issue-number', issueNumber)
202+
core.setOutput('pr-number', prNumber || '')
203+
core.setOutput('head-ref', headRef || '')
204+
core.setOutput('base-ref', baseRef || '')
205+
core.setOutput('head-sha', headSha || '')
206+
core.setOutput('is-pr', isPR)
207+
core.setOutput('trigger-text', triggerText)
208+
core.setOutput('has-linked-pr', hasLinkedPR)
183209
184-
console.log(`Final Context: Issue #${issueNumber}, isPR: ${isPR}, Event: ${context.eventName}`);
210+
console.log(`Final Context:`)
211+
console.log(`Event: ${context.eventName}`)
212+
console.log(`Issue #${issueNumber}`)
213+
console.log(`isPR: ${isPR}`)
214+
console.log(`Trigger Text: ${triggerText}`)
215+
console.log(`Already has linked PR: ${hasLinkedPR}`)
185216
186217
- name: Validate Environment
187218
run: |
@@ -196,6 +227,7 @@ jobs:
196227
echo "Head Ref: ${{ steps.context-info.outputs.head-ref }}"
197228
echo "Base Ref: ${{ steps.context-info.outputs.base-ref }}"
198229
echo "Head SHA: ${{ steps.context-info.outputs.head-sha }}"
230+
echo "Has Linked PR: ${{ steps.context-info.outputs.has-linked-pr }}"
199231
echo "=================================="
200232
201233
# Check for secrets

0 commit comments

Comments
 (0)