{"thread":{"id":"22959","subject":"[PATCH 1/4] t4013: add tests for log -p -m --first-parent","startedAt":"2010-03-09T09:42:52Z","lastAt":"2010-03-09T09:42:55Z","messageCount":4,"participants":["Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":4},"messages":[{"id":"136422","messageId":"1268127775-9998-1-git-send-email-gitster@pobox.com","threadId":"22959","inReplyTo":null,"subject":"[PATCH 1/4] t4013: add tests for log -p -m --first-parent","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2010-03-09T09:42:52Z","receivedAt":"2010-03-09T09:42:52Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Signed-off-by: Junio C Hamano <gitster@pobox.com>\n---\n\n * This is just to finish off where Pasky has left off.\n\n t/t4013-diff-various.sh                      |    3 +\n t/t4013/diff.log_-m_-p_--first-parent_master |  100 +++++++++++++\n t/t4013/diff.log_-m_-p_master                |  200 ++++++++++++++++++++++++++\n t/t4013/diff.log_-p_--first-parent_master    |   78 ++++++++++\n 4 files changed, 381 insertions(+), 0 deletions(-)\n create mode 100644 t/t4013/diff.log_-m_-p_--first-parent_master\n create mode 100644 t/t4013/diff.log_-m_-p_master\n create mode 100644 t/t4013/diff.log_-p_--first-parent_master\n\ndiff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh\nindex 8e3694e..68cb651 100755\n--- a/t/t4013-diff-various.sh\n+++ b/t/t4013-diff-various.sh\n@@ -204,6 +204,9 @@ log --root --patch-with-stat --summary master\n log --root -c --patch-with-stat --summary master\n # improved by Timo's patch\n log --root --cc --patch-with-stat --summary master\n+log -p --first-parent master\n+log -m -p --first-parent master\n+log -m -p master\n log -SF master\n log -SF -p master\n log --decorate --all\ndiff --git a/t/t4013/diff.log_-m_-p_--first-parent_master b/t/t4013/diff.log_-m_-p_--first-parent_master\nnew file mode 100644\nindex 0000000..7a0073f\n--- /dev/null\n+++ b/t/t4013/diff.log_-m_-p_--first-parent_master\n@@ -0,0 +1,100 @@\n+$ git log -m -p --first-parent master\n+commit 59d314ad6f356dd08601a4cd5e530381da3e3c64\n+Merge: 9a6d494 c7a2ab9\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:04:00 2006 +0000\n+\n+    Merge branch 'side'\n+\n+diff --git a/dir/sub b/dir/sub\n+index cead32e..992913c 100644\n+--- a/dir/sub\n++++ b/dir/sub\n+@@ -4,3 +4,5 @@ C\n+ D\n+ E\n+ F\n++1\n++2\n+diff --git a/file0 b/file0\n+index b414108..10a8a9f 100644\n+--- a/file0\n++++ b/file0\n+@@ -4,3 +4,6 @@\n+ 4\n+ 5\n+ 6\n++A\n++B\n++C\n+\n+commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:02:00 2006 +0000\n+\n+    Third\n+\n+diff --git a/dir/sub b/dir/sub\n+index 8422d40..cead32e 100644\n+--- a/dir/sub\n++++ b/dir/sub\n+@@ -2,3 +2,5 @@ A\n+ B\n+ C\n+ D\n++E\n++F\n+diff --git a/file1 b/file1\n+new file mode 100644\n+index 0000000..b1e6722\n+--- /dev/null\n++++ b/file1\n+@@ -0,0 +1,3 @@\n++A\n++B\n++C\n+\n+commit 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:01:00 2006 +0000\n+\n+    Second\n+    \n+    This is the second commit.\n+\n+diff --git a/dir/sub b/dir/sub\n+index 35d242b..8422d40 100644\n+--- a/dir/sub\n++++ b/dir/sub\n+@@ -1,2 +1,4 @@\n+ A\n+ B\n++C\n++D\n+diff --git a/file0 b/file0\n+index 01e79c3..b414108 100644\n+--- a/file0\n++++ b/file0\n+@@ -1,3 +1,6 @@\n+ 1\n+ 2\n+ 3\n++4\n++5\n++6\n+diff --git a/file2 b/file2\n+deleted file mode 100644\n+index 01e79c3..0000000\n+--- a/file2\n++++ /dev/null\n+@@ -1,3 +0,0 @@\n+-1\n+-2\n+-3\n+\n+commit 444ac553ac7612cc88969031b02b3767fb8a353a\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:00:00 2006 +0000\n+\n+    Initial\n+$\ndiff --git a/t/t4013/diff.log_-m_-p_master b/t/t4013/diff.log_-m_-p_master\nnew file mode 100644\nindex 0000000..9ca62a0\n--- /dev/null\n+++ b/t/t4013/diff.log_-m_-p_master\n@@ -0,0 +1,200 @@\n+$ git log -m -p master\n+commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (from 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0)\n+Merge: 9a6d494 c7a2ab9\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:04:00 2006 +0000\n+\n+    Merge branch 'side'\n+\n+diff --git a/dir/sub b/dir/sub\n+index cead32e..992913c 100644\n+--- a/dir/sub\n++++ b/dir/sub\n+@@ -4,3 +4,5 @@ C\n+ D\n+ E\n+ F\n++1\n++2\n+diff --git a/file0 b/file0\n+index b414108..10a8a9f 100644\n+--- a/file0\n++++ b/file0\n+@@ -4,3 +4,6 @@\n+ 4\n+ 5\n+ 6\n++A\n++B\n++C\n+\n+commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (from c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a)\n+Merge: 9a6d494 c7a2ab9\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:04:00 2006 +0000\n+\n+    Merge branch 'side'\n+\n+diff --git a/dir/sub b/dir/sub\n+index 7289e35..992913c 100644\n+--- a/dir/sub\n++++ b/dir/sub\n+@@ -1,4 +1,8 @@\n+ A\n+ B\n++C\n++D\n++E\n++F\n+ 1\n+ 2\n+diff --git a/file0 b/file0\n+index f4615da..10a8a9f 100644\n+--- a/file0\n++++ b/file0\n+@@ -1,6 +1,9 @@\n+ 1\n+ 2\n+ 3\n++4\n++5\n++6\n+ A\n+ B\n+ C\n+diff --git a/file1 b/file1\n+new file mode 100644\n+index 0000000..b1e6722\n+--- /dev/null\n++++ b/file1\n+@@ -0,0 +1,3 @@\n++A\n++B\n++C\n+diff --git a/file2 b/file2\n+deleted file mode 100644\n+index 01e79c3..0000000\n+--- a/file2\n++++ /dev/null\n+@@ -1,3 +0,0 @@\n+-1\n+-2\n+-3\n+diff --git a/file3 b/file3\n+deleted file mode 100644\n+index 7289e35..0000000\n+--- a/file3\n++++ /dev/null\n+@@ -1,4 +0,0 @@\n+-A\n+-B\n+-1\n+-2\n+\n+commit c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:03:00 2006 +0000\n+\n+    Side\n+\n+diff --git a/dir/sub b/dir/sub\n+index 35d242b..7289e35 100644\n+--- a/dir/sub\n++++ b/dir/sub\n+@@ -1,2 +1,4 @@\n+ A\n+ B\n++1\n++2\n+diff --git a/file0 b/file0\n+index 01e79c3..f4615da 100644\n+--- a/file0\n++++ b/file0\n+@@ -1,3 +1,6 @@\n+ 1\n+ 2\n+ 3\n++A\n++B\n++C\n+diff --git a/file3 b/file3\n+new file mode 100644\n+index 0000000..7289e35\n+--- /dev/null\n++++ b/file3\n+@@ -0,0 +1,4 @@\n++A\n++B\n++1\n++2\n+\n+commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:02:00 2006 +0000\n+\n+    Third\n+\n+diff --git a/dir/sub b/dir/sub\n+index 8422d40..cead32e 100644\n+--- a/dir/sub\n++++ b/dir/sub\n+@@ -2,3 +2,5 @@ A\n+ B\n+ C\n+ D\n++E\n++F\n+diff --git a/file1 b/file1\n+new file mode 100644\n+index 0000000..b1e6722\n+--- /dev/null\n++++ b/file1\n+@@ -0,0 +1,3 @@\n++A\n++B\n++C\n+\n+commit 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:01:00 2006 +0000\n+\n+    Second\n+    \n+    This is the second commit.\n+\n+diff --git a/dir/sub b/dir/sub\n+index 35d242b..8422d40 100644\n+--- a/dir/sub\n++++ b/dir/sub\n+@@ -1,2 +1,4 @@\n+ A\n+ B\n++C\n++D\n+diff --git a/file0 b/file0\n+index 01e79c3..b414108 100644\n+--- a/file0\n++++ b/file0\n+@@ -1,3 +1,6 @@\n+ 1\n+ 2\n+ 3\n++4\n++5\n++6\n+diff --git a/file2 b/file2\n+deleted file mode 100644\n+index 01e79c3..0000000\n+--- a/file2\n++++ /dev/null\n+@@ -1,3 +0,0 @@\n+-1\n+-2\n+-3\n+\n+commit 444ac553ac7612cc88969031b02b3767fb8a353a\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:00:00 2006 +0000\n+\n+    Initial\n+$\ndiff --git a/t/t4013/diff.log_-p_--first-parent_master b/t/t4013/diff.log_-p_--first-parent_master\nnew file mode 100644\nindex 0000000..3fc896d\n--- /dev/null\n+++ b/t/t4013/diff.log_-p_--first-parent_master\n@@ -0,0 +1,78 @@\n+$ git log -p --first-parent master\n+commit 59d314ad6f356dd08601a4cd5e530381da3e3c64\n+Merge: 9a6d494 c7a2ab9\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:04:00 2006 +0000\n+\n+    Merge branch 'side'\n+\n+commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:02:00 2006 +0000\n+\n+    Third\n+\n+diff --git a/dir/sub b/dir/sub\n+index 8422d40..cead32e 100644\n+--- a/dir/sub\n++++ b/dir/sub\n+@@ -2,3 +2,5 @@ A\n+ B\n+ C\n+ D\n++E\n++F\n+diff --git a/file1 b/file1\n+new file mode 100644\n+index 0000000..b1e6722\n+--- /dev/null\n++++ b/file1\n+@@ -0,0 +1,3 @@\n++A\n++B\n++C\n+\n+commit 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:01:00 2006 +0000\n+\n+    Second\n+    \n+    This is the second commit.\n+\n+diff --git a/dir/sub b/dir/sub\n+index 35d242b..8422d40 100644\n+--- a/dir/sub\n++++ b/dir/sub\n+@@ -1,2 +1,4 @@\n+ A\n+ B\n++C\n++D\n+diff --git a/file0 b/file0\n+index 01e79c3..b414108 100644\n+--- a/file0\n++++ b/file0\n+@@ -1,3 +1,6 @@\n+ 1\n+ 2\n+ 3\n++4\n++5\n++6\n+diff --git a/file2 b/file2\n+deleted file mode 100644\n+index 01e79c3..0000000\n+--- a/file2\n++++ /dev/null\n+@@ -1,3 +0,0 @@\n+-1\n+-2\n+-3\n+\n+commit 444ac553ac7612cc88969031b02b3767fb8a353a\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:00:00 2006 +0000\n+\n+    Initial\n+$\n-- \n1.7.0.2.384.g015e\n"},{"id":"136443","messageId":"1268127775-9998-2-git-send-email-gitster@pobox.com","threadId":"22959","inReplyTo":"1268127775-9998-1-git-send-email-gitster@pobox.com","subject":"[PATCH 2/4] revision: introduce setup_revision_opt","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2010-03-09T09:42:53Z","receivedAt":"2010-03-09T09:42:53Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"So far the last parameter to setup_revisions() was to specify the default\nref when the command line did not give any (typically \"HEAD\").  This changes\nit to take a pointer to a structure so that we can add other information without\ntouching too many codepaths in later patches.\n\nThere is no functionality change.\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n\n builtin-log.c |   30 ++++++++++++++++++++++--------\n diff-lib.c    |    5 ++++-\n revision.c    |    4 ++--\n revision.h    |    6 +++++-\n wt-status.c   |   15 +++++++++++----\n 5 files changed, 44 insertions(+), 16 deletions(-)\n\ndiff --git a/builtin-log.c b/builtin-log.c\nindex 8d16832..dfbf6f2 100644\n--- a/builtin-log.c\n+++ b/builtin-log.c\n@@ -32,7 +32,7 @@ static const char * const builtin_log_usage =\n \t\"   or: git show [options] <object>...\";\n \n static void cmd_log_init(int argc, const char **argv, const char *prefix,\n-\t\t      struct rev_info *rev)\n+\t\t\t struct rev_info *rev, struct setup_revision_opt *opt)\n {\n \tint i;\n \tint decoration_style = 0;\n@@ -56,7 +56,7 @@ static void cmd_log_init(int argc, const char **argv, const char *prefix,\n \t */\n \tif (argc == 2 && !strcmp(argv[1], \"-h\"))\n \t\tusage(builtin_log_usage);\n-\targc = setup_revisions(argc, argv, rev, \"HEAD\");\n+\targc = setup_revisions(argc, argv, rev, opt);\n \n \tif (!rev->show_notes_given && !rev->pretty_given)\n \t\trev->show_notes = 1;\n@@ -262,6 +262,7 @@ static int git_log_config(const char *var, const char *value, void *cb)\n int cmd_whatchanged(int argc, const char **argv, const char *prefix)\n {\n \tstruct rev_info rev;\n+\tstruct setup_revision_opt opt;\n \n \tgit_config(git_log_config, NULL);\n \n@@ -271,7 +272,9 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)\n \tinit_revisions(&rev, prefix);\n \trev.diff = 1;\n \trev.simplify_history = 0;\n-\tcmd_log_init(argc, argv, prefix, &rev);\n+\tmemset(&opt, 0, sizeof(opt));\n+\topt.def = \"HEAD\";\n+\tcmd_log_init(argc, argv, prefix, &rev, &opt);\n \tif (!rev.diffopt.output_format)\n \t\trev.diffopt.output_format = DIFF_FORMAT_RAW;\n \treturn cmd_log_walk(&rev);\n@@ -328,6 +331,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)\n {\n \tstruct rev_info rev;\n \tstruct object_array_entry *objects;\n+\tstruct setup_revision_opt opt;\n \tint i, count, ret = 0;\n \n \tgit_config(git_log_config, NULL);\n@@ -342,7 +346,9 @@ int cmd_show(int argc, const char **argv, const char *prefix)\n \trev.always_show_header = 1;\n \trev.ignore_merges = 0;\n \trev.no_walk = 1;\n-\tcmd_log_init(argc, argv, prefix, &rev);\n+\tmemset(&opt, 0, sizeof(opt));\n+\topt.def = \"HEAD\";\n+\tcmd_log_init(argc, argv, prefix, &rev, &opt);\n \n \tcount = rev.pending.nr;\n \tobjects = rev.pending.objects;\n@@ -405,6 +411,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)\n int cmd_log_reflog(int argc, const char **argv, const char *prefix)\n {\n \tstruct rev_info rev;\n+\tstruct setup_revision_opt opt;\n \n \tgit_config(git_log_config, NULL);\n \n@@ -415,7 +422,9 @@ int cmd_log_reflog(int argc, const char **argv, const char *prefix)\n \tinit_reflog_walk(&rev.reflog_info);\n \trev.abbrev_commit = 1;\n \trev.verbose_header = 1;\n-\tcmd_log_init(argc, argv, prefix, &rev);\n+\tmemset(&opt, 0, sizeof(opt));\n+\topt.def = \"HEAD\";\n+\tcmd_log_init(argc, argv, prefix, &rev, &opt);\n \n \t/*\n \t * This means that we override whatever commit format the user gave\n@@ -438,6 +447,7 @@ int cmd_log_reflog(int argc, const char **argv, const char *prefix)\n int cmd_log(int argc, const char **argv, const char *prefix)\n {\n \tstruct rev_info rev;\n+\tstruct setup_revision_opt opt;\n \n \tgit_config(git_log_config, NULL);\n \n@@ -446,7 +456,9 @@ int cmd_log(int argc, const char **argv, const char *prefix)\n \n \tinit_revisions(&rev, prefix);\n \trev.always_show_header = 1;\n-\tcmd_log_init(argc, argv, prefix, &rev);\n+\tmemset(&opt, 0, sizeof(opt));\n+\topt.def = \"HEAD\";\n+\tcmd_log_init(argc, argv, prefix, &rev, &opt);\n \treturn cmd_log_walk(&rev);\n }\n \n@@ -887,6 +899,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)\n \tstruct commit *commit;\n \tstruct commit **list = NULL;\n \tstruct rev_info rev;\n+\tstruct setup_revision_opt s_r_opt;\n \tint nr = 0, total, i;\n \tint use_stdout = 0;\n \tint start_number = -1;\n@@ -964,8 +977,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)\n \trev.combine_merges = 0;\n \trev.ignore_merges = 1;\n \tDIFF_OPT_SET(&rev.diffopt, RECURSIVE);\n-\n \trev.subject_prefix = fmt_patch_subject_prefix;\n+\tmemset(&s_r_opt, 0, sizeof(s_r_opt));\n+\ts_r_opt.def = \"HEAD\";\n \n \tif (default_attach) {\n \t\trev.mime_boundary = default_attach;\n@@ -1037,7 +1051,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)\n \tif (keep_subject && subject_prefix)\n \t\tdie (\"--subject-prefix and -k are mutually exclusive.\");\n \n-\targc = setup_revisions(argc, argv, &rev, \"HEAD\");\n+\targc = setup_revisions(argc, argv, &rev, &s_r_opt);\n \tif (argc > 1)\n \t\tdie (\"unrecognized argument: %s\", argv[1]);\n \ndiff --git a/diff-lib.c b/diff-lib.c\nindex d7e13cb..64976f9 100644\n--- a/diff-lib.c\n+++ b/diff-lib.c\n@@ -510,9 +510,12 @@ int do_diff_cache(const unsigned char *tree_sha1, struct diff_options *opt)\n int index_differs_from(const char *def, int diff_flags)\n {\n \tstruct rev_info rev;\n+\tstruct setup_revision_opt opt;\n \n \tinit_revisions(&rev, NULL);\n-\tsetup_revisions(0, NULL, &rev, def);\n+\tmemset(&opt, 0, sizeof(opt));\n+\topt.def = def;\n+\tsetup_revisions(0, NULL, &rev, &opt);\n \tDIFF_OPT_SET(&rev.diffopt, QUICK);\n \tDIFF_OPT_SET(&rev.diffopt, EXIT_WITH_STATUS);\n \trev.diffopt.flags |= diff_flags;\ndiff --git a/revision.c b/revision.c\nindex 3ba6d99..25c1bbb 100644\n--- a/revision.c\n+++ b/revision.c\n@@ -1328,7 +1328,7 @@ static void append_prune_data(const char ***prune_data, const char **av)\n  * Returns the number of arguments left that weren't recognized\n  * (which are also moved to the head of the argument list)\n  */\n-int setup_revisions(int argc, const char **argv, struct rev_info *revs, const char *def)\n+int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct setup_revision_opt *opt)\n {\n \tint i, flags, left, seen_dashdash, read_from_stdin;\n \tconst char **prune_data = NULL;\n@@ -1462,7 +1462,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch\n \t\trevs->prune_data = get_pathspec(revs->prefix, prune_data);\n \n \tif (revs->def == NULL)\n-\t\trevs->def = def;\n+\t\trevs->def = opt ? opt->def : NULL;\n \tif (revs->show_merge)\n \t\tprepare_show_merge(revs);\n \tif (revs->def && !revs->pending.nr) {\ndiff --git a/revision.h b/revision.h\nindex a14deef..fcc0de8 100644\n--- a/revision.h\n+++ b/revision.h\n@@ -137,8 +137,12 @@ struct rev_info {\n typedef void (*show_early_output_fn_t)(struct rev_info *, struct commit_list *);\n extern volatile show_early_output_fn_t show_early_output;\n \n+struct setup_revision_opt {\n+\tconst char *def;\n+};\n+\n extern void init_revisions(struct rev_info *revs, const char *prefix);\n-extern int setup_revisions(int argc, const char **argv, struct rev_info *revs, const char *def);\n+extern int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct setup_revision_opt *);\n extern void parse_revision_opt(struct rev_info *revs, struct parse_opt_ctx_t *ctx,\n \t\t\t\t const struct option *options,\n \t\t\t\t const char * const usagestr[]);\ndiff --git a/wt-status.c b/wt-status.c\nindex 5807fc3..dcaec7f 100644\n--- a/wt-status.c\n+++ b/wt-status.c\n@@ -290,10 +290,13 @@ static void wt_status_collect_changes_worktree(struct wt_status *s)\n static void wt_status_collect_changes_index(struct wt_status *s)\n {\n \tstruct rev_info rev;\n+\tstruct setup_revision_opt opt;\n \n \tinit_revisions(&rev, NULL);\n-\tsetup_revisions(0, NULL, &rev,\n-\t\ts->is_initial ? EMPTY_TREE_SHA1_HEX : s->reference);\n+\tmemset(&opt, 0, sizeof(opt));\n+\topt.def = s->is_initial ? EMPTY_TREE_SHA1_HEX : s->reference;\n+\tsetup_revisions(0, NULL, &rev, &opt);\n+\n \trev.diffopt.output_format |= DIFF_FORMAT_CALLBACK;\n \trev.diffopt.format_callback = wt_status_collect_updated_cb;\n \trev.diffopt.format_callback_data = s;\n@@ -512,11 +515,15 @@ static void wt_status_print_untracked(struct wt_status *s)\n static void wt_status_print_verbose(struct wt_status *s)\n {\n \tstruct rev_info rev;\n+\tstruct setup_revision_opt opt;\n \n \tinit_revisions(&rev, NULL);\n \tDIFF_OPT_SET(&rev.diffopt, ALLOW_TEXTCONV);\n-\tsetup_revisions(0, NULL, &rev,\n-\t\ts->is_initial ? EMPTY_TREE_SHA1_HEX : s->reference);\n+\n+\tmemset(&opt, 0, sizeof(opt));\n+\topt.def = s->is_initial ? EMPTY_TREE_SHA1_HEX : s->reference;\n+\tsetup_revisions(0, NULL, &rev, &opt);\n+\n \trev.diffopt.output_format |= DIFF_FORMAT_PATCH;\n \trev.diffopt.detect_rename = 1;\n \trev.diffopt.file = s->fp;\n-- \n1.7.0.2.384.g015e\n"},{"id":"136423","messageId":"1268127775-9998-3-git-send-email-gitster@pobox.com","threadId":"22959","inReplyTo":"1268127775-9998-1-git-send-email-gitster@pobox.com","subject":"[PATCH 3/4] show -c: show patch text","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2010-03-09T09:42:54Z","receivedAt":"2010-03-09T09:42:54Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Traditionally, \"show\" defaulted to \"show --cc\" (dense combined patch), but\nasking for combined patch with \"show -c\" didn't turn the patch output\nformat on; the placement of this logic in setup_revisions() dates back to\ncd2bdc5 (Common option parsing for \"git log --diff\" and friends,\n2006-04-14).\n\nThis unfortunately cannot be done as a trivial change of \"if dense\ncombined is asked, default to patch format\" done in setup_revisions() to\n\"if any combined is asked, default to patch format\", as \"diff-tree -c\"\nneeds to default to raw, while \"diff-tree --cc\" needs to default to patch,\nand they share the codepath.  These command specific defaults are now\nhandled in the new \"tweak\" callback that can be customized by individual\ncommand implementations.\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n builtin-diff-tree.c         |   18 ++++++++++++++----\n builtin-log.c               |    7 +++++++\n revision.c                  |    7 +++----\n revision.h                  |    1 +\n t/t4013-diff-various.sh     |    1 +\n t/t4013/diff.show_-c_master |   36 ++++++++++++++++++++++++++++++++++++\n 6 files changed, 62 insertions(+), 8 deletions(-)\n create mode 100644 t/t4013/diff.show_-c_master\n\ndiff --git a/builtin-diff-tree.c b/builtin-diff-tree.c\nindex 2380c21..3c78bda 100644\n--- a/builtin-diff-tree.c\n+++ b/builtin-diff-tree.c\n@@ -92,12 +92,23 @@ static const char diff_tree_usage[] =\n \"  --root        include the initial commit as diff against /dev/null\\n\"\n COMMON_DIFF_OPTIONS_HELP;\n \n+static void diff_tree_tweak_rev(struct rev_info *rev, struct setup_revision_opt *opt)\n+{\n+\tif (!rev->diffopt.output_format) {\n+\t\tif (rev->dense_combined_merges)\n+\t\t\trev->diffopt.output_format = DIFF_FORMAT_PATCH;\n+\t\telse\n+\t\t\trev->diffopt.output_format = DIFF_FORMAT_RAW;\n+\t}\n+}\n+\n int cmd_diff_tree(int argc, const char **argv, const char *prefix)\n {\n \tint nr_sha1;\n \tchar line[1000];\n \tstruct object *tree1, *tree2;\n \tstatic struct rev_info *opt = &log_tree_opt;\n+\tstruct setup_revision_opt s_r_opt;\n \tint read_stdin = 0;\n \n \tinit_revisions(opt, prefix);\n@@ -105,7 +116,9 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)\n \topt->abbrev = 0;\n \topt->diff = 1;\n \topt->disable_stdin = 1;\n-\targc = setup_revisions(argc, argv, opt, NULL);\n+\tmemset(&s_r_opt, 0, sizeof(s_r_opt));\n+\ts_r_opt.tweak = diff_tree_tweak_rev;\n+\targc = setup_revisions(argc, argv, opt, &s_r_opt);\n \n \twhile (--argc > 0) {\n \t\tconst char *arg = *++argv;\n@@ -117,9 +130,6 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)\n \t\tusage(diff_tree_usage);\n \t}\n \n-\tif (!opt->diffopt.output_format)\n-\t\topt->diffopt.output_format = DIFF_FORMAT_RAW;\n-\n \t/*\n \t * NOTE! We expect \"a ^b\" to be equal to \"a..b\", so we\n \t * reverse the order of the objects if the second one\ndiff --git a/builtin-log.c b/builtin-log.c\nindex dfbf6f2..ab5f60c 100644\n--- a/builtin-log.c\n+++ b/builtin-log.c\n@@ -327,6 +327,12 @@ static int show_tree_object(const unsigned char *sha1,\n \treturn 0;\n }\n \n+static void show_rev_tweak_rev(struct rev_info *rev, struct setup_revision_opt *opt)\n+{\n+\tif (!rev->diffopt.output_format)\n+\t\trev->diffopt.output_format = DIFF_FORMAT_PATCH;\n+}\n+\n int cmd_show(int argc, const char **argv, const char *prefix)\n {\n \tstruct rev_info rev;\n@@ -348,6 +354,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)\n \trev.no_walk = 1;\n \tmemset(&opt, 0, sizeof(opt));\n \topt.def = \"HEAD\";\n+\topt.tweak = show_rev_tweak_rev;\n \tcmd_log_init(argc, argv, prefix, &rev, &opt);\n \n \tcount = rev.pending.nr;\ndiff --git a/revision.c b/revision.c\nindex 25c1bbb..2ddbb50 100644\n--- a/revision.c\n+++ b/revision.c\n@@ -1463,6 +1463,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s\n \n \tif (revs->def == NULL)\n \t\trevs->def = opt ? opt->def : NULL;\n+\tif (opt && opt->tweak)\n+\t\topt->tweak(revs, opt);\n \tif (revs->show_merge)\n \t\tprepare_show_merge(revs);\n \tif (revs->def && !revs->pending.nr) {\n@@ -1496,11 +1498,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s\n \t\tif (!revs->full_diff)\n \t\t\tdiff_tree_setup_paths(revs->prune_data, &revs->diffopt);\n \t}\n-\tif (revs->combine_merges) {\n+\tif (revs->combine_merges)\n \t\trevs->ignore_merges = 0;\n-\t\tif (revs->dense_combined_merges && !revs->diffopt.output_format)\n-\t\t\trevs->diffopt.output_format = DIFF_FORMAT_PATCH;\n-\t}\n \trevs->diffopt.abbrev = revs->abbrev;\n \tif (diff_setup_done(&revs->diffopt) < 0)\n \t\tdie(\"diff_setup_done failed\");\ndiff --git a/revision.h b/revision.h\nindex fcc0de8..ceae4ca 100644\n--- a/revision.h\n+++ b/revision.h\n@@ -139,6 +139,7 @@ extern volatile show_early_output_fn_t show_early_output;\n \n struct setup_revision_opt {\n \tconst char *def;\n+\tvoid (*tweak)(struct rev_info *, struct setup_revision_opt *);\n };\n \n extern void init_revisions(struct rev_info *revs, const char *prefix);\ndiff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh\nindex 68cb651..8dd93d9 100755\n--- a/t/t4013-diff-various.sh\n+++ b/t/t4013-diff-various.sh\n@@ -238,6 +238,7 @@ show initial\n show --root initial\n show side\n show master\n+show -c master\n show --stat side\n show --stat --summary side\n show --patch-with-stat side\ndiff --git a/t/t4013/diff.show_-c_master b/t/t4013/diff.show_-c_master\nnew file mode 100644\nindex 0000000..81aba8d\n--- /dev/null\n+++ b/t/t4013/diff.show_-c_master\n@@ -0,0 +1,36 @@\n+$ git show -c master\n+commit 59d314ad6f356dd08601a4cd5e530381da3e3c64\n+Merge: 9a6d494 c7a2ab9\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:04:00 2006 +0000\n+\n+    Merge branch 'side'\n+\n+diff --combined dir/sub\n+index cead32e,7289e35..992913c\n+--- a/dir/sub\n++++ b/dir/sub\n+@@@ -1,6 -1,4 +1,8 @@@\n+  A\n+  B\n+ +C\n+ +D\n+ +E\n+ +F\n++ 1\n++ 2\n+diff --combined file0\n+index b414108,f4615da..10a8a9f\n+--- a/file0\n++++ b/file0\n+@@@ -1,6 -1,6 +1,9 @@@\n+  1\n+  2\n+  3\n+ +4\n+ +5\n+ +6\n++ A\n++ B\n++ C\n+$\n-- \n1.7.0.2.384.g015e\n"},{"id":"136430","messageId":"1268127775-9998-4-git-send-email-gitster@pobox.com","threadId":"22959","inReplyTo":"1268127775-9998-1-git-send-email-gitster@pobox.com","subject":"[PATCH 4/4] show --first-parent/-m: do not default to --cc","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2010-03-09T09:42:55Z","receivedAt":"2010-03-09T09:42:55Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Given that \"git show\" always shows some diff and does not walk the history\nby default, it is natural to expect \"git show --first-parent\" to show the\ndifference between the given commit and its first parent.  It also would\nbe natural, given that \"--cc\" is the default, \"git show -m\" to show\npairwise difference from each of the parents.\n\nWe however always defaulted to --cc and there was no way to turn it off.\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n builtin-log.c                           |   12 +++-\n t/t4013-diff-various.sh                 |    2 +\n t/t4013/diff.show_--first-parent_master |   30 ++++++++++\n t/t4013/diff.show_-m_master             |   93 +++++++++++++++++++++++++++++++\n 4 files changed, 134 insertions(+), 3 deletions(-)\n create mode 100644 t/t4013/diff.show_--first-parent_master\n create mode 100644 t/t4013/diff.show_-m_master\n\ndiff --git a/builtin-log.c b/builtin-log.c\nindex ab5f60c..4dd6d2c 100644\n--- a/builtin-log.c\n+++ b/builtin-log.c\n@@ -329,6 +329,15 @@ static int show_tree_object(const unsigned char *sha1,\n \n static void show_rev_tweak_rev(struct rev_info *rev, struct setup_revision_opt *opt)\n {\n+\tif (rev->ignore_merges) {\n+\t\t/* There was no \"-m\" on the command line */\n+\t\trev->ignore_merges = 0;\n+\t\tif (!rev->first_parent_only && !rev->combine_merges) {\n+\t\t\t/* No \"--first-parent\", \"-c\", nor \"--cc\" */\n+\t\t\trev->combine_merges = 1;\n+\t\t\trev->dense_combined_merges = 1;\n+\t\t}\n+\t}\n \tif (!rev->diffopt.output_format)\n \t\trev->diffopt.output_format = DIFF_FORMAT_PATCH;\n }\n@@ -347,10 +356,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)\n \n \tinit_revisions(&rev, prefix);\n \trev.diff = 1;\n-\trev.combine_merges = 1;\n-\trev.dense_combined_merges = 1;\n \trev.always_show_header = 1;\n-\trev.ignore_merges = 0;\n \trev.no_walk = 1;\n \tmemset(&opt, 0, sizeof(opt));\n \topt.def = \"HEAD\";\ndiff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh\nindex 8dd93d9..dae6358 100755\n--- a/t/t4013-diff-various.sh\n+++ b/t/t4013-diff-various.sh\n@@ -239,6 +239,8 @@ show --root initial\n show side\n show master\n show -c master\n+show -m master\n+show --first-parent master\n show --stat side\n show --stat --summary side\n show --patch-with-stat side\ndiff --git a/t/t4013/diff.show_--first-parent_master b/t/t4013/diff.show_--first-parent_master\nnew file mode 100644\nindex 0000000..3dcbe47\n--- /dev/null\n+++ b/t/t4013/diff.show_--first-parent_master\n@@ -0,0 +1,30 @@\n+$ git show --first-parent master\n+commit 59d314ad6f356dd08601a4cd5e530381da3e3c64\n+Merge: 9a6d494 c7a2ab9\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:04:00 2006 +0000\n+\n+    Merge branch 'side'\n+\n+diff --git a/dir/sub b/dir/sub\n+index cead32e..992913c 100644\n+--- a/dir/sub\n++++ b/dir/sub\n+@@ -4,3 +4,5 @@ C\n+ D\n+ E\n+ F\n++1\n++2\n+diff --git a/file0 b/file0\n+index b414108..10a8a9f 100644\n+--- a/file0\n++++ b/file0\n+@@ -4,3 +4,6 @@\n+ 4\n+ 5\n+ 6\n++A\n++B\n++C\n+$\ndiff --git a/t/t4013/diff.show_-m_master b/t/t4013/diff.show_-m_master\nnew file mode 100644\nindex 0000000..4ea2ee4\n--- /dev/null\n+++ b/t/t4013/diff.show_-m_master\n@@ -0,0 +1,93 @@\n+$ git show -m master\n+commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (from 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0)\n+Merge: 9a6d494 c7a2ab9\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:04:00 2006 +0000\n+\n+    Merge branch 'side'\n+\n+diff --git a/dir/sub b/dir/sub\n+index cead32e..992913c 100644\n+--- a/dir/sub\n++++ b/dir/sub\n+@@ -4,3 +4,5 @@ C\n+ D\n+ E\n+ F\n++1\n++2\n+diff --git a/file0 b/file0\n+index b414108..10a8a9f 100644\n+--- a/file0\n++++ b/file0\n+@@ -4,3 +4,6 @@\n+ 4\n+ 5\n+ 6\n++A\n++B\n++C\n+\n+commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (from c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a)\n+Merge: 9a6d494 c7a2ab9\n+Author: A U Thor <author@example.com>\n+Date:   Mon Jun 26 00:04:00 2006 +0000\n+\n+    Merge branch 'side'\n+\n+diff --git a/dir/sub b/dir/sub\n+index 7289e35..992913c 100644\n+--- a/dir/sub\n++++ b/dir/sub\n+@@ -1,4 +1,8 @@\n+ A\n+ B\n++C\n++D\n++E\n++F\n+ 1\n+ 2\n+diff --git a/file0 b/file0\n+index f4615da..10a8a9f 100644\n+--- a/file0\n++++ b/file0\n+@@ -1,6 +1,9 @@\n+ 1\n+ 2\n+ 3\n++4\n++5\n++6\n+ A\n+ B\n+ C\n+diff --git a/file1 b/file1\n+new file mode 100644\n+index 0000000..b1e6722\n+--- /dev/null\n++++ b/file1\n+@@ -0,0 +1,3 @@\n++A\n++B\n++C\n+diff --git a/file2 b/file2\n+deleted file mode 100644\n+index 01e79c3..0000000\n+--- a/file2\n++++ /dev/null\n+@@ -1,3 +0,0 @@\n+-1\n+-2\n+-3\n+diff --git a/file3 b/file3\n+deleted file mode 100644\n+index 7289e35..0000000\n+--- a/file3\n++++ /dev/null\n+@@ -1,4 +0,0 @@\n+-A\n+-B\n+-1\n+-2\n+$\n-- \n1.7.0.2.384.g015e\n"}]}