path: root/tree-diff.c
diff options
authorRene Scharfe <>2006-10-26 16:52:39 (GMT)
committerJunio C Hamano <>2006-10-27 01:31:17 (GMT)
commit2b60356da5369dd60ab26eabaa91d95b6badf209 (patch)
treecbbdf8cbe6ef081f5e2d48c5d24d7fe283f443c4 /tree-diff.c
parente827633a5d7d627eb1170b2d0c71e944d0d56faf (diff)
Make git-cherry handle root trees
This patch on top of 'next' makes built-in git-cherry handle root commits. It moves the static function log-tree.c::diff_root_tree() to tree-diff.c and makes it more similar to diff_tree_sha1() by shuffling around arguments and factoring out the call to log_tree_diff_flush(). Consequently the name is changed to diff_root_tree_sha1(). It is a version of diff_tree_sha1() that compares the empty tree (= root tree) against a single 'real' tree. This function is then used in get_patch_id() to compute patch IDs for initial commits instead of SEGFAULTing, as the current code does if confronted with parentless commits. Signed-off-by: Rene Scharfe <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'tree-diff.c')
1 files changed, 18 insertions, 0 deletions
diff --git a/tree-diff.c b/tree-diff.c
index 7e2f4f0..37d235e 100644
--- a/tree-diff.c
+++ b/tree-diff.c
@@ -215,6 +215,24 @@ int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const cha
return retval;
+int diff_root_tree_sha1(const unsigned char *new, const char *base, struct diff_options *opt)
+ int retval;
+ void *tree;
+ struct tree_desc empty, real;
+ tree = read_object_with_reference(new, tree_type, &real.size, NULL);
+ if (!tree)
+ die("unable to read root tree (%s)", sha1_to_hex(new));
+ real.buf = tree;
+ empty.size = 0;
+ empty.buf = "";
+ retval = diff_tree(&empty, &real, base, opt);
+ free(tree);
+ return retval;
static int count_paths(const char **paths)
int i = 0;