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  }