Merge origin/main, fix test git init for modern git
This commit is contained in:
@@ -67,6 +67,49 @@ func ExtractPrefix(id string) string {
|
||||
return id[:idx+1] // Include the hyphen
|
||||
}
|
||||
|
||||
// ExtractProjectFromPath extracts the project name from a route path.
|
||||
// For "beads/mayor/rig", returns "beads".
|
||||
// For "gastown/crew/max", returns "gastown".
|
||||
func ExtractProjectFromPath(path string) string {
|
||||
// Get the first component of the path
|
||||
parts := strings.Split(path, "/")
|
||||
if len(parts) > 0 && parts[0] != "" {
|
||||
return parts[0]
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// ResolveToExternalRef attempts to convert a foreign issue ID to an external reference
|
||||
// using routes.jsonl for prefix-based routing.
|
||||
//
|
||||
// If the ID's prefix matches a route, returns "external:<project>:<id>".
|
||||
// Otherwise, returns empty string (no route found).
|
||||
//
|
||||
// Example: If routes.jsonl has {"prefix": "bd-", "path": "beads/mayor/rig"}
|
||||
// then ResolveToExternalRef("bd-abc", beadsDir) returns "external:beads:bd-abc"
|
||||
func ResolveToExternalRef(id, beadsDir string) string {
|
||||
routes, err := LoadRoutes(beadsDir)
|
||||
if err != nil || len(routes) == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
prefix := ExtractPrefix(id)
|
||||
if prefix == "" {
|
||||
return ""
|
||||
}
|
||||
|
||||
for _, route := range routes {
|
||||
if route.Prefix == prefix {
|
||||
project := ExtractProjectFromPath(route.Path)
|
||||
if project != "" {
|
||||
return fmt.Sprintf("external:%s:%s", project, id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// ResolveBeadsDirForID determines which beads directory contains the given issue ID.
|
||||
// It first checks the local beads directory, then consults routes.jsonl for prefix-based routing.
|
||||
//
|
||||
|
||||
@@ -88,3 +88,57 @@ func TestDetectUserRole_Fallback(t *testing.T) {
|
||||
t.Errorf("DetectUserRole() = %v, want %v (fallback)", role, Contributor)
|
||||
}
|
||||
}
|
||||
|
||||
func TestExtractPrefix(t *testing.T) {
|
||||
tests := []struct {
|
||||
id string
|
||||
want string
|
||||
}{
|
||||
{"gt-abc123", "gt-"},
|
||||
{"bd-xyz", "bd-"},
|
||||
{"hq-1234", "hq-"},
|
||||
{"abc123", ""}, // No hyphen
|
||||
{"", ""}, // Empty string
|
||||
{"-abc", "-"}, // Starts with hyphen
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.id, func(t *testing.T) {
|
||||
got := ExtractPrefix(tt.id)
|
||||
if got != tt.want {
|
||||
t.Errorf("ExtractPrefix(%q) = %q, want %q", tt.id, got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestExtractProjectFromPath(t *testing.T) {
|
||||
tests := []struct {
|
||||
path string
|
||||
want string
|
||||
}{
|
||||
{"beads/mayor/rig", "beads"},
|
||||
{"gastown/crew/max", "gastown"},
|
||||
{"simple", "simple"},
|
||||
{"", ""},
|
||||
{"/absolute/path", ""}, // Starts with /, first component is empty
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.path, func(t *testing.T) {
|
||||
got := ExtractProjectFromPath(tt.path)
|
||||
if got != tt.want {
|
||||
t.Errorf("ExtractProjectFromPath(%q) = %q, want %q", tt.path, got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestResolveToExternalRef(t *testing.T) {
|
||||
// This test is limited since it requires a routes.jsonl file
|
||||
// Just test that it returns empty string for nonexistent directory
|
||||
got := ResolveToExternalRef("bd-abc", "/nonexistent/path")
|
||||
if got != "" {
|
||||
t.Errorf("ResolveToExternalRef() = %q, want empty string for nonexistent path", got)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user