A container registry that uses the AT Protocol for manifest storage and S3 for blob storage. atcr.io
docker container atproto go

Adds Codeberg as a source

Changed files
+38 -7
pkg
appview
+20 -7
pkg/appview/readme/source.go
··· 10 type Platform string 11 12 const ( 13 - PlatformGitHub Platform = "github" 14 - PlatformGitLab Platform = "gitlab" 15 - PlatformTangled Platform = "tangled" 16 ) 17 18 // ParseSourceURL extracts platform, user, and repo from a source repository URL. ··· 38 39 host := strings.ToLower(parsed.Host) 40 41 - switch { 42 - case host == "github.com": 43 // GitHub: github.com/{user}/{repo} 44 parts := strings.SplitN(path, "/", 3) 45 if len(parts) < 2 || parts[0] == "" || parts[1] == "" { ··· 47 } 48 return PlatformGitHub, parts[0], parts[1], true 49 50 - case host == "gitlab.com": 51 // GitLab: gitlab.com/{user}/{repo} or gitlab.com/{group}/{subgroup}/{repo} 52 // For nested groups, user = everything except last part, repo = last part 53 lastSlash := strings.LastIndex(path, "/") ··· 61 } 62 return PlatformGitLab, user, repo, true 63 64 - case host == "tangled.org" || host == "tangled.sh": 65 // Tangled: tangled.org/{user}/{repo} or tangled.sh/@{user}/{repo} (legacy) 66 // Strip leading @ from user if present 67 path = strings.TrimPrefix(path, "@") ··· 70 return "", "", "", false 71 } 72 return PlatformTangled, parts[0], parts[1], true 73 74 default: 75 return "", "", "", false ··· 96 case PlatformTangled: 97 // https://tangled.org/{user}/{repo}/raw/{branch}/README.md 98 return fmt.Sprintf("https://tangled.org/%s/%s/raw/%s/README.md", user, repo, branch) 99 100 default: 101 return ""
··· 10 type Platform string 11 12 const ( 13 + PlatformGitHub Platform = "github" 14 + PlatformGitLab Platform = "gitlab" 15 + PlatformTangled Platform = "tangled" 16 + PlatformCodeberg Platform = "codeberg" 17 ) 18 19 // ParseSourceURL extracts platform, user, and repo from a source repository URL. ··· 39 40 host := strings.ToLower(parsed.Host) 41 42 + switch host { 43 + case "github.com": 44 // GitHub: github.com/{user}/{repo} 45 parts := strings.SplitN(path, "/", 3) 46 if len(parts) < 2 || parts[0] == "" || parts[1] == "" { ··· 48 } 49 return PlatformGitHub, parts[0], parts[1], true 50 51 + case "gitlab.com": 52 // GitLab: gitlab.com/{user}/{repo} or gitlab.com/{group}/{subgroup}/{repo} 53 // For nested groups, user = everything except last part, repo = last part 54 lastSlash := strings.LastIndex(path, "/") ··· 62 } 63 return PlatformGitLab, user, repo, true 64 65 + case "tangled.org", "tangled.sh": 66 // Tangled: tangled.org/{user}/{repo} or tangled.sh/@{user}/{repo} (legacy) 67 // Strip leading @ from user if present 68 path = strings.TrimPrefix(path, "@") ··· 71 return "", "", "", false 72 } 73 return PlatformTangled, parts[0], parts[1], true 74 + 75 + case "codeberg.org": 76 + // Codeberg: codeberg.org/{user}/{repo} 77 + parts := strings.SplitN(path, "/", 3) 78 + if len(parts) < 2 || parts[0] == "" || parts[1] == "" { 79 + return "", "", "", false 80 + } 81 + return PlatformCodeberg, parts[0], parts[1], true 82 83 default: 84 return "", "", "", false ··· 105 case PlatformTangled: 106 // https://tangled.org/{user}/{repo}/raw/{branch}/README.md 107 return fmt.Sprintf("https://tangled.org/%s/%s/raw/%s/README.md", user, repo, branch) 108 + 109 + case PlatformCodeberg: 110 + // https://codeberg.org/{user}/{repo}/raw/branch/{branch}/README.md 111 + return fmt.Sprintf("https://codeberg.org/%s/%s/raw/branch/%s/README.md", user, repo, branch) 112 113 default: 114 return ""
+18
pkg/appview/readme/source_test.go
··· 120 wantOK: true, 121 }, 122 123 // Unsupported / Invalid 124 { 125 name: "unsupported platform", ··· 213 sourceURL: "https://tangled.org/@user/repo", 214 branch: "main", 215 want: "https://tangled.org/user/repo/raw/main/README.md", 216 }, 217 218 // Unsupported
··· 120 wantOK: true, 121 }, 122 123 + // Codeberg 124 + { 125 + name: "codeberg standard", 126 + sourceURL: "https://codeberg.org/user/repo", 127 + wantPlatform: PlatformCodeberg, 128 + wantUser: "user", 129 + wantRepo: "repo", 130 + wantOK: true, 131 + }, 132 + 133 // Unsupported / Invalid 134 { 135 name: "unsupported platform", ··· 223 sourceURL: "https://tangled.org/@user/repo", 224 branch: "main", 225 want: "https://tangled.org/user/repo/raw/main/README.md", 226 + }, 227 + 228 + // Codeberg 229 + { 230 + name: "codeberg main", 231 + sourceURL: "https://codeberg.org/user/repo", 232 + branch: "main", 233 + want: "https://codeberg.org/user/repo/raw/branch/main/README.md", 234 }, 235 236 // Unsupported