feat: support ~ (tilde) expansion in match_dirs paths
Some checks are pending
CI / lint (push) Waiting to run
CI / build (push) Waiting to run
CI / test (push) Waiting to run
CI / functional (push) Blocked by required conditions

This commit is contained in:
sid 2026-03-23 12:50:49 -06:00
parent c293e233d2
commit ac780231a8
2 changed files with 66 additions and 0 deletions

View file

@ -151,6 +151,8 @@ func (c *Config) ResolveHostByPath(cwd string) string {
if dir == "" { if dir == "" {
continue continue
} }
// Expand ~ to home directory
dir = expandHome(dir)
// Resolve symlinks in the configured dir as well // Resolve symlinks in the configured dir as well
if resolved, err := filepath.EvalSymlinks(dir); err == nil { if resolved, err := filepath.EvalSymlinks(dir); err == nil {
dir = resolved dir = resolved
@ -173,6 +175,18 @@ func (c *Config) ResolveHostByPath(cwd string) string {
return bestHost return bestHost
} }
// expandHome replaces a leading ~ with the user's home directory.
func expandHome(path string) string {
if path == "~" || strings.HasPrefix(path, "~/") {
home, err := os.UserHomeDir()
if err != nil {
return path
}
return filepath.Join(home, path[1:])
}
return path
}
func (c *Config) SetHost(hostname string, host HostConfig) { func (c *Config) SetHost(hostname string, host HostConfig) {
if c.Hosts == nil { if c.Hosts == nil {
c.Hosts = make(map[string]HostConfig) c.Hosts = make(map[string]HostConfig)

View file

@ -539,3 +539,55 @@ func TestGetHost_MatchDirsIntegration(t *testing.T) {
t.Errorf("expected codeberg.org, got %s", host.Hostname) t.Errorf("expected codeberg.org, got %s", host.Hostname)
} }
} }
func TestResolveHostByPath_TildeExpansion(t *testing.T) {
home, err := os.UserHomeDir()
if err != nil {
t.Skip("cannot determine home directory")
}
cfg := &Config{
Hosts: map[string]HostConfig{
"tilde.org": {
Hostname: "tilde.org",
Token: "t1",
MatchDirs: []string{"~/repos"},
},
},
}
got := cfg.ResolveHostByPath(filepath.Join(home, "repos", "myproject"))
if got != "tilde.org" {
t.Errorf("expected tilde.org, got %q", got)
}
got = cfg.ResolveHostByPath(filepath.Join(home, "other"))
if got != "" {
t.Errorf("expected empty, got %q", got)
}
}
func TestExpandHome(t *testing.T) {
home, err := os.UserHomeDir()
if err != nil {
t.Skip("cannot determine home directory")
}
tests := []struct {
input string
want string
}{
{"~/repos", filepath.Join(home, "repos")},
{"~", home},
{"/absolute/path", "/absolute/path"},
{"relative/path", "relative/path"},
{"~other", "~other"}, // only ~/... is expanded, not ~user
}
for _, tt := range tests {
got := expandHome(tt.input)
if got != tt.want {
t.Errorf("expandHome(%q) = %q, want %q", tt.input, got, tt.want)
}
}
}