If the tree has already been read, no need to read it into memory again. This also helps when this function is called on temporary trees; these no longer have to be written to disk. Signed-off-by: Johannes Schindelin <Johannes.Schindelin@xxxxxx> --- tree-diff.c | 33 ++++++++++++++++++++++----------- 1 files changed, 22 insertions(+), 11 deletions(-) diff --git a/tree-diff.c b/tree-diff.c index 9d80dfb..54a6b44 100644 --- a/tree-diff.c +++ b/tree-diff.c @@ -195,23 +195,34 @@ int diff_tree(struct tree_desc *t1, struct tree_desc *t2, const char *base, stru return 0; } +static int get_tree_desc_from_sha1(const unsigned char *sha1, + struct tree_desc *t) +{ + struct object *o; + + o = lookup_object(sha1); + if (o && o->type == OBJ_TREE && o->parsed) { + struct tree *tree = (struct tree *)o; + t->size = tree->size; + t->buf = xmalloc(t->size); + memcpy(t->buf, tree->buffer, t->size); + } else { + t->buf = read_object_with_reference(sha1, + tree_type, &t->size, NULL); + if (!t->buf) + die("unable to read source tree (%s)", + sha1_to_hex(sha1)); + } +} + int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const char *base, struct diff_options *opt) { - void *tree1, *tree2; struct tree_desc t1, t2; int retval; - tree1 = read_object_with_reference(old, tree_type, &t1.size, NULL); - if (!tree1) - die("unable to read source tree (%s)", sha1_to_hex(old)); - tree2 = read_object_with_reference(new, tree_type, &t2.size, NULL); - if (!tree2) - die("unable to read destination tree (%s)", sha1_to_hex(new)); - t1.buf = tree1; - t2.buf = tree2; + get_tree_desc_from_sha1(old, &t1); + get_tree_desc_from_sha1(new, &t2); retval = diff_tree(&t1, &t2, base, opt); - free(tree1); - free(tree2); return retval; } -- 1.4.4.2.g0f32-dirty - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html