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