зеркало из https://github.com/microsoft/git.git
git-gui: reduce Tcl version requirement from 8.6 to 8.5
On some MacOS distributions like High Sierra, Tcl 8.5 is shipped by default. This makes git-gui error out at startup because of the version mismatch. The only part that requires Tcl 8.6 is SimpleChord, which depends on TclOO. So, don't use it and use our homegrown class.tcl instead. This means some slight syntax changes. Since class.tcl doesn't have an "unknown" method like TclOO does, we can't just call '$note', but have to use '$note activate' instead. The constructor now needs a proper namespace qualifier. Update the documentation to reflect the new syntax. As of now, the only part of git-gui that needs Tcl 8.5 is a call to 'apply' in lib/index.tcl::lambda. Keep using it until someone shows up shouting that their OS ships with 8.4 only. Then we would have to look into implementing it in pure Tcl. Signed-off-by: Pratyush Yadav <me@yadavpratyush.com>
This commit is contained in:
Родитель
0d2116c644
Коммит
8a8efbe414
|
@ -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 \
|
||||||
|
|
|
@ -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,21 @@
|
||||||
# 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
|
||||||
|
|
||||||
# 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
|
||||||
|
return $this
|
||||||
}
|
}
|
||||||
|
|
||||||
# Method:
|
# Method:
|
||||||
|
@ -80,7 +83,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 [namespace qualifiers $this] $script
|
||||||
}
|
}
|
||||||
|
|
||||||
# Method:
|
# Method:
|
||||||
|
@ -92,7 +95,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 +111,8 @@ oo::class create SimpleChord {
|
||||||
|
|
||||||
set is_completed 1
|
set is_completed 1
|
||||||
|
|
||||||
namespace eval [self] $body
|
namespace eval [namespace qualifiers $this] $body
|
||||||
namespace delete [self]
|
delete_this
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -119,15 +122,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 +143,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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче