diff --git a/.github/workflows/label-workstream-rollup.yml b/.github/workflows/label-workstream-rollup.yml index 38707bac7b..502f396244 100644 --- a/.github/workflows/label-workstream-rollup.yml +++ b/.github/workflows/label-workstream-rollup.yml @@ -23,7 +23,9 @@ jobs: const allowedParentUrls = [ 'https://github.com/google-gemini/gemini-cli/issues/15374', 'https://github.com/google-gemini/gemini-cli/issues/15456', - 'https://github.com/google-gemini/gemini-cli/issues/15324' + 'https://github.com/google-gemini/gemini-cli/issues/15324', + 'https://github.com/google-gemini/gemini-cli/issues/17202', + 'https://github.com/google-gemini/gemini-cli/issues/17203' ]; async function getIssueParent(owner, repo, number) { @@ -33,6 +35,7 @@ jobs: issue(number:$number) { parent { url + number } } } @@ -40,7 +43,7 @@ jobs: `; try { const result = await github.graphql(query, { owner, repo, number }); - return result.repository.issue.parent ? result.repository.issue.parent.url : null; + return result.repository.issue.parent || null; } catch (error) { console.error(`Failed to fetch parent for #${number}:`, error); return null; @@ -75,20 +78,38 @@ jobs: console.log(`Processing ${issuesToProcess.length} issue(s)...`); for (const issue of issuesToProcess) { - const parentUrl = await getIssueParent(issue.owner, issue.repo, issue.number); + let currentNumber = issue.number; + let depth = 0; + const MAX_DEPTH = 5; // Safety limit for recursion + let matched = false; + let tracedParents = []; - if (parentUrl && allowedParentUrls.includes(parentUrl)) { - console.log(`SUCCESS: Issue #${issue.number} is a direct child of ${parentUrl}. Adding label.`); - await github.rest.issues.addLabels({ - owner: issue.owner, - repo: issue.repo, - issue_number: issue.number, - labels: [labelToAdd] - }); - } else { - // logging only for single execution to avoid spam - if (context.eventName === 'issues') { - console.log(`Issue #${issue.number} parent is ${parentUrl || 'None'}. No action.`); - } + while (depth < MAX_DEPTH) { + const parent = await getIssueParent(issue.owner, issue.repo, currentNumber); + + if (!parent) { + break; + } + + tracedParents.push(parent.url); + + if (allowedParentUrls.includes(parent.url)) { + console.log(`SUCCESS: Issue #${issue.number} is a descendant of ${parent.url}. Trace: ${tracedParents.join(' -> ')}. Adding label.`); + await github.rest.issues.addLabels({ + owner: issue.owner, + repo: issue.repo, + issue_number: issue.number, + labels: [labelToAdd] + }); + matched = true; + break; + } + + currentNumber = parent.number; + depth++; + } + + if (!matched && context.eventName === 'issues') { + console.log(`Issue #${issue.number} did not match any allowed workstreams after checking ${depth} levels. Trace: ${tracedParents.join(' -> ') || 'None'}.`); } }