Skip to content

Commit 8e444e6

Browse files
committed
Merge branch 'so/log-m-implies-p'
The "-m" option in "git log -m" that does not specify which format, if any, of diff is desired did not have any visible effect; it now implies some form of diff (by default "--patch") is produced. * so/log-m-implies-p: diff-merges: let "-m" imply "-p" diff-merges: rename "combined_imply_patch" to "merges_imply_patch" stash list: stop passing "-m" to "git log" git-svn: stop passing "-m" to "git rev-list" diff-merges: move specific diff-index "-m" handling to diff-index t4013: test "git diff-index -m" t4013: test "git diff-tree -m" t4013: test "git log -m --stat" t4013: test "git log -m --raw" t4013: test that "-m" alone has no effect in "git log"
2 parents 169914e + f5bfcc8 commit 8e444e6

File tree

12 files changed

+200
-25
lines changed

12 files changed

+200
-25
lines changed

Documentation/diff-options.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,9 @@ ifdef::git-log[]
4949
--diff-merges=m:::
5050
-m:::
5151
This option makes diff output for merge commits to be shown in
52-
the default format. `-m` will produce the output only if `-p`
53-
is given as well. The default format could be changed using
52+
the default format. The default format could be changed using
5453
`log.diffMerges` configuration parameter, which default value
55-
is `separate`.
54+
is `separate`. `-m` implies `-p`.
5655
+
5756
--diff-merges=first-parent:::
5857
--diff-merges=1:::
@@ -62,7 +61,8 @@ ifdef::git-log[]
6261
--diff-merges=separate:::
6362
This makes merge commits show the full diff with respect to
6463
each of the parents. Separate log entry and diff is generated
65-
for each parent.
64+
for each parent. This is the format that `-m` produced
65+
historically.
6666
+
6767
--diff-merges=combined:::
6868
--diff-merges=c:::

builtin/diff-index.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "cache.h"
33
#include "config.h"
44
#include "diff.h"
5+
#include "diff-merges.h"
56
#include "commit.h"
67
#include "revision.h"
78
#include "builtin.h"
@@ -27,6 +28,12 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)
2728
rev.abbrev = 0;
2829
prefix = precompose_argv_prefix(argc, argv, prefix);
2930

31+
/*
32+
* We need no diff for merges options, and we need to avoid conflict
33+
* with our own meaning of "-m".
34+
*/
35+
diff_merges_suppress_options_parsing();
36+
3037
argc = setup_revisions(argc, argv, &rev, NULL);
3138
for (i = 1; i < argc; i++) {
3239
const char *arg = argv[i];
@@ -35,6 +42,8 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)
3542
option |= DIFF_INDEX_CACHED;
3643
else if (!strcmp(arg, "--merge-base"))
3744
option |= DIFF_INDEX_MERGE_BASE;
45+
else if (!strcmp(arg, "-m"))
46+
rev.match_missing = 1;
3847
else
3948
usage(diff_cache_usage);
4049
}

builtin/stash.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,7 @@ static int list_stash(int argc, const char **argv, const char *prefix)
761761

762762
cp.git_cmd = 1;
763763
strvec_pushl(&cp.args, "log", "--format=%gd: %gs", "-g",
764-
"--first-parent", "-m", NULL);
764+
"--first-parent", NULL);
765765
strvec_pushv(&cp.args, argv);
766766
strvec_push(&cp.args, ref_stash);
767767
strvec_push(&cp.args, "--");

diff-merges.c

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ typedef void (*diff_merges_setup_func_t)(struct rev_info *);
66
static void set_separate(struct rev_info *revs);
77

88
static diff_merges_setup_func_t set_to_default = set_separate;
9+
static int suppress_parsing;
910

1011
static void suppress(struct rev_info *revs)
1112
{
@@ -14,7 +15,7 @@ static void suppress(struct rev_info *revs)
1415
revs->combine_merges = 0;
1516
revs->dense_combined_merges = 0;
1617
revs->combined_all_paths = 0;
17-
revs->combined_imply_patch = 0;
18+
revs->merges_imply_patch = 0;
1819
revs->merges_need_diff = 0;
1920
}
2021

