//go:build search // +build search package cli import ( "fmt" godigest "github.com/opencontainers/go-digest" "github.com/spf13/cobra" zerr "zotregistry.io/zot/errors" zcommon "zotregistry.io/zot/pkg/common" ) func NewSearchSubjectCommand(searchService SearchService) *cobra.Command { imageCmd := &cobra.Command{ Use: "subject [repo:tag]|[repo@digest]", Short: "List all referrers for this subject.", Long: `List all referrers for this subject. The subject can be specified by tag(repo:tag) or by digest" + "(repo@digest)`, Example: `# For referrers search specify the referred subject using it's full digest or tag: zli search subject "repo@sha256:f9a0981..." zli search subject "repo:tag"`, Args: OneImageWithRefArg, RunE: func(cmd *cobra.Command, args []string) error { searchConfig, err := GetSearchConfigFromFlags(cmd, searchService) if err != nil { return err } if err := CheckExtEndPointQuery(searchConfig, ReferrersQuery()); err == nil { return SearchReferrersGQL(searchConfig, args[0]) } else { return SearchReferrers(searchConfig, args[0]) } }, } return imageCmd } func NewSearchQueryCommand(searchService SearchService) *cobra.Command { imageCmd := &cobra.Command{ Use: "query", Short: "Fuzzy search for repos and their tags.", Long: "Fuzzy search for repos and their tags.", Example: `# For repo search specify a substring of the repo name without the tag zli search query "test/repo" # For image search specify the full repo name followed by the tag or a prefix of the tag. zli search query "test/repo:2.1." # To search all tags in all repos. zli search query ":"`, Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { searchConfig, err := GetSearchConfigFromFlags(cmd, searchService) if err != nil { return err } // special format for searching all images and tags if args[0] == ":" { err := CheckExtEndPointQuery(searchConfig, GlobalSearchQuery()) if err != nil { return fmt.Errorf("%w: '%s'", err, ImageListQuery().Name) } return SearchAllImagesGQL(searchConfig) } if err := CheckExtEndPointQuery(searchConfig, GlobalSearchQuery()); err != nil { return fmt.Errorf("%w: '%s'", err, CVEListForImageQuery().Name) } return GlobalSearchGQL(searchConfig, args[0]) }, } return imageCmd } func OneImageWithRefArg(cmd *cobra.Command, args []string) error { if err := cobra.ExactArgs(1)(cmd, args); err != nil { return err } image := args[0] if dir, ref, _ := zcommon.GetImageDirAndReference(image); dir == "" || ref == "" { return zerr.ErrInvalidRepoRefFormat } return nil } func OneDigestArg(cmd *cobra.Command, args []string) error { if err := cobra.ExactArgs(1)(cmd, args); err != nil { return err } digest := args[0] if _, err := godigest.Parse(digest); err != nil { return err } return nil }