From 4c17480d68c3fb3f9a01c8dc16c83a61ae90f40b Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Wed, 23 Sep 2026 13:07:45 -0400 Subject: [PATCH 1/9] Calculate merge base in `changed-files` action `pr.base.sha` is not a reliable indicator of the merge base. Calculate the merge base manually. --- changed-files/action.yml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/changed-files/action.yml b/changed-files/action.yml index 7a61258f..636dbc86 100644 --- a/changed-files/action.yml +++ b/changed-files/action.yml @@ -37,17 +37,31 @@ runs: - name: Get PR info id: get-pr-info uses: nv-gha-runners/get-pr-info@090577647b8ddc4e06e809e264f7881650ecdccf # main - - name: Fetch changed files + - name: Fetch changed files and compute merge base + id: fetch-changed-files-and-compute-merge-base shell: bash env: BASE_SHA: ${{ fromJSON(steps.get-pr-info.outputs.pr-info).base.sha }} + HEAD_SHA: ${{ fromJSON(steps.get-pr-info.outputs.pr-info).head.sha }} run: | git fetch --depth 1 origin "$BASE_SHA" + merge_bases=() + for merge_base in "$(git merge-base -a "$BASE_SHA" "$HEAD_SHA")"; do + merge_bases+=("$merge_base") + done + if [[ "${#merge_base[@]}" -ne 1 ]]; then + echo "::error::Multiple merge bases:" + for merge_base in "${merge_base[@]}"; do + echo " $merge_base" + done + exit 1 + fi + echo "merge_base=$merge_bases" | tee "$GITHUB_OUTPUT" - name: Get changed files id: changed-files uses: step-security/changed-files@2e07db73e5ccdb319b9a6c7766bd46d39d304bad # v47.0.5 with: - base_sha: ${{ fromJSON(steps.get-pr-info.outputs.pr-info).base.sha }} + base_sha: ${{ steps.fetch-changed-files-and-compute-merge-base.outputs.merge_base }} sha: ${{ fromJSON(steps.get-pr-info.outputs.pr-info).head.sha }} files_yaml: ${{ inputs.files_yaml }} write_output_files: true From 68ec6b94acad5bde98540652dcb68fe5eeb7f17f Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Wed, 23 Sep 2026 13:15:15 -0400 Subject: [PATCH 2/9] Oops --- changed-files/action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/changed-files/action.yml b/changed-files/action.yml index 636dbc86..0a71961a 100644 --- a/changed-files/action.yml +++ b/changed-files/action.yml @@ -49,9 +49,9 @@ runs: for merge_base in "$(git merge-base -a "$BASE_SHA" "$HEAD_SHA")"; do merge_bases+=("$merge_base") done - if [[ "${#merge_base[@]}" -ne 1 ]]; then + if [[ "${#merge_bases[@]}" -ne 1 ]]; then echo "::error::Multiple merge bases:" - for merge_base in "${merge_base[@]}"; do + for merge_base in "${merge_bases[@]}"; do echo " $merge_base" done exit 1 From 7612fbb0d2edf66beed0ee5f7d5d85ba0a507e72 Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Wed, 23 Sep 2026 13:20:40 -0400 Subject: [PATCH 3/9] Remove quotes --- changed-files/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changed-files/action.yml b/changed-files/action.yml index 0a71961a..73d0037f 100644 --- a/changed-files/action.yml +++ b/changed-files/action.yml @@ -46,7 +46,7 @@ runs: run: | git fetch --depth 1 origin "$BASE_SHA" merge_bases=() - for merge_base in "$(git merge-base -a "$BASE_SHA" "$HEAD_SHA")"; do + for merge_base in $(git merge-base -a "$BASE_SHA" "$HEAD_SHA"); do merge_bases+=("$merge_base") done if [[ "${#merge_bases[@]}" -ne 1 ]]; then From 2709d1127f710251ba8e5a67af9f47d7d6d95b55 Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Wed, 23 Sep 2026 13:26:05 -0400 Subject: [PATCH 4/9] Fetch more history --- changed-files/action.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/changed-files/action.yml b/changed-files/action.yml index 73d0037f..39646ec9 100644 --- a/changed-files/action.yml +++ b/changed-files/action.yml @@ -37,14 +37,15 @@ runs: - name: Get PR info id: get-pr-info uses: nv-gha-runners/get-pr-info@090577647b8ddc4e06e809e264f7881650ecdccf # main - - name: Fetch changed files and compute merge base - id: fetch-changed-files-and-compute-merge-base + - name: Fetch history and compute merge base + id: fetch-history-and-compute-merge-base shell: bash env: BASE_SHA: ${{ fromJSON(steps.get-pr-info.outputs.pr-info).base.sha }} HEAD_SHA: ${{ fromJSON(steps.get-pr-info.outputs.pr-info).head.sha }} run: | git fetch --depth 1 origin "$BASE_SHA" + git fetch --depth 1 origin "$HEAD_SHA" merge_bases=() for merge_base in $(git merge-base -a "$BASE_SHA" "$HEAD_SHA"); do merge_bases+=("$merge_base") @@ -61,7 +62,7 @@ runs: id: changed-files uses: step-security/changed-files@2e07db73e5ccdb319b9a6c7766bd46d39d304bad # v47.0.5 with: - base_sha: ${{ steps.fetch-changed-files-and-compute-merge-base.outputs.merge_base }} + base_sha: ${{ steps.fetch-history-and-compute-merge-base.outputs.merge_base }} sha: ${{ fromJSON(steps.get-pr-info.outputs.pr-info).head.sha }} files_yaml: ${{ inputs.files_yaml }} write_output_files: true From 4eae538eb49584d164bc70f91fba14584d5153a5 Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Wed, 23 Sep 2026 13:46:53 -0400 Subject: [PATCH 5/9] Debugging --- changed-files/action.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/changed-files/action.yml b/changed-files/action.yml index 39646ec9..fafcc5ea 100644 --- a/changed-files/action.yml +++ b/changed-files/action.yml @@ -48,8 +48,11 @@ runs: git fetch --depth 1 origin "$HEAD_SHA" merge_bases=() for merge_base in $(git merge-base -a "$BASE_SHA" "$HEAD_SHA"); do + echo "Adding $merge_base to merge_bases" merge_bases+=("$merge_base") + echo "Done, merge_bases is ${merge_bases[@]}" done + echo "merge_bases has ${#merge_bases[@]} elements" if [[ "${#merge_bases[@]}" -ne 1 ]]; then echo "::error::Multiple merge bases:" for merge_base in "${merge_bases[@]}"; do From dbabef1a5c45b3031d2613a61be68e1538bae483 Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Wed, 23 Sep 2026 13:48:58 -0400 Subject: [PATCH 6/9] Remove depth limit --- changed-files/action.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/changed-files/action.yml b/changed-files/action.yml index fafcc5ea..9bc13e5c 100644 --- a/changed-files/action.yml +++ b/changed-files/action.yml @@ -44,8 +44,7 @@ runs: BASE_SHA: ${{ fromJSON(steps.get-pr-info.outputs.pr-info).base.sha }} HEAD_SHA: ${{ fromJSON(steps.get-pr-info.outputs.pr-info).head.sha }} run: | - git fetch --depth 1 origin "$BASE_SHA" - git fetch --depth 1 origin "$HEAD_SHA" + git fetch origin "$BASE_SHA" "$HEAD_SHA" merge_bases=() for merge_base in $(git merge-base -a "$BASE_SHA" "$HEAD_SHA"); do echo "Adding $merge_base to merge_bases" From 1ab07be70eba0f18369aacc27af5122f56dc23ec Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Wed, 23 Sep 2026 13:53:28 -0400 Subject: [PATCH 7/9] unshallow --- changed-files/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changed-files/action.yml b/changed-files/action.yml index 9bc13e5c..d4f29b6d 100644 --- a/changed-files/action.yml +++ b/changed-files/action.yml @@ -44,7 +44,7 @@ runs: BASE_SHA: ${{ fromJSON(steps.get-pr-info.outputs.pr-info).base.sha }} HEAD_SHA: ${{ fromJSON(steps.get-pr-info.outputs.pr-info).head.sha }} run: | - git fetch origin "$BASE_SHA" "$HEAD_SHA" + git fetch --unshallow origin "$BASE_SHA" "$HEAD_SHA" merge_bases=() for merge_base in $(git merge-base -a "$BASE_SHA" "$HEAD_SHA"); do echo "Adding $merge_base to merge_bases" From db65ce5ab2552459cd55b701caa256e8ff676f22 Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Wed, 23 Sep 2026 13:56:15 -0400 Subject: [PATCH 8/9] Remove debugging --- changed-files/action.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/changed-files/action.yml b/changed-files/action.yml index d4f29b6d..6f991c8f 100644 --- a/changed-files/action.yml +++ b/changed-files/action.yml @@ -47,11 +47,8 @@ runs: git fetch --unshallow origin "$BASE_SHA" "$HEAD_SHA" merge_bases=() for merge_base in $(git merge-base -a "$BASE_SHA" "$HEAD_SHA"); do - echo "Adding $merge_base to merge_bases" merge_bases+=("$merge_base") - echo "Done, merge_bases is ${merge_bases[@]}" done - echo "merge_bases has ${#merge_bases[@]} elements" if [[ "${#merge_bases[@]}" -ne 1 ]]; then echo "::error::Multiple merge bases:" for merge_base in "${merge_bases[@]}"; do From 2d74f9640e7b61a9f6c4d67259f38f96a79037f2 Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Wed, 23 Sep 2026 14:04:10 -0400 Subject: [PATCH 9/9] Better error --- changed-files/action.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/changed-files/action.yml b/changed-files/action.yml index 6f991c8f..9b77041a 100644 --- a/changed-files/action.yml +++ b/changed-files/action.yml @@ -49,12 +49,15 @@ runs: for merge_base in $(git merge-base -a "$BASE_SHA" "$HEAD_SHA"); do merge_bases+=("$merge_base") done - if [[ "${#merge_bases[@]}" -ne 1 ]]; then + if [[ "${#merge_bases[@]}" -gt 1 ]]; then echo "::error::Multiple merge bases:" for merge_base in "${merge_bases[@]}"; do echo " $merge_base" done exit 1 + elif [[ "${#merge_bases[@]}" -eq 0 ]]; then + echo "::error::No merge bases" + exit 1 fi echo "merge_base=$merge_bases" | tee "$GITHUB_OUTPUT" - name: Get changed files