working commit

This commit is contained in:
2026-03-10 12:52:12 +02:00
parent d0a5fab362
commit d1ef1fbe50
42 changed files with 242 additions and 426 deletions
+60 -39
View File
@@ -2,63 +2,84 @@ package repocli
import (
"net/url"
"path"
"strings"
)
type Referer struct {
urlobj *url.URL
user, pass string
base string
base, tag string
}
func NewReferer(rawrepo string) (*Referer, error) {
repo := &Referer{}
if !strings.Contains(rawrepo, "://") {
rawrepo = "https://" + rawrepo
func NewReferer(rawref string) (*Referer, error) {
ref := &Referer{}
if !strings.Contains(rawref, "://") {
rawref = "https://" + rawref
}
urlobj, err := url.Parse(rawrepo)
urlobj, err := url.Parse(rawref)
if err != nil {
return repo, err
return ref, err
}
if urlobj.User != nil {
repo.user = urlobj.User.Username()
repo.pass, _ = urlobj.User.Password()
ref.user = urlobj.User.Username()
ref.pass, _ = urlobj.User.Password()
urlobj.User = nil
}
repo.urlobj = urlobj
repo.base = repo.urlobj.Path
repo.urlobj.Path = "/"
repo.urlobj = urlobj
ref.urlobj = urlobj
if strings.Contains(ref.urlobj.Path, ":") {
m := strings.SplitN(ref.urlobj.Path, ":", 2)
ref.base = m[0]
ref.tag = m[1]
} else {
ref.base = ref.urlobj.Path
}
ref.urlobj.Path = "/"
ref.urlobj = urlobj
return repo, err
return ref, err
}
func (repo *Referer) String() string {
curl := repo.urlobj.JoinPath(repo.base)
func (ref *Referer) RawWithTag(tag string) string {
return path.Join(ref.urlobj.Host, ref.base+":"+tag)
}
func (ref *Referer) Raw() string {
if ref.tag != "" {
return path.Join(ref.urlobj.Host, ref.base+":"+ref.tag)
}
return path.Join(ref.urlobj.Host, ref.base)
}
func (ref *Referer) RawRepo() string {
return path.Join(ref.urlobj.Host, ref.base)
}
func (ref *Referer) Tag() string {
return ref.tag
}
func (ref *Referer) ManifestEP() string {
curl := ref.urlobj.JoinPath("/v2", ref.base, "/manifests", ref.tag)
return curl.String()
}
func (repo *Referer) Manifest(tag string) string {
curl := repo.urlobj.JoinPath("/v2", repo.base, "/manifests", tag)
func (ref *Referer) BlobEP(digest string) string {
curl := ref.urlobj.JoinPath("/v2", ref.base, "/blobs", digest)
return curl.String()
}
func (repo *Referer) Blob(digest string) string {
curl := repo.urlobj.JoinPath("/v2", repo.base, "/blobs", digest)
func (ref *Referer) UploadEP() string {
curl := ref.urlobj.JoinPath("/v2", ref.base, "/blobs/uploads/")
return curl.String()
}
func (repo *Referer) Upload() string {
curl := repo.urlobj.JoinPath("/v2", repo.base, "/blobs/uploads/")
return curl.String()
}
func (repo *Referer) Patch(loc string) (string, error) {
func (ref *Referer) PatchEP(loc string) (string, error) {
var curl *url.URL
var out string
var err error
if isUUID(loc) {
curl = repo.urlobj.JoinPath("/v2/", repo.base, "/blobs/uploads/", loc)
curl = ref.urlobj.JoinPath("/v2/", ref.base, "/blobs/uploads/", loc)
return curl.String(), nil
}
if strings.Contains(loc, "://") {
@@ -67,26 +88,26 @@ func (repo *Referer) Patch(loc string) (string, error) {
return out, err
}
} else {
curl = repo.urlobj.JoinPath(loc)
curl = ref.urlobj.JoinPath(loc)
}
out = curl.String()
return out, err
}
func (repo *Referer) Put(loc, digest string) (string, error) {
func (ref *Referer) PutEP(loc, digest string) (string, error) {
var curl *url.URL
var out string
var err error
if isUUID(loc) {
curl = repo.urlobj.JoinPath("/v2/", repo.base, "/blobs/uploads/", loc)
curl = ref.urlobj.JoinPath("/v2/", ref.base, "/blobs/uploads/", loc)
} else if strings.Contains(loc, "://") {
curl, err = url.Parse(loc)
if err != nil {
return out, err
}
} else {
curl = repo.urlobj.JoinPath(loc)
curl = ref.urlobj.JoinPath(loc)
}
query := curl.Query()
query.Set("digest", digest)
@@ -95,21 +116,21 @@ func (repo *Referer) Put(loc, digest string) (string, error) {
return out, err
}
func (repo *Referer) Tags() string {
curl := repo.urlobj.JoinPath("/v2", repo.base, "/tags/list")
func (ref *Referer) TagsEP() string {
curl := ref.urlobj.JoinPath("/v2", ref.base, "/tags/list")
return curl.String()
}
func (repo *Referer) Referers(digest string) string {
curl := repo.urlobj.JoinPath("/v2", repo.base, "/referrers/", digest)
func (ref *Referer) ReferersEP(digest string) string {
curl := ref.urlobj.JoinPath("/v2", ref.base, "/referers/", digest)
return curl.String()
}
func (repo *Referer) Catalog() string {
curl := repo.urlobj.JoinPath("/v2/_catalog")
func (ref *Referer) CatalogEP() string {
curl := ref.urlobj.JoinPath("/v2/_catalog")
return curl.String()
}
func (repo *Referer) Userinfo() (string, string) {
return repo.user, repo.pass
func (ref *Referer) Userinfo() (string, string) {
return ref.user, ref.pass
}