diff --git a/cli/docker-ls/cmd_tag_details.go b/cli/docker-ls/cmd_tag_details.go index ab2f069..26f3a01 100644 --- a/cli/docker-ls/cmd_tag_details.go +++ b/cli/docker-ls/cmd_tag_details.go @@ -22,15 +22,18 @@ func (r *tagDetailsCmd) execute(argv []string) (err error) { rawManifest := false r.flags.BoolVar(&rawManifest, "raw-manifest", rawManifest, "output raw manifest") - if len(argv) < 2 { + if len(argv) < 1 { r.flags.Usage() os.Exit(1) } - repositoryName := argv[0] - reference := argv[1] + ref := lib.EmptyRefspec() + err = ref.Set(argv[0]) + if err != nil { + return + } - err = r.flags.Parse(argv[2:]) + err = r.flags.Parse(argv[1:]) if err != nil { return @@ -40,7 +43,7 @@ func (r *tagDetailsCmd) execute(argv []string) (err error) { progress.Start("requesting manifest") registryApi := lib.NewRegistryApi(libCfg) - tagDetails, err := registryApi.GetTagDetails(repositoryName, reference) + tagDetails, err := registryApi.GetTagDetails(ref) progress.Progress() progress.Finish("done") @@ -63,7 +66,7 @@ func newTagDetailsCmd(name string) (cmd *tagDetailsCmd) { flags: flag.NewFlagSet(name, flag.ExitOnError), } - cmd.flags.Usage = commandUsage(name, " ", "Inspect a singe tag.", cmd.flags) + cmd.flags.Usage = commandUsage(name, "", "Inspect a singe tag.", cmd.flags) return } diff --git a/cli/docker-ls/cmd_tags.go b/cli/docker-ls/cmd_tags.go index b597102..98e8b80 100644 --- a/cli/docker-ls/cmd_tags.go +++ b/cli/docker-ls/cmd_tags.go @@ -96,7 +96,7 @@ func (r *tagsCmd) listLevel1(api lib.RegistryApi) (resp *response.TagsL1, err er wait.Add(1) go func(tag lib.Tag) { - tagDetails, err := api.GetTagDetails(tag.RepositoryName(), tag.Name()) + tagDetails, err := api.GetTagDetails(lib.NewRefspec(tag.RepositoryName(), tag.Name())) progress.Progress() if err == nil { diff --git a/cli/docker-rm/main.go b/cli/docker-rm/main.go index eff1c25..b6b34b2 100644 --- a/cli/docker-rm/main.go +++ b/cli/docker-rm/main.go @@ -8,7 +8,7 @@ import ( "git.mayflower.de/vaillant-team/docker-ls/lib" ) -const USAGE_TEMPLATE = `usage: docker-rm [options] +const USAGE_TEMPLATE = `usage: docker-rm [options] Delete a tag in a given repository. @@ -28,22 +28,31 @@ func usage() { flags.PrintDefaults() } -func main() { +func dispatch() (err error) { libCfg := lib.NewConfig() libCfg.BindToFlags(flags) - if len(os.Args) < 3 { + if len(os.Args) < 2 { usage() os.Exit(0) } - repository, reference := os.Args[1], os.Args[2] + ref := lib.EmptyRefspec() + err = ref.Set(os.Args[1]) + if err != nil { + return + } - flags.Parse(os.Args[3:]) + flags.Parse(os.Args[2:]) api := lib.NewRegistryApi(libCfg) + err = api.DeleteTag(ref) - if err := api.DeleteTag(repository, reference); err == nil { + return +} + +func main() { + if err := dispatch(); err == nil { fmt.Println("...Tag deleted successfully!") } else { fmt.Printf("ERROR: %v\n", err) diff --git a/lib/api_delete_tag.go b/lib/api_delete_tag.go index 3c7ff66..34bc9fa 100644 --- a/lib/api_delete_tag.go +++ b/lib/api_delete_tag.go @@ -5,8 +5,8 @@ import ( "net/http" ) -func (r *registryApi) DeleteTag(repository, reference string) (err error) { - response, err := r.connector.Delete(r.endpointUrl(fmt.Sprintf("/v2/%s/manifests/%s", repository, reference)), "") +func (r *registryApi) DeleteTag(ref Refspec) (err error) { + response, err := r.connector.Delete(r.endpointUrl(fmt.Sprintf("/v2/%s/manifests/%s", ref.Repository(), ref.Reference())), "") if err != nil { return @@ -17,7 +17,7 @@ func (r *registryApi) DeleteTag(repository, reference string) (err error) { err = genericAuthorizationError case http.StatusNotFound: - err = newNotFoundError(fmt.Sprintf("%s:%s : no such repository or reference", repository, reference)) + err = newNotFoundError(fmt.Sprintf("%v : no such repository or reference", ref)) case http.StatusBadRequest: err = newInvalidRequestError("invalid request --- make sure that your reference is a content digest") diff --git a/lib/api_interface.go b/lib/api_interface.go index a1f1b03..cc6fca1 100644 --- a/lib/api_interface.go +++ b/lib/api_interface.go @@ -34,7 +34,7 @@ type TagDetails interface { type RegistryApi interface { ListRepositories() RepositoryListResponse ListTags(repositoryName string) TagListResponse - GetTagDetails(repository, reference string) (TagDetails, error) - DeleteTag(repository, reference string) error + GetTagDetails(ref Refspec) (TagDetails, error) + DeleteTag(ref Refspec) error GetStatistics() Statistics } diff --git a/lib/api_tag_details.go b/lib/api_tag_details.go index ff3141b..a27b317 100644 --- a/lib/api_tag_details.go +++ b/lib/api_tag_details.go @@ -49,10 +49,10 @@ func (t *tagDetails) setLayers(layers []parsedLayer) { } } -func (r *registryApi) GetTagDetails(repository, reference string) (details TagDetails, err error) { - url := r.endpointUrl(fmt.Sprintf("v2/%s/manifests/%s", repository, reference)) +func (r *registryApi) GetTagDetails(ref Refspec) (details TagDetails, err error) { + url := r.endpointUrl(fmt.Sprintf("v2/%s/manifests/%s", ref.Repository(), ref.Reference())) - apiResponse, err := r.connector.Get(url, cacheHintTagDetails(repository)) + apiResponse, err := r.connector.Get(url, cacheHintTagDetails(ref.Repository())) if err != nil { return @@ -67,7 +67,7 @@ func (r *registryApi) GetTagDetails(repository, reference string) (details TagDe err = genericAuthorizationError case http.StatusNotFound: - err = newNotFoundError(fmt.Sprintf("%s:%s : no such repository or reference", repository, reference)) + err = newNotFoundError(fmt.Sprintf("%v: : no such repository or reference", ref)) case http.StatusOK: diff --git a/lib/link_to_next_header_test.go b/lib/link_to_next_header_test.go index f7b31fd..300a78b 100644 --- a/lib/link_to_next_header_test.go +++ b/lib/link_to_next_header_test.go @@ -5,7 +5,7 @@ import ( "testing" ) -func TestParse(t *testing.T) { +func TestLinkHeaderParse(t *testing.T) { testcase := `; rel="next"` url, err := parseLinkToNextHeader(testcase) @@ -26,7 +26,7 @@ func TestParse(t *testing.T) { } } -func TestParseInvalid(t *testing.T) { +func TestLinkHeaderParseInvalid(t *testing.T) { testcase := `