Allow the 'revert' option in Git Gui to operate on untracked files, deleting them
cover Allow the 'revert' option in Git Gui to operate on untracked files, deleting them
My development environment sometimes makes automatic changes that I don't want to keep. In some cases, this involves new files being added that I don't want to commit or keep. I have typically had to explicitly delete those files externally to Git Gui, and I want to be able to just select those newly-created untracked files and "revert" them into oblivion.
This change updates the revert_helper function to check for untracked files as well as changes, and then any changes to be reverted and untracked files are handled by independent blocks of code. The user is prompted independently for untracked files, since the underlying action is fundamentally different (rm -f). If after deleting untracked files, the directory containing them becomes empty, then the directory is removed as well.
This introduces new strings in index.tcl. I have been told that there is a separate process whereby the translations get updated.
Jonathan Gilbert (1):
git-gui: Revert untracked files by deleting them
git-gui/lib/index.tcl | 139 +++++++++++++++++++++++++++++++----------- 1 file changed, 104 insertions(+), 35 deletions(-)
base-commit: 566a1439f6f56c2171b8853ddbca0ad3f5098770
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-423%2Flogiclrd%2Fgit-gui-revert-untracked-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-423/logiclrd/git-gui-revert-untracked-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/423
Signature · 1 line
gitgitgadget
PATCH 1/1 git-gui: Revert untracked files by deleting them
From: Jonathan Gilbert <[email protected]>
My development environment sometimes makes automatic changes that I don't want to keep. In some cases, this involves new files being added that I don't want to commit or keep. I have typically had to explicitly delete those files externally to Git Gui, and I want to be able to just select those newly- created untracked files and "revert" them into oblivion.
This change updates the revert_helper function to check for untracked files as well as changes, and then any changes to be reverted and untracked files are handled by independent blocks of code. The user is prompted independently for untracked files, since the underlying action is fundamentally different (rm -f). If after deleting untracked files, the directory containing them becomes empty, then the directory is removed as well.
This introduces new strings in index.tcl. I have been told that there is a separate process whereby the translations get updated.
--- git-gui/lib/index.tcl | 139 +++++++++++++++++++++++++++++++----------- 1 file changed, 104 insertions(+), 35 deletions(-)
git-gui/lib/index.tcl +104 -35
@@ -393,11 +393,24 @@ proc revert_helper {txt paths} { if {![lock_index begin-update]} return + # If an action is taken that implicitly unlocks the index, this gets cleared. Either way, it is executed at the end of the procedure. + set epilogue [list] + lappend epilogue {unlock_index} + + proc already_unlocked {} { upvar epilogue epilogue; set epilogue [lsearch -inline -all -not -exact $epilogue {unlock_index}] } + set pathList [list] + set untrackedList [list] set after {} foreach path $paths { switch -glob -- [lindex $file_states($path) 0] { U? {continue} + ?O { + lappend untrackedList $path + if {$path eq $current_diff_path} { + set after {reshow_diff;} + } + } ?M - ?T - ?D {
@@ -410,45 +423,101 @@ proc revert_helper {txt paths} { } - # Split question between singular and plural cases, because - # such distinction is needed in some languages. Previously, the - # code used "Revert changes in" for both, but that can't work - # in languages where 'in' must be combined with word from - # rest of string (in different way for both cases of course). - # - # FIXME: Unfortunately, even that isn't enough in some languages - # as they have quite complex plural-form rules. Unfortunately, - # msgcat doesn't seem to support that kind of string translation. - # - set n [llength $pathList] - if {$n == 0} { - unlock_index - return - } elseif {$n == 1} { - set query [mc "Revert changes in file %s?" [short_path [lindex $pathList]]] - } else { - set query [mc "Revert changes in these %i files?" $n] - } + set numPaths [llength $pathList] + set numUntracked [llength $untrackedList] - set reply [tk_dialog \ - .confirm_revert \ - "[appname] ([reponame])" \ - "$query + if {$numPaths > 0} { + # Split question between singular and plural cases, because + # such distinction is needed in some languages. Previously, the + # code used "Revert changes in" for both, but that can't work + # in languages where 'in' must be combined with word from + # rest of string (in different way for both cases of course). + # + # FIXME: Unfortunately, even that isn't enough in some languages + # as they have quite complex plural-form rules. Unfortunately, + # msgcat doesn't seem to support that kind of string translation. + if {$numPaths == 1} { + set query [mc "Revert changes in file %s?" [short_path [lindex $pathList]]] + } else { + set query [mc "Revert changes in these %i files?" $numPaths] + } + + set reply [tk_dialog \ + .confirm_revert \ + "[appname] ([reponame])" \ + "$query [mc "Any unstaged changes will be permanently lost by the revert."]" \ - question \ - 1 \ - [mc "Do Nothing"] \ - [mc "Revert Changes"] \ - ] - if {$reply == 1} { - checkout_index \ - $txt \ - $pathList \ - [concat $after [list ui_ready]] - } else { - unlock_index + question \ + 1 \ + [mc "Do Nothing"] \ + [mc "Revert Changes"] \ + ] + + if {$reply == 1} { + checkout_index \ + $txt \ + $pathList \ + [concat $after [list ui_ready]] + + already_unlocked + } + } + + if {$numUntracked > 0} { + # Split question between singular and plural cases, because + # such distinction is needed in some languages. + # + # FIXME: Unfortunately, even that isn't enough in some languages + # as they have quite complex plural-form rules. Unfortunately, + # msgcat doesn't seem to support that kind of string translation. + if {$numUntracked == 1} { + set query [mc "Delete untracked file %s?" [short_path [lindex $untrackedList]]] + } else { + set query [mc "Delete these %i untracked files?" $numUntracked] + } + + set reply [tk_dialog \ + .confirm_revert \ + "[appname] ([reponame])" \ + "$query + +[mc "Files will be permanently deleted."]" \ + question \ + 1 \ + [mc "Do Nothing"] \ + [mc "Delete Files"] \ + ] + + if {$reply == 1} { + file delete -- {*}$untrackedList + + foreach path $untrackedList { + set directoryPath [file dirname $path] + + while {$directoryPath != $path} { + set contents [glob -nocomplain -dir $path *] + + if {[llength $contents] > 0} { break } + + try { + file delete -- $path + } + catch { + # This is just a best effort, don't annoy the user with failure to remove empty directories. + break + } + + set path $directoryPath + set directoryPath [file dirname $path] + } + } + + lappend epilogue {ui_do_rescan} + } } + + foreach epilogueCommand $epilogue { {*}$epilogueCommand } } proc do_revert_selection {} {
Signature · 1 line
gitgitgadget
Re: [PATCH 1/1] git-gui: Revert untracked files by deleting them
Hi Jonathan,
Thanks for the patch.
While git-gui is distributed in the main Git tree, the development happens on a separate repo, and the Git maintainer periodically pulls in changes from that repo. It can be found at [0]. For now, I munged your patch to apply on my tree, but please base it on the git-gui repo for your re-rolls or future patches. You can use GitGitGadget to do that [1].
Now, on to the patch.
Nitpick: Do not use a capital letter after 'git-gui:' in your subject. So the subject should look something like:
git-gui: revert untracked files by deleting them
Quoted 8 lines · Jonathan Gilbert via GitGitGadget
From: Jonathan Gilbert <[email protected]>
My development environment sometimes makes automatic changes that I don't want to keep. In some cases, this involves new files being added that I don't want to commit or keep. I have typically had to explicitly delete those files externally to Git Gui, and I want to be able to just select those newly- created untracked files and "revert" them into oblivion.
I think the description of your workflow belongs in the cover letter more than here. The commit message should take a more neutral tone. So, describe the problem in an objective way that not only you, but other git-gui users might face.
Quoted 11 lines
This change updates the
revert_helperfunction to check for untracked files as well as changes, and then any changes to be reverted and untracked files are handled by independent blocks of code. The user is prompted independently for untracked files, since the underlying action is fundamentally different (rm -f). If after deleting untracked files, the directory containing them becomes empty, then the directory is removed as well.This introduces new strings in index.tcl. I have been told that there is a separate process whereby the translations get updated.
I don't think this should be in the commit message. The commit message describes the change. The process of getting that change integrated should be discussed elsewhere (elsewhere == this list). But yes, there is a separate process to update translations (but unfortunately no one is actively doing that yet).
Quoted 10 lines
Signed-off-by Jonathan Gilbert <[email protected]>--- git-gui/lib/index.tcl | 139 +++++++++++++++++++++++++++++++----------- 1 file changed, 104 insertions(+), 35 deletions(-)git-gui/lib/index.tcl +0
-0
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 396
Quoted 4 lines
git-gui/lib/index.tcl +1
-0@@ -393,11 +393,24 @@ proc revert_helper {txt paths} { if {![lock_index begin-update]} return + # If an action is taken that implicitly unlocks the index, this gets cleared. Either way, it is executed at the end of the procedure.
The convention is to wrap lines at 80 columns wherever possible. Please follow that. You can look at the rest of the code for examples.
You have other lines too that are too long. The same comment applies to all those.
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 400
Quoted 4 lines
git-gui/lib/index.tcl +4
-0+ set epilogue [list] + lappend epilogue {unlock_index} + + proc already_unlocked {} { upvar epilogue epilogue; set epilogue [lsearch -inline -all -not -exact $epilogue {unlock_index}] }
A procedure defined inside a procedure? Please don't do that. Define it outside.
Also, what is this procedure supposed to do? It is not very clear at first read.
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 403
Quoted 3 lines
git-gui/lib/index.tcl +2
-0+ set pathList [list] + set untrackedList [list]
Nitpick: Ugh! camelCase in a sea of snake_cases. What's even more unfortunate is that pathList itself is in camelCase, so that's probably the reason you went with camelCase in the first place. Maybe re-name pathList to path_list while we're at it, and then use snake_case everywhere?
Quoted 126 lines
git-gui/lib/index.tcl +77
-35set after {} foreach path $paths { switch -glob -- [lindex $file_states($path) 0] { U? {continue} + ?O { + lappend untrackedList $path + if {$path eq $current_diff_path} { + set after {reshow_diff;} + } + } ?M - ?T - ?D {@@ -410,45 +423,101 @@ proc revert_helper {txt paths} { } - # Split question between singular and plural cases, because - # such distinction is needed in some languages. Previously, the - # code used "Revert changes in" for both, but that can't work - # in languages where 'in' must be combined with word from - # rest of string (in different way for both cases of course). - # - # FIXME: Unfortunately, even that isn't enough in some languages - # as they have quite complex plural-form rules. Unfortunately, - # msgcat doesn't seem to support that kind of string translation. - # - set n [llength $pathList] - if {$n == 0} { - unlock_index - return - } elseif {$n == 1} { - set query [mc "Revert changes in file %s?" [short_path [lindex $pathList]]] - } else { - set query [mc "Revert changes in these %i files?" $n] - } + set numPaths [llength $pathList] + set numUntracked [llength $untrackedList] - set reply [tk_dialog \ - .confirm_revert \ - "[appname] ([reponame])" \ - "$query + if {$numPaths > 0} { + # Split question between singular and plural cases, because + # such distinction is needed in some languages. Previously, the + # code used "Revert changes in" for both, but that can't work + # in languages where 'in' must be combined with word from + # rest of string (in different way for both cases of course). + # + # FIXME: Unfortunately, even that isn't enough in some languages + # as they have quite complex plural-form rules. Unfortunately, + # msgcat doesn't seem to support that kind of string translation. + if {$numPaths == 1} { + set query [mc "Revert changes in file %s?" [short_path [lindex $pathList]]] + } else { + set query [mc "Revert changes in these %i files?" $numPaths] + } + + set reply [tk_dialog \ + .confirm_revert \ + "[appname] ([reponame])" \ + "$query [mc "Any unstaged changes will be permanently lost by the revert."]" \ - question \ - 1 \ - [mc "Do Nothing"] \ - [mc "Revert Changes"] \ - ] - if {$reply == 1} { - checkout_index \ - $txt \ - $pathList \ - [concat $after [list ui_ready]] - } else { - unlock_index + question \ + 1 \ + [mc "Do Nothing"] \ + [mc "Revert Changes"] \ + ] + + if {$reply == 1} { + checkout_index \ + $txt \ + $pathList \ + [concat $after [list ui_ready]] + + already_unlocked + } + } + + if {$numUntracked > 0} { + # Split question between singular and plural cases, because + # such distinction is needed in some languages. + # + # FIXME: Unfortunately, even that isn't enough in some languages + # as they have quite complex plural-form rules. Unfortunately, + # msgcat doesn't seem to support that kind of string translation. + if {$numUntracked == 1} { + set query [mc "Delete untracked file %s?" [short_path [lindex $untrackedList]]] + } else { + set query [mc "Delete these %i untracked files?" $numUntracked] + } + + set reply [tk_dialog \ + .confirm_revert \ + "[appname] ([reponame])" \ + "$query + +[mc "Files will be permanently deleted."]" \ + question \ + 1 \ + [mc "Do Nothing"] \ + [mc "Delete Files"] \ + ] + + if {$reply == 1} { + file delete -- {*}$untrackedList + + foreach path $untrackedList { + set directoryPath [file dirname $path] + + while {$directoryPath != $path} { + set contents [glob -nocomplain -dir $path *]
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 509
Quoted 10 lines
git-gui/lib/index.tcl +10
-0+ + if {[llength $contents] > 0} { break } + + try { + file delete -- $path + } + catch { + # This is just a best effort, don't annoy the user with failure to remove empty directories. + break + }
The convention in this project is to just use catch, and not try. So something like:
catch {file delete -- $path}
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 512
Quoted 3 lines
git-gui/lib/index.tcl +3
-0+ + set path $directoryPath + set directoryPath [file dirname $path]
I read this loop as "if all the paths in a directory are removed, remove the empty directory as well". Do I read correctly?
Will there be problems in deleting the directory? What if the user wants to keep the directory, and just delete the files? Is that even a valid use-case?
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 516
Quoted 4 lines
git-gui/lib/index.tcl +4
-0+ } + } + + lappend epilogue {ui_do_rescan}
A rescan is an expensive operation, so we should use it judiciously. Are you sure it is really needed? The "Revert" code does not do a rescan but still manages to update the list of "unstaged files". How does it manage that? Can the new code do something similar?
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 520
Quoted 4 lines
git-gui/lib/index.tcl +3
-0+ } } + + foreach epilogueCommand $epilogue { {*}$epilogueCommand }
Why not use eval [2]? Are there any downsides to that compared to your way? If not, use eval. At least it means better readability if nothing else.
As far as I see, you use $epilogue for two things: unlocking the index and rescanning. Can you move the control flow around that both can be done in the "normal" way. That is, they are not a part of a list of things to do at the end, but instead are done when needed. For example, just move the call to unlock_index at the end instead of putting it in epilogue. Can the same be done for ui_do_rescan (if you do go with a rescan instead of doing it like the existing revert does)?
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 523
Quoted 3 lines
git-gui/lib/index.tcl +0
-0} proc do_revert_selection {} {
While I appreciate the idea of such a feature, I'm surprised by how complex the implementation is. I expected something much simpler. The complexity can probably be managed a bit better by moving the control flow around.
I couldn't dive in the code as deep as I wanted to because I don't have too much time on my hands. But maybe I'll look further by the time your re-roll arrives. Thanks.
[0] https://github.com/prati0100/git-gui
[1] https://github.com/prati0100/git-gui#using-gitgitgadget
[2] https://www.tcl.tk/man/tcl8.6/TclCmd/eval.htm
Signature · 2 lines
Regards, Pratyush Yadav
Re: [PATCH 1/1] git-gui: Revert untracked files by deleting them
Thanks for the reply :-)
Quoted 6 lines
While git-gui is distributed in the main Git tree, the development happens on a separate repo, and the Git maintainer periodically pulls in changes from that repo. It can be found at [0]. For now, I munged your patch to apply on my tree, but please base it on the git-gui repo for your re-rolls or future patches. You can use GitGitGadget to do that [1].
Alright :-)
Quoted 12 lines
Now, on to the patch.
Quoted 8 lines · Jonathan Gilbert via GitGitGadget
From: Jonathan Gilbert <[email protected]>
My development environment sometimes makes automatic changes that I don't want to keep. In some cases, this involves new files being added that I don't want to commit or keep. I have typically had to explicitly delete those files externally to Git Gui, and I want to be able to just select those newly- created untracked files and "revert" them into oblivion.
Quoted 4 lines
I think the description of your workflow belongs in the cover letter more than here. The commit message should take a more neutral tone. So, describe the problem in an objective way that not only you, but other git-gui users might face.
That's totally fair, I was sort of shooting in the dark since this is the first such patch I have made. I will reword the commit message.
Quoted 7 lines
Quoted 1 line
+ # If an action is taken that implicitly unlocks the index, this gets cleared. Either way, it is executed at the end of the procedure.
The convention is to wrap lines at 80 columns wherever possible. Please follow that. You can look at the rest of the code for examples.
You have other lines too that are too long. The same comment applies to all those.
Roger.
Quoted 10 lines
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 400
Quoted 4 lines
git-gui/lib/index.tcl +4
-0+ set epilogue [list] + lappend epilogue {unlock_index} + + proc already_unlocked {} { upvar epilogue epilogue; set epilogue [lsearch -inline -all -not -exact $epilogue {unlock_index}] }A procedure defined inside a procedure? Please don't do that. Define it outside.
Also, what is this procedure supposed to do? It is not very clear at first read.
The name could probably be improved, but this procedure can't live outside of the outer proc because it is lexically tied to it. It takes an action on state that is in a local variable. If it's flat-out disallowed to use a proc to abstract this, then every place that wants to indicate that the repository is already unlocked and doesn't need to be explicitly unlocked in the epilogue will have to repeat the code inside the proc.
This becomes a non-issue if I rework the function so that it doesn't end with a dynamic epilogue (see below).
Quoted 9 lines
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 403
Quoted 3 lines
git-gui/lib/index.tcl +2
-0+ set pathList [list] + set untrackedList [list]Nitpick: Ugh! camelCase in a sea of
snake_cases. What's even more unfortunate is thatpathListitself is in camelCase, so that's probably the reason you went with camelCase in the first place. Maybe re-namepathListtopath_listwhile we're at it, and then usesnake_caseeverywhere?
Absolutely, yeah I was just copying what I already saw there, but I'm all in favour of consistency. :-)
Quoted 2 lines
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 427
Quoted 2 lines
git-gui/lib/index.tcl +2
-0+ set numPaths [llength $pathList] + set numUntracked [llength $untrackedList]
Will fix this too.
Quoted 8 lines
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 509
Quoted 7 lines
git-gui/lib/index.tcl +7
-0+ try { + file delete -- $path + } + catch { + # This is just a best effort, don't annoy the user with failure to remove empty directories. + break + }
Quoted 4 lines
The convention in this project is to just use
catch, and not try. So something like:catch {file delete -- $path}
I'm not super familiar with TCL, where does the break statement fit into this?
I did a Google search and saw that catch returns a value that you can inspect, would I write this?:
```
if { [catch {file delete -- $path}] } {
break
}
```Quoted 9 lines
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 512
Quoted 2 lines
git-gui/lib/index.tcl +2
-0+ set path $directoryPath + set directoryPath [file dirname $path]I read this loop as "if all the paths in a directory are removed, remove the empty directory as well". Do I read correctly?
Will there be problems in deleting the directory? What if the user wants to keep the directory, and just delete the files? Is that even a valid use-case?
Well, Git itself doesn't keep empty directories. As such, I wrote the code with an (undocumented) assumption that if there is a directory that contains only a single untracked file, then the directory was probably created to put the file in it.
Quoted 9 lines
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 516
Quoted 4 lines
git-gui/lib/index.tcl +4
-0+ } + } + + lappend epilogue {ui_do_rescan}A rescan is an expensive operation, so we should use it judiciously. Are you sure it is really needed? The "Revert" code does not do a rescan but still manages to update the list of "unstaged files". How does it manage that? Can the new code do something similar?
I'll look into it, but I'm assuming it's happening as part of checkout_index.
Quoted 8 lines
git-gui/lib/index.tcl proc revert_helper {txt paths} { · line 520
Quoted 4 lines
git-gui/lib/index.tcl +3
-0+ } } + + foreach epilogueCommand $epilogue { {*}$epilogueCommand }Why not use
eval[2]? Are there any downsides to that compared to your way? If not, useeval. At least it means better readability if nothing else.
I wrote some TCL over a decade ago for Eggdrop bot scripts, and haven't touched it until now, so my ambient knowledge of TCL is quite limited. I'll look into how to use eval for this. :-)
Quoted 7 lines
As far as I see, you use $epilogue for two things: unlocking the index and rescanning. Can you move the control flow around that both can be done in the "normal" way. That is, they are not a part of a list of things to do at the end, but instead are done when needed. For example, just move the call to
unlock_indexat the end instead of putting it in epilogue. Can the same be done forui_do_rescan(if you do go with a rescan instead of doing it like the existing revert does)?
Well, unlock_index will presumably throw an error if checkout_index gets called, but checkout_index only gets called if the scan finds tracked files with changes _and_ the user opts to revert them.
Similarly, ui_do_rescan wants to be done exactly once at the end, but only if the scan finds untracked files _and_ the user opts to delete them.
An alternative to the epilogue could be two booleans need_unlock_index that starts out true and need_rescan that starts out false, and then the function's epilogue, instead of being dynamic, just checks the booleans and does the things.
Quoted 20 lines
Quoted 3 lines
}
proc
do_revert_selection{} {While I appreciate the idea of such a feature, I'm surprised by how complex the implementation is. I expected something much simpler. The complexity can probably be managed a bit better by moving the control flow around.
I couldn't dive in the code as deep as I wanted to because I don't have too much time on my hands. But maybe I'll look further by the time your re-roll arrives. Thanks.
[0] https://github.com/prati0100/git-gui
[1] https://github.com/prati0100/git-gui#using-gitgitgadget
[2] https://www.tcl.tk/man/tcl8.6/TclCmd/eval.htm--
Regards,
Pratyush Yadav
Quoted 5 lines · Jonathan Gilbert via GitGitGadget
My development environment sometimes makes automatic changes that I don't want to keep. In some cases, this involves new files being added that I don't want to commit or keep. I have typically had to explicitly delete those files externally to Git Gui, and I want to be able to just select those newly-created untracked files and "revert" them into oblivion.
Is there a reason these new files can't be ignored, with one of the .gitignore file, .git/info/exclude, or core.excludesFile?
If so, it would be helpful to explain that in the commit message so we can more fully understand the rationale here.
Signature · 2 lines
brian m. carlson: Houston, Texas, US OpenPGP: https://keybase.io/bk2204
Quoted 1 line
Is there a reason these new files can't be ignored, with one of the.gitignore file, .git/info/exclude, or core.excludesFile?
I guess it's implied in the way I worded the message, but I have fallen into the habit of using Git-Gui to manage the state of the working copy (at least in detail). I am primarily doing .NET development, for which projects can have a file App.config that stores various settings that apply to the project at runtime. The NuGet package manager sometimes edits App.config on your behalf as part of installing a package, and if a project doesn't already have an App.config file, it adds one. It has also updated a packages.config file and the main project file. If I decide that I actually don't want the change after all, Git-Gui permits me to revert the packages.config change and revert the project file change. If an existing App.config file was edited, I can revert that too, but if it was newly-generated, then I want to delete that file, but I don't want to ignore App.config files going forward, because there's a good chance a future change may introduce a different need for an App.config file.
With the current Git-Gui version, I need to exit the Git-Gui UI/flow, navigate to the project in a console window (which probably isn't already in the correct folder) and manually delete the unwanted file. This deletion requires me to identify the file explicitly as well. With the proposed change, the untracked file, which Git-Gui already lists, can be selected, and then activating the "revert" function performs a UI flow for deleting the file. Without these changes, Git-Gui simply does nothing at all when you tell it to revert an untracked file.
Another example is when I go to review changes and discover a VIM crash dump or a spurious temporary file from a code analyzer, files that aren't _expected_ to normally come into existence at all. While we could try to anticipate every type of spurious file and .gitignore them all, I prefer to simply delete the files, and for similar reasons as before, navigating a separate tool to the correct folder to perform the deletion is a manual, time-consuming and context-switching process. This is what led me to want this feature directly from the Git-Gui tool, which is what identifies the rogue file to me in the first place.
If you can think of a concise way to say that, I'll be happy to add it to the commit message. My intuition is that that's too wordy as-written, but if that intuition is wrong, I can copy/paste this text too. :-)
Thanks,
Jonathan Gilbert
Quoted 16 lines · On Mon, Oct 28, 2019 at 7:12 PM brian m. carlson…
Quoted 5 lines · Jonathan Gilbert via GitGitGadget
My development environment sometimes makes automatic changes that I don't want to keep. In some cases, this involves new files being added that I don't want to commit or keep. I have typically had to explicitly delete those files externally to Git Gui, and I want to be able to just select those newly-created untracked files and "revert" them into oblivion.
Is there a reason these new files can't be ignored, with one of the .gitignore file, .git/info/exclude, or core.excludesFile?
If so, it would be helpful to explain that in the commit message so we can more fully understand the rationale here.
--
brian m. carlson: Houston, Texas, US
OpenPGP: https://keybase.io/bk2204
Quoted 7 lines · Jonathan Gilbert via GitGitGadget
My development environment sometimes makes automatic changes that I don't want to keep. In some cases, this involves new files being added that I don't want to commit or keep. I have typically had to explicitly delete those files externally to Git Gui, and I want to be able to just select those newly-created untracked files and "revert" them into oblivion.
I have an entry in the 'Tools" menu for this called 'Delete':
[guitool "Delete"]
cmd = rm -f \"$FILENAME\"
noconsole = yes
needsfile = yes
confirm = yes
Best,
Bert
Quoted 18 lines
This change updates the
revert_helperfunction to check for untracked files as well as changes, and then any changes to be reverted and untracked files are handled by independent blocks of code. The user is prompted independently for untracked files, since the underlying action is fundamentally different (rm -f). If after deleting untracked files, the directory containing them becomes empty, then the directory is removed as well.This introduces new strings in index.tcl. I have been told that there is a separate process whereby the translations get updated.
Jonathan Gilbert (1):
git-gui: Revert untracked files by deleting themgit-gui/lib/index.tcl | 139 +++++++++++++++++++++++++++++++----------- 1 file changed, 104 insertions(+), 35 deletions(-)
That's kind of neat, I wasn't aware of that facet of Git Gui :-) But, it isn't quite the same feature:
* It has to be manually set up on each installation.
* It invokes an external process, I don't know if it's safe to assume that "rm" will work on all platforms (though I just tested it on my Windows installation and it worked).
* It doesn't remove directories that it makes empty.
* I don't see a way to bind it to a keyboard shortcut. That could just be me not knowing enough about custom tools, though. :-)
* It only processes the first file selected.
* If I select a tracked file, it will still delete it, and the feature I'm looking for is more of a "return repository to clean state" type function, like "revert" already is but extended to handle files that you can't actually "git revert".
Thanks,
Jonathan Gilbert
Quoted 40 lines · On Tue, Oct 29, 2019 at 9:32 AM Bert Wesarg bert.wesarg-at-googlemail.com…
Quoted 7 lines · Jonathan Gilbert via GitGitGadget
My development environment sometimes makes automatic changes that I don't want to keep. In some cases, this involves new files being added that I don't want to commit or keep. I have typically had to explicitly delete those files externally to Git Gui, and I want to be able to just select those newly-created untracked files and "revert" them into oblivion.
I have an entry in the 'Tools" menu for this called 'Delete':
[guitool "Delete"]
cmd = rm -f \"$FILENAME\"
noconsole = yes
needsfile = yes
confirm = yesBest,
BertQuoted 18 lines
This change updates the
revert_helperfunction to check for untracked files as well as changes, and then any changes to be reverted and untracked files are handled by independent blocks of code. The user is prompted independently for untracked files, since the underlying action is fundamentally different (rm -f). If after deleting untracked files, the directory containing them becomes empty, then the directory is removed as well.This introduces new strings in index.tcl. I have been told that there is a separate process whereby the translations get updated.
Jonathan Gilbert (1):
git-gui: Revert untracked files by deleting themgit-gui/lib/index.tcl | 139 +++++++++++++++++++++++++++++++----------- 1 file changed, 104 insertions(+), 35 deletions(-)
(should have had:)
Quoted 4 lines
Quoted 1 line
I have an entry in the "Tools" menu for this called 'Delete':
That's kind of neat, I wasn't aware of that facet of Git Gui :-) But, it isn't quite the same feature:
Oops, double gaffe. I accidentally forgot to "Reply All", so this was a re-send of the message. And when I re-sent it, I didn't notice that the e-mail client hid the quoted line from me and accidentally sent it without quoting Bert's line. I wasn't sure whether to write this follow-up but the longer I stared at it, the more sure I was that somebody would call me out on it so I decided to be pre-emptive. My apologies if it would have been better to just let it slide.
Jonathan Gilbert
Quoted 64 lines · Jonathan Gilbert
That's kind of neat, I wasn't aware of that facet of Git Gui :-) But, it isn't quite the same feature:
* It has to be manually set up on each installation.
* It invokes an external process, I don't know if it's safe to assume that "rm" will work on all platforms (though I just tested it on my Windows installation and it worked).
* It doesn't remove directories that it makes empty.
* I don't see a way to bind it to a keyboard shortcut. That could just be me not knowing enough about custom tools, though. :-)
* It only processes the first file selected.
* If I select a tracked file, it will still delete it, and the feature I'm looking for is more of a "return repository to clean state" type function, like "revert" already is but extended to handle files that you can't actually "git revert".Thanks,
Jonathan Gilbert
Quoted 40 lines · On Tue, Oct 29, 2019 at 9:32 AM Bert Wesarg bert.wesarg-at-googlemail.com…
Quoted 7 lines · Jonathan Gilbert via GitGitGadget
My development environment sometimes makes automatic changes that I don't want to keep. In some cases, this involves new files being added that I don't want to commit or keep. I have typically had to explicitly delete those files externally to Git Gui, and I want to be able to just select those newly-created untracked files and "revert" them into oblivion.
I have an entry in the 'Tools" menu for this called 'Delete':
[guitool "Delete"]
cmd = rm -f \"$FILENAME\"
noconsole = yes
needsfile = yes
confirm = yesBest,
BertQuoted 18 lines
This change updates the
revert_helperfunction to check for untracked files as well as changes, and then any changes to be reverted and untracked files are handled by independent blocks of code. The user is prompted independently for untracked files, since the underlying action is fundamentally different (rm -f). If after deleting untracked files, the directory containing them becomes empty, then the directory is removed as well.This introduces new strings in index.tcl. I have been told that there is a separate process whereby the translations get updated.
Jonathan Gilbert (1):
git-gui: Revert untracked files by deleting themgit-gui/lib/index.tcl | 139 +++++++++++++++++++++++++++++++----------- 1 file changed, 104 insertions(+), 35 deletions(-)
Quoted 10 lines · Jonathan Gilbert
That's kind of neat, I wasn't aware of that facet of Git Gui :-) But, it isn't quite the same feature:
* It has to be manually set up on each installation.
* It invokes an external process, I don't know if it's safe to assume that "rm" will work on all platforms (though I just tested it on my Windows installation and it worked).
* It doesn't remove directories that it makes empty.
* I don't see a way to bind it to a keyboard shortcut. That could just be me not knowing enough about custom tools, though. :-)
You can't as of now. Harish was in the process of implementing this [0], but I left some comments and he hasn't re-rolled the patch since. So unless I find some time to tie it up, this will remain un-implemented.
Of course, if you'd like to see that feature in git-gui, feel free to pick it up and brush up the changes :). The latest version can be found at [1]. But it does not have a proper commit message (apart from the other changes I suggested) since Harish did not format the patch correctly when sending.
Quoted 5 lines
* It only processes the first file selected.
* If I select a tracked file, it will still delete it, and the feature I'm looking for is more of a "return repository to clean state" type function, like "revert" already is but extended to handle files that you can't actually "git revert".
[0] https://public-inbox.org/git/CACV9s2MQCP04QASgt0xhi3cSNPSKjwXTufxmZQXAUNvnWD9DSw@mail.gmail.com/
[1] https://github.com/prati0100/git-gui/tree/hk/custom-keyboard-shortcuts
Signature · 2 lines
Regards, Pratyush Yadav