Previously, calling ls-tree with a revision such as `master^{tree}:foo/{{path}}` would show the root tree instead of the correct tree pointed by foo/{{path}}. If a colon is present in the revision name, peel_onion() should assume that the presence of a bracket at the end of the string belongs to the filename. Signed-off-by: Stan Hu <stanhu@xxxxxxxxx> --- sha1-name.c | 14 +++++++++++++- t/t3104-ls-tree-braces.sh | 30 ++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 t/t3104-ls-tree-braces.sh diff --git a/sha1-name.c b/sha1-name.c index faa60f69e3..69ecf0a26c 100644 --- a/sha1-name.c +++ b/sha1-name.c @@ -1001,9 +1001,21 @@ static int peel_onion(const char *name, int len, struct object_id *oid, * "ref^{commit}". "commit^{tree}" could be used to find the * top-level tree of the given commit. */ - if (len < 4 || name[len-1] != '}') + if (len < 4) return -1; + /* Check for names in ref:path format in case the path includes + * brackets (e.g. ref^{type}:foo/{{bar}}). + */ + for (sp = name; sp < name + len; sp++) { + if (*sp == ':') + return -1; + } + + if (sp == name && name[len-1] != '}') { + return -1; + } + for (sp = name + len - 1; name <= sp; sp--) { int ch = *sp; if (ch == '{' && name < sp && sp[-1] == '^') diff --git a/t/t3104-ls-tree-braces.sh b/t/t3104-ls-tree-braces.sh new file mode 100644 index 0000000000..3ead86c4fe --- /dev/null +++ b/t/t3104-ls-tree-braces.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +test_description='ls-tree with a folder with braces' + +. ./test-lib.sh + +test_expect_success 'setup' ' + mkdir -p "newdir/{{curly}}" && + touch "newdir/{{curly}}/one" && + git add "newdir/{{curly}}/one" && + git commit -m test +' + +test_expect_success 'ls-tree with curly brace folder' ' + cat >expect <<-EOF && + 100644 blob $EMPTY_BLOB one + EOF + git ls-tree -r "HEAD:newdir/{{curly}}" >actual && + test_cmp expect actual +' + +test_expect_success 'ls-tree with type restriction and curly brace folder' ' + cat >expect <<-EOF && + 100644 blob $EMPTY_BLOB one + EOF + git ls-tree "HEAD^{tree}:newdir/{{curly}}" >actual && + test_cmp expect actual +' + +test_done -- 2.19.0