diff options
-rwxr-xr-x | git-gui.sh | 4 | ||||
-rw-r--r-- | lib/chord.tcl | 56 | ||||
-rw-r--r-- | lib/index.tcl | 10 |
3 files changed, 35 insertions, 35 deletions
diff --git a/git-gui.sh b/git-gui.sh index d939844942..4610e4ca72 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -30,8 +30,8 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.}] ## ## Tcl/Tk sanity check -if {[catch {package require Tcl 8.6} err] - || [catch {package require Tk 8.6} err] +if {[catch {package require Tcl 8.5} err] + || [catch {package require Tk 8.5} err] } { catch {wm withdraw .} tk_messageBox \ diff --git a/lib/chord.tcl b/lib/chord.tcl index 275a6cd4a1..e21e7d3d0b 100644 --- a/lib/chord.tcl +++ b/lib/chord.tcl @@ -27,7 +27,7 @@ # # Turn off the UI while running a couple of async operations. # lock_ui # -# set chord [SimpleChord new { +# set chord [SimpleChord::new { # unlock_ui # # Note: $notice here is not referenced in the calling scope # if {$notice} { info_popup $notice } @@ -37,9 +37,9 @@ # # all operations have been initiated. # set common_note [$chord add_note] # -# # Pass notes as 'after' callbacks to other operations -# async_operation $args [$chord add_note] -# other_async_operation $args [$chord add_note] +# # Activate notes in 'after' callbacks to other operations +# set newnote [$chord add_note] +# async_operation $args [list $newnote activate] # # # Communicate with the chord body # if {$condition} { @@ -48,7 +48,7 @@ # } # # # Activate the common note, making the chord eligible to complete -# $common_note +# $common_note activate # # At this point, the chord will complete at some unknown point in the future. # The common note might have been the first note activated, or the async @@ -60,18 +60,23 @@ # Represents a procedure that conceptually has multiple entrypoints that must # all be called before the procedure executes. Each entrypoint is called a # "note". The chord is only "completed" when all the notes are "activated". -oo::class create SimpleChord { - variable notes body is_completed +class SimpleChord { + field notes + field body + field is_completed + field eval_ns # Constructor: - # set chord [SimpleChord new {body}] + # set chord [SimpleChord::new {body}] # Creates a new chord object with the specified body script. The # body script is evaluated at most once, when a note is activated # and the chord has no other non-activated notes. - constructor {body} { + constructor new {i_body} { set notes [list] - my eval [list set body $body] + set body $i_body set is_completed 0 + set eval_ns "[namespace qualifiers $this]::eval" + return $this } # Method: @@ -80,7 +85,7 @@ oo::class create SimpleChord { # the chord body will be evaluated. This can be used to set variable # values for the chord body to use. method eval {script} { - namespace eval [self] $script + namespace eval $eval_ns $script } # Method: @@ -92,7 +97,7 @@ oo::class create SimpleChord { method add_note {} { if {$is_completed} { error "Cannot add a note to a completed chord" } - set note [ChordNote new [self]] + set note [ChordNote::new $this] lappend notes $note @@ -108,8 +113,8 @@ oo::class create SimpleChord { set is_completed 1 - namespace eval [self] $body - namespace delete [self] + namespace eval $eval_ns $body + delete_this } } } @@ -119,15 +124,17 @@ oo::class create SimpleChord { # final note of the chord is activated (this can be any note in the chord, # with all other notes already previously activated in any order), the chord's # body is evaluated. -oo::class create ChordNote { - variable chord is_activated +class ChordNote { + field chord + field is_activated # Constructor: # Instances of ChordNote are created internally by calling add_note on # SimpleChord objects. - constructor {chord} { - my eval set chord $chord + constructor new {c} { + set chord $c set is_activated 0 + return $this } # Method: @@ -138,20 +145,11 @@ oo::class create ChordNote { } # Method: - # $note + # $note activate # Activates the note, if it has not already been activated, and # completes the chord if there are no other notes awaiting # activation. Subsequent calls will have no further effect. - # - # NB: In TclOO, if an object is invoked like a method without supplying - # any method name, then this internal method `unknown` is what - # actually runs (with no parameters). It is used in the ChordNote - # class for the purpose of allowing the note object to be called as - # a function (see example above). (The `unknown` method can also be - # used to support dynamic dispatch, but must take parameters to - # identify the "unknown" method to be invoked. In this form, this - # proc serves only to make instances behave directly like methods.) - method unknown {} { + method activate {} { if {!$is_activated} { set is_activated 1 $chord notify_note_activation diff --git a/lib/index.tcl b/lib/index.tcl index 1254145634..1fc5b42300 100644 --- a/lib/index.tcl +++ b/lib/index.tcl @@ -436,7 +436,7 @@ proc revert_helper {txt paths} { # # The asynchronous operations are each indicated below by a comment # before the code block that starts the async operation. - set after_chord [SimpleChord new { + set after_chord [SimpleChord::new { if {[string trim $err] != ""} { rescan_on_error $err } else { @@ -522,10 +522,11 @@ proc revert_helper {txt paths} { ] if {$reply == 1} { + set note [$after_chord add_note] checkout_index \ $txt \ $path_list \ - [$after_chord add_note] \ + [list $note activate] \ $capture_error } } @@ -567,14 +568,15 @@ proc revert_helper {txt paths} { if {$reply == 1} { $after_chord eval { set should_reshow_diff 1 } - delete_files $untracked_list [$after_chord add_note] + set note [$after_chord add_note] + delete_files $untracked_list [list $note activate] } } # Activate the common note. If no other notes were created, this # completes the chord. If other notes were created, then this common # note prevents a race condition where the chord might complete early. - $after_common_note + $after_common_note activate } # Delete all of the specified files, performing deletion in batches to allow the |