]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sparse-checkout: escape all glob characters on write
authorDerrick Stolee <dstolee@microsoft.com>
Fri, 31 Jan 2020 20:16:13 +0000 (20:16 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 31 Jan 2020 21:05:29 +0000 (13:05 -0800)
The sparse-checkout patterns allow special globs according to
fnmatch(3). When writing cone-mode patterns for paths containing
these characters, they must be escaped.

Use is_glob_special() to check which characters must be escaped
this way, and add a path to the tests that contains all glob
characters at once. Note that ']' is not special, since the
initial bracket '[' is escaped.

Reported-by: Jeff King <peff@peff.net>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/sparse-checkout.c
t/t1091-sparse-checkout-builtin.sh

index facdb6bda707de92808a5a1c961eaed3eb125cbf..7aeb384362df0d5933239632bd56ca31ba8ef483 100644 (file)
@@ -149,7 +149,7 @@ static char *escaped_pattern(char *pattern)
        struct strbuf final = STRBUF_INIT;
 
        while (*p) {
-               if (*p == '*' || *p == '\\')
+               if (is_glob_special(*p))
                        strbuf_addch(&final, '\\');
 
                strbuf_addch(&final, *p);
index 545e8d5ebe1de98ef56dcb07accb87797464ee11..37e9304ef32cf0bd84da1ba8038743d1180410e6 100755 (executable)
@@ -381,20 +381,21 @@ test_expect_success 'pattern-checks: contained glob characters' '
        done
 '
 
-test_expect_success BSLASHPSPEC 'pattern-checks: escaped "*"' '
+test_expect_success BSLASHPSPEC 'pattern-checks: escaped characters' '
        git clone repo escaped &&
        TREEOID=$(git -C escaped rev-parse HEAD:folder1) &&
        NEWTREE=$(git -C escaped mktree <<-EOF
        $(git -C escaped ls-tree HEAD)
        040000 tree $TREEOID    zbad\\dir
        040000 tree $TREEOID    zdoes*exist
+       040000 tree $TREEOID    zglob[!a]?
        EOF
        ) &&
        COMMIT=$(git -C escaped commit-tree $NEWTREE -p HEAD) &&
        git -C escaped reset --hard $COMMIT &&
-       check_files escaped "a deep folder1 folder2 zbad\\dir zdoes*exist" &&
+       check_files escaped "a deep folder1 folder2 zbad\\dir zdoes*exist" zglob[!a]? &&
        git -C escaped sparse-checkout init --cone &&
-       git -C escaped sparse-checkout set zbad\\dir/bogus "zdoes*not*exist" "zdoes*exist" &&
+       git -C escaped sparse-checkout set zbad\\dir/bogus "zdoes*not*exist" "zdoes*exist" "zglob[!a]?" &&
        cat >expect <<-\EOF &&
        /*
        !/*/
@@ -403,9 +404,10 @@ test_expect_success BSLASHPSPEC 'pattern-checks: escaped "*"' '
        /zbad\\dir/bogus/
        /zdoes\*exist/
        /zdoes\*not\*exist/
+       /zglob\[!a]\?/
        EOF
        test_cmp expect escaped/.git/info/sparse-checkout &&
-       check_read_tree_errors escaped "a zbad\\dir zdoes*exist" &&
+       check_read_tree_errors escaped "a zbad\\dir zdoes*exist zglob[!a]?" &&
        git -C escaped ls-tree -d --name-only HEAD >list-expect &&
        git -C escaped sparse-checkout set --stdin <list-expect &&
        cat >expect <<-\EOF &&
@@ -416,9 +418,10 @@ test_expect_success BSLASHPSPEC 'pattern-checks: escaped "*"' '
        /folder2/
        /zbad\\dir/
        /zdoes\*exist/
+       /zglob\[!a]\?/
        EOF
        test_cmp expect escaped/.git/info/sparse-checkout &&
-       check_files escaped "a deep folder1 folder2 zbad\\dir zdoes*exist" &&
+       check_files escaped "a deep folder1 folder2 zbad\\dir zdoes*exist" zglob[!a]? &&
        git -C escaped sparse-checkout list >list-actual &&
        test_cmp list-expect list-actual
 '