diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-24 14:40:28 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-24 14:40:28 -0700 |
commit | 320d3a1b1aa04d75f0aaff3cc7cf582e144a84c6 (patch) | |
tree | faa60f2d661470ceea9791fd0592737975212a49 /update-cache.c | |
parent | c4bd907d959673a9113e32e53f65a279b9786f25 (diff) | |
download | git-320d3a1b1aa04d75f0aaff3cc7cf582e144a84c6.tar.gz git-320d3a1b1aa04d75f0aaff3cc7cf582e144a84c6.tar.xz |
git-update-cache: allow dot-files
We still refuse to add ".", ".." and ".git".
In theory, you could track another git-repository by allowing ".git",
but the potential for confusion is just too high.
Diffstat (limited to 'update-cache.c')
-rw-r--r-- | update-cache.c | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/update-cache.c b/update-cache.c index e76fb9b21..48b4deeeb 100644 --- a/update-cache.c +++ b/update-cache.c @@ -238,13 +238,42 @@ static int refresh_cache(void) /* * We fundamentally don't like some paths: we don't want - * dot or dot-dot anywhere, and in fact, we don't even want - * any other dot-files (.git or anything else). They - * are hidden, for chist sake. + * dot or dot-dot anywhere, and for obvious reasons don't + * want to recurse into ".git" either. * * Also, we don't want double slashes or slashes at the * end that can make pathnames ambiguous. */ +static int verify_dotfile(const char *rest) +{ + /* + * The first character was '.', but that + * has already been discarded, we now test + * the rest. + */ + switch (*rest) { + /* "." is not allowed */ + case '\0': case '/': + return 0; + + /* + * ".git" followed by NUL or slash is bad. This + * shares the path end test with the ".." case. + */ + case 'g': + if (rest[1] != 'i') + break; + if (rest[2] != 't') + break; + rest += 2; + /* fallthrough */ + case '.': + if (rest[1] == '\0' || rest[1] == '/') + return 0; + } + return 1; +} + static int verify_path(char *path) { char c; @@ -256,8 +285,15 @@ static int verify_path(char *path) if (c == '/') { inside: c = *path++; - if (c != '/' && c != '.' && c != '\0') + switch (c) { + default: continue; + case '/': case '\0': + break; + case '.': + if (verify_dotfile(path)) + continue; + } return 0; } c = *path++; |