From: Pratyush Yadav <me@yadavpratyush.com>
To: Jonathan Gilbert via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Jonathan Gilbert <rcq8n2xf3v@liamekaens.com>,
Jonathan Gilbert <JonathanG@iQmetrix.com>
Subject: Re: [PATCH v3 2/2] git-gui: revert untracked files by deleting them
Date: Sat, 16 Nov 2019 20:41:13 +0530 [thread overview]
Message-ID: <20191116151113.mwbaendh6lgykfw3@yadavpratyush.com> (raw)
In-Reply-To: <dc12c1668dce875c99a45fb49ad5854a13ef4f35.1573638988.git.gitgitgadget@gmail.com>
Hi Jonathan,
Thanks for the re-roll.
[I removed some parts of the diff to make the reply easier to read. I am
implicitly OK with the removed parts.]
On 13/11/19 09:56AM, Jonathan Gilbert via GitGitGadget wrote:
> From: Jonathan Gilbert <JonathanG@iQmetrix.com>
>
> Update the revert_helper proc to check for untracked files as well as
> changes, and then handle changes to be reverted and untracked files with
> independent blocks of code. Prompt the user 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 remove the directory as well. Migrate unlocking of the index
> out of _close_updateindex to a responsibility of the caller, to permit
> paths that don't directly unlock the index, and refactor the error
> handling added in d4e890e5 so that callers can make flow control
> decisions in the event of errors.
>
> A new proc delete_files takes care of actually deleting the files in
> batches, using the Tcler's Wiki recommended approach for keeping the UI
> responsive.
>
> Since the checkout_index and delete_files calls are both asynchronous
> and could potentially complete in any order, a "chord" is used to
> coordinate unlocking the index and returning the UI to a usable state
> only after both operations are complete. The `SimpleChord` class,
> based on TclOO (Tcl/Tk 8.6), is added in this commit.
Looks much better!
> Signed-off-by: Jonathan Gilbert <JonathanG@iQmetrix.com>
> ---
> git-gui.sh | 4 +-
> lib/chord.tcl | 160 +++++++++++++++++++
> lib/index.tcl | 416 ++++++++++++++++++++++++++++++++++++++++----------
> 3 files changed, 496 insertions(+), 84 deletions(-)
> create mode 100644 lib/chord.tcl
>
> diff --git a/lib/index.tcl b/lib/index.tcl
> index 28d4d2a54e..3ac08281c2 100644
> --- a/lib/index.tcl
> +++ b/lib/index.tcl
> @@ -7,53 +7,62 @@ proc _delete_indexlock {} {
> }
> }
>
> -proc _close_updateindex {fd after} {
> - global use_ttk NS
> +# Returns true if the operation succeeded, false if a rescan has been initiated.
> +proc _close_updateindex_rescan_on_error {fd} {
> + if {![catch {_close_updateindex $fd} err]} {
> + return true
> + } else {
> + rescan_on_error $err
> + return false
> + }
> +}
> +
> +proc _close_updateindex {fd} {
> fconfigure $fd -blocking 1
> - if {[catch {close $fd} err]} {
> - set w .indexfried
> - Dialog $w
> - wm withdraw $w
> - wm title $w [strcat "[appname] ([reponame]): " [mc "Index Error"]]
> - wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
> - set s [mc "Updating the Git index failed. A rescan will be automatically started to resynchronize git-gui."]
> - text $w.msg -yscrollcommand [list $w.vs set] \
> - -width [string length $s] -relief flat \
> - -borderwidth 0 -highlightthickness 0 \
> - -background [get_bg_color $w]
> - $w.msg tag configure bold -font font_uibold -justify center
> - ${NS}::scrollbar $w.vs -command [list $w.msg yview]
> - $w.msg insert end $s bold \n\n$err {}
> - $w.msg configure -state disabled
> -
> - ${NS}::button $w.continue \
> - -text [mc "Continue"] \
> - -command [list destroy $w]
> - ${NS}::button $w.unlock \
> - -text [mc "Unlock Index"] \
> - -command "destroy $w; _delete_indexlock"
> - grid $w.msg - $w.vs -sticky news
> - grid $w.unlock $w.continue - -sticky se -padx 2 -pady 2
> - grid columnconfigure $w 0 -weight 1
> - grid rowconfigure $w 0 -weight 1
> -
> - wm protocol $w WM_DELETE_WINDOW update
> - bind $w.continue <Visibility> "
> - grab $w
> - focus %W
> - "
> - wm deiconify $w
> - tkwait window $w
> + close $fd
> + $::main_status stop
I didn't spot this earlier. Will this call to 'stop' interfere with the
'start' in 'delete_files'?
> +}
>
> - $::main_status stop
> - unlock_index
> - rescan $after 0
> - return
> - }
> +proc rescan_on_error {err} {
> + global use_ttk NS
> +
> + set w .indexfried
> + Dialog $w
> + wm withdraw $w
> + wm title $w [strcat "[appname] ([reponame]): " [mc "Index Error"]]
> + wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
> + set s [mc "Updating the Git index failed. A rescan will be automatically started to resynchronize git-gui."]
> + text $w.msg -yscrollcommand [list $w.vs set] \
> + -width [string length $s] -relief flat \
> + -borderwidth 0 -highlightthickness 0 \
> + -background [get_bg_color $w]
> + $w.msg tag configure bold -font font_uibold -justify center
> + ${NS}::scrollbar $w.vs -command [list $w.msg yview]
> + $w.msg insert end $s bold \n\n$err {}
> + $w.msg configure -state disabled
> +
> + ${NS}::button $w.continue \
> + -text [mc "Continue"] \
> + -command [list destroy $w]
> + ${NS}::button $w.unlock \
> + -text [mc "Unlock Index"] \
> + -command "destroy $w; _delete_indexlock"
> + grid $w.msg - $w.vs -sticky news
> + grid $w.unlock $w.continue - -sticky se -padx 2 -pady 2
> + grid columnconfigure $w 0 -weight 1
> + grid rowconfigure $w 0 -weight 1
> +
> + wm protocol $w WM_DELETE_WINDOW update
> + bind $w.continue <Visibility> "
> + grab $w
> + focus %W
> + "
> + wm deiconify $w
> + tkwait window $w
>
> $::main_status stop
Same question here.
> unlock_index
> - uplevel #0 $after
> + rescan ui_ready 0
> }
>
> proc update_indexinfo {msg path_list after} {
> @@ -90,7 +99,11 @@ proc write_update_indexinfo {fd path_list total_cnt batch after} {
> global file_states current_diff_path
>
> if {$update_index_cp >= $total_cnt} {
> - _close_updateindex $fd $after
> + if {[_close_updateindex_rescan_on_error $fd]} {
> + unlock_index
> + }
> +
> + uplevel #0 $after
This changes when $after is called. If you pass it to 'rescan', it runs
_after_ the rescan is finished. Now it runs "in parallel" with it. Are
you sure that is the intended behaviour? Should we just stick to passing
$after to rescan on failure?
> return
> }
>
> @@ -156,7 +169,11 @@ proc write_update_index {fd path_list total_cnt batch after} {
> global file_states current_diff_path
>
> if {$update_index_cp >= $total_cnt} {
> - _close_updateindex $fd $after
> + if {[_close_updateindex_rescan_on_error $fd]} {
> + unlock_index
> + }
> +
> + uplevel #0 $after
While we're here, how about just moving this entire thing to
'_close_updateindex_rescan_on_error', since the only two consumers of
the function do the _exact_ same thing?
This would also allow us to pass $after to 'rescan'. It would also
hopefully make the code a bit easier to follow because you can clearly
see that we only unlock the index when there is no error.
Even better, unlock the index unconditionally in
'_close_updateindex_rescan_on_error', and remove the 'unlock_index' call
from 'rescan_on_error'. I generally prefer to keep locking/unlocking
paths as simple as possible.
> return
> }
>
> @@ -193,7 +210,7 @@ proc write_update_index {fd path_list total_cnt batch after} {
> $::main_status update $update_index_cp $total_cnt
> }
>
> -proc checkout_index {msg path_list after} {
> +proc checkout_index {msg path_list after capture_error} {
> global update_index_cp
>
> if {![lock_index update]} return
> @@ -225,15 +242,21 @@ proc checkout_index {msg path_list after} {
> $total_cnt \
> $batch \
> $after \
> + $capture_error \
> ]
> }
>
> -proc write_checkout_index {fd path_list total_cnt batch after} {
> +proc write_checkout_index {fd path_list total_cnt batch after capture_error} {
> global update_index_cp
> global file_states current_diff_path
>
> if {$update_index_cp >= $total_cnt} {
> - _close_updateindex $fd $after
> + if {[catch {_close_updateindex $fd} err]} {
> + uplevel #0 $capture_error [list $err]
> + }
> +
> + uplevel #0 $after
> +
Nitpick: Please explicitly mention why we _don't_ want to unlock the
index here.
There are two function very similar to this one: 'write_update_index'
and 'write_update_indexinfo'. This subtle but important difference is
very easy to gloss over.
> return
> }
>
This patch is almost ready to be merged. Looking forward to the
(hopefully) final iteration of this topic :)
--
Regards,
Pratyush Yadav
next prev parent reply other threads:[~2019-11-16 15:11 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-30 6:48 [PATCH 0/2] git-gui: revert untracked files by deleting them Jonathan Gilbert via GitGitGadget
2019-10-30 6:48 ` [PATCH 1/2] git-gui: consolidate naming conventions Jonathan Gilbert via GitGitGadget
2019-11-03 0:27 ` Pratyush Yadav
2019-10-30 6:48 ` [PATCH 2/2] git-gui: revert untracked files by deleting them Jonathan Gilbert via GitGitGadget
2019-11-03 7:44 ` Pratyush Yadav
2019-11-04 16:04 ` Jonathan Gilbert
2019-11-04 17:36 ` Jonathan Gilbert
2019-10-30 9:06 ` [PATCH 0/2] " Bert Wesarg
2019-10-30 17:16 ` Jonathan Gilbert
2019-11-03 1:12 ` Pratyush Yadav
2019-11-03 4:41 ` Jonathan Gilbert
2019-11-03 7:54 ` Pratyush Yadav
2019-11-07 7:05 ` [PATCH v2 " Jonathan Gilbert via GitGitGadget
2019-11-07 7:05 ` [PATCH v2 1/2] git-gui: consolidate naming conventions Jonathan Gilbert via GitGitGadget
2019-11-07 7:05 ` [PATCH v2 2/2] git-gui: revert untracked files by deleting them Jonathan Gilbert via GitGitGadget
2019-11-11 19:25 ` Pratyush Yadav
2019-11-11 21:55 ` Jonathan Gilbert
2019-11-11 22:59 ` Philip Oakley
2019-11-12 4:49 ` Jonathan Gilbert
2019-11-12 10:45 ` Philip Oakley
2019-11-12 16:29 ` Jonathan Gilbert
2019-11-26 11:22 ` Philip Oakley
2019-11-12 19:35 ` Pratyush Yadav
2019-11-11 19:35 ` [PATCH v2 0/2] " Pratyush Yadav
2019-11-13 9:56 ` [PATCH v3 " Jonathan Gilbert via GitGitGadget
2019-11-13 9:56 ` [PATCH v3 1/2] git-gui: consolidate naming conventions Jonathan Gilbert via GitGitGadget
2019-11-13 9:56 ` [PATCH v3 2/2] git-gui: revert untracked files by deleting them Jonathan Gilbert via GitGitGadget
2019-11-16 15:11 ` Pratyush Yadav [this message]
2019-11-16 21:42 ` Jonathan Gilbert
2019-11-17 6:56 ` [PATCH v4 0/2] " Jonathan Gilbert via GitGitGadget
2019-11-17 6:56 ` [PATCH v4 1/2] git-gui: consolidate naming conventions Jonathan Gilbert via GitGitGadget
2019-11-17 6:56 ` [PATCH v4 2/2] git-gui: revert untracked files by deleting them Jonathan Gilbert via GitGitGadget
2019-11-24 13:09 ` Pratyush Yadav
2019-11-19 15:21 ` [PATCH v4 0/2] " Pratyush Yadav
2019-11-19 16:56 ` Jonathan Gilbert
2019-11-24 20:37 ` [PATCH v5 0/3] " Jonathan Gilbert via GitGitGadget
2019-11-24 20:37 ` [PATCH v5 1/3] git-gui: consolidate naming conventions Jonathan Gilbert via GitGitGadget
2019-11-24 20:37 ` [PATCH v5 2/3] git-gui: update status bar to track operations Jonathan Gilbert via GitGitGadget
2019-11-27 21:55 ` Pratyush Yadav
2019-11-28 7:34 ` Jonathan Gilbert
2019-11-24 20:37 ` [PATCH v5 3/3] git-gui: revert untracked files by deleting them Jonathan Gilbert via GitGitGadget
2019-11-27 22:03 ` Pratyush Yadav
2019-11-28 8:30 ` [PATCH v6 0/3] " Jonathan Gilbert via GitGitGadget
2019-11-28 8:30 ` [PATCH v6 1/3] git-gui: consolidate naming conventions Jonathan Gilbert via GitGitGadget
2019-11-28 8:30 ` [PATCH v6 2/3] git-gui: update status bar to track operations Jonathan Gilbert via GitGitGadget
2019-11-30 23:05 ` Pratyush Yadav
2019-12-01 2:12 ` Jonathan Gilbert
2019-12-01 11:43 ` Philip Oakley
2019-12-01 20:09 ` Jonathan Gilbert
2019-11-28 8:30 ` [PATCH v6 3/3] git-gui: revert untracked files by deleting them Jonathan Gilbert via GitGitGadget
2019-12-01 2:28 ` [PATCH v7 0/3] " Jonathan Gilbert via GitGitGadget
2019-12-01 2:28 ` [PATCH v7 1/3] git-gui: consolidate naming conventions Jonathan Gilbert via GitGitGadget
2019-12-01 2:28 ` [PATCH v7 2/3] git-gui: update status bar to track operations Jonathan Gilbert via GitGitGadget
2020-02-26 8:24 ` Benjamin Poirier
2020-03-02 18:14 ` Pratyush Yadav
2019-12-01 2:28 ` [PATCH v7 3/3] git-gui: revert untracked files by deleting them Jonathan Gilbert via GitGitGadget
2019-12-05 18:54 ` [PATCH v7 0/3] " Pratyush Yadav
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191116151113.mwbaendh6lgykfw3@yadavpratyush.com \
--to=me@yadavpratyush.com \
--cc=JonathanG@iQmetrix.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=rcq8n2xf3v@liamekaens.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).