зеркало из https://github.com/microsoft/git.git
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
This commit is contained in:
Коммит
a5728022e0
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче