cache_tree_update: give an option to update cache-tree only.
[git.git] / cache-tree.c
index d8438d6..a10902f 100644 (file)
@@ -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
@@ -220,7 +226,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 +274,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;
        }
@@ -332,7 +340,14 @@ static int update_one(struct cache_tree *it,
 #endif
        }
 
-       write_sha1_file(buffer, offset, tree_type, it->sha1);
+       if (dryrun) {
+               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
@@ -346,13 +361,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;
@@ -476,12 +492,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)