Browse Source

Merge branch 'py/remove-tcloo'

Reduce the Tcl version requirement to 8.5 to allow git-gui to run on
MacOS distributions like High Sierra. While here, fix a potential
variable name collision.

* py/remove-tcloo:
  git-gui: create a new namespace for chord script evaluation
  git-gui: reduce Tcl version requirement from 8.6 to 8.5
maint
Pratyush Yadav 5 years ago
parent
commit
a5728022e0
  1. 4
      git-gui.sh
  2. 56
      lib/chord.tcl
  3. 10
      lib/index.tcl

4
git-gui.sh

@ -30,8 +30,8 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.}]
## ##
## Tcl/Tk sanity check ## Tcl/Tk sanity check


if {[catch {package require Tcl 8.6} err] if {[catch {package require Tcl 8.5} err]
|| [catch {package require Tk 8.6} err] || [catch {package require Tk 8.5} err]
} { } {
catch {wm withdraw .} catch {wm withdraw .}
tk_messageBox \ tk_messageBox \

56
lib/chord.tcl

@ -27,7 +27,7 @@
# # Turn off the UI while running a couple of async operations. # # Turn off the UI while running a couple of async operations.
# lock_ui # lock_ui
# #
# set chord [SimpleChord new { # set chord [SimpleChord::new {
# unlock_ui # unlock_ui
# # Note: $notice here is not referenced in the calling scope # # Note: $notice here is not referenced in the calling scope
# if {$notice} { info_popup $notice } # if {$notice} { info_popup $notice }
@ -37,9 +37,9 @@
# # all operations have been initiated. # # all operations have been initiated.
# set common_note [$chord add_note] # set common_note [$chord add_note]
# #
# # Pass notes as 'after' callbacks to other operations # # Activate notes in 'after' callbacks to other operations
# async_operation $args [$chord add_note] # set newnote [$chord add_note]
# other_async_operation $args [$chord add_note] # async_operation $args [list $newnote activate]
# #
# # Communicate with the chord body # # Communicate with the chord body
# if {$condition} { # if {$condition} {
@ -48,7 +48,7 @@
# } # }
# #
# # Activate the common note, making the chord eligible to complete # # 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. # 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 # 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 # Represents a procedure that conceptually has multiple entrypoints that must
# all be called before the procedure executes. Each entrypoint is called a # all be called before the procedure executes. Each entrypoint is called a
# "note". The chord is only "completed" when all the notes are "activated". # "note". The chord is only "completed" when all the notes are "activated".
oo::class create SimpleChord { class SimpleChord {
variable notes body is_completed field notes
field body
field is_completed
field eval_ns


# Constructor: # Constructor:
# set chord [SimpleChord new {body}] # set chord [SimpleChord::new {body}]
# Creates a new chord object with the specified body script. The # Creates a new chord object with the specified body script. The
# body script is evaluated at most once, when a note is activated # body script is evaluated at most once, when a note is activated
# and the chord has no other non-activated notes. # and the chord has no other non-activated notes.
constructor {body} { constructor new {i_body} {
set notes [list] set notes [list]
my eval [list set body $body] set body $i_body
set is_completed 0 set is_completed 0
set eval_ns "[namespace qualifiers $this]::eval"
return $this
} }


# Method: # Method:
@ -80,7 +85,7 @@ oo::class create SimpleChord {
# the chord body will be evaluated. This can be used to set variable # the chord body will be evaluated. This can be used to set variable
# values for the chord body to use. # values for the chord body to use.
method eval {script} { method eval {script} {
namespace eval [self] $script namespace eval $eval_ns $script
} }


# Method: # Method:
@ -92,7 +97,7 @@ oo::class create SimpleChord {
method add_note {} { method add_note {} {
if {$is_completed} { error "Cannot add a note to a completed chord" } 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 lappend notes $note


@ -108,8 +113,8 @@ oo::class create SimpleChord {


set is_completed 1 set is_completed 1


namespace eval [self] $body namespace eval $eval_ns $body
namespace delete [self] 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, # 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 # with all other notes already previously activated in any order), the chord's
# body is evaluated. # body is evaluated.
oo::class create ChordNote { class ChordNote {
variable chord is_activated field chord
field is_activated


# Constructor: # Constructor:
# Instances of ChordNote are created internally by calling add_note on # Instances of ChordNote are created internally by calling add_note on
# SimpleChord objects. # SimpleChord objects.
constructor {chord} { constructor new {c} {
my eval set chord $chord set chord $c
set is_activated 0 set is_activated 0
return $this
} }


# Method: # Method:
@ -138,20 +145,11 @@ oo::class create ChordNote {
} }


# Method: # Method:
# $note # $note activate
# Activates the note, if it has not already been activated, and # Activates the note, if it has not already been activated, and
# completes the chord if there are no other notes awaiting # completes the chord if there are no other notes awaiting
# activation. Subsequent calls will have no further effect. # activation. Subsequent calls will have no further effect.
# method activate {} {
# 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 {} {
if {!$is_activated} { if {!$is_activated} {
set is_activated 1 set is_activated 1
$chord notify_note_activation $chord notify_note_activation

10
lib/index.tcl

@ -436,7 +436,7 @@ proc revert_helper {txt paths} {
# #
# The asynchronous operations are each indicated below by a comment # The asynchronous operations are each indicated below by a comment
# before the code block that starts the async operation. # before the code block that starts the async operation.
set after_chord [SimpleChord new { set after_chord [SimpleChord::new {
if {[string trim $err] != ""} { if {[string trim $err] != ""} {
rescan_on_error $err rescan_on_error $err
} else { } else {
@ -522,10 +522,11 @@ proc revert_helper {txt paths} {
] ]


if {$reply == 1} { if {$reply == 1} {
set note [$after_chord add_note]
checkout_index \ checkout_index \
$txt \ $txt \
$path_list \ $path_list \
[$after_chord add_note] \ [list $note activate] \
$capture_error $capture_error
} }
} }
@ -567,14 +568,15 @@ proc revert_helper {txt paths} {
if {$reply == 1} { if {$reply == 1} {
$after_chord eval { set should_reshow_diff 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 # Activate the common note. If no other notes were created, this
# completes the chord. If other notes were created, then this common # completes the chord. If other notes were created, then this common
# note prevents a race condition where the chord might complete early. # 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 # Delete all of the specified files, performing deletion in batches to allow the

Loading…
Cancel
Save