get_oid(): when an object was not found, try harder

It is quite possible that the loose object cache gets stale when new objects are written. In that case, get_oid() would potentially say that it cannot find a given object, even if it should find it. Let's blow away the loose object cache as well as the read packs and try again in that case. Note: this does *not* affect the code path that was introduced to help avoid looking for the same non-existing objects (which made some operations really expensive via NFS): that code path is handled by the `OBJECT_INFO_QUICK` flag (which does not even apply to `get_oid()`, which has no equivalent flag, at least at the time this patch was written). This incidentally fixes the problem identified earlier where an interactive rebase wanted to re-read (and validate) the todo list after an `exec` command modified it. Helped-by: Jeff King <peff@peff.net> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Johannes Schindelin committed Mar 13, 2019 at 03:16 UTC 6d67a993b2a7c3e1a9c3688c92f28b237144c2fd
2 files changed +13 -1
sha1-name.c
+12
@@ -442,6 +442,18 @@ static enum get_oid_result get_short_oid(const char *name, int len,
442 find_short_packed_object(&ds);
443 status = finish_object_disambiguation(&ds, oid);
444
445 + /*
446 + * If we didn't find it, do the usual reprepare() slow-path,
447 + * since the object may have recently been added to the repository
448 + * or migrated from loose to packed.
449 + */
450 + if (status == MISSING_OBJECT) {
451 + reprepare_packed_git(the_repository);
452 + find_short_object_filename(&ds);
453 + find_short_packed_object(&ds);
454 + status = finish_object_disambiguation(&ds, oid);
455 + }
456 +
457 if (!quietly && (status == SHORT_NAME_AMBIGUOUS)) {
458 struct oid_array collect = OID_ARRAY_INIT;
459
t/t3429-rebase-edit-todo.sh
+1 -1
@@ -11,7 +11,7 @@ test_expect_success 'rebase exec modifies rebase-todo' '
11 test -e F
12 '
13
14 -test_expect_failure SHA1 'loose object cache vs re-reading todo list' '
14 +test_expect_success SHA1 'loose object cache vs re-reading todo list' '
15 GIT_REBASE_TODO=.git/rebase-merge/git-rebase-todo &&
16 export GIT_REBASE_TODO &&
17 write_script append-todo.sh <<-\EOS &&