summaryrefslogtreecommitdiff
path: root/builtin/log.c
diff options
context:
space:
mode:
authorFelipe Contreras <felipe.contreras@gmail.com>2013-04-07 17:46:20 (GMT)
committerJunio C Hamano <gitster@pobox.com>2013-04-07 20:32:41 (GMT)
commit80d35ca0aaeca654562974be6ea528e22bc76e8c (patch)
tree957c277a944dfaa40f1ea4383b15f1ea528b1811 /builtin/log.c
parent402596aafa45ef371611bb795bdf8daa2bdb9286 (diff)
downloadgit-80d35ca0aaeca654562974be6ea528e22bc76e8c.zip
git-80d35ca0aaeca654562974be6ea528e22bc76e8c.tar.gz
git-80d35ca0aaeca654562974be6ea528e22bc76e8c.tar.bz2
format-patch: improve head calculation for cover-letter
If we do it after the revision traversal we can be sure that this is indeed a commit that will be processed (i.e. not a merge) and it's the top most one (thus removing the NEEDSWORK comment, at least we show the same as 'git diff --stat' output that appears in the cover-letter). While we are at it, since we know there's nothing to generate, exit sooner in all cases, like --cover-letter currently does. Also, if there's nothing to generate and cover-letter is specified, a different code-path might be triggered that is not currently covered in the test-case, so add a test for it. Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/log.c')
-rw-r--r--builtin/log.c22
1 files changed, 4 insertions, 18 deletions
diff --git a/builtin/log.c b/builtin/log.c
index 0f31810..6792827 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -1311,24 +1311,6 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
rev.show_root_diff = 1;
if (cover_letter) {
- /*
- * NEEDSWORK:randomly pick one positive commit to show
- * diffstat; this is often the tip and the command
- * happens to do the right thing in most cases, but a
- * complex command like "--cover-letter a b c ^bottom"
- * picks "c" and shows diffstat between bottom..c
- * which may not match what the series represents at
- * all and totally broken.
- */
- int i;
- for (i = 0; i < rev.pending.nr; i++) {
- struct object *o = rev.pending.objects[i].item;
- if (!(o->flags & UNINTERESTING))
- head = (struct commit *)o;
- }
- /* There is nothing to show; it is not an error, though. */
- if (!head)
- return 0;
if (!branch_name)
branch_name = find_branch_name(&rev);
}
@@ -1364,6 +1346,10 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
list = xrealloc(list, nr * sizeof(list[0]));
list[nr - 1] = commit;
}
+ if (nr == 0)
+ /* nothing to do */
+ return 0;
+ head = list[0];
total = nr;
if (!keep_subject && auto_number && total > 1)
numbered = 1;