X-Git-Url: https://git.octo.it/?p=git.git;a=blobdiff_plain;f=cache-tree.c;h=a880c97b38e7d36f2a45a1743e9565cc1e58280d;hp=d8438d67d7ce5549c0b2baa377bec31202619138;hb=1a82e79315ed633f6b0b1fc4076054950c5380d3;hpb=61fa30972c45e73d39c81d27af9eeacbda7531c9 diff --git a/cache-tree.c b/cache-tree.c index d8438d67..a880c97b 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -91,6 +91,12 @@ static struct cache_tree_sub *find_subtree(struct cache_tree *it, return down; } +struct cache_tree_sub *cache_tree_sub(struct cache_tree *it, const char *path) +{ + int pathlen = strlen(path); + return find_subtree(it, path, pathlen, 1); +} + void cache_tree_invalidate_path(struct cache_tree *it, const char *path) { /* a/b/c @@ -104,6 +110,10 @@ void cache_tree_invalidate_path(struct cache_tree *it, const char *path) int namelen; struct cache_tree_sub *down; +#if DEBUG + fprintf(stderr, "cache-tree invalidate <%s>\n", path); +#endif + if (!it) return; slash = strchr(path, '/'); @@ -220,7 +230,8 @@ static int update_one(struct cache_tree *it, int entries, const char *base, int baselen, - int missing_ok) + int missing_ok, + int dryrun) { unsigned long size, offset; char *buffer; @@ -267,7 +278,8 @@ static int update_one(struct cache_tree *it, cache + i, entries - i, path, baselen + sublen + 1, - missing_ok); + missing_ok, + dryrun); i += subcnt - 1; sub->used = 1; } @@ -327,16 +339,23 @@ static int update_one(struct cache_tree *it, offset += 20; #if DEBUG - fprintf(stderr, "cache-tree %o %.*s\n", + fprintf(stderr, "cache-tree update-one %o %.*s\n", mode, entlen, path + baselen); #endif } - write_sha1_file(buffer, offset, tree_type, it->sha1); + if (dryrun) { + unsigned char hdr[200]; + int hdrlen; + write_sha1_file_prepare(buffer, offset, tree_type, it->sha1, + hdr, &hdrlen); + } + else + write_sha1_file(buffer, offset, tree_type, it->sha1); free(buffer); it->entry_count = i; #if DEBUG - fprintf(stderr, "cache-tree (%d ent, %d subtree) %s\n", + fprintf(stderr, "cache-tree update-one (%d ent, %d subtree) %s\n", it->entry_count, it->subtree_nr, sha1_to_hex(it->sha1)); #endif @@ -346,13 +365,14 @@ static int update_one(struct cache_tree *it, int cache_tree_update(struct cache_tree *it, struct cache_entry **cache, int entries, - int missing_ok) + int missing_ok, + int dryrun) { int i; i = verify_cache(cache, entries); if (i) return i; - i = update_one(it, cache, entries, "", 0, missing_ok); + i = update_one(it, cache, entries, "", 0, missing_ok, dryrun); if (i < 0) return i; return 0; @@ -424,6 +444,8 @@ static struct cache_tree *read_one(const char **buffer, unsigned long *size_p) { const char *buf = *buffer; unsigned long size = *size_p; + const char *cp; + char *ep; struct cache_tree *it; int i, subtree_nr; @@ -437,7 +459,14 @@ static struct cache_tree *read_one(const char **buffer, unsigned long *size_p) goto free_return; buf++; size--; it = cache_tree(); - if (sscanf(buf, "%d %d\n", &it->entry_count, &subtree_nr) != 2) + + cp = buf; + it->entry_count = strtol(cp, &ep, 10); + if (cp == ep) + goto free_return; + cp = ep; + subtree_nr = strtol(cp, &ep, 10); + if (cp == ep) goto free_return; while (size && *buf && *buf != '\n') { size--; @@ -476,12 +505,11 @@ static struct cache_tree *read_one(const char **buffer, unsigned long *size_p) struct cache_tree *sub; struct cache_tree_sub *subtree; const char *name = buf; - int namelen; + sub = read_one(&buf, &size); if (!sub) goto free_return; - namelen = strlen(name); - subtree = find_subtree(it, name, namelen, 1); + subtree = cache_tree_sub(it, name); subtree->cache_tree = sub; } if (subtree_nr != it->subtree_nr)