mirror of
https://github.com/jesseduffield/lazygit.git
synced 2026-08-24 02:24:25 -05:00
Entering a submodule clears GIT_DIR and GIT_WORK_TREE, as it must: they say where the superproject is. But the stack we push the superproject onto so that escape brings us back only held its path, and for a repo opened with --git-dir/--work-tree the path leads nowhere — git can't find a repo there. Escaping out of a submodule of a dotfile repo failed with "not a git repository", or, if some unrelated repo happened to lie above the work tree, quietly switched to that one instead. Push the environment onto the stack along with the path, taken from the repo paths rather than from the process env, so that it also covers a repo we worked the location out for ourselves. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
61 lines
1.4 KiB
Go
61 lines
1.4 KiB
Go
package env
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// This package encapsulates accessing/mutating the ENV of the program.
|
|
|
|
// The variables with which git can be told where a repo is, rather than having
|
|
// it find out from the working directory.
|
|
const (
|
|
GitDirEnvVar = "GIT_DIR"
|
|
GitWorkTreeEnvVar = "GIT_WORK_TREE"
|
|
)
|
|
|
|
func GetGitDirEnv() string {
|
|
return os.Getenv(GitDirEnvVar)
|
|
}
|
|
|
|
func SetGitDirEnv(value string) {
|
|
os.Setenv(GitDirEnvVar, value)
|
|
}
|
|
|
|
func GetWorkTreeEnv() string {
|
|
return os.Getenv(GitWorkTreeEnvVar)
|
|
}
|
|
|
|
func SetWorkTreeEnv(value string) {
|
|
os.Setenv(GitWorkTreeEnvVar, value)
|
|
}
|
|
|
|
func UnsetGitLocationEnvVars() {
|
|
_ = os.Unsetenv(GitDirEnvVar)
|
|
_ = os.Unsetenv(GitWorkTreeEnvVar)
|
|
}
|
|
|
|
// GetGitLocationEnvVars returns the location variables that are set, as
|
|
// "NAME=value" entries.
|
|
func GetGitLocationEnvVars() []string {
|
|
envVars := []string{}
|
|
for _, name := range []string{GitDirEnvVar, GitWorkTreeEnvVar} {
|
|
if value := os.Getenv(name); value != "" {
|
|
envVars = append(envVars, name+"="+value)
|
|
}
|
|
}
|
|
return envVars
|
|
}
|
|
|
|
// SetGitLocationEnvVars sets the location variables from "NAME=value" entries,
|
|
// clearing both first so that only what is given remains. Passing nothing is
|
|
// how you say the repo is to be found from the working directory.
|
|
func SetGitLocationEnvVars(envVars []string) {
|
|
UnsetGitLocationEnvVars()
|
|
for _, envVar := range envVars {
|
|
if name, value, ok := strings.Cut(envVar, "="); ok {
|
|
os.Setenv(name, value)
|
|
}
|
|
}
|
|
}
|