X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=update-cache.c;h=7c2698df6e7b08315e7d20bd40c1e7e313f52bf3;hb=ef0bfa25e99627b809c0902d21072821955db3fe;hp=a9569533e12978041100e6013c3c3f3161c002b0;hpb=667bb59b2d5b0a2e7fca5970d6f757790a6edd74;p=git.git diff --git a/update-cache.c b/update-cache.c index a9569533e..7c2698df6 100644 --- a/update-cache.c +++ b/update-cache.c @@ -12,7 +12,8 @@ * like "git-update-cache *" and suddenly having all the object * files be revision controlled. */ -static int allow_add = 0, allow_remove = 0, allow_replace = 0, not_new = 0; +static int allow_add = 0, allow_remove = 0, allow_replace = 0, not_new = 0, quiet = 0; +static int force_remove; /* Three functions to allow overloaded pointer return; see linux/err.h */ static inline void *ERR_PTR(long error) @@ -221,10 +222,12 @@ static int refresh_cache(void) new = refresh_entry(ce); if (IS_ERR(new)) { - if (!(not_new && PTR_ERR(new) == -ENOENT)) { - printf("%s: needs update\n", ce->name); - has_errors = 1; - } + if (not_new && PTR_ERR(new) == -ENOENT) + continue; + if (quiet) + continue; + printf("%s: needs update\n", ce->name); + has_errors = 1; continue; } active_cache_changed = 1; @@ -238,13 +241,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 +288,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++; @@ -292,7 +331,7 @@ static int add_cacheinfo(char *arg1, char *arg2, char *arg3) return add_cache_entry(ce, option); } -struct cache_file cache_file; +static struct cache_file cache_file; int main(int argc, char **argv) { @@ -315,6 +354,10 @@ int main(int argc, char **argv) allow_options = 0; continue; } + if (!strcmp(path, "-q")) { + quiet = 1; + continue; + } if (!strcmp(path, "--add")) { allow_add = 1; continue; @@ -340,11 +383,7 @@ int main(int argc, char **argv) continue; } if (!strcmp(path, "--force-remove")) { - if (argc <= i + 1) - die("git-update-cache: --force-remove "); - if (remove_file_from_cache(argv[i+1])) - die("git-update-cache: --force-remove cannot remove %s", argv[i+1]); - i++; + force_remove = 1; continue; } @@ -358,6 +397,11 @@ int main(int argc, char **argv) fprintf(stderr, "Ignoring path %s\n", argv[i]); continue; } + if (force_remove) { + if (remove_file_from_cache(path)) + die("git-update-cache: --force-remove cannot remove %s", path); + continue; + } if (add_file_to_cache(path)) die("Unable to add %s to database", path); }