|
|
|
@ -9,6 +9,141 @@ exec wish "$0" -- "$@"
|
|
|
|
|
|
|
|
|
|
package require Tk
|
|
|
|
|
|
|
|
|
|
######################################################################
|
|
|
|
|
##
|
|
|
|
|
## Enabling platform-specific code paths
|
|
|
|
|
|
|
|
|
|
proc is_MacOSX {} {
|
|
|
|
|
if {[tk windowingsystem] eq {aqua}} {
|
|
|
|
|
return 1
|
|
|
|
|
}
|
|
|
|
|
return 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc is_Windows {} {
|
|
|
|
|
if {$::tcl_platform(platform) eq {windows}} {
|
|
|
|
|
return 1
|
|
|
|
|
}
|
|
|
|
|
return 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
set _iscygwin {}
|
|
|
|
|
proc is_Cygwin {} {
|
|
|
|
|
global _iscygwin
|
|
|
|
|
if {$_iscygwin eq {}} {
|
|
|
|
|
if {[string match "CYGWIN_*" $::tcl_platform(os)]} {
|
|
|
|
|
set _iscygwin 1
|
|
|
|
|
} else {
|
|
|
|
|
set _iscygwin 0
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return $_iscygwin
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
######################################################################
|
|
|
|
|
##
|
|
|
|
|
## PATH lookup
|
|
|
|
|
|
|
|
|
|
set _search_path {}
|
|
|
|
|
proc _which {what args} {
|
|
|
|
|
global env _search_exe _search_path
|
|
|
|
|
|
|
|
|
|
if {$_search_path eq {}} {
|
|
|
|
|
if {[is_Cygwin] && [regexp {^(/|\.:)} $env(PATH)]} {
|
|
|
|
|
set _search_path [split [exec cygpath \
|
|
|
|
|
--windows \
|
|
|
|
|
--path \
|
|
|
|
|
--absolute \
|
|
|
|
|
$env(PATH)] {;}]
|
|
|
|
|
set _search_exe .exe
|
|
|
|
|
} elseif {[is_Windows]} {
|
|
|
|
|
set gitguidir [file dirname [info script]]
|
|
|
|
|
regsub -all ";" $gitguidir "\\;" gitguidir
|
|
|
|
|
set env(PATH) "$gitguidir;$env(PATH)"
|
|
|
|
|
set _search_path [split $env(PATH) {;}]
|
|
|
|
|
# Skip empty `PATH` elements
|
|
|
|
|
set _search_path [lsearch -all -inline -not -exact \
|
|
|
|
|
$_search_path ""]
|
|
|
|
|
set _search_exe .exe
|
|
|
|
|
} else {
|
|
|
|
|
set _search_path [split $env(PATH) :]
|
|
|
|
|
set _search_exe {}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[is_Windows] && [lsearch -exact $args -script] >= 0} {
|
|
|
|
|
set suffix {}
|
|
|
|
|
} else {
|
|
|
|
|
set suffix $_search_exe
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach p $_search_path {
|
|
|
|
|
set p [file join $p $what$suffix]
|
|
|
|
|
if {[file exists $p]} {
|
|
|
|
|
return [file normalize $p]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return {}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc sanitize_command_line {command_line from_index} {
|
|
|
|
|
set i $from_index
|
|
|
|
|
while {$i < [llength $command_line]} {
|
|
|
|
|
set cmd [lindex $command_line $i]
|
|
|
|
|
if {[file pathtype $cmd] ne "absolute"} {
|
|
|
|
|
set fullpath [_which $cmd]
|
|
|
|
|
if {$fullpath eq ""} {
|
|
|
|
|
throw {NOT-FOUND} "$cmd not found in PATH"
|
|
|
|
|
}
|
|
|
|
|
lset command_line $i $fullpath
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# handle piped commands, e.g. `exec A | B`
|
|
|
|
|
for {incr i} {$i < [llength $command_line]} {incr i} {
|
|
|
|
|
if {[lindex $command_line $i] eq "|"} {
|
|
|
|
|
incr i
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return $command_line
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Override `exec` to avoid unsafe PATH lookup
|
|
|
|
|
|
|
|
|
|
rename exec real_exec
|
|
|
|
|
|
|
|
|
|
proc exec {args} {
|
|
|
|
|
# skip options
|
|
|
|
|
for {set i 0} {$i < [llength $args]} {incr i} {
|
|
|
|
|
set arg [lindex $args $i]
|
|
|
|
|
if {$arg eq "--"} {
|
|
|
|
|
incr i
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
if {[string range $arg 0 0] ne "-"} {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
set args [sanitize_command_line $args $i]
|
|
|
|
|
uplevel 1 real_exec $args
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Override `open` to avoid unsafe PATH lookup
|
|
|
|
|
|
|
|
|
|
rename open real_open
|
|
|
|
|
|
|
|
|
|
proc open {args} {
|
|
|
|
|
set arg0 [lindex $args 0]
|
|
|
|
|
if {[string range $arg0 0 0] eq "|"} {
|
|
|
|
|
set command_line [string trim [string range $arg0 1 end]]
|
|
|
|
|
lset args 0 "| [sanitize_command_line $command_line 0]"
|
|
|
|
|
}
|
|
|
|
|
uplevel 1 real_open $args
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# End of safe PATH lookup stuff
|
|
|
|
|
|
|
|
|
|
proc hasworktree {} {
|
|
|
|
|
return [expr {[exec git rev-parse --is-bare-repository] == "false" &&
|
|
|
|
|
[exec git rev-parse --is-inside-git-dir] == "false"}]
|
|
|
|
@ -2103,7 +2238,7 @@ proc makewindow {} {
|
|
|
|
|
global headctxmenu progresscanv progressitem progresscoords statusw
|
|
|
|
|
global fprogitem fprogcoord lastprogupdate progupdatepending
|
|
|
|
|
global rprogitem rprogcoord rownumsel numcommits
|
|
|
|
|
global have_tk85 use_ttk NS
|
|
|
|
|
global have_tk85 have_tk86 use_ttk NS
|
|
|
|
|
global git_version
|
|
|
|
|
global worddiff
|
|
|
|
|
|
|
|
|
@ -2601,8 +2736,13 @@ proc makewindow {} {
|
|
|
|
|
bind . <Key-Down> "selnextline 1"
|
|
|
|
|
bind . <Shift-Key-Up> "dofind -1 0"
|
|
|
|
|
bind . <Shift-Key-Down> "dofind 1 0"
|
|
|
|
|
bindkey <Key-Right> "goforw"
|
|
|
|
|
bindkey <Key-Left> "goback"
|
|
|
|
|
if {$have_tk86} {
|
|
|
|
|
bindkey <<NextChar>> "goforw"
|
|
|
|
|
bindkey <<PrevChar>> "goback"
|
|
|
|
|
} else {
|
|
|
|
|
bindkey <Key-Right> "goforw"
|
|
|
|
|
bindkey <Key-Left> "goback"
|
|
|
|
|
}
|
|
|
|
|
bind . <Key-Prior> "selnextpage -1"
|
|
|
|
|
bind . <Key-Next> "selnextpage 1"
|
|
|
|
|
bind . <$M1B-Home> "allcanvs yview moveto 0.0"
|
|
|
|
@ -7720,7 +7860,7 @@ proc gettreeline {gtf id} {
|
|
|
|
|
if {[string index $fname 0] eq "\""} {
|
|
|
|
|
set fname [lindex $fname 0]
|
|
|
|
|
}
|
|
|
|
|
set fname [encoding convertfrom $fname]
|
|
|
|
|
set fname [encoding convertfrom utf-8 $fname]
|
|
|
|
|
lappend treefilelist($id) $fname
|
|
|
|
|
}
|
|
|
|
|
if {![eof $gtf]} {
|
|
|
|
@ -7982,7 +8122,7 @@ proc gettreediffline {gdtf ids} {
|
|
|
|
|
if {[string index $file 0] eq "\""} {
|
|
|
|
|
set file [lindex $file 0]
|
|
|
|
|
}
|
|
|
|
|
set file [encoding convertfrom $file]
|
|
|
|
|
set file [encoding convertfrom utf-8 $file]
|
|
|
|
|
if {$file ne [lindex $treediff end]} {
|
|
|
|
|
lappend treediff $file
|
|
|
|
|
lappend sublist $file
|
|
|
|
@ -8127,7 +8267,7 @@ proc makediffhdr {fname ids} {
|
|
|
|
|
global ctext curdiffstart treediffs diffencoding
|
|
|
|
|
global ctext_file_names jump_to_here targetline diffline
|
|
|
|
|
|
|
|
|
|
set fname [encoding convertfrom $fname]
|
|
|
|
|
set fname [encoding convertfrom utf-8 $fname]
|
|
|
|
|
set diffencoding [get_path_encoding $fname]
|
|
|
|
|
set i [lsearch -exact $treediffs($ids) $fname]
|
|
|
|
|
if {$i >= 0} {
|
|
|
|
@ -8189,7 +8329,7 @@ proc parseblobdiffline {ids line} {
|
|
|
|
|
|
|
|
|
|
if {![string compare -length 5 "diff " $line]} {
|
|
|
|
|
if {![regexp {^diff (--cc|--git) } $line m type]} {
|
|
|
|
|
set line [encoding convertfrom $line]
|
|
|
|
|
set line [encoding convertfrom utf-8 $line]
|
|
|
|
|
$ctext insert end "$line\n" hunksep
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
@ -8238,7 +8378,7 @@ proc parseblobdiffline {ids line} {
|
|
|
|
|
makediffhdr $fname $ids
|
|
|
|
|
|
|
|
|
|
} elseif {![string compare -length 16 "* Unmerged path " $line]} {
|
|
|
|
|
set fname [encoding convertfrom [string range $line 16 end]]
|
|
|
|
|
set fname [encoding convertfrom utf-8 [string range $line 16 end]]
|
|
|
|
|
$ctext insert end "\n"
|
|
|
|
|
set curdiffstart [$ctext index "end - 1c"]
|
|
|
|
|
lappend ctext_file_names $fname
|
|
|
|
@ -8291,7 +8431,7 @@ proc parseblobdiffline {ids line} {
|
|
|
|
|
if {[string index $fname 0] eq "\""} {
|
|
|
|
|
set fname [lindex $fname 0]
|
|
|
|
|
}
|
|
|
|
|
set fname [encoding convertfrom $fname]
|
|
|
|
|
set fname [encoding convertfrom utf-8 $fname]
|
|
|
|
|
set i [lsearch -exact $treediffs($ids) $fname]
|
|
|
|
|
if {$i >= 0} {
|
|
|
|
|
setinlist difffilestart $i $curdiffstart
|
|
|
|
@ -8310,6 +8450,7 @@ proc parseblobdiffline {ids line} {
|
|
|
|
|
set diffinhdr 0
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set line [encoding convertfrom utf-8 $line]
|
|
|
|
|
$ctext insert end "$line\n" filesep
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
@ -10068,7 +10209,7 @@ proc showrefs {} {
|
|
|
|
|
text $top.list -background $bgcolor -foreground $fgcolor \
|
|
|
|
|
-selectbackground $selectbgcolor -font mainfont \
|
|
|
|
|
-xscrollcommand "$top.xsb set" -yscrollcommand "$top.ysb set" \
|
|
|
|
|
-width 30 -height 20 -cursor $maincursor \
|
|
|
|
|
-width 60 -height 20 -cursor $maincursor \
|
|
|
|
|
-spacing1 1 -spacing3 1 -state disabled
|
|
|
|
|
$top.list tag configure highlight -background $selectbgcolor
|
|
|
|
|
if {![lsearch -exact $bglist $top.list]} {
|
|
|
|
@ -12305,7 +12446,7 @@ proc cache_gitattr {attr pathlist} {
|
|
|
|
|
foreach row [split $rlist "\n"] {
|
|
|
|
|
if {[regexp "(.*): $attr: (.*)" $row m path value]} {
|
|
|
|
|
if {[string index $path 0] eq "\""} {
|
|
|
|
|
set path [encoding convertfrom [lindex $path 0]]
|
|
|
|
|
set path [encoding convertfrom utf-8 [lindex $path 0]]
|
|
|
|
|
}
|
|
|
|
|
set path_attr_cache($attr,$path) $value
|
|
|
|
|
}
|
|
|
|
@ -12335,7 +12476,6 @@ if { [info exists ::env(GITK_MSGSDIR)] } {
|
|
|
|
|
set gitk_prefix [file dirname [file dirname [file normalize $argv0]]]
|
|
|
|
|
set gitk_libdir [file join $gitk_prefix share gitk lib]
|
|
|
|
|
set gitk_msgsdir [file join $gitk_libdir msgs]
|
|
|
|
|
unset gitk_prefix
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
## Internationalization (i18n) through msgcat and gettext. See
|
|
|
|
@ -12637,6 +12777,7 @@ set nullid2 "0000000000000000000000000000000000000001"
|
|
|
|
|
set nullfile "/dev/null"
|
|
|
|
|
|
|
|
|
|
set have_tk85 [expr {[package vcompare $tk_version "8.5"] >= 0}]
|
|
|
|
|
set have_tk86 [expr {[package vcompare $tk_version "8.6"] >= 0}]
|
|
|
|
|
if {![info exists have_ttk]} {
|
|
|
|
|
set have_ttk [llength [info commands ::ttk::style]]
|
|
|
|
|
}
|
|
|
|
@ -12701,28 +12842,32 @@ if {[expr {[exec git rev-parse --is-inside-work-tree] == "true"}]} {
|
|
|
|
|
set worktree [gitworktree]
|
|
|
|
|
setcoords
|
|
|
|
|
makewindow
|
|
|
|
|
catch {
|
|
|
|
|
image create photo gitlogo -width 16 -height 16
|
|
|
|
|
if {$::tcl_platform(platform) eq {windows} && [file exists $gitk_prefix/etc/git.ico]} {
|
|
|
|
|
wm iconbitmap . -default $gitk_prefix/etc/git.ico
|
|
|
|
|
} else {
|
|
|
|
|
catch {
|
|
|
|
|
image create photo gitlogo -width 16 -height 16
|
|
|
|
|
|
|
|
|
|
image create photo gitlogominus -width 4 -height 2
|
|
|
|
|
gitlogominus put #C00000 -to 0 0 4 2
|
|
|
|
|
gitlogo copy gitlogominus -to 1 5
|
|
|
|
|
gitlogo copy gitlogominus -to 6 5
|
|
|
|
|
gitlogo copy gitlogominus -to 11 5
|
|
|
|
|
image delete gitlogominus
|
|
|
|
|
image create photo gitlogominus -width 4 -height 2
|
|
|
|
|
gitlogominus put #C00000 -to 0 0 4 2
|
|
|
|
|
gitlogo copy gitlogominus -to 1 5
|
|
|
|
|
gitlogo copy gitlogominus -to 6 5
|
|
|
|
|
gitlogo copy gitlogominus -to 11 5
|
|
|
|
|
image delete gitlogominus
|
|
|
|
|
|
|
|
|
|
image create photo gitlogoplus -width 4 -height 4
|
|
|
|
|
gitlogoplus put #008000 -to 1 0 3 4
|
|
|
|
|
gitlogoplus put #008000 -to 0 1 4 3
|
|
|
|
|
gitlogo copy gitlogoplus -to 1 9
|
|
|
|
|
gitlogo copy gitlogoplus -to 6 9
|
|
|
|
|
gitlogo copy gitlogoplus -to 11 9
|
|
|
|
|
image delete gitlogoplus
|
|
|
|
|
image create photo gitlogoplus -width 4 -height 4
|
|
|
|
|
gitlogoplus put #008000 -to 1 0 3 4
|
|
|
|
|
gitlogoplus put #008000 -to 0 1 4 3
|
|
|
|
|
gitlogo copy gitlogoplus -to 1 9
|
|
|
|
|
gitlogo copy gitlogoplus -to 6 9
|
|
|
|
|
gitlogo copy gitlogoplus -to 11 9
|
|
|
|
|
image delete gitlogoplus
|
|
|
|
|
|
|
|
|
|
image create photo gitlogo32 -width 32 -height 32
|
|
|
|
|
gitlogo32 copy gitlogo -zoom 2 2
|
|
|
|
|
image create photo gitlogo32 -width 32 -height 32
|
|
|
|
|
gitlogo32 copy gitlogo -zoom 2 2
|
|
|
|
|
|
|
|
|
|
wm iconphoto . -default gitlogo gitlogo32
|
|
|
|
|
wm iconphoto . -default gitlogo gitlogo32
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
# wait for the window to become visible
|
|
|
|
|
if {![winfo viewable .]} {tkwait visibility .}
|
|
|
|
|