git-gui: Refactor 'exec git subcmd' idiom.
As we frequently need to execute a Git subcommand and obtain its returned output we are making heavy use of [exec git foo] to run foo. As I'm concerned about possibly needing to carry environment data through a shell on Cygwin for at least some subcommands, I'm migrating all current calls to a new git proc. This actually makes the code look cleaner too, as we aren't saying 'exec git' everywhere. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
022fef30fa
commit
8134722306
54
git-gui.sh
54
git-gui.sh
@ -46,7 +46,7 @@ proc gitdir {args} {
|
|||||||
proc gitexec {args} {
|
proc gitexec {args} {
|
||||||
global _gitexec
|
global _gitexec
|
||||||
if {$_gitexec eq {}} {
|
if {$_gitexec eq {}} {
|
||||||
if {[catch {set _gitexec [exec git --exec-path]} err]} {
|
if {[catch {set _gitexec [git --exec-path]} err]} {
|
||||||
error "Git not installed?\n\n$err"
|
error "Git not installed?\n\n$err"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -202,14 +202,14 @@ proc save_config {} {
|
|||||||
set value $global_config_new($name)
|
set value $global_config_new($name)
|
||||||
if {$value ne $global_config($name)} {
|
if {$value ne $global_config($name)} {
|
||||||
if {$value eq $default_config($name)} {
|
if {$value eq $default_config($name)} {
|
||||||
catch {exec git config --global --unset $name}
|
catch {git config --global --unset $name}
|
||||||
} else {
|
} else {
|
||||||
regsub -all "\[{}\]" $value {"} value
|
regsub -all "\[{}\]" $value {"} value
|
||||||
exec git config --global $name $value
|
git config --global $name $value
|
||||||
}
|
}
|
||||||
set global_config($name) $value
|
set global_config($name) $value
|
||||||
if {$value eq $repo_config($name)} {
|
if {$value eq $repo_config($name)} {
|
||||||
catch {exec git config --unset $name}
|
catch {git config --unset $name}
|
||||||
set repo_config($name) $value
|
set repo_config($name) $value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -219,16 +219,24 @@ proc save_config {} {
|
|||||||
set value $repo_config_new($name)
|
set value $repo_config_new($name)
|
||||||
if {$value ne $repo_config($name)} {
|
if {$value ne $repo_config($name)} {
|
||||||
if {$value eq $global_config($name)} {
|
if {$value eq $global_config($name)} {
|
||||||
catch {exec git config --unset $name}
|
catch {git config --unset $name}
|
||||||
} else {
|
} else {
|
||||||
regsub -all "\[{}\]" $value {"} value
|
regsub -all "\[{}\]" $value {"} value
|
||||||
exec git config $name $value
|
git config $name $value
|
||||||
}
|
}
|
||||||
set repo_config($name) $value
|
set repo_config($name) $value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
##
|
||||||
|
## handy utils
|
||||||
|
|
||||||
|
proc git {args} {
|
||||||
|
return [eval exec git $args]
|
||||||
|
}
|
||||||
|
|
||||||
proc error_popup {msg} {
|
proc error_popup {msg} {
|
||||||
set title [appname]
|
set title [appname]
|
||||||
if {[reponame] ne {}} {
|
if {[reponame] ne {}} {
|
||||||
@ -292,7 +300,7 @@ proc ask_popup {msg} {
|
|||||||
## repository setup
|
## repository setup
|
||||||
|
|
||||||
if { [catch {set _gitdir $env(GIT_DIR)}]
|
if { [catch {set _gitdir $env(GIT_DIR)}]
|
||||||
&& [catch {set _gitdir [exec git rev-parse --git-dir]} err]} {
|
&& [catch {set _gitdir [git rev-parse --git-dir]} err]} {
|
||||||
catch {wm withdraw .}
|
catch {wm withdraw .}
|
||||||
error_popup "Cannot find the git directory:\n\n$err"
|
error_popup "Cannot find the git directory:\n\n$err"
|
||||||
exit 1
|
exit 1
|
||||||
@ -365,7 +373,7 @@ proc repository_state {ctvar hdvar mhvar} {
|
|||||||
|
|
||||||
set mh [list]
|
set mh [list]
|
||||||
|
|
||||||
if {[catch {set current_branch [exec git symbolic-ref HEAD]}]} {
|
if {[catch {set current_branch [git symbolic-ref HEAD]}]} {
|
||||||
set current_branch {}
|
set current_branch {}
|
||||||
} else {
|
} else {
|
||||||
regsub ^refs/((heads|tags|remotes)/)? \
|
regsub ^refs/((heads|tags|remotes)/)? \
|
||||||
@ -374,7 +382,7 @@ proc repository_state {ctvar hdvar mhvar} {
|
|||||||
current_branch
|
current_branch
|
||||||
}
|
}
|
||||||
|
|
||||||
if {[catch {set hd [exec git rev-parse --verify HEAD]}]} {
|
if {[catch {set hd [git rev-parse --verify HEAD]}]} {
|
||||||
set hd {}
|
set hd {}
|
||||||
set ct initial
|
set ct initial
|
||||||
return
|
return
|
||||||
@ -402,7 +410,7 @@ proc PARENT {} {
|
|||||||
return $p
|
return $p
|
||||||
}
|
}
|
||||||
if {$empty_tree eq {}} {
|
if {$empty_tree eq {}} {
|
||||||
set empty_tree [exec git mktree << {}]
|
set empty_tree [git mktree << {}]
|
||||||
}
|
}
|
||||||
return $empty_tree
|
return $empty_tree
|
||||||
}
|
}
|
||||||
@ -1042,7 +1050,7 @@ proc committer_ident {} {
|
|||||||
global GIT_COMMITTER_IDENT
|
global GIT_COMMITTER_IDENT
|
||||||
|
|
||||||
if {$GIT_COMMITTER_IDENT eq {}} {
|
if {$GIT_COMMITTER_IDENT eq {}} {
|
||||||
if {[catch {set me [exec git var GIT_COMMITTER_IDENT]} err]} {
|
if {[catch {set me [git var GIT_COMMITTER_IDENT]} err]} {
|
||||||
error_popup "Unable to obtain your identity:\n\n$err"
|
error_popup "Unable to obtain your identity:\n\n$err"
|
||||||
return {}
|
return {}
|
||||||
}
|
}
|
||||||
@ -1275,7 +1283,7 @@ proc commit_committree {fd_wt curHEAD msg} {
|
|||||||
# -- Let rerere do its thing.
|
# -- Let rerere do its thing.
|
||||||
#
|
#
|
||||||
if {[file isdirectory [gitdir rr-cache]]} {
|
if {[file isdirectory [gitdir rr-cache]]} {
|
||||||
catch {exec git rerere}
|
catch {git rerere}
|
||||||
}
|
}
|
||||||
|
|
||||||
# -- Run the post-commit hook.
|
# -- Run the post-commit hook.
|
||||||
@ -1894,7 +1902,7 @@ proc do_create_branch_action {w} {
|
|||||||
focus $w.desc.name_t
|
focus $w.desc.name_t
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if {![catch {exec git show-ref --verify -- "refs/heads/$newbranch"}]} {
|
if {![catch {git show-ref --verify -- "refs/heads/$newbranch"}]} {
|
||||||
tk_messageBox \
|
tk_messageBox \
|
||||||
-icon error \
|
-icon error \
|
||||||
-type ok \
|
-type ok \
|
||||||
@ -1904,7 +1912,7 @@ proc do_create_branch_action {w} {
|
|||||||
focus $w.desc.name_t
|
focus $w.desc.name_t
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if {[catch {exec git check-ref-format "heads/$newbranch"}]} {
|
if {[catch {git check-ref-format "heads/$newbranch"}]} {
|
||||||
tk_messageBox \
|
tk_messageBox \
|
||||||
-icon error \
|
-icon error \
|
||||||
-type ok \
|
-type ok \
|
||||||
@ -1921,7 +1929,7 @@ proc do_create_branch_action {w} {
|
|||||||
tracking {set rev $create_branch_trackinghead}
|
tracking {set rev $create_branch_trackinghead}
|
||||||
expression {set rev $create_branch_revexp}
|
expression {set rev $create_branch_revexp}
|
||||||
}
|
}
|
||||||
if {[catch {set cmt [exec git rev-parse --verify "${rev}^0"]}]} {
|
if {[catch {set cmt [git rev-parse --verify "${rev}^0"]}]} {
|
||||||
tk_messageBox \
|
tk_messageBox \
|
||||||
-icon error \
|
-icon error \
|
||||||
-type ok \
|
-type ok \
|
||||||
@ -2100,7 +2108,7 @@ proc do_delete_branch_action {w} {
|
|||||||
}
|
}
|
||||||
if {$check_rev eq {:none}} {
|
if {$check_rev eq {:none}} {
|
||||||
set check_cmt {}
|
set check_cmt {}
|
||||||
} elseif {[catch {set check_cmt [exec git rev-parse --verify "${check_rev}^0"]}]} {
|
} elseif {[catch {set check_cmt [git rev-parse --verify "${check_rev}^0"]}]} {
|
||||||
tk_messageBox \
|
tk_messageBox \
|
||||||
-icon error \
|
-icon error \
|
||||||
-type ok \
|
-type ok \
|
||||||
@ -2114,10 +2122,10 @@ proc do_delete_branch_action {w} {
|
|||||||
set not_merged [list]
|
set not_merged [list]
|
||||||
foreach i [$w.list.l curselection] {
|
foreach i [$w.list.l curselection] {
|
||||||
set b [$w.list.l get $i]
|
set b [$w.list.l get $i]
|
||||||
if {[catch {set o [exec git rev-parse --verify $b]}]} continue
|
if {[catch {set o [git rev-parse --verify $b]}]} continue
|
||||||
if {$check_cmt ne {}} {
|
if {$check_cmt ne {}} {
|
||||||
if {$b eq $check_rev} continue
|
if {$b eq $check_rev} continue
|
||||||
if {[catch {set m [exec git merge-base $o $check_cmt]}]} continue
|
if {[catch {set m [git merge-base $o $check_cmt]}]} continue
|
||||||
if {$o ne $m} {
|
if {$o ne $m} {
|
||||||
lappend not_merged $b
|
lappend not_merged $b
|
||||||
continue
|
continue
|
||||||
@ -2155,7 +2163,7 @@ Delete the selected branches?}
|
|||||||
foreach i $to_delete {
|
foreach i $to_delete {
|
||||||
set b [lindex $i 0]
|
set b [lindex $i 0]
|
||||||
set o [lindex $i 1]
|
set o [lindex $i 1]
|
||||||
if {[catch {exec git update-ref -d "refs/heads/$b" $o} err]} {
|
if {[catch {git update-ref -d "refs/heads/$b" $o} err]} {
|
||||||
append failed " - $b: $err\n"
|
append failed " - $b: $err\n"
|
||||||
} else {
|
} else {
|
||||||
set x [lsearch -sorted -exact $all_heads $b]
|
set x [lsearch -sorted -exact $all_heads $b]
|
||||||
@ -2366,7 +2374,7 @@ Staying on branch '$current_branch'."
|
|||||||
# here, it Just Works(tm). If it doesn't we are in some really ugly
|
# here, it Just Works(tm). If it doesn't we are in some really ugly
|
||||||
# state that is difficult to recover from within git-gui.
|
# state that is difficult to recover from within git-gui.
|
||||||
#
|
#
|
||||||
if {[catch {exec git symbolic-ref HEAD "refs/heads/$new_branch"} err]} {
|
if {[catch {git symbolic-ref HEAD "refs/heads/$new_branch"} err]} {
|
||||||
error_popup "Failed to set current branch.
|
error_popup "Failed to set current branch.
|
||||||
|
|
||||||
This working directory is only partially switched.
|
This working directory is only partially switched.
|
||||||
@ -4161,7 +4169,7 @@ proc do_quit {} {
|
|||||||
set rc_geometry {}
|
set rc_geometry {}
|
||||||
}
|
}
|
||||||
if {$cfg_geometry ne $rc_geometry} {
|
if {$cfg_geometry ne $rc_geometry} {
|
||||||
catch {exec git config gui.geometry $cfg_geometry}
|
catch {git config gui.geometry $cfg_geometry}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4412,7 +4420,7 @@ $copyright" \
|
|||||||
|
|
||||||
set v {}
|
set v {}
|
||||||
append v "[appname] version $appvers\n"
|
append v "[appname] version $appvers\n"
|
||||||
append v "[exec git version]\n"
|
append v "[git version]\n"
|
||||||
append v "\n"
|
append v "\n"
|
||||||
if {$tcl_patchLevel eq $tk_patchLevel} {
|
if {$tcl_patchLevel eq $tk_patchLevel} {
|
||||||
append v "Tcl/Tk version $tcl_patchLevel"
|
append v "Tcl/Tk version $tcl_patchLevel"
|
||||||
@ -5904,7 +5912,7 @@ if {[is_enabled transport]} {
|
|||||||
if {[is_enabled multicommit]} {
|
if {[is_enabled multicommit]} {
|
||||||
set object_limit 2000
|
set object_limit 2000
|
||||||
if {[is_Windows]} {set object_limit 200}
|
if {[is_Windows]} {set object_limit 200}
|
||||||
regexp {^([0-9]+) objects,} [exec git count-objects] _junk objects_current
|
regexp {^([0-9]+) objects,} [git count-objects] _junk objects_current
|
||||||
if {$objects_current >= $object_limit} {
|
if {$objects_current >= $object_limit} {
|
||||||
if {[ask_popup \
|
if {[ask_popup \
|
||||||
"This repository currently has $objects_current loose objects.
|
"This repository currently has $objects_current loose objects.
|
||||||
|
Loading…
Reference in New Issue
Block a user