(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:'support for reading config from a blob' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'create config blob' span_id:17))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:21) (Token id:Id.Lit_Chars val:'\tcat >config <<-\\EOF &&\n' span_id:22) (Token id:Id.Lit_Chars val:'\t[some]\n' span_id:23) (Token id:Id.Lit_Chars val:'\t\tvalue = 1\n' span_id:24) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:25) (Token id:Id.Lit_Chars val:'\tgit add config &&\n' span_id:26) (Token id:Id.Lit_Chars val:'\tgit commit -m foo\n' span_id:27) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'list config blob contents' span_id:34))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:38) (Token id:Id.Lit_Chars val:'\techo some.value=1 >expect &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\tgit config --blob=HEAD:config --list >actual &&\n' span_id:40) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:41) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'fetch value from blob' span_id:48))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:52) (Token id:Id.Lit_Chars val:'\techo true >expect &&\n' span_id:53) (Token id: Id.Lit_Chars val: '\tgit config --blob=HEAD:config --bool some.value >actual &&\n' span_id: 54 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:55) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'reading non-existing value from blob is an error' span_id:62))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:66) (Token id: Id.Lit_Chars val: '\ttest_must_fail git config --blob=HEAD:config non.existing\n' span_id: 67 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'reading from blob and file is an error' span_id:74))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:78) (Token id: Id.Lit_Chars val: '\ttest_must_fail git config --blob=HEAD:config --system --list\n' span_id: 79 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'reading from missing ref is an error' span_id:86))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:90) (Token id: Id.Lit_Chars val: '\ttest_must_fail git config --blob=HEAD:doesnotexist --list\n' span_id: 91 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'reading from non-blob is an error' span_id:98))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:102) (Token id: Id.Lit_Chars val: '\ttest_must_fail git config --blob=HEAD --list\n' span_id: 103 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setting a value in a blob is an error' span_id:110))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:114) (Token id: Id.Lit_Chars val: '\ttest_must_fail git config --blob=HEAD:config some.value foo\n' span_id: 115 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'deleting a value in a blob is an error' span_id:122))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:126) (Token id: Id.Lit_Chars val: '\ttest_must_fail git config --blob=HEAD:config --unset some.value\n' span_id: 127 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'editing a blob is an error' span_id:134))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:138) (Token id: Id.Lit_Chars val: '\ttest_must_fail git config --blob=HEAD:config --edit\n' span_id: 139 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'parse errors in blobs are properly attributed' span_id:146))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:150) (Token id:Id.Lit_Chars val:'\tcat >config <<-\\EOF &&\n' span_id:151) (Token id:Id.Lit_Chars val:'\t[some]\n' span_id:152) (Token id:Id.Lit_Chars val:'\t\tvalue = "\n' span_id:153) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:154) (Token id:Id.Lit_Chars val:'\tgit add config &&\n' span_id:155) (Token id:Id.Lit_Chars val:'\tgit commit -m broken &&\n' span_id:156) (Token id:Id.Lit_Chars val:'\n' span_id:157) (Token id: Id.Lit_Chars val: '\ttest_must_fail git config --blob=HEAD:config some.value 2>err &&\n' span_id: 158 ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "HEAD:config" err\n' span_id:159) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'can parse blob ending with CR' span_id:166))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:170) (Token id: Id.Lit_Chars val: '\tprintf "[some]key = value\\\\r" >config &&\n' span_id: 171 ) (Token id:Id.Lit_Chars val:'\tgit add config &&\n' span_id:172) (Token id:Id.Lit_Chars val:'\tgit commit -m CR &&\n' span_id:173) (Token id:Id.Lit_Chars val:'\techo value >expect &&\n' span_id:174) (Token id: Id.Lit_Chars val: '\tgit config --blob=HEAD:config some.key >actual &&\n' span_id: 175 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:176) ) } ) (C {(test_done)}) ] )