refs: fix migration of reflogs respecting "core.logAllRefUpdates"

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>

Patrick Steinhardt committed Jan 22, 2025 at 10:48 UTC a0bea0978fe80a64e7ccc27d9cafc1725a61e6dc
2 files changed +18 -1
refs.c
+1 -1
@@ -1282,7 +1282,7 @@ int ref_transaction_update_reflog(struct ref_transaction *transaction,
1282
1283 assert(err);
1284
1285 - flags |= REF_LOG_ONLY | REF_NO_DEREF;
1285 + flags |= REF_LOG_ONLY | REF_FORCE_CREATE_REFLOG | REF_NO_DEREF;
1286
1287 if (!transaction_refname_valid(refname, new_oid, flags, err))
1288 return -1;
t/t1460-refs-migrate.sh
+17
@@ -224,6 +224,23 @@ do
224 test_commit --date "100003000 +0700" --no-tag -C repo second &&
225 test_migration repo "$to_format"
226 '
227 +
228 + test_expect_success "$from_format -> $to_format: stash is retained" '
229 + test_when_finished "rm -rf repo" &&
230 + git init --ref-format=$from_format repo &&
231 + (
232 + cd repo &&
233 + test_commit initial A &&
234 + echo foo >A &&
235 + git stash push &&
236 + echo bar >A &&
237 + git stash push &&
238 + git stash list >expect.reflog &&
239 + test_migration . "$to_format" &&
240 + git stash list >actual.reflog &&
241 + test_cmp expect.reflog actual.reflog
242 + )
243 + '
244 done
245 done
246