Skip to content

Commit

Permalink
git-gui: handle non-standard worktree locations
Browse files Browse the repository at this point in the history
Don't rely on the git worktree being the updir of the gitdir, since it
might not be. Instead, define (and use) a new _gitworktree global
variable, setting it to $GIT_WORK_TREE if present, falling back to
core.worktree if defined, and finally to whatever we guess the correct
worktree is. Getting core.worktree requires the config from the alleged
git dir _gitdir to be loaded early.

Supporting non-standard worktree locations also breaks the git-gui
assumption (made when calling gitk) that the worktree was the dirname of
$_gitdir and that, by consequence, the git dir could be set to the tail
of $_gitdir once we changed to the worktree root directory. Therefore,
we need to export a GIT_DIR environment variable set to the full,
normalized path of $_gitdir instead. We also skip changing to the worktree
directory if it's empty (i.e. if we're working on a bare repository).

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
  • Loading branch information
Giuseppe Bilotta authored and Shawn O. Pearce committed Jan 23, 2010
1 parent ff07c3b commit 21985a1
Showing 1 changed file with 28 additions and 9 deletions.
37 changes: 28 additions & 9 deletions git-gui.sh
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ unset oguimsg

set _appname {Git Gui}
set _gitdir {}
set _gitworktree {}
set _gitexec {}
set _githtmldir {}
set _reponame {}
Expand Down Expand Up @@ -1100,25 +1101,41 @@ if {![file isdirectory $_gitdir]} {
error_popup [strcat [mc "Git directory not found:"] "\n\n$_gitdir"]
exit 1
}
# _gitdir exists, so try loading the config
load_config 0
apply_config
# try to set work tree from environment, falling back to core.worktree
if {[catch { set _gitworktree $env(GIT_WORK_TREE) }]} {
set _gitworktree [get_config core.worktree]
}
if {$_prefix ne {}} {
regsub -all {[^/]+/} $_prefix ../ cdup
if {$_gitworktree eq {}} {
regsub -all {[^/]+/} $_prefix ../ cdup
} else {
set cdup $_gitworktree
}
if {[catch {cd $cdup} err]} {
catch {wm withdraw .}
error_popup [strcat [mc "Cannot move to top of working directory:"] "\n\n$err"]
exit 1
}
set _gitworktree [pwd]
unset cdup
} elseif {![is_enabled bare]} {
if {[lindex [file split $_gitdir] end] ne {.git}} {
catch {wm withdraw .}
error_popup [strcat [mc "Cannot use funny .git directory:"] "\n\n$_gitdir"]
exit 1
}
if {[catch {cd [file dirname $_gitdir]} err]} {
if {$_gitworktree eq {}} {
set _gitworktree [file dirname $_gitdir]
}
if {[catch {cd $_gitworktree} err]} {
catch {wm withdraw .}
error_popup [strcat [mc "No working directory"] " [file dirname $_gitdir]:\n\n$err"]
error_popup [strcat [mc "No working directory"] " $_gitworktree:\n\n$err"]
exit 1
}
set _gitworktree [pwd]
}
set _reponame [file split [file normalize $_gitdir]]
if {[lindex $_reponame end] eq {.git}} {
Expand Down Expand Up @@ -1935,6 +1952,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
# -- Always start gitk through whatever we were loaded with. This
# lets us bypass using shell process on Windows systems.
Expand All @@ -1955,8 +1973,10 @@ proc do_gitk {revs {is_submodule false}} {
set pwd [pwd]
if {!$is_submodule} {
cd [file dirname [gitdir]]
set env(GIT_DIR) [file tail [gitdir]]
if {$_gitworktree ne {}} {
cd $_gitworktree
}
set env(GIT_DIR) [file normalize [gitdir]]
} else {
cd $current_diff_path
if {$revs eq {--}} {
Expand Down Expand Up @@ -2032,6 +2052,7 @@ proc do_git_gui {} {
}
proc do_explore {} {
global _gitworktree
set explorer {}
if {[is_Cygwin] || [is_Windows]} {
set explorer "explorer.exe"
Expand All @@ -2041,7 +2062,7 @@ proc do_explore {} {
# freedesktop.org-conforming system is our best shot
set explorer "xdg-open"
}
eval exec $explorer [list [file nativename [file dirname [gitdir]]]] &
eval exec $explorer $_gitworktree &
}
set is_quitting 0
Expand Down Expand Up @@ -2405,8 +2426,6 @@ proc show_less_context {} {
##
## ui construction
load_config 0
apply_config
set ui_comm {}
# -- Menu Bar
Expand Down Expand Up @@ -3492,7 +3511,7 @@ unset i
set file_lists($ui_index) [list]
set file_lists($ui_workdir) [list]
wm title . "[appname] ([reponame]) [file normalize [file dirname [gitdir]]]"
wm title . "[appname] ([reponame]) [file normalize $_gitworktree]"
focus -force $ui_comm
# -- Warn the user about environmental problems. Cygwin's Tcl
Expand Down

0 comments on commit 21985a1

Please sign in to comment.