Re: [PATCH v6 3/3] git-gui: handle GIT_DIR and GIT_WORK_TREE early
- From
Mark Levedahl <mlevedahl@gmail.com>
- Date
- May 7, 2026, 15:50 UTC
- Message-ID
- <54d3c28a-040e-470c-b061-8d3a1cfe4257@gmail.com>
- In-Reply-To
- <tencent_16BC933B6ECB562A74F4EE334828A2D23605@qq.com>
On 5/6/26 4:27 PM, Shroom Moo wrote:
Show 18 quoted lines
> +proc resolve_initial_environment {} {
> + global _gitdir env
> +
> + # Only act if both GIT_DIR and GIT_WORK_TREE are set
> + if {[info exists env(GIT_DIR)] && [info exists env(GIT_WORK_TREE)]} {
> + # Validate GIT_DIR by resolving its absolute path
> + if {[catch {set _abs [git rev-parse --absolute-git-dir]} err]} {
> + catch {wm withdraw .}
> + error_popup [strcat [mc "Invalid GIT_DIR:"] "\n\n$err"]
> + exit 1
> + }
> +
> + # Change current directory to GIT_WORK_TREE
> + if {[catch {cd $env(GIT_WORK_TREE)} err]} {
> + catch {wm withdraw .}
> + error_popup [strcat [mc "Cannot change to GIT_WORK_TREE:"] "\n\n$err"]
> + exit 1
> + }GIT_DIR could be relative to the startup directory. The absolute variant should be exported before the next step.
Show 15 quoted lines
> +
> + # Verify that GIT_WORK_TREE is a valid Git worktree
> + if {[catch {git rev-parse --show-toplevel} err]} {
> + catch {wm withdraw .}
> + error_popup [strcat [mc "GIT_WORK_TREE is not a valid worktree:"] "\n\n$err"]
> + exit 1
> + }
> +
> + # Use repository path specified by environment variables
> + set _gitdir $_abs
> + set ::_prefix {}
> +
> + # Unset GIT_WORK_TREE to prevent it from being inherited by child processes
> + unset env(GIT_WORK_TREE)
> +There are many places in the code that have pairs of set/unset env(GIT_DIR) & env(GIT_WORK_TREE). Now that we have cases where $_gitworktree == {} and we don't want that exported, and these are all unguarded.
Perhaps we need to create set/unset procs that do the right thing (setx assures GIT_WORK_TREE is not in the env when $_gitworktree == {}), unsetx does not thow and error when unset env(GIT_WORK_TREE) fails as the value doesn't exist, and invoke those common procs to instead.
Mark