git-gui: set GIT_DIR and GIT_WORK_TREE after setup
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Sat, 23 Jan 2010 23:59:00 +0000 (00:59 +0100)
committerShawn O. Pearce <spearce@spearce.org>
Sun, 24 Jan 2010 00:02:16 +0000 (16:02 -0800)
Rather than juggling with the env var GIT_DIR around the invocation of
gitk, set it and GIT_WORK_TREE after finishing setup, ensuring that any
external tool works with the setup we're running with.

This also allows us to remove a couple of conditionals when running gitk
or git gui in a submodule, as we know that the variables are present and
have to be unset and reset before and after the invocation.

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
git-gui.sh

index 5d399555e6f43b1b9d622a486cf6def6b7ae24ac..81143c71b4342016aff786692e83af00c390395f 100755 (executable)
@@ -1171,6 +1171,9 @@ if {[lindex $_reponame end] eq {.git}} {
        set _reponame [lindex $_reponame end]
 }
 
+set env(GIT_DIR) $_gitdir
+set env(GIT_WORK_TREE) $_gitworktree
+
 ######################################################################
 ##
 ## global init
@@ -1979,7 +1982,7 @@ set starting_gitk_msg [mc "Starting gitk... please wait..."]
 
 proc do_gitk {revs {is_submodule false}} {
        global current_diff_path file_states current_diff_side ui_index
-       global _gitworktree
+       global _gitdir _gitworktree
 
        # -- Always start gitk through whatever we were loaded with.  This
        #    lets us bypass using shell process on Windows systems.
@@ -1991,19 +1994,12 @@ proc do_gitk {revs {is_submodule false}} {
        } else {
                global env
 
-               if {[info exists env(GIT_DIR)]} {
-                       set old_GIT_DIR $env(GIT_DIR)
-               } else {
-                       set old_GIT_DIR {}
-               }
-
                set pwd [pwd]
 
                if {!$is_submodule} {
                        if {![is_bare]} {
                                cd $_gitworktree
                        }
-                       set env(GIT_DIR) [file normalize [gitdir]]
                } else {
                        cd $current_diff_path
                        if {$revs eq {--}} {
@@ -2024,15 +2020,18 @@ proc do_gitk {revs {is_submodule false}} {
                                }
                                set revs $old_sha1...$new_sha1
                        }
-                       if {[info exists env(GIT_DIR)]} {
-                               unset env(GIT_DIR)
-                       }
+                       # GIT_DIR and GIT_WORK_TREE for the submodule are not the ones
+                       # we've been using for the main repository, so unset them.
+                       # TODO we could make life easier (start up faster?) for gitk
+                       # by setting these to the appropriate values to allow gitk
+                       # to skip the heuristics to find their proper value
+                       unset env(GIT_DIR)
+                       unset env(GIT_WORK_TREE)
                }
                eval exec $cmd $revs "--" "--" &
 
-               if {$old_GIT_DIR ne {}} {
-                       set env(GIT_DIR) $old_GIT_DIR
-               }
+               set env(GIT_DIR) $_gitdir
+               set env(GIT_WORK_TREE) $_gitworktree
                cd $pwd
 
                ui_status $::starting_gitk_msg
@@ -2053,22 +2052,20 @@ proc do_git_gui {} {
                error_popup [mc "Couldn't find git gui in PATH"]
        } else {
                global env
+               global _gitdir _gitworktree
 
-               if {[info exists env(GIT_DIR)]} {
-                       set old_GIT_DIR $env(GIT_DIR)
-                       unset env(GIT_DIR)
-               } else {
-                       set old_GIT_DIR {}
-               }
+               # see note in do_gitk about unsetting these vars when
+               # running tools in a submodule
+               unset env(GIT_DIR)
+               unset env(GIT_WORK_TREE)
 
                set pwd [pwd]
                cd $current_diff_path
 
                eval exec $exe gui &
 
-               if {$old_GIT_DIR ne {}} {
-                       set env(GIT_DIR) $old_GIT_DIR
-               }
+               set env(GIT_DIR) $_gitdir
+               set env(GIT_WORK_TREE) $_gitworktree
                cd $pwd
 
                ui_status $::starting_gitk_msg