{"thread":{"id":"7562","subject":"[PATCH 5/5] t3030: merge-recursive backend test.","startedAt":"2007-04-07T14:43:01Z","lastAt":"2007-04-08T05:17:25Z","messageCount":2,"participants":["Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":5},"messages":[{"id":"38849","messageId":"7v4pnsckju.fsf@assigned-by-dhcp.cox.net","threadId":"7562","inReplyTo":null,"subject":"[PATCH 5/5] t3030: merge-recursive backend test.","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2007-04-07T14:43:01Z","receivedAt":"2007-04-07T14:43:01Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"We have fairly extensive coverage of read-tree 3-way machinery,\nand many Porcelain-ish tests use git-merge front-end tests, but\nwe did not have good basic test for merge-recursive, which made\nit very hard to hack on it.\n\nI used this during the recent work to teach D/F conflicts to\nmerge-recursive.\n\nSigned-off-by: Junio C Hamano <junkio@cox.net>\n---\n t/t3030-merge-recursive.sh |  528 ++++++++++++++++++++++++++++++++++++++++++++\n 1 files changed, 528 insertions(+), 0 deletions(-)\n create mode 100755 t/t3030-merge-recursive.sh\n\ndiff --git a/t/t3030-merge-recursive.sh b/t/t3030-merge-recursive.sh\nnew file mode 100755\nindex 0000000..aef92b9\n--- /dev/null\n+++ b/t/t3030-merge-recursive.sh\n@@ -0,0 +1,528 @@\n+#!/bin/sh\n+\n+test_description='merge-recursive backend test'\n+\n+. ./test-lib.sh\n+\n+test_expect_success 'setup 1' '\n+\n+\techo hello >a &&\n+\to0=$(git hash-object a) &&\n+\tcp a b &&\n+\tcp a A &&\n+\tmkdir d &&\n+\tcp a d/e &&\n+\n+\ttest_tick &&\n+\tgit add a b A d/e &&\n+\tgit commit -m initial &&\n+\tc0=$(git rev-parse --verify HEAD) &&\n+\tgit branch side &&\n+\tgit branch df-1 &&\n+\tgit branch df-2 &&\n+\tgit branch df-3 &&\n+\tgit branch remove &&\n+\n+\techo hello >>a &&\n+\tcp a d/e &&\n+\to1=$(git hash-object a) &&\n+\n+\tgit add a d/e &&\n+\n+\ttest_tick &&\n+\tgit commit -m \"master modifies a and d/e\" &&\n+\tc1=$(git rev-parse --verify HEAD) &&\n+\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n+\t(\n+\t\techo \"100644 blob $o0\tA\"\n+\t\techo \"100644 blob $o1\ta\"\n+\t\techo \"100644 blob $o0\tb\"\n+\t\techo \"100644 blob $o1\td/e\"\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o1 0\ta\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o1 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+'\n+\n+test_expect_success 'setup 2' '\n+\n+\trm -rf [Aabd] &&\n+\tgit checkout side &&\n+\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n+\t(\n+\t\techo \"100644 blob $o0\tA\"\n+\t\techo \"100644 blob $o0\ta\"\n+\t\techo \"100644 blob $o0\tb\"\n+\t\techo \"100644 blob $o0\td/e\"\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 0\ta\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o0 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual &&\n+\n+\techo goodbye >>a &&\n+\to2=$(git hash-object a) &&\n+\n+\tgit add a &&\n+\n+\ttest_tick &&\n+\tgit commit -m \"side modifies a\" &&\n+\tc2=$(git rev-parse --verify HEAD) &&\n+\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n+\t(\n+\t\techo \"100644 blob $o0\tA\"\n+\t\techo \"100644 blob $o2\ta\"\n+\t\techo \"100644 blob $o0\tb\"\n+\t\techo \"100644 blob $o0\td/e\"\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o2 0\ta\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o0 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+'\n+\n+test_expect_success 'setup 3' '\n+\n+\trm -rf [Aabd] &&\n+\tgit checkout df-1 &&\n+\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n+\t(\n+\t\techo \"100644 blob $o0\tA\"\n+\t\techo \"100644 blob $o0\ta\"\n+\t\techo \"100644 blob $o0\tb\"\n+\t\techo \"100644 blob $o0\td/e\"\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 0\ta\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o0 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual &&\n+\n+\trm -f b && mkdir b && echo df-1 >b/c && git add b/c &&\n+\to3=$(git hash-object b/c) &&\n+\n+\ttest_tick &&\n+\tgit commit -m \"df-1 makes b/c\" &&\n+\tc3=$(git rev-parse --verify HEAD) &&\n+\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n+\t(\n+\t\techo \"100644 blob $o0\tA\"\n+\t\techo \"100644 blob $o0\ta\"\n+\t\techo \"100644 blob $o3\tb/c\"\n+\t\techo \"100644 blob $o0\td/e\"\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 0\ta\"\n+\t\techo \"100644 $o3 0\tb/c\"\n+\t\techo \"100644 $o0 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+'\n+\n+test_expect_success 'setup 4' '\n+\n+\trm -rf [Aabd] &&\n+\tgit checkout df-2 &&\n+\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n+\t(\n+\t\techo \"100644 blob $o0\tA\"\n+\t\techo \"100644 blob $o0\ta\"\n+\t\techo \"100644 blob $o0\tb\"\n+\t\techo \"100644 blob $o0\td/e\"\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 0\ta\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o0 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual &&\n+\n+\trm -f a && mkdir a && echo df-2 >a/c && git add a/c &&\n+\to4=$(git hash-object a/c) &&\n+\n+\ttest_tick &&\n+\tgit commit -m \"df-2 makes a/c\" &&\n+\tc4=$(git rev-parse --verify HEAD) &&\n+\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n+\t(\n+\t\techo \"100644 blob $o0\tA\"\n+\t\techo \"100644 blob $o4\ta/c\"\n+\t\techo \"100644 blob $o0\tb\"\n+\t\techo \"100644 blob $o0\td/e\"\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o4 0\ta/c\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o0 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+'\n+\n+test_expect_success 'setup 5' '\n+\n+\trm -rf [Aabd] &&\n+\tgit checkout remove &&\n+\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n+\t(\n+\t\techo \"100644 blob $o0\tA\"\n+\t\techo \"100644 blob $o0\ta\"\n+\t\techo \"100644 blob $o0\tb\"\n+\t\techo \"100644 blob $o0\td/e\"\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 0\ta\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o0 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual &&\n+\n+\trm -f b &&\n+\techo remove-conflict >a &&\n+\n+\tgit add a &&\n+\tgit rm b &&\n+\to5=$(git hash-object a) &&\n+\n+\ttest_tick &&\n+\tgit commit -m \"remove removes b and modifies a\" &&\n+\tc5=$(git rev-parse --verify HEAD) &&\n+\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n+\t(\n+\t\techo \"100644 blob $o0\tA\"\n+\t\techo \"100644 blob $o5\ta\"\n+\t\techo \"100644 blob $o0\td/e\"\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o5 0\ta\"\n+\t\techo \"100644 $o0 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+\n+'\n+\n+test_expect_success 'setup 6' '\n+\n+\trm -rf [Aabd] &&\n+\tgit checkout df-3 &&\n+\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n+\t(\n+\t\techo \"100644 blob $o0\tA\"\n+\t\techo \"100644 blob $o0\ta\"\n+\t\techo \"100644 blob $o0\tb\"\n+\t\techo \"100644 blob $o0\td/e\"\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 0\ta\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o0 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual &&\n+\n+\trm -fr d && echo df-3 >d && git add d &&\n+\to6=$(git hash-object d) &&\n+\n+\ttest_tick &&\n+\tgit commit -m \"df-3 makes d\" &&\n+\tc6=$(git rev-parse --verify HEAD) &&\n+\t( git ls-tree -r HEAD ; git ls-files -s ) >actual &&\n+\t(\n+\t\techo \"100644 blob $o0\tA\"\n+\t\techo \"100644 blob $o0\ta\"\n+\t\techo \"100644 blob $o0\tb\"\n+\t\techo \"100644 blob $o6\td\"\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 0\ta\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o6 0\td\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+'\n+\n+test_expect_success 'merge-recursive simple' '\n+\n+\trm -fr [Aabd] &&\n+\tgit checkout -f \"$c2\" &&\n+\n+\tgit-merge-recursive \"$c0\" -- \"$c2\" \"$c1\"\n+\tstatus=$?\n+\tcase \"$status\" in\n+\t1)\n+\t\t: happy\n+\t\t;;\n+\t*)\n+\t\techo >&2 \"why status $status!!!\"\n+\t\tfalse\n+\t\t;;\n+\tesac\n+'\n+\n+test_expect_success 'merge-recursive result' '\n+\n+\tgit ls-files -s >actual &&\n+\t(\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 1\ta\"\n+\t\techo \"100644 $o2 2\ta\"\n+\t\techo \"100644 $o1 3\ta\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o1 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+\n+'\n+\n+test_expect_success 'merge-recursive remove conflict' '\n+\n+\trm -fr [Aabd] &&\n+\tgit checkout -f \"$c1\" &&\n+\n+\tgit-merge-recursive \"$c0\" -- \"$c1\" \"$c5\"\n+\tstatus=$?\n+\tcase \"$status\" in\n+\t1)\n+\t\t: happy\n+\t\t;;\n+\t*)\n+\t\techo >&2 \"why status $status!!!\"\n+\t\tfalse\n+\t\t;;\n+\tesac\n+'\n+\n+test_expect_success 'merge-recursive remove conflict' '\n+\n+\tgit ls-files -s >actual &&\n+\t(\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 1\ta\"\n+\t\techo \"100644 $o1 2\ta\"\n+\t\techo \"100644 $o5 3\ta\"\n+\t\techo \"100644 $o1 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+\n+'\n+\n+test_expect_success 'merge-recursive d/f simple' '\n+\trm -fr [Aabd] &&\n+\tgit reset --hard &&\n+\tgit checkout -f \"$c1\" &&\n+\n+\tgit-merge-recursive \"$c0\" -- \"$c1\" \"$c3\"\n+'\n+\n+test_expect_success 'merge-recursive result' '\n+\n+\tgit ls-files -s >actual &&\n+\t(\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o1 0\ta\"\n+\t\techo \"100644 $o3 0\tb/c\"\n+\t\techo \"100644 $o1 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+\n+'\n+\n+test_expect_success 'merge-recursive d/f conflict' '\n+\n+\trm -fr [Aabd] &&\n+\tgit reset --hard &&\n+\tgit checkout -f \"$c1\" &&\n+\n+\tgit-merge-recursive \"$c0\" -- \"$c1\" \"$c4\"\n+\tstatus=$?\n+\tcase \"$status\" in\n+\t1)\n+\t\t: happy\n+\t\t;;\n+\t*)\n+\t\techo >&2 \"why status $status!!!\"\n+\t\tfalse\n+\t\t;;\n+\tesac\n+'\n+\n+test_expect_success 'merge-recursive d/f conflict result' '\n+\n+\tgit ls-files -s >actual &&\n+\t(\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 1\ta\"\n+\t\techo \"100644 $o1 2\ta\"\n+\t\techo \"100644 $o4 0\ta/c\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o1 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+\n+'\n+\n+test_expect_success 'merge-recursive d/f conflict the other way' '\n+\n+\trm -fr [Aabd] &&\n+\tgit reset --hard &&\n+\tgit checkout -f \"$c4\" &&\n+\n+\tgit-merge-recursive \"$c0\" -- \"$c4\" \"$c1\"\n+\tstatus=$?\n+\tcase \"$status\" in\n+\t1)\n+\t\t: happy\n+\t\t;;\n+\t*)\n+\t\techo >&2 \"why status $status!!!\"\n+\t\tfalse\n+\t\t;;\n+\tesac\n+'\n+\n+test_expect_success 'merge-recursive d/f conflict result the other way' '\n+\n+\tgit ls-files -s >actual &&\n+\t(\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 1\ta\"\n+\t\techo \"100644 $o1 3\ta\"\n+\t\techo \"100644 $o4 0\ta/c\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o1 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+\n+'\n+\n+test_expect_success 'merge-recursive d/f conflict' '\n+\n+\trm -fr [Aabd] &&\n+\tgit reset --hard &&\n+\tgit checkout -f \"$c1\" &&\n+\n+\tgit-merge-recursive \"$c0\" -- \"$c1\" \"$c6\"\n+\tstatus=$?\n+\tcase \"$status\" in\n+\t1)\n+\t\t: happy\n+\t\t;;\n+\t*)\n+\t\techo >&2 \"why status $status!!!\"\n+\t\tfalse\n+\t\t;;\n+\tesac\n+'\n+\n+test_expect_success 'merge-recursive d/f conflict result' '\n+\n+\tgit ls-files -s >actual &&\n+\t(\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o1 0\ta\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o6 3\td\"\n+\t\techo \"100644 $o0 1\td/e\"\n+\t\techo \"100644 $o1 2\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+\n+'\n+\n+test_expect_success 'merge-recursive d/f conflict' '\n+\n+\trm -fr [Aabd] &&\n+\tgit reset --hard &&\n+\tgit checkout -f \"$c6\" &&\n+\n+\tgit-merge-recursive \"$c0\" -- \"$c6\" \"$c1\"\n+\tstatus=$?\n+\tcase \"$status\" in\n+\t1)\n+\t\t: happy\n+\t\t;;\n+\t*)\n+\t\techo >&2 \"why status $status!!!\"\n+\t\tfalse\n+\t\t;;\n+\tesac\n+'\n+\n+test_expect_success 'merge-recursive d/f conflict result' '\n+\n+\tgit ls-files -s >actual &&\n+\t(\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o1 0\ta\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o6 2\td\"\n+\t\techo \"100644 $o0 1\td/e\"\n+\t\techo \"100644 $o1 3\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+\n+'\n+\n+test_expect_success 'reset and 3-way merge' '\n+\n+\tgit reset --hard \"$c2\" &&\n+\tgit read-tree -m \"$c0\" \"$c2\" \"$c1\"\n+\n+'\n+\n+test_expect_success 'reset and bind merge' '\n+\n+\tgit reset --hard master &&\n+\tgit read-tree --prefix=M/ master &&\n+\tgit ls-files -s >actual &&\n+\t(\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 0\tM/A\"\n+\t\techo \"100644 $o1 0\tM/a\"\n+\t\techo \"100644 $o0 0\tM/b\"\n+\t\techo \"100644 $o1 0\tM/d/e\"\n+\t\techo \"100644 $o1 0\ta\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o1 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual &&\n+\n+\tgit read-tree --prefix=a1/ master &&\n+\tgit ls-files -s >actual &&\n+\t(\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 0\tM/A\"\n+\t\techo \"100644 $o1 0\tM/a\"\n+\t\techo \"100644 $o0 0\tM/b\"\n+\t\techo \"100644 $o1 0\tM/d/e\"\n+\t\techo \"100644 $o1 0\ta\"\n+\t\techo \"100644 $o0 0\ta1/A\"\n+\t\techo \"100644 $o1 0\ta1/a\"\n+\t\techo \"100644 $o0 0\ta1/b\"\n+\t\techo \"100644 $o1 0\ta1/d/e\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o1 0\td/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+\n+\tgit read-tree --prefix=z/ master &&\n+\tgit ls-files -s >actual &&\n+\t(\n+\t\techo \"100644 $o0 0\tA\"\n+\t\techo \"100644 $o0 0\tM/A\"\n+\t\techo \"100644 $o1 0\tM/a\"\n+\t\techo \"100644 $o0 0\tM/b\"\n+\t\techo \"100644 $o1 0\tM/d/e\"\n+\t\techo \"100644 $o1 0\ta\"\n+\t\techo \"100644 $o0 0\ta1/A\"\n+\t\techo \"100644 $o1 0\ta1/a\"\n+\t\techo \"100644 $o0 0\ta1/b\"\n+\t\techo \"100644 $o1 0\ta1/d/e\"\n+\t\techo \"100644 $o0 0\tb\"\n+\t\techo \"100644 $o1 0\td/e\"\n+\t\techo \"100644 $o0 0\tz/A\"\n+\t\techo \"100644 $o1 0\tz/a\"\n+\t\techo \"100644 $o0 0\tz/b\"\n+\t\techo \"100644 $o1 0\tz/d/e\"\n+\t) >expected &&\n+\tgit diff -u expected actual\n+\n+'\n+\n+test_done\n+\n-- \n1.5.1.81.gee969\n"},{"id":"38875","messageId":"7vmz1ja1i2.fsf@assigned-by-dhcp.cox.net","threadId":"7562","inReplyTo":"7v4pnsckju.fsf@assigned-by-dhcp.cox.net","subject":"Re: [PATCH 5/5] t3030: merge-recursive backend test.","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2007-04-08T05:17:25Z","receivedAt":"2007-04-08T05:17:25Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Junio C Hamano <junkio@cox.net> writes:\n\n> +test_expect_success 'merge-recursive d/f conflict result' '\n> +\n> +\tgit ls-files -s >actual &&\n> +\t(\n> +\t\techo \"100644 $o0 0\tA\"\n> +\t\techo \"100644 $o0 1\ta\"\n> +\t\techo \"100644 $o1 2\ta\"\n> +\t\techo \"100644 $o4 0\ta/c\"\n> +\t\techo \"100644 $o0 0\tb\"\n> +\t\techo \"100644 $o1 0\td/e\"\n> +\t) >expected &&\n> +\tgit diff -u expected actual\n> +\n> +'\n\nThe expected result of this test is what I find very iffy.  The\ninput trees are:\n\n * Ancestor has a file \"a\"\n * Our tree has a file \"a\", which was modified from the\n   ancestor's\n * The other tree has a file \"a/c\"\n\nmerge-recursive.c::git_merge_trees() calls unpack_trees() using\nthe threeway_merge function and what it gets back are stage 1\nand 2 entries for \"a\", and stage 3 entry for \"a/c\" (you can see\nit by running \"git-read-tree -m $c0 $c1 $c4\" instead).  But the\noutput from merge-recursive has \"a/c\" resolved down to stage 0.\n\nThe problem is that process_entry() finds that there is only\nstage 3 entry for that path and decides to resolve it.  I think\nit should do the D/F check and leave \"a/c\" in stage 3.\n\nLooking at the D/F conflict detection code in merge-recursive.c\nmakes my head hurt, and I do not quite follow the logic there,\nbut it seems to be doing the following to me.\n\n * current_directory_set is initialized to be union of all\n   directories that appear in our tree and the other tree (I am\n   not sure if that set is updated and if so how);\n\n * when a path is about to be resolved to a blob, this set is\n   consulted, and if there is a directory there, declare D/F\n   conflict and blob is added under a name that does not\n   conflict with the directory;\n\n * otherwise the path is resolved down to stage 0.\n\nHowever, in this case, there is no such directory \"a/c\" but the\ncode forgets that adding a blob at \"a/c\" requires that there is\nno file \"a\" at all.  I am not sure if this is deliberate or just\na simple oversight.\n\nAlso I suspect this can be done more easily with just checking\nthe index.  We know blob \"a\" is in the index, unresolved, when\nwe try to resolve path \"a/c\".\n \n"}]}