@@ -30,17 +31,6 @@ static void set_first_parent(struct rev_info *revs)
3031
revs->first_parent_merges = 1;
3132
}
3233

33-
static void set_m(struct rev_info *revs)
34-
{
35-
/*
36-
* To "diff-index", "-m" means "match missing", and to the "log"
37-
* family of commands, it means "show default diff for merges". Set
38-
* both fields appropriately.
39-
*/
40-
set_to_default(revs);
41-
revs->match_missing = 1;
42-
}
43-
4434
static void set_combined(struct rev_info *revs)
4535
{
4636
suppress(revs);
@@ -101,20 +91,29 @@ int diff_merges_config(const char *value)
10191
return 0;
10292
}
10393

94+
void diff_merges_suppress_options_parsing(void)
95+
{
96+
suppress_parsing = 1;
97+
}
98+
10499
int diff_merges_parse_opts(struct rev_info *revs, const char **argv)
105100
{
106101
int argcount = 1;
107102
const char *optarg;
108103
const char *arg = argv[0];
109104

105+
if (suppress_parsing)
106+
return 0;
107+
110108
if (!strcmp(arg, "-m")) {
111-
set_m(revs);
109+
set_to_default(revs);
110+
revs->merges_imply_patch = 1;
112111
} else if (!strcmp(arg, "-c")) {
113112
set_combined(revs);
114-
revs->combined_imply_patch = 1;
113+
revs->merges_imply_patch = 1;
115114
} else if (!strcmp(arg, "--cc")) {
116115
set_dense_combined(revs);
117-
revs->combined_imply_patch = 1;
116+
revs->merges_imply_patch = 1;
118117
} else if (!strcmp(arg, "--no-diff-merges")) {
119118
suppress(revs);
120119
} else if (!strcmp(arg, "--combined-all-paths")) {
@@ -155,15 +154,18 @@ void diff_merges_set_dense_combined_if_unset(struct rev_info *revs)
155154

156155
void diff_merges_setup_revs(struct rev_info *revs)
157156
{
157+
if (suppress_parsing)
158+
return;
159+
158160
if (revs->combine_merges == 0)
159161
revs->dense_combined_merges = 0;
160162
if (revs->separate_merges == 0)
161163
revs->first_parent_merges = 0;
162164
if (revs->combined_all_paths && !revs->combine_merges)
163165
die("--combined-all-paths makes no sense without -c or --cc");
164-
if (revs->combined_imply_patch)
166+
if (revs->merges_imply_patch)
165167
revs->diff = 1;
166-
if (revs->combined_imply_patch || revs->merges_need_diff) {
168+
if (revs->merges_imply_patch || revs->merges_need_diff) {
167169
if (!revs->diffopt.output_format)
168170
revs->diffopt.output_format = DIFF_FORMAT_PATCH;
169171
}

diff-merges.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ struct rev_info;
1111

1212
int diff_merges_config(const char *value);
1313

14+
void diff_merges_suppress_options_parsing(void);
15+
1416
int diff_merges_parse_opts(struct rev_info *revs, const char **argv);
1517

1618
void diff_merges_suppress(struct rev_info *revs);

perl/Git/SVN.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1636,7 +1636,7 @@ sub has_no_changes {
16361636
my $commit = shift;
16371637

16381638
my @revs = split / /, command_oneline(
1639-
qw(rev-list --parents -1 -m), $commit);
1639+
qw(rev-list --parents -1), $commit);
16401640

16411641
# Commits with no parents, e.g. the start of a partial branch,
16421642
# have changes by definition.

revision.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,10 @@ struct rev_info {
193193
/* Diff-merge flags */
194194
explicit_diff_merges: 1,
195195
merges_need_diff: 1,
196+
merges_imply_patch:1,
196197
separate_merges: 1,
197198
combine_merges:1,
198199
combined_all_paths:1,
199-
combined_imply_patch:1,
200200
dense_combined_merges:1,
201201
first_parent_merges:1;
202202

t/t3903-stash.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ test_expect_success 'setup stash with index and worktree changes' '
859859
git stash
860860
'
861861

862-
test_expect_success 'stash list implies --first-parent -m' '
862+
test_expect_success 'stash list -p shows simple diff' '
863863
cat >expect <<-EOF &&
864864
stash@{0}
865865

t/t4013-diff-various.sh

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ diff-tree --stat initial mode
293293
diff-tree --summary initial mode
294294
295295
diff-tree master
296+
diff-tree -m master
296297
diff-tree -p master
297298
diff-tree -p -m master
298299
diff-tree -c master
@@ -337,6 +338,8 @@ log -m -p --first-parent master
337338
log -m -p master
338339
log --cc -m -p master
339340
log -c -m -p master
341+
log -m --raw master
342+
log -m --stat master
340343
log -SF master
341344
log -S F master
342345
log -SF -p master
@@ -452,6 +455,14 @@ diff-tree --stat --compact-summary initial mode
452455
diff-tree -R --stat --compact-summary initial mode
453456
EOF
454457

458+
test_expect_success 'log -m matches log -m -p' '
459+
git log -m -p master >result &&
460+
process_diffs result >expected &&
461+
git log -m >result &&
462+
process_diffs result >actual &&
463+
test_cmp expected actual
464+
'
465+
455466
test_expect_success 'log --diff-merges=on matches --diff-merges=separate' '
456467
git log -p --diff-merges=separate master >result &&
457468
process_diffs result >expected &&
@@ -483,6 +494,19 @@ test_expect_success 'git config log.diffMerges first-parent vs -m' '
483494
test_cmp expected actual
484495
'
485496

497+
# -m in "git diff-index" means "match missing", that differs
498+
# from its meaning in "git diff". Let's check it in diff-index.
499+
# The line in the output for removed file should disappear when
500+
# we provide -m in diff-index.
501+
test_expect_success 'git diff-index -m' '
502+
rm -f file1 &&
503+
git diff-index HEAD >without-m &&
504+
lines_count=$(wc -l <without-m) &&
505+
git diff-index -m HEAD >with-m &&
506+
git restore file1 &&
507+
test_line_count = $((lines_count - 1)) with-m
508+
'
509+
486510
test_expect_success 'log -S requires an argument' '
487511
test_must_fail git log -S
488512
'

t/t4013/diff.diff-tree_-m_master

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
$ git diff-tree -m master
2+
59d314ad6f356dd08601a4cd5e530381da3e3c64
3+
:040000 040000 65f5c9dd60ce3b2b3324b618ac7accf8d912c113 0564e026437809817a64fff393079714b6dd4628 M dir
4+
:100644 100644 b414108e81e5091fe0974a1858b4d0d22b107f70 10a8a9f3657f91a156b9f0184ed79a20adef9f7f M file0
5+
59d314ad6f356dd08601a4cd5e530381da3e3c64
6+
:040000 040000 f977ed46ae6873c1c30ab878e15a4accedc3618b 0564e026437809817a64fff393079714b6dd4628 M dir
7+
:100644 100644 f4615da674c09df322d6ba8d6b21ecfb1b1ba510 10a8a9f3657f91a156b9f0184ed79a20adef9f7f M file0
8+
:000000 100644 0000000000000000000000000000000000000000 b1e67221afe8461efd244b487afca22d46b95eb8 A file1
9+
:100644 000000 01e79c32a8c99c557f0757da7cb6d65b3414466d 0000000000000000000000000000000000000000 D file2
10+
:100644 000000 7289e35bff32727c08dda207511bec138fdb9ea5 0000000000000000000000000000000000000000 D file3
11+
$

0 commit comments

Comments
 (0)