(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (SQ (Token id:Id.Lit_Chars val:'object name disambiguation\n' span_id:6) 
                (Token id:Id.Lit_Chars val:'\n' span_id:7) 
                (Token
                  id: Id.Lit_Chars
                  val: 'Create blobs, trees, commits and a tag that all share the same\n'
                  span_id: 8
                ) (Token id:Id.Lit_Chars val:'prefix, and make sure "git rev-parse" can take advantage of\n' span_id:9) 
                (Token
                  id: Id.Lit_Chars
                  val: 'type information to disambiguate short object names that are\n'
                  span_id: 10
                ) (Token id:Id.Lit_Chars val:'not necessarily unique.\n' span_id:11) 
                (Token id:Id.Lit_Chars val:'\n' span_id:12) 
                (Token
                  id: Id.Lit_Chars
                  val: 'The final history used in the test has five commits, with the bottom\n'
                  span_id: 13
                ) 
                (Token
                  id: Id.Lit_Chars
                  val: 'one tagged as v1.0.0.  They all have one regular file each.\n'
                  span_id: 14
                ) (Token id:Id.Lit_Chars val:'\n' span_id:15) 
                (Token
                  id: Id.Lit_Chars
                  val: '  +-------------------------------------------+\n'
                  span_id: 16
                ) (Token id:Id.Lit_Chars val:'  |                                           |\n' span_id:17) 
                (Token
                  id: Id.Lit_Chars
                  val: '  |           .-------b3wettvi---- ad2uee     |\n'
                  span_id: 18
                ) (Token id:Id.Lit_Chars val:'  |          /                   /            |\n' span_id:19) 
                (Token
                  id: Id.Lit_Chars
                  val: '  |  a2onsxbvj---czy8f73t--ioiley5o           |\n'
                  span_id: 20
                ) (Token id:Id.Lit_Chars val:'  |                                           |\n' span_id:21) 
                (Token
                  id: Id.Lit_Chars
                  val: '  +-------------------------------------------+\n'
                  span_id: 22
                ) (Token id:Id.Lit_Chars val:'\n' span_id:23)
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blob and tree' span_id:35))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:39) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:40) (Token id:Id.Lit_Chars val:'\t(\n' span_id:41) 
          (Token id:Id.Lit_Chars val:'\t\tfor i in 0 1 2 3 4 5 6 7 8 9\n' span_id:42) (Token id:Id.Lit_Chars val:'\t\tdo\n' span_id:43) 
          (Token id:Id.Lit_Chars val:'\t\t\techo $i\n' span_id:44) (Token id:Id.Lit_Chars val:'\t\tdone\n' span_id:45) 
          (Token id:Id.Lit_Chars val:'\t\techo\n' span_id:46) (Token id:Id.Lit_Chars val:'\t\techo b1rwzyc3\n' span_id:47) 
          (Token id:Id.Lit_Chars val:'\t) >a0blgqsjc &&\n' span_id:48) (Token id:Id.Lit_Chars val:'\n' span_id:49) 
          (Token id:Id.Lit_Chars val:'\t# create one blob 0000000000b36\n' span_id:50) (Token id:Id.Lit_Chars val:'\tgit add a0blgqsjc &&\n' span_id:51) 
          (Token id:Id.Lit_Chars val:'\n' span_id:52) (Token id:Id.Lit_Chars val:'\t# create one tree 0000000000cdc\n' span_id:53) 
          (Token id:Id.Lit_Chars val:'\tgit write-tree\n' span_id:54)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'warn ambiguity when no candidate matches type hint'
            span_id: 61
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:65) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --verify 000000000^{commit} 2>actual &&\n'
            span_id: 66
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "short SHA1 000000000 is ambiguous" actual\n' span_id:67)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'disambiguate tree-ish' span_id:74))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:78) 
          (Token
            id: Id.Lit_Chars
            val: '\t# feed tree-ish in an unambiguous way\n'
            span_id: 79
          ) (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify 0000000000cdc:a0blgqsjc &&\n' span_id:80) 
          (Token id:Id.Lit_Chars val:'\n' span_id:81) 
          (Token
            id: Id.Lit_Chars
            val: '\t# ambiguous at the object name level, but there is only one\n'
            span_id: 82
          ) (Token id:Id.Lit_Chars val:'\t# such tree-ish (the other is a blob)\n' span_id:83) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse --verify 000000000:a0blgqsjc\n'
            span_id: 84
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'disambiguate blob' span_id:91))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:95) 
          (Token id:Id.Lit_Chars val:'\tsed -e "s/|$//" >patch <<-EOF &&\n' span_id:96) (Token id:Id.Lit_Chars val:'\tdiff --git a/frotz b/frotz\n' span_id:97) 
          (Token id:Id.Lit_Chars val:'\tindex 000000000..ffffff 100644\n' span_id:98) (Token id:Id.Lit_Chars val:'\t--- a/frotz\n' span_id:99) 
          (Token id:Id.Lit_Chars val:'\t+++ b/frotz\n' span_id:100) (Token id:Id.Lit_Chars val:'\t@@ -10,3 +10,4 @@\n' span_id:101) 
          (Token id:Id.Lit_Chars val:'\t 9\n' span_id:102) (Token id:Id.Lit_Chars val:'\t |\n' span_id:103) 
          (Token id:Id.Lit_Chars val:'\t b1rwzyc3\n' span_id:104) (Token id:Id.Lit_Chars val:'\t+irwry\n' span_id:105) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:106) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:107) (Token id:Id.Lit_Chars val:'\t\tGIT_INDEX_FILE=frotz &&\n' span_id:108) 
          (Token id:Id.Lit_Chars val:'\t\texport GIT_INDEX_FILE &&\n' span_id:109) (Token id:Id.Lit_Chars val:'\t\tgit apply --build-fake-ancestor frotz patch &&\n' span_id:110) 
          (Token id:Id.Lit_Chars val:'\t\tgit cat-file blob :frotz >actual\n' span_id:111) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:112) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp a0blgqsjc actual\n' span_id:113)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'disambiguate tree' span_id:120))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:124) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit=$(echo "d7xm" | git commit-tree 000000000) &&\n'
            span_id: 125
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t# this commit is fffff2e and not ambiguous with the 00000* objects\n'
            span_id: 126
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest $(git rev-parse $commit^{tree}) = $(git rev-parse 0000000000cdc)\n'
            span_id: 127
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'first commit' span_id:134))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:138) 
          (Token id:Id.Lit_Chars val:'\t# create one commit 0000000000e4f\n' span_id:139) (Token id:Id.Lit_Chars val:'\tgit commit -m a2onsxbvj\n' span_id:140)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'disambiguate commit-ish' span_id:147))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:151) 
          (Token
            id: Id.Lit_Chars
            val: '\t# feed commit-ish in an unambiguous way\n'
            span_id: 152
          ) (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify 0000000000e4f^{commit} &&\n' span_id:153) 
          (Token id:Id.Lit_Chars val:'\n' span_id:154) 
          (Token
            id: Id.Lit_Chars
            val: '\t# ambiguous at the object name level, but there is only one\n'
            span_id: 155
          ) (Token id:Id.Lit_Chars val:'\t# such commit (the others are tree and blob)\n' span_id:156) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse --verify 000000000^{commit} &&\n'
            span_id: 157
          ) (Token id:Id.Lit_Chars val:'\n' span_id:158) (Token id:Id.Lit_Chars val:'\t# likewise\n' span_id:159) 
          (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify 000000000^0\n' span_id:160)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'disambiguate commit' span_id:167))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:171) 
          (Token
            id: Id.Lit_Chars
            val: '\tcommit=$(echo "hoaxj" | git commit-tree 0000000000cdc -p 000000000) &&\n'
            span_id: 172
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t# this commit is ffffffd8 and not ambiguous with the 00000* objects\n'
            span_id: 173
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest $(git rev-parse $commit^) = $(git rev-parse 0000000000e4f)\n'
            span_id: 174
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'log name1..name2 takes only commit-ishes on both ends'
            span_id: 181
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:185) 
          (Token
            id: Id.Lit_Chars
            val: '\t# These are underspecified from the prefix-length point of view\n'
            span_id: 186
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t# to disambiguate the commit with other objects, but there is only\n'
            span_id: 187
          ) (Token id:Id.Lit_Chars val:'\t# one commit that has 00000* prefix at this point.\n' span_id:188) 
          (Token id:Id.Lit_Chars val:'\tgit log 000000000..000000000 &&\n' span_id:189) (Token id:Id.Lit_Chars val:'\tgit log ..000000000 &&\n' span_id:190) 
          (Token id:Id.Lit_Chars val:'\tgit log 000000000.. &&\n' span_id:191) (Token id:Id.Lit_Chars val:'\tgit log 000000000...000000000 &&\n' span_id:192) 
          (Token id:Id.Lit_Chars val:'\tgit log ...000000000 &&\n' span_id:193) (Token id:Id.Lit_Chars val:'\tgit log 000000000...\n' span_id:194)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rev-parse name1..name2 takes only commit-ishes on both ends'
            span_id: 201
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:205) 
          (Token id:Id.Lit_Chars val:'\t# Likewise.\n' span_id:206) (Token id:Id.Lit_Chars val:'\tgit rev-parse 000000000..000000000 &&\n' span_id:207) 
          (Token id:Id.Lit_Chars val:'\tgit rev-parse ..000000000 &&\n' span_id:208) (Token id:Id.Lit_Chars val:'\tgit rev-parse 000000000..\n' span_id:209)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git log takes only commit-ish' span_id:216))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:220) 
          (Token id:Id.Lit_Chars val:'\t# Likewise.\n' span_id:221) (Token id:Id.Lit_Chars val:'\tgit log 000000000\n' span_id:222)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git reset takes only commit-ish' span_id:229))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:233) 
          (Token id:Id.Lit_Chars val:'\t# Likewise.\n' span_id:234) (Token id:Id.Lit_Chars val:'\tgit reset 000000000\n' span_id:235)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'first tag' span_id:242))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:246) 
          (Token id:Id.Lit_Chars val:'\t# create one tag 0000000000f8f\n' span_id:247) (Token id:Id.Lit_Chars val:'\tgit tag -a -m j7cp83um v1.0.0\n' span_id:248)
        )
      }
    )
    (C {(test_expect_failure)} 
      {(SQ (Token id:Id.Lit_Chars val:'two semi-ambiguous commit-ish' span_id:255))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:259) 
          (Token
            id: Id.Lit_Chars
            val: '\t# At this point, we have a tag 0000000000f8f that points\n'
            span_id: 260
          ) (Token id:Id.Lit_Chars val:'\t# at a commit 0000000000e4f, and a tree and a blob that\n' span_id:261) 
          (Token
            id: Id.Lit_Chars
            val: '\t# share 0000000000 prefix with these tag and commit.\n'
            span_id: 262
          ) (Token id:Id.Lit_Chars val:'\t#\n' span_id:263) 
          (Token
            id: Id.Lit_Chars
            val: '\t# Once the parser becomes ultra-smart, it could notice that\n'
            span_id: 264
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t# 0000000000 before ^{commit} name many different objects, but\n'
            span_id: 265
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t# that only two (HEAD and v1.0.0 tag) can be peeled to commit,\n'
            span_id: 266
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t# and that peeling them down to commit yield the same commit\n'
            span_id: 267
          ) (Token id:Id.Lit_Chars val:'\t# without ambiguity.\n' span_id:268) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse --verify 0000000000^{commit} &&\n'
            span_id: 269
          ) (Token id:Id.Lit_Chars val:'\n' span_id:270) (Token id:Id.Lit_Chars val:'\t# likewise\n' span_id:271) 
          (Token id:Id.Lit_Chars val:'\tgit log 0000000000..0000000000 &&\n' span_id:272) (Token id:Id.Lit_Chars val:'\tgit log ..0000000000 &&\n' span_id:273) 
          (Token id:Id.Lit_Chars val:'\tgit log 0000000000.. &&\n' span_id:274) (Token id:Id.Lit_Chars val:'\tgit log 0000000000...0000000000 &&\n' span_id:275) 
          (Token id:Id.Lit_Chars val:'\tgit log ...0000000000 &&\n' span_id:276) (Token id:Id.Lit_Chars val:'\tgit log 0000000000...\n' span_id:277)
        )
      }
    )
    (C {(test_expect_failure)} 
      {(SQ (Token id:Id.Lit_Chars val:'three semi-ambiguous tree-ish' span_id:284))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:288) 
          (Token
            id: Id.Lit_Chars
            val: '\t# Likewise for tree-ish.  HEAD, v1.0.0 and HEAD^{tree} share\n'
            span_id: 289
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t# the prefix but peeling them to tree yields the same thing\n'
            span_id: 290
          ) (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify 0000000000^{tree}\n' span_id:291)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'parse describe name' span_id:298))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:302) 
          (Token id:Id.Lit_Chars val:'\t# feed an unambiguous describe name\n' span_id:303) (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify v1.0.0-0-g0000000000e4f &&\n' span_id:304) 
          (Token id:Id.Lit_Chars val:'\n' span_id:305) 
          (Token
            id: Id.Lit_Chars
            val: '\t# ambiguous at the object name level, but there is only one\n'
            span_id: 306
          ) (Token id:Id.Lit_Chars val:'\t# such commit (others are blob, tree and tag)\n' span_id:307) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse --verify v1.0.0-0-g000000000\n'
            span_id: 308
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'more history' span_id:315))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:319) 
          (Token id:Id.Lit_Chars val:'\t# commit 0000000000043\n' span_id:320) (Token id:Id.Lit_Chars val:'\tgit mv a0blgqsjc d12cr3h8t &&\n' span_id:321) 
          (Token id:Id.Lit_Chars val:'\techo h62xsjeu >>d12cr3h8t &&\n' span_id:322) (Token id:Id.Lit_Chars val:'\tgit add d12cr3h8t &&\n' span_id:323) 
          (Token id:Id.Lit_Chars val:'\n' span_id:324) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:325) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m czy8f73t &&\n' span_id:326) (Token id:Id.Lit_Chars val:'\n' span_id:327) 
          (Token id:Id.Lit_Chars val:'\t# commit 00000000008ec\n' span_id:328) (Token id:Id.Lit_Chars val:'\tgit mv d12cr3h8t j000jmpzn &&\n' span_id:329) 
          (Token id:Id.Lit_Chars val:'\techo j08bekfvt >>j000jmpzn &&\n' span_id:330) (Token id:Id.Lit_Chars val:'\tgit add j000jmpzn &&\n' span_id:331) 
          (Token id:Id.Lit_Chars val:'\n' span_id:332) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:333) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m ioiley5o &&\n' span_id:334) (Token id:Id.Lit_Chars val:'\n' span_id:335) 
          (Token id:Id.Lit_Chars val:'\t# commit 0000000005b0\n' span_id:336) (Token id:Id.Lit_Chars val:'\tgit checkout v1.0.0^0 &&\n' span_id:337) 
          (Token id:Id.Lit_Chars val:'\tgit mv a0blgqsjc f5518nwu &&\n' span_id:338) (Token id:Id.Lit_Chars val:'\n' span_id:339) 
          (Token
            id: Id.Lit_Chars
            val: '\tfor i in h62xsjeu j08bekfvt kg7xflhm\n'
            span_id: 340
          ) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:341) 
          (Token id:Id.Lit_Chars val:'\t\techo $i\n' span_id:342) (Token id:Id.Lit_Chars val:'\tdone >>f5518nwu &&\n' span_id:343) 
          (Token id:Id.Lit_Chars val:'\tgit add f5518nwu &&\n' span_id:344) (Token id:Id.Lit_Chars val:'\n' span_id:345) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:346) (Token id:Id.Lit_Chars val:'\tgit commit -m b3wettvi &&\n' span_id:347) 
          (Token id:Id.Lit_Chars val:'\tside=$(git rev-parse HEAD) &&\n' span_id:348) (Token id:Id.Lit_Chars val:'\n' span_id:349) 
          (Token id:Id.Lit_Chars val:'\t# commit 000000000066\n' span_id:350) (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:351) 
          (Token id:Id.Lit_Chars val:'\n' span_id:352) 
          (Token
            id: Id.Lit_Chars
            val: '\t# If you use recursive, merge will fail and you will need to\n'
            span_id: 353
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t# clean up a0blgqsjc as well.  If you use resolve, merge will\n'
            span_id: 354
          ) (Token id:Id.Lit_Chars val:'\t# succeed.\n' span_id:355) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_might_fail git merge --no-commit -s recursive $side &&\n'
            span_id: 356
          ) (Token id:Id.Lit_Chars val:'\tgit rm -f f5518nwu j000jmpzn &&\n' span_id:357) 
          (Token id:Id.Lit_Chars val:'\n' span_id:358) (Token id:Id.Lit_Chars val:'\ttest_might_fail git rm -f a0blgqsjc &&\n' span_id:359) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:360) (Token id:Id.Lit_Chars val:'\t\tgit cat-file blob $side:f5518nwu\n' span_id:361) 
          (Token id:Id.Lit_Chars val:'\t\techo j3l0i9s6\n' span_id:362) (Token id:Id.Lit_Chars val:'\t) >ab2gs879 &&\n' span_id:363) 
          (Token id:Id.Lit_Chars val:'\tgit add ab2gs879 &&\n' span_id:364) (Token id:Id.Lit_Chars val:'\n' span_id:365) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:366) (Token id:Id.Lit_Chars val:'\tgit commit -m ad2uee\n' span_id:367) 
          (Token id:Id.Lit_Chars val:'\n' span_id:368)
        )
      }
    )
    (C {(test_expect_failure)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'parse describe name taking advantage of generation'
            span_id: 375
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:379) 
          (Token
            id: Id.Lit_Chars
            val: '\t# ambiguous at the object name level, but there is only one\n'
            span_id: 380
          ) (Token id:Id.Lit_Chars val:'\t# such commit at generation 0\n' span_id:381) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse --verify v1.0.0-0-g000000000 &&\n'
            span_id: 382
          ) (Token id:Id.Lit_Chars val:'\n' span_id:383) 
          (Token id:Id.Lit_Chars val:'\t# likewise for generation 2 and 4\n' span_id:384) (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify v1.0.0-2-g000000000 &&\n' span_id:385) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse --verify v1.0.0-4-g000000000\n'
            span_id: 386
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'parse describe name not ignoring ambiguity' span_id:414))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:418) 
          (Token
            id: Id.Lit_Chars
            val: '\t# ambiguous at the object name level, and there are two such\n'
            span_id: 419
          ) (Token id:Id.Lit_Chars val:'\t# commits at generation 1\n' span_id:420) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --verify v1.0.0-1-g000000000\n'
            span_id: 421
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'ambiguous commit-ish' span_id:428))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:432) 
          (Token
            id: Id.Lit_Chars
            val: '\t# Now there are many commits that begin with the\n'
            span_id: 433
          ) (Token id:Id.Lit_Chars val:'\t# common prefix, none of these should pick one at\n' span_id:434) 
          (Token
            id: Id.Lit_Chars
            val: '\t# random.  They all should result in ambiguity errors.\n'
            span_id: 435
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --verify 00000000^{commit} &&\n'
            span_id: 436
          ) (Token id:Id.Lit_Chars val:'\n' span_id:437) (Token id:Id.Lit_Chars val:'\t# likewise\n' span_id:438) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git log 000000000..000000000 &&\n'
            span_id: 439
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git log ..000000000 &&\n' span_id:440) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git log 000000000.. &&\n'
            span_id: 441
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git log 000000000...000000000 &&\n' span_id:442) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git log ...000000000 &&\n'
            span_id: 443
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git log 000000000...\n' span_id:444)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'ambiguous tags peel to treeish' span_id:460))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:464) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse 0000000000f^{tree}\n'
            span_id: 465
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-parse --disambiguate' span_id:472))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:476) 
          (Token
            id: Id.Lit_Chars
            val: '\t# The test creates 16 objects that share the prefix and two\n'
            span_id: 477
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t# commits created by commit-tree in earlier tests share a\n'
            span_id: 478
          ) (Token id:Id.Lit_Chars val:'\t# different prefix.\n' span_id:479) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse --disambiguate=000000000 >actual &&\n'
            span_id: 480
          ) (Token id:Id.Lit_Chars val:'\ttest $(wc -l <actual) = 16 &&\n' span_id:481) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(sed -e "s/^\\(.........\\).*/\\1/" actual | sort -u)" = 000000000\n'
            span_id: 482
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-parse --disambiguate drops duplicates' span_id:489))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:493) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse --disambiguate=000000000 >expect &&\n'
            span_id: 494
          ) (Token id:Id.Lit_Chars val:'\tgit pack-objects .git/objects/pack/pack <expect &&\n' span_id:495) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse --disambiguate=000000000 >actual &&\n'
            span_id: 496
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:497)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'ambiguous 40-hex ref' span_id:504))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:508) 
          (Token id:Id.Lit_Chars val:'\tTREE=$(git mktree </dev/null) &&\n' span_id:509) (Token id:Id.Lit_Chars val:'\tREF=$(git rev-parse HEAD) &&\n' span_id:510) 
          (Token
            id: Id.Lit_Chars
            val: '\tVAL=$(git commit-tree $TREE </dev/null) &&\n'
            span_id: 511
          ) (Token id:Id.Lit_Chars val:'\tgit update-ref refs/heads/$REF $VAL &&\n' span_id:512) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest $(git rev-parse $REF 2>err) = $REF &&\n'
            span_id: 513
          ) (Token id:Id.Lit_Chars val:'\tgrep "refname.*${REF}.*ambiguous" err\n' span_id:514)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'ambiguous short sha1 ref' span_id:521))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:525) 
          (Token id:Id.Lit_Chars val:'\tTREE=$(git mktree </dev/null) &&\n' span_id:526) (Token id:Id.Lit_Chars val:'\tREF=$(git rev-parse --short HEAD) &&\n' span_id:527) 
          (Token
            id: Id.Lit_Chars
            val: '\tVAL=$(git commit-tree $TREE </dev/null) &&\n'
            span_id: 528
          ) (Token id:Id.Lit_Chars val:'\tgit update-ref refs/heads/$REF $VAL &&\n' span_id:529) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest $(git rev-parse $REF 2>err) = $VAL &&\n'
            span_id: 530
          ) (Token id:Id.Lit_Chars val:'\tgrep "refname.*${REF}.*ambiguous" err\n' span_id:531)
        )
      }
    )
    (C {(test_expect_success)} {(C_LOCALE_OUTPUT)} 
      {(SQ (Token id:Id.Lit_Chars val:'ambiguity errors are not repeated (raw)' span_id:540))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:544) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse 00000 2>stderr &&\n'
            span_id: 545
          ) (Token id:Id.Lit_Chars val:'\tgrep "is ambiguous" stderr >errors &&\n' span_id:546) 
          (Token id:Id.Lit_Chars val:'\ttest_line_count = 1 errors\n' span_id:547)
        )
      }
    )
    (C {(test_expect_success)} {(C_LOCALE_OUTPUT)} 
      {(SQ (Token id:Id.Lit_Chars val:'ambiguity errors are not repeated (treeish)' span_id:556))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:560) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse 00000:foo 2>stderr &&\n'
            span_id: 561
          ) (Token id:Id.Lit_Chars val:'\tgrep "is ambiguous" stderr >errors &&\n' span_id:562) 
          (Token id:Id.Lit_Chars val:'\ttest_line_count = 1 errors\n' span_id:563)
        )
      }
    )
    (C {(test_expect_success)} {(C_LOCALE_OUTPUT)} 
      {(SQ (Token id:Id.Lit_Chars val:'ambiguity errors are not repeated (peel)' span_id:572))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:576) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse 00000^{commit} 2>stderr &&\n'
            span_id: 577
          ) (Token id:Id.Lit_Chars val:'\tgrep "is ambiguous" stderr >errors &&\n' span_id:578) 
          (Token id:Id.Lit_Chars val:'\ttest_line_count = 1 errors\n' span_id:579)
        )
      }
    )
    (C {(test_expect_success)} {(C_LOCALE_OUTPUT)} 
      {(SQ (Token id:Id.Lit_Chars val:'ambiguity hints' span_id:588))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:592) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse 000000000 2>stderr &&\n'
            span_id: 593
          ) (Token id:Id.Lit_Chars val:'\tgrep ^hint: stderr >hints &&\n' span_id:594) 
          (Token
            id: Id.Lit_Chars
            val: '\t# 16 candidates, plus one intro line\n'
            span_id: 595
          ) (Token id:Id.Lit_Chars val:'\ttest_line_count = 17 hints\n' span_id:596)
        )
      }
    )
    (C {(test_expect_success)} {(C_LOCALE_OUTPUT)} 
      {(SQ (Token id:Id.Lit_Chars val:'ambiguity hints respect type' span_id:605))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:609) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse 000000000^{commit} 2>stderr &&\n'
            span_id: 610
          ) (Token id:Id.Lit_Chars val:'\tgrep ^hint: stderr >hints &&\n' span_id:611) 
          (Token
            id: Id.Lit_Chars
            val: '\t# 5 commits, 1 tag (which is a commitish), plus intro line\n'
            span_id: 612
          ) (Token id:Id.Lit_Chars val:'\ttest_line_count = 7 hints\n' span_id:613)
        )
      }
    )
    (C {(test_expect_success)} {(C_LOCALE_OUTPUT)} 
      {(SQ (Token id:Id.Lit_Chars val:'failed type-selector still shows hint' span_id:622))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:626) 
          (Token
            id: Id.Lit_Chars
            val: '\t# these two blobs share the same prefix "ee3d", but neither\n'
            span_id: 627
          ) (Token id:Id.Lit_Chars val:'\t# will pass for a commit\n' span_id:628) 
          (Token
            id: Id.Lit_Chars
            val: '\techo 851 | git hash-object --stdin -w &&\n'
            span_id: 629
          ) (Token id:Id.Lit_Chars val:'\techo 872 | git hash-object --stdin -w &&\n' span_id:630) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse ee3d^{commit} 2>stderr &&\n'
            span_id: 631
          ) (Token id:Id.Lit_Chars val:'\tgrep ^hint: stderr >hints &&\n' span_id:632) 
          (Token id:Id.Lit_Chars val:'\ttest_line_count = 3 hints\n' span_id:633)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'core.disambiguate config can prefer types' span_id:640))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:644) 
          (Token id:Id.Lit_Chars val:'\t# ambiguous between tree and tag\n' span_id:645) (Token id:Id.Lit_Chars val:'\tsha1=0000000000f &&\n' span_id:646) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse $sha1 &&\n'
            span_id: 647
          ) (Token id:Id.Lit_Chars val:'\tgit rev-parse $sha1^{commit} &&\n' span_id:648) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit -c core.disambiguate=committish rev-parse $sha1\n'
            span_id: 649
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'core.disambiguate does not override context' span_id:656))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:660) 
          (Token
            id: Id.Lit_Chars
            val: '\t# treeish ambiguous between tag and tree\n'
            span_id: 661
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail \\\n' span_id:662) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit -c core.disambiguate=committish rev-parse $sha1^{tree}\n'
            span_id: 663
          )
        )
      }
    )
    (C {(test_done)})
  ]
)