diff options
-rw-r--r-- | Documentation/git-format-patch.txt | 4 | ||||
-rw-r--r-- | builtin/log.c | 5 | ||||
-rw-r--r-- | cache.h | 1 | ||||
-rw-r--r-- | log-tree.c | 3 | ||||
-rw-r--r-- | revision.h | 1 | ||||
-rw-r--r-- | sha1_file.c | 1 | ||||
-rwxr-xr-x | t/t4014-format-patch.sh | 14 |
7 files changed, 28 insertions, 1 deletions
diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index 4035649117..e3cdaeb958 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -256,6 +256,10 @@ you can use `--suffix=-patch` to get `0001-description-of-my-change-patch`. using this option cannot be applied properly, but they are still useful for code review. +--zero-commit:: + Output an all-zero hash in each patch's From header instead + of the hash of the commit. + --root:: Treat the revision argument as a <revision range>, even if it is just a single commit (that would normally be treated as a diff --git a/builtin/log.c b/builtin/log.c index 069bd3a909..e00cea75cc 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -1196,6 +1196,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) int cover_letter = -1; int boundary_count = 0; int no_binary_diff = 0; + int zero_commit = 0; struct commit *origin = NULL; const char *in_reply_to = NULL; struct patch_ids ids; @@ -1236,6 +1237,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback }, OPT_BOOL(0, "no-binary", &no_binary_diff, N_("don't output binary diffs")), + OPT_BOOL(0, "zero-commit", &zero_commit, + N_("output all-zero hash in From header")), OPT_BOOL(0, "ignore-if-in-upstream", &ignore_if_in_upstream, N_("don't include a patch matching a commit upstream")), { OPTION_SET_INT, 'p', "no-stat", &use_patch_format, NULL, @@ -1380,6 +1383,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) /* Always generate a patch */ rev.diffopt.output_format |= DIFF_FORMAT_PATCH; + rev.zero_commit = zero_commit; + if (!DIFF_OPT_TST(&rev.diffopt, TEXT) && !no_binary_diff) DIFF_OPT_SET(&rev.diffopt, BINARY); @@ -831,6 +831,7 @@ extern const char *find_unique_abbrev(const unsigned char *sha1, int len); extern int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len); extern const unsigned char null_sha1[GIT_SHA1_RAWSZ]; +extern const struct object_id null_oid; static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2) { diff --git a/log-tree.c b/log-tree.c index 35e780170a..f70a30e127 100644 --- a/log-tree.c +++ b/log-tree.c @@ -342,7 +342,8 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit, { const char *subject = NULL; const char *extra_headers = opt->extra_headers; - const char *name = oid_to_hex(&commit->object.oid); + const char *name = oid_to_hex(opt->zero_commit ? + &null_oid : &commit->object.oid); *need_8bit_cte_p = 0; /* unknown */ if (opt->total > 0) { diff --git a/revision.h b/revision.h index 5bc9686846..23857c0ed1 100644 --- a/revision.h +++ b/revision.h @@ -135,6 +135,7 @@ struct rev_info { pretty_given:1, abbrev_commit:1, abbrev_commit_given:1, + zero_commit:1, use_terminator:1, missing_newline:1, date_mode_explicit:1, diff --git a/sha1_file.c b/sha1_file.c index 2c68766ebf..73ccd49a46 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -36,6 +36,7 @@ static inline uintmax_t sz_fmt(size_t s) { return s; } const unsigned char null_sha1[20]; +const struct object_id null_oid; /* * This is meant to hold a *small* number of objects that you would diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index 890db1174f..646c4750ec 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -1431,4 +1431,18 @@ test_expect_success 'cover letter auto user override' ' test_line_count = 2 list ' +test_expect_success 'format-patch --zero-commit' ' + git format-patch --zero-commit --stdout v2..v1 >patch2 && + grep "^From " patch2 | sort | uniq >actual && + echo "From $_z40 Mon Sep 17 00:00:00 2001" >expect && + test_cmp expect actual +' + +test_expect_success 'From line has expected format' ' + git format-patch --stdout v2..v1 >patch2 && + grep "^From " patch2 >from && + grep "^From $_x40 Mon Sep 17 00:00:00 2001$" patch2 >filtered && + test_cmp from filtered +' + test_done |