]> git.ipfire.org Git - thirdparty/git.git/commitdiff
refs: fix migration of reflogs respecting "core.logAllRefUpdates"
authorPatrick Steinhardt <ps@pks.im>
Wed, 22 Jan 2025 09:48:06 +0000 (10:48 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 22 Jan 2025 18:00:33 +0000 (10:00 -0800)
In 246cebe320 (refs: add support for migrating reflogs, 2024-12-16) we
have added support to git-refs(1) to migrate reflogs between reference
backends. It was reported [1] though that not we don't migrate reflogs
for a subset of references, most importantly "refs/stash".

This issue is caused by us still honoring "core.logAllRefUpdates" when
trying to migrate reflogs: we do queue the updates, but depending on the
value of that config we may decide to just skip writing the reflog entry
altogether. And given that:

  - The default for "core.logAllRefUpdates" is to only create reflogs
    for branches, remotes, note refs and "HEAD"

  - "refs/stash" is neither of these ref types.

We end up skipping the reflog creation for that particular reference.

Fix the bug by setting `REF_FORCE_CREATE_REFLOG`, which instructs the
ref backends to create the reflog entry regardless of the config or any
preexisting state.

[1]: <Z5BTQRlsOj1sygun@tapette.crustytoothpaste.net>

Reported-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c
t/t1460-refs-migrate.sh

diff --git a/refs.c b/refs.c
index c55583986940d8ef1e1c839364c03cd92d4f7114..c36bc57a6c60e523a0caca762ee298cb60d6f0ba 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -1282,7 +1282,7 @@ int ref_transaction_update_reflog(struct ref_transaction *transaction,
 
        assert(err);
 
-       flags |= REF_LOG_ONLY | REF_NO_DEREF;
+       flags |= REF_LOG_ONLY | REF_FORCE_CREATE_REFLOG | REF_NO_DEREF;
 
        if (!transaction_refname_valid(refname, new_oid, flags, err))
                return -1;
index f59bc4860f19c4af82dc6f2984bdb69d61fe3ec2..ceb0c4977d8fe3aa33381f72d587d8e9fed9540c 100755 (executable)
@@ -224,6 +224,23 @@ do
                        test_commit --date "100003000 +0700" --no-tag -C repo second &&
                        test_migration repo "$to_format"
                '
+
+               test_expect_success "$from_format -> $to_format: stash is retained" '
+                       test_when_finished "rm -rf repo" &&
+                       git init --ref-format=$from_format repo &&
+                       (
+                               cd repo &&
+                               test_commit initial A &&
+                               echo foo >A &&
+                               git stash push &&
+                               echo bar >A &&
+                               git stash push &&
+                               git stash list >expect.reflog &&
+                               test_migration . "$to_format" &&
+                               git stash list >actual.reflog &&
+                               test_cmp expect.reflog actual.reflog
+                       )
+               '
        done
 done