Earlier, git-format-patch used to silently skip over commits that it didn't intend to make patches out of. As a consequence, a command like 'git-format-patch -3' would just do nothing and print nothing if the topmost three commits were merge commits. Instead, print a useful message similar to "Skipping: Merge branch ..." when ignoring a commit. Suggested-by: Jakub Narebski <jnareb@xxxxxxxxx> Cc: Thomas Rast <trast@xxxxxxxxxxxxxxx> Signed-off-by: Ramkumar Ramachandra <artagnon@xxxxxxxxx> --- builtin/log.c | 42 +++++++++++++++++++++++++++++++----------- 1 files changed, 31 insertions(+), 11 deletions(-) diff --git a/builtin/log.c b/builtin/log.c index 0151d2f..b64de7c 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -1090,7 +1090,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) struct commit **list = NULL; struct rev_info rev; struct setup_revision_opt s_r_opt; - int nr = 0, total, i; + int nr = 0, nr_i = 0, total, i; int use_stdout = 0; int start_number = -1; int numbered_files = 0; /* _just_ numbers */ @@ -1098,6 +1098,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) int cover_letter = 0; int boundary_count = 0; int no_binary_diff = 0; + int *list_i = NULL; struct commit *origin = NULL, *head = NULL; const char *in_reply_to = NULL; struct patch_ids ids; @@ -1342,19 +1343,22 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) continue; } - /* ignore merges */ - if (commit->parents && commit->parents->next) - continue; - - if (ignore_if_in_upstream && - has_commit_patch_id(commit, &ids)) - continue; + /* ignore merge commits and optionally ignore commits + already in upstream */ + if ((commit->parents && commit->parents->next) || + (ignore_if_in_upstream && + has_commit_patch_id(commit, &ids))) { + /* Store the nr of the ignored commits in list_i */ + nr_i++; + list_i = xrealloc(list_i, nr_i * sizeof(list_i[0])); + list_i[nr_i - 1] = nr; + } nr++; list = xrealloc(list, nr * sizeof(list[0])); list[nr - 1] = commit; } - total = nr; + total = nr - nr_i; if (!keep_subject && auto_number && total > 1) numbered = 1; if (numbered) @@ -1376,10 +1380,25 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) start_number--; } rev.add_signoff = add_signoff; - while (0 <= --nr) { + for (i = nr - nr_i; --nr >= 0;) { int shown; commit = list[nr]; - rev.nr = total - nr + (start_number - 1); + + /* Ignore commits in list whose index is list_i */ + if (list_i[nr_i - 1] == nr) { + struct strbuf commit_msg = STRBUF_INIT; + struct pretty_print_context ctx = {0}; + format_commit_message(commit, "%s", &commit_msg, &ctx); + fprintf(realstdout, "Skipping: %s\n", + commit_msg.buf); + strbuf_release(&buf); + --nr_i; + continue; + } + else + --i; + + rev.nr = total - i + (start_number - 1); /* Make the second and subsequent mails replies to the first */ if (thread) { /* Have we already had a message ID? */ @@ -1443,6 +1462,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) fclose(stdout); } free(list); + free(list_i); string_list_clear(&extra_to, 0); string_list_clear(&extra_cc, 0); string_list_clear(&extra_hdr, 0); -- 1.7.2.2.409.gdbb11.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