git-gui: handle non-standard worktree locations
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>
This commit is contained in:
parent
ff07c3b621
commit
21985a1136
35
git-gui.sh
35
git-gui.sh
@ -121,6 +121,7 @@ unset oguimsg
|
|||||||
|
|
||||||
set _appname {Git Gui}
|
set _appname {Git Gui}
|
||||||
set _gitdir {}
|
set _gitdir {}
|
||||||
|
set _gitworktree {}
|
||||||
set _gitexec {}
|
set _gitexec {}
|
||||||
set _githtmldir {}
|
set _githtmldir {}
|
||||||
set _reponame {}
|
set _reponame {}
|
||||||
@ -1100,13 +1101,25 @@ if {![file isdirectory $_gitdir]} {
|
|||||||
error_popup [strcat [mc "Git directory not found:"] "\n\n$_gitdir"]
|
error_popup [strcat [mc "Git directory not found:"] "\n\n$_gitdir"]
|
||||||
exit 1
|
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 {}} {
|
if {$_prefix ne {}} {
|
||||||
|
if {$_gitworktree eq {}} {
|
||||||
regsub -all {[^/]+/} $_prefix ../ cdup
|
regsub -all {[^/]+/} $_prefix ../ cdup
|
||||||
|
} else {
|
||||||
|
set cdup $_gitworktree
|
||||||
|
}
|
||||||
if {[catch {cd $cdup} err]} {
|
if {[catch {cd $cdup} err]} {
|
||||||
catch {wm withdraw .}
|
catch {wm withdraw .}
|
||||||
error_popup [strcat [mc "Cannot move to top of working directory:"] "\n\n$err"]
|
error_popup [strcat [mc "Cannot move to top of working directory:"] "\n\n$err"]
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
set _gitworktree [pwd]
|
||||||
unset cdup
|
unset cdup
|
||||||
} elseif {![is_enabled bare]} {
|
} elseif {![is_enabled bare]} {
|
||||||
if {[lindex [file split $_gitdir] end] ne {.git}} {
|
if {[lindex [file split $_gitdir] end] ne {.git}} {
|
||||||
@ -1114,11 +1127,15 @@ if {$_prefix ne {}} {
|
|||||||
error_popup [strcat [mc "Cannot use funny .git directory:"] "\n\n$_gitdir"]
|
error_popup [strcat [mc "Cannot use funny .git directory:"] "\n\n$_gitdir"]
|
||||||
exit 1
|
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 .}
|
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
|
exit 1
|
||||||
}
|
}
|
||||||
|
set _gitworktree [pwd]
|
||||||
}
|
}
|
||||||
set _reponame [file split [file normalize $_gitdir]]
|
set _reponame [file split [file normalize $_gitdir]]
|
||||||
if {[lindex $_reponame end] eq {.git}} {
|
if {[lindex $_reponame end] eq {.git}} {
|
||||||
@ -1935,6 +1952,7 @@ set starting_gitk_msg [mc "Starting gitk... please wait..."]
|
|||||||
|
|
||||||
proc do_gitk {revs {is_submodule false}} {
|
proc do_gitk {revs {is_submodule false}} {
|
||||||
global current_diff_path file_states current_diff_side ui_index
|
global current_diff_path file_states current_diff_side ui_index
|
||||||
|
global _gitworktree
|
||||||
|
|
||||||
# -- Always start gitk through whatever we were loaded with. This
|
# -- Always start gitk through whatever we were loaded with. This
|
||||||
# lets us bypass using shell process on Windows systems.
|
# lets us bypass using shell process on Windows systems.
|
||||||
@ -1955,8 +1973,10 @@ proc do_gitk {revs {is_submodule false}} {
|
|||||||
set pwd [pwd]
|
set pwd [pwd]
|
||||||
|
|
||||||
if {!$is_submodule} {
|
if {!$is_submodule} {
|
||||||
cd [file dirname [gitdir]]
|
if {$_gitworktree ne {}} {
|
||||||
set env(GIT_DIR) [file tail [gitdir]]
|
cd $_gitworktree
|
||||||
|
}
|
||||||
|
set env(GIT_DIR) [file normalize [gitdir]]
|
||||||
} else {
|
} else {
|
||||||
cd $current_diff_path
|
cd $current_diff_path
|
||||||
if {$revs eq {--}} {
|
if {$revs eq {--}} {
|
||||||
@ -2032,6 +2052,7 @@ proc do_git_gui {} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
proc do_explore {} {
|
proc do_explore {} {
|
||||||
|
global _gitworktree
|
||||||
set explorer {}
|
set explorer {}
|
||||||
if {[is_Cygwin] || [is_Windows]} {
|
if {[is_Cygwin] || [is_Windows]} {
|
||||||
set explorer "explorer.exe"
|
set explorer "explorer.exe"
|
||||||
@ -2041,7 +2062,7 @@ proc do_explore {} {
|
|||||||
# freedesktop.org-conforming system is our best shot
|
# freedesktop.org-conforming system is our best shot
|
||||||
set explorer "xdg-open"
|
set explorer "xdg-open"
|
||||||
}
|
}
|
||||||
eval exec $explorer [list [file nativename [file dirname [gitdir]]]] &
|
eval exec $explorer $_gitworktree &
|
||||||
}
|
}
|
||||||
|
|
||||||
set is_quitting 0
|
set is_quitting 0
|
||||||
@ -2405,8 +2426,6 @@ proc show_less_context {} {
|
|||||||
##
|
##
|
||||||
## ui construction
|
## ui construction
|
||||||
|
|
||||||
load_config 0
|
|
||||||
apply_config
|
|
||||||
set ui_comm {}
|
set ui_comm {}
|
||||||
|
|
||||||
# -- Menu Bar
|
# -- Menu Bar
|
||||||
@ -3492,7 +3511,7 @@ unset i
|
|||||||
set file_lists($ui_index) [list]
|
set file_lists($ui_index) [list]
|
||||||
set file_lists($ui_workdir) [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
|
focus -force $ui_comm
|
||||||
|
|
||||||
# -- Warn the user about environmental problems. Cygwin's Tcl
|
# -- Warn the user about environmental problems. Cygwin's Tcl
|
||||||
|
Loading…
x
Reference in New Issue
Block a user