summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2007-12-11 16:05:50 -0800
committerLibravatar Junio C Hamano <gitster@pobox.com>2007-12-11 16:05:50 -0800
commit7c3c79629547195d13e325ea015ce9f89bf461b5 (patch)
treeb584fbf9afbbba1dd2446345a59ac197acbae73a
parentgit-clone: print an error message when trying to clone empty repo (diff)
downloadtgif-7c3c79629547195d13e325ea015ce9f89bf461b5.tar.xz
blame: drop blob data after passing blame to the parent
We used to keep the blob data for each origin that has any remaining line in the result, but this will get very costly with a huge file that has a deep history. This patch releases the blob after we ran diff between the child rev and its parents. When passing blame from a parent to its parent (i.e. the grandparent), the blob data for the parent may need to be read again, but it should be relatively cheap, thanks to delta-base cache. Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin-blame.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/builtin-blame.c b/builtin-blame.c
index c158d319dc..eda79d0f00 100644
--- a/builtin-blame.c
+++ b/builtin-blame.c
@@ -130,6 +130,14 @@ static void origin_decref(struct origin *o)
}
}
+static void drop_origin_blob(struct origin *o)
+{
+ if (o->file.ptr) {
+ free(o->file.ptr);
+ o->file.ptr = NULL;
+ }
+}
+
/*
* Each group of lines is described by a blame_entry; it can be split
* as we pass blame to the parents. They form a linked list in the
@@ -1274,8 +1282,13 @@ static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt)
}
finish:
- for (i = 0; i < MAXPARENT; i++)
- origin_decref(parent_origin[i]);
+ for (i = 0; i < MAXPARENT; i++) {
+ if (parent_origin[i]) {
+ drop_origin_blob(parent_origin[i]);
+ origin_decref(parent_origin[i]);
+ }
+ }
+ drop_origin_blob(origin);
}
/*