X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=read-cache.c;h=54536944648c166008f06d29f65314b58b0c3988;hb=e2e5e98a40d6ed04b7acf791cc2243ff32923db3;hp=91b2628e3c18e7f75e477c24197d9ef2eca14125;hpb=d6d3f9d0125a7215f3cdc2600b2307ca55b69536;p=git.git diff --git a/read-cache.c b/read-cache.c index 91b2628e..54536944 100644 --- a/read-cache.c +++ b/read-cache.c @@ -9,9 +9,15 @@ const char *sha1_file_directory = NULL; struct cache_entry **active_cache = NULL; unsigned int active_nr = 0, active_alloc = 0; -void usage(const char *err) +void usage(const char *err, ...) { - fprintf(stderr, "read-tree: %s\n", err); + va_list args; + char string[200]; + + va_start(args, err); + vsnprintf(string, sizeof(string), err, args); + va_end(args); + fprintf(stderr, "%s\n", string); exit(1); } @@ -59,7 +65,7 @@ char * sha1_to_hex(const unsigned char *sha1) * careful about using it. Do a "strdup()" if you need to save the * filename. */ -char *sha1_file_name(unsigned char *sha1) +char *sha1_file_name(const unsigned char *sha1) { int i; static char *name, *base; @@ -95,7 +101,7 @@ int check_sha1_signature(unsigned char *sha1, void *map, unsigned long size) return memcmp(sha1, real_sha1, 20) ? -1 : 0; } -void *map_sha1_file(unsigned char *sha1, unsigned long *size) +void *map_sha1_file(const unsigned char *sha1, unsigned long *size) { char *filename = sha1_file_name(sha1); int fd = open(filename, O_RDONLY); @@ -154,7 +160,7 @@ void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned l return buf; } -void * read_sha1_file(unsigned char *sha1, char *type, unsigned long *size) +void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size) { unsigned long mapsize; void *map, *buf; @@ -204,7 +210,7 @@ int write_sha1_file(char *buf, unsigned len, unsigned char *returnsha1) return 0; } -int write_sha1_buffer(unsigned char *sha1, void *buf, unsigned int size) +int write_sha1_buffer(const unsigned char *sha1, void *buf, unsigned int size) { char *filename = sha1_file_name(sha1); int fd; @@ -272,39 +278,42 @@ int cache_name_pos(const char *name, int namelen) struct cache_entry *ce = active_cache[next]; int cmp = cache_name_compare(name, namelen, ce->name, ce->namelen); if (!cmp) - return -next-1; + return next; if (cmp < 0) { last = next; continue; } first = next+1; } - return first; + return -first-1; } int remove_file_from_cache(char *path) { int pos = cache_name_pos(path, strlen(path)); - if (pos < 0) { - pos = -pos-1; + if (pos >= 0) { active_nr--; if (pos < active_nr) - memmove(active_cache + pos, active_cache + pos + 1, (active_nr - pos - 1) * sizeof(struct cache_entry *)); + memmove(active_cache + pos, active_cache + pos + 1, (active_nr - pos) * sizeof(struct cache_entry *)); } return 0; } -int add_cache_entry(struct cache_entry *ce) +int add_cache_entry(struct cache_entry *ce, int ok_to_add) { int pos; pos = cache_name_pos(ce->name, ce->namelen); /* existing match? Just replace it */ - if (pos < 0) { - active_cache[-pos-1] = ce; + if (pos >= 0) { + active_cache[pos] = ce; return 0; } + pos = -pos-1; + + if (!ok_to_add) + return -1; /* Make sure the array is big enough .. */ if (active_nr == active_alloc) { @@ -355,7 +364,7 @@ int read_cache(void) sha1_file_directory = DEFAULT_DB_ENVIRONMENT; if (access(sha1_file_directory, X_OK) < 0) return error("no access to SHA1 file directory"); - fd = open(".dircache/index", O_RDONLY); + fd = open(".git/index", O_RDONLY); if (fd < 0) return (errno == ENOENT) ? 0 : error("open failed");