]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use "git push --force-with-lease" for autorebases
authorMichał Kępień <michal@isc.org>
Thu, 30 Apr 2026 20:19:59 +0000 (22:19 +0200)
committerMichał Kępień <michal@isc.org>
Thu, 30 Apr 2026 20:19:59 +0000 (22:19 +0200)
If a merge request is merged to an autorebased branch while it is
getting rebased, the "git push -f" command at the end of the autorebase
job will cause the contents of that merge request to be silently deleted
from Git history even though the merge request will still be (correctly)
shown as "merged" by GitLab.

Use "git push --force-with-lease" instead to prevent force-pushing the
rebased version of the branch if it is pushed to after its pre-rebase
version is fetched by the autorebase job.  Report such an event
accordingly.  For simplicity, no retries are attempted as the problem is
expected to be resolved by the next autorebase and the chances of this
scenario happening in practice are already low to begin with.

.gitlab-ci.yml

index eb0ab2b2a282b47828d3f4321cb7e0c6b859a7bb..6278193e6b4ad98e9d5518b4883cc6ee1928a697 100644 (file)
@@ -2562,7 +2562,7 @@ merged-metadata:
     - *configure
     - meson compile -C build
     - git range-diff --color=always "${BASE_COMMIT}" "${CI_COMMIT_SHA}" HEAD
-    - git push -f origin "HEAD:${CI_COMMIT_REF_NAME}"
+    - if ! git push --force-with-lease origin "HEAD:${CI_COMMIT_REF_NAME}"; then touch .git-push-failed; exit 1; fi
   after_script:
     - if [ "${CI_JOB_STATUS}" = "success" ]; then exit 0; fi
     - OLDEST_MERGE_COMMIT="$(git log --reverse --merges --pretty=%H "${CI_COMMIT_SHA}..${BASE_COMMIT}" | head -1)"
@@ -2577,7 +2577,11 @@ merged-metadata:
           # Rebase did not fail; most likely, this is a build failure, or the job was canceled
           CONFLICT_COMMIT="${OLDEST_MERGE_COMMIT}"
           if [ "${CI_JOB_STATUS}" = "failed" ]; then
-              REASON="build failure after a successful rebase"
+              if [ -f ".git-push-failed" ]; then
+                  REASON="branch was updated during rebase"
+              else
+                  REASON="build failure after a successful rebase"
+              fi
           else
               REASON="job was canceled"
           fi