cache_tree_update: give an option to update cache-tree only.

When the extra "dryrun" parameter is true, cache_tree_update()
recomputes the invalid entry but does not actually creates
new tree object.

Signed-off-by: Junio C Hamano <junkio@cox.net>
diff --git a/cache-tree.c b/cache-tree.c
index 35740b3..a10902f 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -226,7 +226,8 @@
 		      int entries,
 		      const char *base,
 		      int baselen,
-		      int missing_ok)
+		      int missing_ok,
+		      int dryrun)
 {
 	unsigned long size, offset;
 	char *buffer;
@@ -273,7 +274,8 @@
 				    cache + i, entries - i,
 				    path,
 				    baselen + sublen + 1,
-				    missing_ok);
+				    missing_ok,
+				    dryrun);
 		i += subcnt - 1;
 		sub->used = 1;
 	}
@@ -338,7 +340,14 @@
 #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
@@ -352,13 +361,14 @@
 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;
diff --git a/cache-tree.h b/cache-tree.h
index 5d824df..72c6480 100644
--- a/cache-tree.h
+++ b/cache-tree.h
@@ -26,6 +26,6 @@
 struct cache_tree *cache_tree_read(const char *buffer, unsigned long size);
 
 int cache_tree_fully_valid(struct cache_tree *);
-int cache_tree_update(struct cache_tree *, struct cache_entry **, int, int);
+int cache_tree_update(struct cache_tree *, struct cache_entry **, int, int, int);
 
 #endif
diff --git a/write-tree.c b/write-tree.c
index a506992..7a4f691 100644
--- a/write-tree.c
+++ b/write-tree.c
@@ -41,7 +41,7 @@
 	if (!was_valid) {
 		if (cache_tree_update(active_cache_tree,
 				      active_cache, active_nr,
-				      missing_ok) < 0)
+				      missing_ok, 0) < 0)
 			die("git-write-tree: error building trees");
 		if (0 <= newfd) {
 			if (!write_cache(newfd, active_cache, active_nr))