package repocli import ( "errors" "net/url" "path" "strings" ) type Reference struct { urlobj *url.URL user, pass string base, tag string } func NewReference(rawref string) (*Reference, error) { ref := &Reference{} if !strings.Contains(rawref, "://") { rawref = "https://" + rawref } urlobj, err := url.Parse(rawref) if err != nil { return ref, err } if urlobj.User != nil { ref.user = urlobj.User.Username() ref.pass, _ = urlobj.User.Password() urlobj.User = nil } ref.urlobj = urlobj repotag := strings.SplitN(ref.urlobj.Path, ":", 2) if len(repotag) != 2 { err = errors.New("Incorrect reference format") return ref, err } ref.base = repotag[0] ref.tag = repotag[1] ref.urlobj.Path = "/" ref.urlobj = urlobj return ref, err } func (ref *Reference) String() string { return path.Join(ref.urlobj.Host, ref.base+":"+ref.tag) } func (ref *Reference) Repo() string { return path.Join(ref.urlobj.Host, ref.base) } func (ref *Reference) Tag() string { return ref.tag }