diff --git a/actions/issueflow-reconcile/action.yml b/actions/issueflow-reconcile/action.yml index bfd7886..6a6cf22 100644 --- a/actions/issueflow-reconcile/action.yml +++ b/actions/issueflow-reconcile/action.yml @@ -7,4 +7,7 @@ runs: shell: bash env: LABELS_CONF: ${{ github.workspace }}/.github/labels.conf + EVENT_NAME: ${{ github.event_name }} + EVENT_ACTION: ${{ github.event.action }} + EVENT_ISSUE: ${{ github.event.issue.number }} run: bash "$GITHUB_ACTION_PATH/issueflow-reconcile.sh" diff --git a/actions/issueflow-reconcile/issueflow-reconcile.sh b/actions/issueflow-reconcile/issueflow-reconcile.sh index d0b730b..0dbdc49 100644 --- a/actions/issueflow-reconcile/issueflow-reconcile.sh +++ b/actions/issueflow-reconcile/issueflow-reconcile.sh @@ -143,24 +143,7 @@ last_issue_activity() { } reconcile_issue() { - local n="$1" author triage=false decision refs states age assignees open_pr=false remove="" label owners - author="$(jq -r '.user.login' <<<"$ISSUE_JSON")" - is_triage_actor "$author" && triage=true - decision="$(author_decision "$triage" <<<"$ISSUE_LABELS")" - if [ "$decision" = ADD_NEEDS_TRIAGE ]; then - for label in epic "${QUEUE_LABELS[@]}"; do - has_issue_label "$label" && remove="$remove,$label" - done - remove="${remove#,}" - if [ -n "$remove" ]; then - run gh issue edit "$n" -R "$REPO" --add-label needs-triage --remove-label "$remove" >/dev/null - else - run gh issue edit "$n" -R "$REPO" --add-label needs-triage >/dev/null - fi - log "#$n: needs-triage (opened by $author)" - ISSUE_LABELS=needs-triage - fi - + local n="$1" decision refs states age assignees open_pr=false label owners decision="$(queue_decision <<<"$ISSUE_LABELS")" case "$decision" in ADD_NEEDS_TRIAGE) @@ -219,12 +202,35 @@ reconcile_issue() { fi } +reconcile_opened_issue() { + local n="$1" author triage=false labels remove="" label + ISSUE_JSON="$(gh api "repos/$REPO/issues/$n")" + jq -e 'has("pull_request") | not' <<<"$ISSUE_JSON" >/dev/null || return + author="$(jq -r '.user.login' <<<"$ISSUE_JSON")" + is_triage_actor "$author" && triage=true + labels="$(jq -r '.labels[].name' <<<"$ISSUE_JSON")" + [ "$(author_decision "$triage" <<<"$labels")" = ADD_NEEDS_TRIAGE ] || return + for label in epic "${QUEUE_LABELS[@]}"; do + grep -qxF "$label" <<<"$labels" && remove="$remove,$label" + done + remove="${remove#,}" + if [ -n "$remove" ]; then + run gh issue edit "$n" -R "$REPO" --add-label needs-triage --remove-label "$remove" >/dev/null + else + run gh issue edit "$n" -R "$REPO" --add-label needs-triage >/dev/null + fi + log "#$n: needs-triage (opened by $author)" +} + main() { local owner name REPO="${REPO:?set REPO to owner/name}" LABELS_CONF="${LABELS_CONF:-.github/labels.conf}" load_issueflow_config "$LABELS_CONF" NOW="$(date +%s)" + if [ "${EVENT_NAME:-}" = issues ] && [ "${EVENT_ACTION:-}" = opened ]; then + reconcile_opened_issue "${EVENT_ISSUE:?set EVENT_ISSUE for issues:opened}" + fi owner="${REPO%%/*}" name="${REPO#*/}" OPEN_PR_ISSUES="$(gh api graphql --paginate -f owner="$owner" -f name="$name" -f query=' diff --git a/test/issueflow-reconcile.test.sh b/test/issueflow-reconcile.test.sh index f78aa69..3817c68 100644 --- a/test/issueflow-reconcile.test.sh +++ b/test/issueflow-reconcile.test.sh @@ -48,6 +48,7 @@ check "unreadable blocker is flagged" 0 "FLAG_UNPARSEABLE" blocked_decision "12" check "triage-authored ready issue is accepted" 0 "KEEP" author_decision true <<<"ready" check "outside author receives needs-triage" 0 "ADD_NEEDS_TRIAGE" author_decision false <<<"ready" check "outside author already marked needs-triage is stable" 0 "KEEP" author_decision false <<<"needs-triage" +check "later sweep accepts a normalized outside-authored issue" 0 "KEEP" queue_decision <<<"ready" # Invariant 5: completed epics get one nudge; incomplete/unparseable do not. epic_refs="$(epic_references <<< $'- [ ] #3 first\n- [x] #2 done\nplain #8')"