(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'test_description='> name:test_description) op: assign_op.Equal rhs: {(SQ <'support for reading config from a blob'>)} spids: [4] ) ] redirects: [] ) (C {<.>} {<'./test-lib.sh'>}) (C {<test_expect_success>} {(SQ <'create config blob'>)} { (SQ <'\n'> <'\tcat >config <<-\\EOF &&\n'> <'\t[some]\n'> <'\t\tvalue = 1\n'> <'\tEOF\n'> <'\tgit add config &&\n'> <'\tgit commit -m foo\n'> ) } ) (C {<test_expect_success>} {(SQ <'list config blob contents'>)} { (SQ <'\n'> <'\techo some.value=1 >expect &&\n'> <'\tgit config --blob=HEAD:config --list >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {<test_expect_success>} {(SQ <'fetch value from blob'>)} { (SQ <'\n'> <'\techo true >expect &&\n'> <'\tgit config --blob=HEAD:config --bool some.value >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {<test_expect_success>} {(SQ <'reading non-existing value from blob is an error'>)} {(SQ <'\n'> <'\ttest_must_fail git config --blob=HEAD:config non.existing\n'>)} ) (C {<test_expect_success>} {(SQ <'reading from blob and file is an error'>)} {(SQ <'\n'> <'\ttest_must_fail git config --blob=HEAD:config --system --list\n'>)} ) (C {<test_expect_success>} {(SQ <'reading from missing ref is an error'>)} {(SQ <'\n'> <'\ttest_must_fail git config --blob=HEAD:doesnotexist --list\n'>)} ) (C {<test_expect_success>} {(SQ <'reading from non-blob is an error'>)} {(SQ <'\n'> <'\ttest_must_fail git config --blob=HEAD --list\n'>)} ) (C {<test_expect_success>} {(SQ <'setting a value in a blob is an error'>)} {(SQ <'\n'> <'\ttest_must_fail git config --blob=HEAD:config some.value foo\n'>)} ) (C {<test_expect_success>} {(SQ <'deleting a value in a blob is an error'>)} {(SQ <'\n'> <'\ttest_must_fail git config --blob=HEAD:config --unset some.value\n'>)} ) (C {<test_expect_success>} {(SQ <'editing a blob is an error'>)} {(SQ <'\n'> <'\ttest_must_fail git config --blob=HEAD:config --edit\n'>)} ) (C {<test_expect_success>} {(SQ <'parse errors in blobs are properly attributed'>)} { (SQ <'\n'> <'\tcat >config <<-\\EOF &&\n'> <'\t[some]\n'> <'\t\tvalue = "\n'> <'\tEOF\n'> <'\tgit add config &&\n'> <'\tgit commit -m broken &&\n'> <'\n'> <'\ttest_must_fail git config --blob=HEAD:config some.value 2>err &&\n'> <'\ttest_i18ngrep "HEAD:config" err\n'> ) } ) (C {<test_expect_success>} {(SQ <'can parse blob ending with CR'>)} { (SQ <'\n'> <'\tprintf "[some]key = value\\\\r" >config &&\n'> <'\tgit add config &&\n'> <'\tgit commit -m CR &&\n'> <'\techo value >expect &&\n'> <'\tgit config --blob=HEAD:config some.key >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {<test_done>}) ] )