Normalized Routing
This commit is contained in:
@@ -123,7 +123,7 @@ func parseRepoSpec(raw string) (giteaRepoSpec, bool) {
|
|||||||
if len(parts) < 2 {
|
if len(parts) < 2 {
|
||||||
return giteaRepoSpec{}, false
|
return giteaRepoSpec{}, false
|
||||||
}
|
}
|
||||||
base := (&url.URL{Scheme: "https", Host: u.Hostname()}).String()
|
base := (&url.URL{Scheme: "https", Host: normalizeGiteaHTTPHost(u.Hostname())}).String()
|
||||||
if u.Scheme == "http" || u.Scheme == "https" {
|
if u.Scheme == "http" || u.Scheme == "https" {
|
||||||
base = (&url.URL{Scheme: u.Scheme, Host: u.Host}).String()
|
base = (&url.URL{Scheme: u.Scheme, Host: u.Host}).String()
|
||||||
}
|
}
|
||||||
@@ -139,12 +139,20 @@ func parseRepoSpec(raw string) (giteaRepoSpec, bool) {
|
|||||||
if len(parts) < 2 {
|
if len(parts) < 2 {
|
||||||
return giteaRepoSpec{}, false
|
return giteaRepoSpec{}, false
|
||||||
}
|
}
|
||||||
base := (&url.URL{Scheme: "https", Host: hostAndPath[0]}).String()
|
base := (&url.URL{Scheme: "https", Host: normalizeGiteaHTTPHost(hostAndPath[0])}).String()
|
||||||
return giteaRepoSpec{BaseURL: strings.TrimRight(base, "/"), Owner: parts[len(parts)-2], Repo: parts[len(parts)-1]}, true
|
return giteaRepoSpec{BaseURL: strings.TrimRight(base, "/"), Owner: parts[len(parts)-2], Repo: parts[len(parts)-1]}, true
|
||||||
}
|
}
|
||||||
return giteaRepoSpec{}, false
|
return giteaRepoSpec{}, false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func normalizeGiteaHTTPHost(host string) string {
|
||||||
|
host = strings.TrimSpace(host)
|
||||||
|
if strings.HasPrefix(host, "git-ssh.") {
|
||||||
|
return "gitea." + strings.TrimPrefix(host, "git-ssh.")
|
||||||
|
}
|
||||||
|
return host
|
||||||
|
}
|
||||||
|
|
||||||
func resolvePartsManifestAssetURL(spec giteaRepoSpec) (string, error) {
|
func resolvePartsManifestAssetURL(spec giteaRepoSpec) (string, error) {
|
||||||
apiURL := fmt.Sprintf("%s/api/v1/repos/%s/%s/releases/tags/%s", strings.TrimRight(spec.BaseURL, "/"), url.PathEscape(spec.Owner), url.PathEscape(spec.Repo), url.PathEscape(partsManifestReleaseTag))
|
apiURL := fmt.Sprintf("%s/api/v1/repos/%s/%s/releases/tags/%s", strings.TrimRight(spec.BaseURL, "/"), url.PathEscape(spec.Owner), url.PathEscape(spec.Repo), url.PathEscape(partsManifestReleaseTag))
|
||||||
var release struct {
|
var release struct {
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package topdata
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestParseRepoSpecNormalizesWestgateSSHHostToPublicGiteaHost(t *testing.T) {
|
||||||
|
spec, ok := parseRepoSpec("ssh://git@git-ssh.westgate.pw:2222/ShadowsOverWestgate/sow-module.git")
|
||||||
|
if !ok {
|
||||||
|
t.Fatal("expected SSH remote to parse")
|
||||||
|
}
|
||||||
|
if spec.BaseURL != "https://gitea.westgate.pw" {
|
||||||
|
t.Fatalf("expected public Gitea base URL, got %q", spec.BaseURL)
|
||||||
|
}
|
||||||
|
if spec.Owner != "ShadowsOverWestgate" || spec.Repo != "sow-module" {
|
||||||
|
t.Fatalf("unexpected repo spec: %#v", spec)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseRepoSpecKeepsHTTPRemoteHost(t *testing.T) {
|
||||||
|
spec, ok := parseRepoSpec("https://example.invalid/owner/repo.git")
|
||||||
|
if !ok {
|
||||||
|
t.Fatal("expected HTTPS remote to parse")
|
||||||
|
}
|
||||||
|
if spec.BaseURL != "https://example.invalid" {
|
||||||
|
t.Fatalf("expected HTTPS base URL to be preserved, got %q", spec.BaseURL)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user