github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/pkg/buildpack/parse_name.go (about) 1 package buildpack 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 // ParseIDLocator parses a buildpack locator in the following formats into its ID and version. 9 // 10 // - <id>[@<version>] 11 // - urn:cnb:builder:<id>[@<version>] 12 // - urn:cnb:registry:<id>[@<version>] 13 // - from=builder:<id>[@<version>] (deprecated) 14 // 15 // If version is omitted, the version returned will be empty. Any "from=builder:" or "urn:cnb" prefix will be ignored. 16 func ParseIDLocator(locator string) (id string, version string) { 17 nakedLocator := parseRegistryLocator(parseBuilderLocator(locator)) 18 19 parts := strings.Split(nakedLocator, "@") 20 if len(parts) == 2 { 21 return parts[0], parts[1] 22 } 23 return parts[0], "" 24 } 25 26 // ParsePackageLocator parses a locator (in format `[docker://][<host>/]<path>[:<tag>⏐@<digest>]`) to image name (`[<host>/]<path>[:<tag>⏐@<digest>]`) 27 func ParsePackageLocator(locator string) (imageName string) { 28 return strings.TrimPrefix( 29 strings.TrimPrefix( 30 strings.TrimPrefix(locator, fromDockerPrefix+"//"), 31 fromDockerPrefix+"/"), 32 fromDockerPrefix) 33 } 34 35 // ParseRegistryID parses a registry id (ie. `<namespace>/<name>@<version>`) into namespace, name and version components. 36 // 37 // Supported formats: 38 // - <ns>/<name>[@<version>] 39 // - urn:cnb:registry:<ns>/<name>[@<version>] 40 func ParseRegistryID(registryID string) (namespace string, name string, version string, err error) { 41 id, version := ParseIDLocator(registryID) 42 43 parts := strings.Split(id, "/") 44 if len(parts) != 2 { 45 return "", "", "", fmt.Errorf("invalid registry ID: %s", registryID) 46 } 47 48 return parts[0], parts[1], version, nil 49 } 50 51 func parseRegistryLocator(locator string) (path string) { 52 return strings.TrimPrefix(locator, fromRegistryPrefix+":") 53 } 54 55 func parseBuilderLocator(locator string) (path string) { 56 return strings.TrimPrefix( 57 strings.TrimPrefix(locator, deprecatedFromBuilderPrefix+":"), 58 fromBuilderPrefix+":") 59 }