X-Git-Url: https://git.octo.it/?a=blobdiff_plain;ds=inline;f=update-index.c;h=11b7f6a5169e0a9a957155c03c7a56667efe980c;hb=9754563ca9a99bc0fe233f43202af15704fbed4d;hp=ef82b8620cdb0e8ae41a27c1f85411998e7266eb;hpb=caf4f582b2bb4d5582540aa49d29749b2600cd03;p=git.git diff --git a/update-index.c b/update-index.c index ef82b862..11b7f6a5 100644 --- a/update-index.c +++ b/update-index.c @@ -5,6 +5,7 @@ */ #include "cache.h" #include "strbuf.h" +#include "quote.h" /* * Default to not allowing changes to the list of files. The @@ -337,7 +338,8 @@ static void read_index_info(int line_termination) struct strbuf buf; strbuf_init(&buf); while (1) { - char *ptr; + char *ptr, *tab; + char *path_name; unsigned char sha1[20]; unsigned int mode; @@ -346,20 +348,31 @@ static void read_index_info(int line_termination) break; mode = strtoul(buf.buf, &ptr, 8); - if (ptr == buf.buf || *ptr != ' ' || - get_sha1_hex(ptr + 1, sha1) || - ptr[41] != '\t') + if (ptr == buf.buf || *ptr != ' ') goto bad_line; - ptr += 42; - if (!verify_path(ptr)) { - fprintf(stderr, "Ignoring path %s\n", ptr); + tab = strchr(ptr, '\t'); + if (!tab || tab - ptr < 41) + goto bad_line; + if (get_sha1_hex(tab - 40, sha1) || tab[-41] != ' ') + goto bad_line; + ptr = tab + 1; + + if (line_termination && ptr[0] == '"') + path_name = unquote_c_style(ptr, NULL); + else + path_name = ptr; + + if (!verify_path(path_name)) { + fprintf(stderr, "Ignoring path %s\n", path_name); + if (path_name != ptr) + free(path_name); continue; } if (!mode) { /* mode == 0 means there is no such path -- remove */ - if (remove_file_from_cache(ptr)) + if (remove_file_from_cache(path_name)) die("git-update-index: unable to remove %s", ptr); } @@ -369,10 +382,12 @@ static void read_index_info(int line_termination) * ptr[-41] is at the beginning of sha1 */ ptr[-42] = ptr[-1] = 0; - if (add_cacheinfo(buf.buf, ptr-41, ptr)) + if (add_cacheinfo(buf.buf, ptr-41, path_name)) die("git-update-index: unable to update %s", - ptr); + path_name); } + if (path_name != ptr) + free(path_name); continue; bad_line: @@ -380,6 +395,9 @@ static void read_index_info(int line_termination) } } +static const char update_index_usage[] = +"git-update-index [-q] [--add] [--replace] [--remove] [--unmerged] [--refresh] [--cacheinfo] [--chmod=(+|-)x] [--info-only] [--force-remove] [--stdin] [--index-info] [--ignore-missing] [-z] [--verbose] [--] ..."; + int main(int argc, const char **argv) { int i, newfd, entries, has_errors = 0, line_termination = '\n'; @@ -477,6 +495,8 @@ int main(int argc, const char **argv) verbose = 1; continue; } + if (!strcmp(path, "-h") || !strcmp(path, "--help")) + usage(update_index_usage); die("unknown option %s", path); } update_one(path, prefix, prefix_length);