]> git.ipfire.org Git - thirdparty/git.git/commitdiff
t0060: test ntfs/hfs-obscured dotfiles
authorJeff King <peff@peff.net>
Mon, 3 May 2021 20:43:22 +0000 (16:43 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 4 May 2021 02:52:02 +0000 (11:52 +0900)
We have tests that cover various filesystem-specific spellings of
".gitmodules", because we need to reliably identify that path for some
security checks. These are from dc2d9ba318 (is_{hfs,ntfs}_dotgitmodules:
add tests, 2018-05-12), with the actual code coming from e7cb0b4455
(is_ntfs_dotgit: match other .git files, 2018-05-11) and 0fc333ba20
(is_hfs_dotgit: match other .git files, 2018-05-02).

Those latter two commits also added similar matching functions for
.gitattributes and .gitignore. These ended up not being used in the
final series, and are currently dead code. But in preparation for them
being used in some fsck checks, let's make sure they actually work by
throwing a few basic tests at them. Likewise, let's cover .mailmap
(which does need matching code added).

I didn't bother with the whole battery of tests that we cover for
.gitmodules. These functions are all based on the same generic matcher,
so it's sufficient to test most of the corner cases just once.

Note that the ntfs magic prefix names in the tests come from the
algorithm described in e7cb0b4455 (and are different for each file).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
cache.h
path.c
t/helper/test-path-utils.c
t/t0060-path-utils.sh
utf8.c
utf8.h

diff --git a/cache.h b/cache.h
index b785ffb383152cad52cff133aa09f09aa0a99a64..e6dda88fb072f080db47c0c24bf3dddfb67db7ba 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -1271,6 +1271,7 @@ int is_ntfs_dotgit(const char *name);
 int is_ntfs_dotgitmodules(const char *name);
 int is_ntfs_dotgitignore(const char *name);
 int is_ntfs_dotgitattributes(const char *name);
+int is_ntfs_dotmailmap(const char *name);
 
 /*
  * Returns true iff "str" could be confused as a command-line option when
diff --git a/path.c b/path.c
index 9e883eb52446d39573a0291109e4b57d28d56bc9..7bccd830e95890c16a93a52801c008a2b634ca24 100644 (file)
--- a/path.c
+++ b/path.c
@@ -1493,6 +1493,11 @@ int is_ntfs_dotgitattributes(const char *name)
        return is_ntfs_dot_str(name, "gitattributes", "gi7d29");
 }
 
+int is_ntfs_dotmailmap(const char *name)
+{
+       return is_ntfs_dot_str(name, "mailmap", "maba30");
+}
+
 int looks_like_command_line_option(const char *str)
 {
        return str && str[0] == '-';
index 313a153209c48f9001f122fa61f6c42c39ac02f8..229ed416b0e67867331bfd75fe376834766f7da5 100644 (file)
@@ -172,9 +172,22 @@ static struct test_data dirname_data[] = {
        { NULL,              NULL     }
 };
 
-static int is_dotgitmodules(const char *path)
+static int check_dotfile(const char *x, const char **argv,
+                        int (*is_hfs)(const char *),
+                        int (*is_ntfs)(const char *))
 {
-       return is_hfs_dotgitmodules(path) || is_ntfs_dotgitmodules(path);
+       int res = 0, expect = 1;
+       for (; *argv; argv++) {
+               if (!strcmp("--not", *argv))
+                       expect = !expect;
+               else if (expect != (is_hfs(*argv) || is_ntfs(*argv)))
+                       res = error("'%s' is %s.git%s", *argv,
+                                   expect ? "not " : "", x);
+               else
+                       fprintf(stderr, "ok: '%s' is %s.git%s\n",
+                               *argv, expect ? "" : "not ", x);
+       }
+       return !!res;
 }
 
 static int cmp_by_st_size(const void *a, const void *b)
@@ -382,17 +395,24 @@ int cmd__path_utils(int argc, const char **argv)
                return test_function(dirname_data, posix_dirname, argv[1]);
 
        if (argc > 2 && !strcmp(argv[1], "is_dotgitmodules")) {
-               int res = 0, expect = 1, i;
-               for (i = 2; i < argc; i++)
-                       if (!strcmp("--not", argv[i]))
-                               expect = !expect;
-                       else if (expect != is_dotgitmodules(argv[i]))
-                               res = error("'%s' is %s.gitmodules", argv[i],
-                                           expect ? "not " : "");
-                       else
-                               fprintf(stderr, "ok: '%s' is %s.gitmodules\n",
-                                       argv[i], expect ? "" : "not ");
-               return !!res;
+               return check_dotfile("modules", argv + 2,
+                                    is_hfs_dotgitmodules,
+                                    is_ntfs_dotgitmodules);
+       }
+       if (argc > 2 && !strcmp(argv[1], "is_dotgitignore")) {
+               return check_dotfile("ignore", argv + 2,
+                                    is_hfs_dotgitignore,
+                                    is_ntfs_dotgitignore);
+       }
+       if (argc > 2 && !strcmp(argv[1], "is_dotgitattributes")) {
+               return check_dotfile("attributes", argv + 2,
+                                    is_hfs_dotgitattributes,
+                                    is_ntfs_dotgitattributes);
+       }
+       if (argc > 2 && !strcmp(argv[1], "is_dotmailmap")) {
+               return check_dotfile("mailmap", argv + 2,
+                                    is_hfs_dotmailmap,
+                                    is_ntfs_dotmailmap);
        }
 
        if (argc > 2 && !strcmp(argv[1], "file-size")) {
index 0ff06b5d1b30a815030d64cadc82d98079b68f06..de4960783f071a48fd136b14f7ac1051fa3c4b77 100755 (executable)
@@ -468,6 +468,36 @@ test_expect_success 'match .gitmodules' '
                .gitmodules,:\$DATA
 '
 
+test_expect_success 'match .gitattributes' '
+       test-tool path-utils is_dotgitattributes \
+               .gitattributes \
+               .git${u200c}attributes \
+               .Gitattributes \
+               .gitattributeS \
+               GITATT~1 \
+               GI7D29~1
+'
+
+test_expect_success 'match .gitignore' '
+       test-tool path-utils is_dotgitignore \
+               .gitignore \
+               .git${u200c}ignore \
+               .Gitignore \
+               .gitignorE \
+               GITIGN~1 \
+               GI250A~1
+'
+
+test_expect_success 'match .mailmap' '
+       test-tool path-utils is_dotmailmap \
+               .mailmap \
+               .mail${u200c}map \
+               .Mailmap \
+               .mailmaP \
+               MAILMA~1 \
+               MABA30~1
+'
+
 test_expect_success MINGW 'is_valid_path() on Windows' '
        test-tool path-utils is_valid_path \
                win32 \
diff --git a/utf8.c b/utf8.c
index 5b39361ada0bbab3dc4df90e64cc6173bb465ff4..de4ce5c0e68adc5da1976806e45e73f42b6e1346 100644 (file)
--- a/utf8.c
+++ b/utf8.c
@@ -777,6 +777,11 @@ int is_hfs_dotgitattributes(const char *path)
        return is_hfs_dot_str(path, "gitattributes");
 }
 
+int is_hfs_dotmailmap(const char *path)
+{
+       return is_hfs_dot_str(path, "mailmap");
+}
+
 const char utf8_bom[] = "\357\273\277";
 
 int skip_utf8_bom(char **text, size_t len)
diff --git a/utf8.h b/utf8.h
index fcd5167bafb38ddafc3c4e22b642b87fb935c8e1..9a16c8679dcd08b66d0a930c04fe1395679cbdcb 100644 (file)
--- a/utf8.h
+++ b/utf8.h
@@ -61,6 +61,7 @@ int is_hfs_dotgit(const char *path);
 int is_hfs_dotgitmodules(const char *path);
 int is_hfs_dotgitignore(const char *path);
 int is_hfs_dotgitattributes(const char *path);
+int is_hfs_dotmailmap(const char *path);
 
 typedef enum {
        ALIGN_LEFT,