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:
Shawn O. Pearce 2007-02-12 22:48:56 -05:00
parent 022fef30fa
commit 8134722306

View File

@ -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.