@@ -13,133 +13,102 @@ package require Tk
1313# #
1414# # Enabling platform-specific code paths
1515
16- proc is_MacOSX {} {
17- if {[tk windowingsystem] eq {aqua}} {
18- return 1
19- }
20- return 0
21- }
22-
2316proc is_Windows {} {
24- if {$::tcl_platform(platform) eq {windows}} {
25- return 1
26- }
27- return 0
28- }
29-
30- set _iscygwin {}
31- proc is_Cygwin {} {
32- global _iscygwin
33- if {$_iscygwin eq {}} {
34- if {[string match " CYGWIN_*" $::tcl_platform(os) ]} {
35- set _iscygwin 1
36- } else {
37- set _iscygwin 0
38- }
39- }
40- return $_iscygwin
17+ if {$::tcl_platform(platform) eq {windows}} {
18+ return 1
19+ }
20+ return 0
4121}
4222
4323# #####################################################################
4424# #
4525# # PATH lookup
4626
47- set _search_path {}
48- proc _which {what args} {
49- global env _search_exe _search_path
50-
51- if {$_search_path eq {}} {
52- if {[is_Cygwin] && [regexp {^(/|\.:)} $env(PATH) ]} {
53- set _search_path [split [exec cygpath \
54- --windows \
55- --path \
56- --absolute \
57- $env(PATH) ] {;}]
58- set _search_exe .exe
59- } elseif {[is_Windows]} {
60- set gitguidir [file dirname [info script]]
61- regsub -all ";" $gitguidir "\\ ;" gitguidir
62- set env(PATH) " $gitguidir ;$env(PATH) "
63- set _search_path [ split $env(PATH) {;}]
64- # Skip empty `PATH` elements
65- set _search_path [ lsearch -all -inline -not -exact \
66- $_search_path " " ]
67- set _search_exe .exe
68- } else {
69- set _search_path [ split $env(PATH) :]
70- set _search_exe {}
71- }
72- }
73-
74- if {[ is_Windows] && [ lsearch -exact $args -script] >= 0} {
75- set suffix {}
76- } else {
77- set suffix $_search_exe
78- }
79-
80- foreach p $_search_path {
81- set p [ file join $p $what$suffix ]
82- if {[ file exists $p ] } {
83- return [ file normalize $p ]
84- }
85- }
86- return {}
87- }
88-
89- proc sanitize_command_line {command_line from_index} {
90- set i $from_index
91- while {$i < [ llength $command_line ] } {
92- set cmd [ lindex $command_line $i ]
93- if {[ file pathtype $cmd ] ne " absolute" } {
94- set fullpath [ _which $cmd ]
95- if {$fullpath eq " " } {
96- throw {NOT-FOUND} " $cmd not found in PATH"
97- }
98- lset command_line $i $fullpath
99- }
100-
101- # handle piped commands, e.g. `exec A | B`
102- for {incr i} {$i < [ llength $command_line ] } {incr i} {
103- if {[ lindex $command_line $i ] eq " |" } {
104- incr i
105- break
106- }
107- }
108- }
109- return $command_line
110- }
111-
112- # Override `exec` to avoid unsafe PATH lookup
113-
114- rename exec real_exec
115-
116- proc exec {args} {
117- # skip options
118- for {set i 0} {$i < [ llength $args ] } {incr i} {
119- set arg [ lindex $args $i ]
120- if {$arg eq " --" } {
121- incr i
122- break
123- }
124- if {[ string range $arg 0 0] ne " -" } {
125- break
126- }
127- }
128- set args [ sanitize_command_line $args $i ]
129- uplevel 1 real_exec $args
130- }
131-
132- # Override `open` to avoid unsafe PATH lookup
133-
134- rename open real_open
135-
136- proc open {args} {
137- set arg0 [ lindex $args 0]
138- if {[ string range $arg0 0 0] eq " |" } {
139- set command_line [ string trim [string range $arg0 1 end] ]
140- lset args 0 " | [sanitize_command_line $command_line 0]"
141- }
142- uplevel 1 real_open $args
27+ if {[is_Windows]} {
28+ set _search_path {}
29+ proc _which {what args} {
30+ global env _search_path
31+
32+ if {$_search_path eq {}} {
33+ set gitguidir [file dirname [info script]]
34+ regsub -all ";" $gitguidir "\\ ;" gitguidir
35+ set env(PATH) " $gitguidir ;$env(PATH) "
36+ set _search_path [ split $env(PATH) {;}]
37+ # Skip empty `PATH` elements
38+ set _search_path [ lsearch -all -inline -not -exact \
39+ $_search_path " " ]
40+ }
41+
42+ if {[ lsearch -exact $args -script] >= 0} {
43+ set suffix {}
44+ } else {
45+ set suffix .exe
46+ }
47+
48+ foreach p $_search_path {
49+ set p [ file join $p $what$suffix ]
50+ if {[ file exists $p ] } {
51+ return [ file normalize $p ]
52+ }
53+ }
54+ return {}
55+ }
56+
57+ proc sanitize_command_line {command_line from_index} {
58+ set i $from_index
59+ while {$i < [ llength $command_line ] } {
60+ set cmd [ lindex $command_line $i ]
61+ if {[ llength [file split $cmd ] ] < 2} {
62+ set fullpath [ _which $cmd ]
63+ if {$fullpath eq " " } {
64+ throw {NOT-FOUND} " $cmd not found in PATH"
65+ }
66+ lset command_line $i $fullpath
67+ }
68+
69+ # handle piped commands, e.g. `exec A | B`
70+ for {incr i} {$i < [ llength $command_line ] } {incr i} {
71+ if {[ lindex $command_line $i ] eq " |" } {
72+ incr i
73+ break
74+ }
75+ }
76+ }
77+ return $command_line
78+ }
79+
80+ # Override `exec` to avoid unsafe PATH lookup
81+
82+ rename exec real_exec
83+
84+ proc exec {args} {
85+ # skip options
86+ for {set i 0} {$i < [ llength $args ] } {incr i} {
87+ set arg [ lindex $args $i ]
88+ if {$arg eq " --" } {
89+ incr i
90+ break
91+ }
92+ if {[ string range $arg 0 0] ne " -" } {
93+ break
94+ }
95+ }
96+ set args [ sanitize_command_line $args $i ]
97+ uplevel 1 real_exec $args
98+ }
99+
100+ # Override `open` to avoid unsafe PATH lookup
101+
102+ rename open real_open
103+
104+ proc open {args} {
105+ set arg0 [ lindex $args 0]
106+ if {[ string range $arg0 0 0] eq " |" } {
107+ set command_line [ string trim [string range $arg0 1 end] ]
108+ lset args 0 " | [sanitize_command_line $command_line 0]"
109+ }
110+ uplevel 1 real_open $args
111+ }
143112}
144113
145114# End of safe PATH lookup stuff
@@ -491,11 +460,11 @@ proc parseviewrevs {view revs} {
491460# Escapes a list of filter paths to be passed to git log via stdin. Note that
492461# paths must not be quoted.
493462proc escape_filter_paths {paths} {
494- set escaped [ list ]
495- foreach path $paths {
496- lappend escaped [ string map {\\ \\\\ " \ " " \\\ " } $path ]
497- }
498- return $escaped
463+ set escaped [ list ]
464+ foreach path $paths {
465+ lappend escaped [ string map {\\ \\\\ " \ " " \\\ " } $path ]
466+ }
467+ return $escaped
499468}
500469
501470# Start off a git log process and arrange to read its output
@@ -4632,7 +4601,7 @@ proc addviewmenu {n} {
46324601 .bar.view add radiobutton -label $viewname($n) \
46334602 -command [ list showview $n ] -variable selectedview -value $n
46344603 #$viewhlmenu add radiobutton -label $viewname($n) \
4635- # -command [ list addvhighlight $n ] -variable selectedhlview
4604+ # -command [ list addvhighlight $n ] -variable selectedhlview
46364605}
46374606
46384607proc showview {n} {
0 commit comments