Message ID | 98e2707ee2faf653e972b0706311ddd099765ce5.1613480198.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | difftool.c: learn a new way start at specified file | expand |
"ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com> writes: > From: ZheNing Hu <adlternative@gmail.com> > > `git difftool` only allow us to select file to view in turn. > If there is a commit with many files and we exit in the search, I am not sure what "in the search" refers to. "in the middle" I would understand, though. > We will have to traverse list again to get the file diff which Let's downcase this "We". > we want to see. Therefore, here is a new method: user can use > `git difftool --rotate-to=<filename>` or `git difftool --skip-to=<filename>` > to start viewing from the specified file, This will improve the > user experience. Do we need both? I'd rather not to give end-user-facing commands too many knobs that would do similar things. Too many choices to choose from without clear answer to "which one should I prefer to use?" is a bad combination for end-users. > diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt > index 7c5b3cf42bcc..aa2b5c11f20b 100644 > --- a/Documentation/diff-options.txt > +++ b/Documentation/diff-options.txt > @@ -701,7 +701,7 @@ components matches the pattern. For example, the pattern "`foo*bar`" > matches "`fooasdfbar`" and "`foo/bar/baz/asdf`" but not "`foobarx`". > > --skip-to=<file>:: > ---rotate-to=<file:: > +--rotate-to=<file>:: > Discard the files before the named <file> from the output > (i.e. 'skip to'), or move them to the end of the output > (i.e. 'rotate to'). These were invented primarily for use Thanks for correcting, but this change should not be a part of this patch. Instead, you help the other's topic by giving a review (and you could just have said "there there is closing '>' missing"). > diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt > index 484c485fd06c..c64dff69c976 100644 > --- a/Documentation/git-difftool.txt > +++ b/Documentation/git-difftool.txt > @@ -34,6 +34,16 @@ OPTIONS > This is the default behaviour; the option is provided to > override any configuration settings. > > +--rotate-to=<file>:: > + Internally call `git diff --rotate-to=<file>`, > + show the change in the specified path first. > + Files before the specified path will be moved to the last output. > + > +--skip-to=<file>:: > + Internally call `git diff --skip-to=<file>`, > + skip the output to the specified path. > + Files before the specified path will not output. > + This, unlike the "diffcore" stuff, is end-user facing, and it is better not to force the readers even know what --skip-to option to the diff does (after all, difftool users are using 'git difftool' and they are not necessarily 'git diff' users). --skip-to=<file>:: Start showing the diff for the given path, skipping all the paths before it. or something, perhaps. > +test_expect_success 'difftool --skip-to' ' > + difftool_test_setup && > + test_when_finished git reset --hard && > + git difftool --no-prompt --extcmd=cat --skip-to="2" HEAD^ >output && > + cat >expect <<-\EOF && > + 2 > + 4 > + EOF > + test_cmp output expect && > + test_must_fail git difftool --no-prompt --extcmd=cat --skip-to="3" HEAD^ > +' This probably should be split into two independent tests. One to check that the non-failing case works as expected, the other to check that a bogus command line option errors out as expected. Thanks.
Junio C Hamano <gitster@pobox.com> 于2021年2月17日周三 下午6:31写道: > > "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com> writes: > > > From: ZheNing Hu <adlternative@gmail.com> > > > > `git difftool` only allow us to select file to view in turn. > > If there is a commit with many files and we exit in the search, > > I am not sure what "in the search" refers to. "in the middle" I > would understand, though. > > > We will have to traverse list again to get the file diff which > > Let's downcase this "We". > > > we want to see. Therefore, here is a new method: user can use > > `git difftool --rotate-to=<filename>` or `git difftool --skip-to=<filename>` > > to start viewing from the specified file, This will improve the > > user experience. > > Do we need both? I'd rather not to give end-user-facing commands > too many knobs that would do similar things. Too many choices to > choose from without clear answer to "which one should I prefer to > use?" is a bad combination for end-users. > So users will not need to use `git difftool --skip-to`? Then I am confused about the meaning of `git difftool --skip-to`. > > diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt > > index 7c5b3cf42bcc..aa2b5c11f20b 100644 > > --- a/Documentation/diff-options.txt > > +++ b/Documentation/diff-options.txt > > @@ -701,7 +701,7 @@ components matches the pattern. For example, the pattern "`foo*bar`" > > matches "`fooasdfbar`" and "`foo/bar/baz/asdf`" but not "`foobarx`". > > > > --skip-to=<file>:: > > ---rotate-to=<file:: > > +--rotate-to=<file>:: > > Discard the files before the named <file> from the output > > (i.e. 'skip to'), or move them to the end of the output > > (i.e. 'rotate to'). These were invented primarily for use > > Thanks for correcting, but this change should not be a part of this > patch. Instead, you help the other's topic by giving a review (and > you could just have said "there there is closing '>' missing"). > Okay, I will pay attention later. > > diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt > > index 484c485fd06c..c64dff69c976 100644 > > --- a/Documentation/git-difftool.txt > > +++ b/Documentation/git-difftool.txt > > @@ -34,6 +34,16 @@ OPTIONS > > This is the default behaviour; the option is provided to > > override any configuration settings. > > > > +--rotate-to=<file>:: > > + Internally call `git diff --rotate-to=<file>`, > > + show the change in the specified path first. > > + Files before the specified path will be moved to the last output. > > + > > +--skip-to=<file>:: > > + Internally call `git diff --skip-to=<file>`, > > + skip the output to the specified path. > > + Files before the specified path will not output. > > + > > This, unlike the "diffcore" stuff, is end-user facing, and it is > better not to force the readers even know what --skip-to option > to the diff does (after all, difftool users are using 'git difftool' > and they are not necessarily 'git diff' users). > > --skip-to=<file>:: > Start showing the diff for the given path, skipping all > the paths before it. > > or something, perhaps. > > > +test_expect_success 'difftool --skip-to' ' > > + difftool_test_setup && > > + test_when_finished git reset --hard && > > + git difftool --no-prompt --extcmd=cat --skip-to="2" HEAD^ >output && > > + cat >expect <<-\EOF && > > + 2 > > + 4 > > + EOF > > + test_cmp output expect && > > + test_must_fail git difftool --no-prompt --extcmd=cat --skip-to="3" HEAD^ > > +' > > This probably should be split into two independent tests. One to > check that the non-failing case works as expected, the other to > check that a bogus command line option errors out as expected. > I will finish it. > Thanks. Besides, I have some curiosity about one place in the code in your patch: > int cmd_diff_tree(...) > ... > if (read_stdin) { > ... > opt->diffopt.rotate_to_strict = 0; > ... } This is the only place where rotate_to_strict is set to zero, So the "git log -p" you mentioned earlier is here Called this code to avoid exiting the program because of the wrong path, right? Thanks.
diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt index 7c5b3cf42bcc..aa2b5c11f20b 100644 --- a/Documentation/diff-options.txt +++ b/Documentation/diff-options.txt @@ -701,7 +701,7 @@ components matches the pattern. For example, the pattern "`foo*bar`" matches "`fooasdfbar`" and "`foo/bar/baz/asdf`" but not "`foobarx`". --skip-to=<file>:: ---rotate-to=<file:: +--rotate-to=<file>:: Discard the files before the named <file> from the output (i.e. 'skip to'), or move them to the end of the output (i.e. 'rotate to'). These were invented primarily for use diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt index 484c485fd06c..c64dff69c976 100644 --- a/Documentation/git-difftool.txt +++ b/Documentation/git-difftool.txt @@ -34,6 +34,16 @@ OPTIONS This is the default behaviour; the option is provided to override any configuration settings. +--rotate-to=<file>:: + Internally call `git diff --rotate-to=<file>`, + show the change in the specified path first. + Files before the specified path will be moved to the last output. + +--skip-to=<file>:: + Internally call `git diff --skip-to=<file>`, + skip the output to the specified path. + Files before the specified path will not output. + -t <tool>:: --tool=<tool>:: Use the diff tool specified by <tool>. Valid values include diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh index 9192c141ffc6..112b798b1c23 100755 --- a/t/t7800-difftool.sh +++ b/t/t7800-difftool.sh @@ -762,4 +762,34 @@ test_expect_success 'difftool --gui, --tool and --extcmd are mutually exclusive' test_must_fail git difftool --gui --tool=test-tool --extcmd=cat ' +test_expect_success 'difftool --rotate-to' ' + difftool_test_setup && + test_when_finished git reset --hard && + echo 1 >1 && + echo 2 >2 && + echo 4 >4 && + git add 1 2 4 && + git commit -a -m "124" && + git difftool --no-prompt --extcmd=cat --rotate-to="2" HEAD^ >output&& + cat >expect <<-\EOF && + 2 + 4 + 1 + EOF + test_cmp output expect && + test_must_fail git difftool --no-prompt --extcmd=cat --rotate-to="3" HEAD^ +' + +test_expect_success 'difftool --skip-to' ' + difftool_test_setup && + test_when_finished git reset --hard && + git difftool --no-prompt --extcmd=cat --skip-to="2" HEAD^ >output && + cat >expect <<-\EOF && + 2 + 4 + EOF + test_cmp output expect && + test_must_fail git difftool --no-prompt --extcmd=cat --skip-to="3" HEAD^ +' + test_done