diff options
author | Junio C Hamano <junkio@cox.net> | 2006-05-20 01:28:49 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-05-20 01:52:19 -0700 |
commit | 93872e07008510340eec951f0d037f7b3a0b8567 (patch) | |
tree | ce5b2c6456000dd5e8dde7b479c2ad6784966055 /read-cache.c | |
parent | 283c8eef6c9a4e379c73904d2bc22b19341b15c8 (diff) | |
parent | d9b814cc97f16daac06566a5340121c446136d22 (diff) | |
download | git-93872e07008510340eec951f0d037f7b3a0b8567.tar.gz |
Merge branch 'lt/dirwalk' into jc/dirwalk-n-cache-tree
This commit is what this branch is all about. It records the
evil merge needed to adjust built-in git-add and git-rm for
the cache-tree extension.
* lt/dirwalk:
Add builtin "git rm" command
Move pathspec matching from builtin-add.c into dir.c
Prevent bogus paths from being added to the index.
builtin-add: fix unmatched pathspec warnings.
Remove old "git-add.sh" remnants
builtin-add: warn on unmatched pathspecs
Do "git add" as a builtin
Clean up git-ls-file directory walking library interface
libify git-ls-files directory traversal
Conflicts:
Makefile
builtin.h
git.c
update-index.c
Diffstat (limited to 'read-cache.c')
-rw-r--r-- | read-cache.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/read-cache.c b/read-cache.c index 2512565260..36bd4ea0be 100644 --- a/read-cache.c +++ b/read-cache.c @@ -347,6 +347,70 @@ int ce_path_match(const struct cache_entry *ce, const char **pathspec) } /* + * We fundamentally don't like some paths: we don't want + * 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; +} + +int verify_path(const char *path) +{ + char c; + + goto inside; + for (;;) { + if (!c) + return 1; + if (c == '/') { +inside: + c = *path++; + switch (c) { + default: + continue; + case '/': case '\0': + break; + case '.': + if (verify_dotfile(path)) + continue; + } + return 0; + } + c = *path++; + } +} + +/* * Do we have another file that has the beginning components being a * proper superset of the name we're trying to add? */ @@ -487,6 +551,8 @@ int add_cache_entry(struct cache_entry *ce, int option) if (!ok_to_add) return -1; + if (!verify_path(ce->name)) + return -1; if (!skip_df_check && check_file_directory_conflict(ce, pos, ok_to_replace)) { |