Re: [PATCH v2] git-difftool-helper.sh: learn a new way go back to last save point
From: David Aguilar <hidden>
Date: 2021-02-08 22:16:48
(cc'd Ryan since the thread involving him was mentioned in the commit message) On Mon, Feb 8, 2021 at 9:02 AM ZheNing Hu via GitGitGadget [off-list ref] wrote:
From: ZheNing Hu <redacted>
`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,
We will have to traverse list again to get the file diff which
we want to see. Therefore, here is a new method: every time before
we view the file diff, the current coordinates will be stored in
`GIT_DIR/difftool-last-position`, this file will be deleted after
successful traversing. But if an unexpected exit occurred midway or
users similar to using "ctrl+c" kill the process,and the user wants
to redo the same `git difftoool`, git will view the coordinates in
the save point, ask user if they want continue from the last position.
This will improve the user experience.
Signed-off-by: ZheNing Hu <redacted>
---
git-difftool-helper.sh: learn a new way skip to save point
git user may should travel the diff list to choice file diff to view, if
they exit in midway,they must travel it again. By saving current
coordinates in GIT_DIR/difftool-last-position method, provides a
possibility for this user-friendly solution.
this patch's origin discuss is here:
https://lore.kernel.org/git/gOXOaoqn-E9A2ob7ykWEcDc7ZxmSwAjcP5CCFKfr5ejCOWZQ1lfAUZcbgYT9AyQCcDgJvCrnrtziXiels-Hxol3xlkGTVHk24SvAdaSUtKQ=@rtzoeller.com/ (local)
Thanks!
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-870%2Fadlternative%2Fdifftool_save_point-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-870/adlternative/difftool_save_point-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/870
Range-diff vs v1:
1: e77c3e33ba85 ! 1: 2468eaff322b git-difftool-helper.sh: learn a new way skip to save point
@@ Metadata
Author: ZheNing Hu [off-list ref]
## Commit message ##
- git-difftool-helper.sh: learn a new way skip to save point
+ git-difftool-helper.sh: learn a new way go back to last save point
- `git difftool` only allow us to select file to view In turn.
- If there is a commit with many files and we exit in search,
+ `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,
We will have to traverse list again to get the file diff which
- we want to see.Therefore,here is a new method:every time before
- we view the file diff,the current coordinates will be stored in
- `GIT_DIR/difftool_skip_to`,this file will be deleted after
- successful traversing.But if an unexpected exit occurred midway,
- git will view the coordinates in the save point,ask user if they
- want continue from the last saved point.This will improve the
- user experience.
+ we want to see. Therefore, here is a new method: every time before
+ we view the file diff, the current coordinates will be stored in
+ `GIT_DIR/difftool-last-position`, this file will be deleted after
+ successful traversing. But if an unexpected exit occurred midway or
+ users similar to using "ctrl+c" kill the process,and the user wants
+ to redo the same `git difftoool`, git will view the coordinates in
+ the save point, ask user if they want continue from the last position.
+ This will improve the user experience.
Signed-off-by: ZheNing Hu [off-list ref]
@@ git-difftool--helper.sh
# Copyright (c) 2009, 2010 David Aguilar
TOOL_MODE=diff
-+GIT_DIFFTOOL_SKIP_TO_FILE="$GIT_DIR/difftool-skip-to"
++GIT_DIFFTOOL_LAST_POSITION="$GIT_DIR/difftool-last-position"
++DIFFTOOL_FIRST_NUM="1"
. git-mergetool--lib
# difftool.prompt controls the default prompt/no-prompt behavior
@@ git-difftool--helper.sh: launch_merge_tool () {
# the user with the real $MERGED name before launching $merge_tool.
if should_prompt
then
-+ if test -f "$GIT_DIFFTOOL_SKIP_TO_FILE"
++ if test -f "$GIT_DIFFTOOL_LAST_POSITION"
+ then
-+ SAVE_POINT_NUM=$(cat "$GIT_DIFFTOOL_SKIP_TO_FILE")
-+ if test $SAVE_POINT_NUM -le $GIT_DIFF_PATH_TOTAL &&
-+ test $SAVE_POINT_NUM -gt $GIT_DIFF_PATH_COUNTER
++ if SAVE_POINT_NUM=$(cat 2>/dev/null "$GIT_DIFFTOOL_LAST_POSITION") &&
++ test "$SAVE_POINT_NUM" -le "$GIT_DIFF_PATH_TOTAL" &&
++ test "$SAVE_POINT_NUM" -gt "$GIT_DIFF_PATH_COUNTER"
+ then
-+ # choice skip or not skip when check first file.
-+ if test $GIT_DIFF_PATH_COUNTER -eq "1"
++ if test "$GIT_DIFF_PATH_COUNTER" -eq "$DIFFTOOL_FIRST_NUM"
+ then
-+ printf "do you want to skip to last time difftool save point($SAVE_POINT_NUM) [Y/n]?"
++ printf "Do you want to start from the possible last file you were viewing? [Y/n]?"
+ read skip_ans || return
+ if test "$skip_ans" = y
+ then
@@ git-difftool--helper.sh: launch_merge_tool () {
+ fi
+ fi
+ fiSimilar to Junio's question about, "where does this possible come from?", I wasn't able to make out the behavior in the following situation. What about when the user switches branches or specifies a pathspec on the command-line or some other avenue that ends up with the number of files to diff being very different than the last difftool invocation? Will difftool, for example, skip over a smaller set of files on invocation 2 if invocation 1 involved many files and we exited out with a counter number that is very high? One thing that's not too good about having state files in .git/ is that they're global data and we also have to think about, "what if the user has multiple difftools running?" and those kind of complexities. I don't want this to seem like I'm trying to be dismissive of this feature which does seem like a useful thing in general, so I'll try to come up with an alternative interface that is slightly more general but a admittedly a little bit more cumbersome because it's not as automatic. What if instead of global state, maybe the user could specify a path that difftool could skip forward to? For example, we could teach difftool to resume by telling it where we last left off: git difftool --resume-from=foo/bar099.txt Then we don't need the global counter state file? Finally, I'm going to plug what I believe to be the right tool for the job here. Have you tried git cola?[1] Difftool is tightly integrated, and the UI is such that you can trivially choose any of the modified/staged files and difftool them by using the Ctrl-d hotkey. https://github.com/git-cola/git-cola/ Cola is purpose-built for driving difftool, and for interactive staging, so not mentioning it in the context of wanting a better UI for difftool would be a disservice to difftool users. -- David