Files
Stefan HallerandClaude Opus 5 06b421ad0c Remember how to get back to a repo we entered a submodule from
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>
2026-08-08 11:15:01 +02:00

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)
}
}
}