Traditionally, "show" defaulted to "show --cc" (dense combined patch), but
asking for combined patch with "show -c" didn't turn the patch output
format on; the placement of this logic in setup_revisions() dates back to
cd2bdc5 (Common option parsing for "git log --diff" and friends,
2006-04-14).

This unfortunately cannot be done as a trivial change of "if dense
combined is asked, default to patch format" done in setup_revisions() to
"if any combined is asked, default to patch format", as "diff-tree -c"
needs to default to raw, while "diff-tree --cc" needs to default to patch,
and they share the codepath.  These command specific defaults are now
handled in the new "tweak" callback that can be customized by individual
command implementations.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2010-03-08 23:27:25 -08:00
Родитель 32962c9bd5
Коммит b449005997
6 изменённых файлов: 62 добавлений и 8 удалений

Просмотреть файл

@ -92,12 +92,23 @@ static const char diff_tree_usage[] =
" --root include the initial commit as diff against /dev/null\n" " --root include the initial commit as diff against /dev/null\n"
COMMON_DIFF_OPTIONS_HELP; COMMON_DIFF_OPTIONS_HELP;
static void diff_tree_tweak_rev(struct rev_info *rev, struct setup_revision_opt *opt)
{
if (!rev->diffopt.output_format) {
if (rev->dense_combined_merges)
rev->diffopt.output_format = DIFF_FORMAT_PATCH;
else
rev->diffopt.output_format = DIFF_FORMAT_RAW;
}
}
int cmd_diff_tree(int argc, const char **argv, const char *prefix) int cmd_diff_tree(int argc, const char **argv, const char *prefix)
{ {
int nr_sha1; int nr_sha1;
char line[1000]; char line[1000];
struct object *tree1, *tree2; struct object *tree1, *tree2;
static struct rev_info *opt = &log_tree_opt; static struct rev_info *opt = &log_tree_opt;
struct setup_revision_opt s_r_opt;
int read_stdin = 0; int read_stdin = 0;
init_revisions(opt, prefix); init_revisions(opt, prefix);
@ -105,7 +116,9 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
opt->abbrev = 0; opt->abbrev = 0;
opt->diff = 1; opt->diff = 1;
opt->disable_stdin = 1; opt->disable_stdin = 1;
argc = setup_revisions(argc, argv, opt, NULL); memset(&s_r_opt, 0, sizeof(s_r_opt));
s_r_opt.tweak = diff_tree_tweak_rev;
argc = setup_revisions(argc, argv, opt, &s_r_opt);
while (--argc > 0) { while (--argc > 0) {
const char *arg = *++argv; const char *arg = *++argv;
@ -117,9 +130,6 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
usage(diff_tree_usage); usage(diff_tree_usage);
} }
if (!opt->diffopt.output_format)
opt->diffopt.output_format = DIFF_FORMAT_RAW;
/* /*
* NOTE! We expect "a ^b" to be equal to "a..b", so we * NOTE! We expect "a ^b" to be equal to "a..b", so we
* reverse the order of the objects if the second one * reverse the order of the objects if the second one

Просмотреть файл

@ -327,6 +327,12 @@ static int show_tree_object(const unsigned char *sha1,
return 0; return 0;
} }
static void show_rev_tweak_rev(struct rev_info *rev, struct setup_revision_opt *opt)
{
if (!rev->diffopt.output_format)
rev->diffopt.output_format = DIFF_FORMAT_PATCH;
}
int cmd_show(int argc, const char **argv, const char *prefix) int cmd_show(int argc, const char **argv, const char *prefix)
{ {
struct rev_info rev; struct rev_info rev;
@ -348,6 +354,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)
rev.no_walk = 1; rev.no_walk = 1;
memset(&opt, 0, sizeof(opt)); memset(&opt, 0, sizeof(opt));
opt.def = "HEAD"; opt.def = "HEAD";
opt.tweak = show_rev_tweak_rev;
cmd_log_init(argc, argv, prefix, &rev, &opt); cmd_log_init(argc, argv, prefix, &rev, &opt);
count = rev.pending.nr; count = rev.pending.nr;

Просмотреть файл

@ -1463,6 +1463,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
if (revs->def == NULL) if (revs->def == NULL)
revs->def = opt ? opt->def : NULL; revs->def = opt ? opt->def : NULL;
if (opt && opt->tweak)
opt->tweak(revs, opt);
if (revs->show_merge) if (revs->show_merge)
prepare_show_merge(revs); prepare_show_merge(revs);
if (revs->def && !revs->pending.nr) { if (revs->def && !revs->pending.nr) {
@ -1496,11 +1498,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
if (!revs->full_diff) if (!revs->full_diff)
diff_tree_setup_paths(revs->prune_data, &revs->diffopt); diff_tree_setup_paths(revs->prune_data, &revs->diffopt);
} }
if (revs->combine_merges) { if (revs->combine_merges)
revs->ignore_merges = 0; revs->ignore_merges = 0;
if (revs->dense_combined_merges && !revs->diffopt.output_format)
revs->diffopt.output_format = DIFF_FORMAT_PATCH;
}
revs->diffopt.abbrev = revs->abbrev; revs->diffopt.abbrev = revs->abbrev;
if (diff_setup_done(&revs->diffopt) < 0) if (diff_setup_done(&revs->diffopt) < 0)
die("diff_setup_done failed"); die("diff_setup_done failed");

Просмотреть файл

@ -139,6 +139,7 @@ extern volatile show_early_output_fn_t show_early_output;
struct setup_revision_opt { struct setup_revision_opt {
const char *def; const char *def;
void (*tweak)(struct rev_info *, struct setup_revision_opt *);
}; };
extern void init_revisions(struct rev_info *revs, const char *prefix); extern void init_revisions(struct rev_info *revs, const char *prefix);

Просмотреть файл

@ -238,6 +238,7 @@ show initial
show --root initial show --root initial
show side show side
show master show master
show -c master
show --stat side show --stat side
show --stat --summary side show --stat --summary side
show --patch-with-stat side show --patch-with-stat side

Просмотреть файл

@ -0,0 +1,36 @@
$ git show -c master
commit 59d314ad6f356dd08601a4cd5e530381da3e3c64
Merge: 9a6d494 c7a2ab9
Author: A U Thor <author@example.com>
Date: Mon Jun 26 00:04:00 2006 +0000
Merge branch 'side'
diff --combined dir/sub
index cead32e,7289e35..992913c
--- a/dir/sub
+++ b/dir/sub
@@@ -1,6 -1,4 +1,8 @@@
A
B
+C
+D
+E
+F
+ 1
+ 2
diff --combined file0
index b414108,f4615da..10a8a9f
--- a/file0
+++ b/file0
@@@ -1,6 -1,6 +1,9 @@@
1
2
3
+4
+5
+6
+ A
+ B
+ C
$