fix(issueflow): the deliverable PR is the last merged, not the highest numbered
post_merge_pr_for_issue answered "which merged Refs PR is this issue's deliverable?" with sort -n | tail -n1. Merge order is not number order: crew#176's two Refs PRs merged #184 at 19:05:16Z and #182 at 19:05:18Z. MERGED_REF_PR_RECORDS gains mergedAt as a third column — a field on the merged-PR node set already fetched, so no additional GraphQL request — and the selection sorts on it, breaking ties by highest PR number so the answer never depends on input order. Refs #242
This commit is contained in:
parent
46329f5993
commit
f4afaa1346
1 changed files with 18 additions and 8 deletions
|
|
@ -157,9 +157,19 @@ post_merge_decision() { # $1 merged Refs PR, $2 linked open PR, $3 already handl
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
post_merge_pr_for_issue() { # $1 issue; records are ISSUE<TAB>PR
|
post_merge_pr_for_issue() { # $1 issue; records are ISSUE<TAB>PR<TAB>MERGED_AT
|
||||||
awk -F '\t' -v issue="$1" '$1 == issue { print $2 }' \
|
# The deliverable is the PR that merged last, not the one numbered highest.
|
||||||
<<<"${MERGED_REF_PR_RECORDS:-}" | sort -n | tail -n1
|
# Merge order is not number order in this family: crew#176's two Refs PRs
|
||||||
|
# merged #184 at 19:05:16Z and #182 at 19:05:18Z — the higher number two
|
||||||
|
# seconds earlier. Number order is also what spends a marker on the wrong
|
||||||
|
# PR: crew#321 carries `post-merge-transition-pr-326` while its real
|
||||||
|
# deliverable crew#322 — a lower number, merging later — is still open, so
|
||||||
|
# under the old rule the transition it owes could never fire (#242).
|
||||||
|
# mergedAt is ISO-8601 UTC, so it sorts as a string; ties break by highest
|
||||||
|
# PR number so the answer never depends on input order.
|
||||||
|
awk -F '\t' -v issue="$1" '$1 == issue { print $3 "\t" $2 }' \
|
||||||
|
<<<"${MERGED_REF_PR_RECORDS:-}" \
|
||||||
|
| sort -t $'\t' -k1,1 -k2,2n | tail -n1 | cut -f2
|
||||||
}
|
}
|
||||||
|
|
||||||
post_merge_transition_marker() { # $1 merged PR number
|
post_merge_transition_marker() { # $1 merged PR number
|
||||||
|
|
@ -507,16 +517,16 @@ main() {
|
||||||
query($owner: String!, $name: String!, $endCursor: String) {
|
query($owner: String!, $name: String!, $endCursor: String) {
|
||||||
repository(owner: $owner, name: $name) {
|
repository(owner: $owner, name: $name) {
|
||||||
pullRequests(first: 100, states: MERGED, after: $endCursor) {
|
pullRequests(first: 100, states: MERGED, after: $endCursor) {
|
||||||
nodes { number body }
|
nodes { number mergedAt body }
|
||||||
pageInfo { hasNextPage endCursor }
|
pageInfo { hasNextPage endCursor }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}' --jq '.data.repository.pullRequests.nodes[]
|
}' --jq '.data.repository.pullRequests.nodes[]
|
||||||
| .number as $pr | .body | split("\n")[]
|
| .number as $pr | .mergedAt as $merged | .body | split("\n")[]
|
||||||
| [$pr, .] | @tsv' \
|
| [$pr, $merged, .] | @tsv' \
|
||||||
| while IFS=$'\t' read -r pr body; do
|
| while IFS=$'\t' read -r pr merged body; do
|
||||||
while IFS= read -r issue; do
|
while IFS= read -r issue; do
|
||||||
[ -n "$issue" ] && printf '%s\t%s\n' "$issue" "$pr"
|
[ -n "$issue" ] && printf '%s\t%s\t%s\n' "$issue" "$pr" "$merged"
|
||||||
done < <(refs_references <<<"$body")
|
done < <(refs_references <<<"$body")
|
||||||
done)"
|
done)"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue