2015-09-08 23:00:48 +00:00
|
|
|
package reference
|
|
|
|
|
|
|
|
import "regexp"
|
|
|
|
|
|
|
|
var (
|
2015-10-09 23:01:01 +00:00
|
|
|
// nameSubComponentRegexp defines the part of the name which must be
|
|
|
|
// begin and end with an alphanumeric character. These characters can
|
|
|
|
// be separated by any number of dashes.
|
|
|
|
nameSubComponentRegexp = regexp.MustCompile(`[a-z0-9]+(?:[-]+[a-z0-9]+)*`)
|
|
|
|
|
2015-09-08 23:00:48 +00:00
|
|
|
// nameComponentRegexp restricts registry path component names to
|
|
|
|
// start with at least one letter or number, with following parts able to
|
2015-10-09 23:01:01 +00:00
|
|
|
// be separated by one period, underscore or double underscore.
|
|
|
|
nameComponentRegexp = regexp.MustCompile(nameSubComponentRegexp.String() + `(?:(?:[._]|__)` + nameSubComponentRegexp.String() + `)*`)
|
2015-09-08 23:00:48 +00:00
|
|
|
|
|
|
|
nameRegexp = regexp.MustCompile(`(?:` + nameComponentRegexp.String() + `/)*` + nameComponentRegexp.String())
|
|
|
|
|
2015-10-09 23:01:01 +00:00
|
|
|
hostnameComponentRegexp = regexp.MustCompile(`(?:[a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])`)
|
2015-09-08 23:00:48 +00:00
|
|
|
|
|
|
|
// hostnameComponentRegexp restricts the registry hostname component of a repository name to
|
|
|
|
// start with a component as defined by hostnameRegexp and followed by an optional port.
|
|
|
|
hostnameRegexp = regexp.MustCompile(`(?:` + hostnameComponentRegexp.String() + `\.)*` + hostnameComponentRegexp.String() + `(?::[0-9]+)?`)
|
|
|
|
|
|
|
|
// TagRegexp matches valid tag names. From docker/docker:graph/tags.go.
|
|
|
|
TagRegexp = regexp.MustCompile(`[\w][\w.-]{0,127}`)
|
|
|
|
|
|
|
|
// anchoredTagRegexp matches valid tag names, anchored at the start and
|
|
|
|
// end of the matched string.
|
|
|
|
anchoredTagRegexp = regexp.MustCompile(`^` + TagRegexp.String() + `$`)
|
|
|
|
|
2015-10-10 00:09:54 +00:00
|
|
|
// DigestRegexp matches valid digests.
|
|
|
|
DigestRegexp = regexp.MustCompile(`[A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}`)
|
|
|
|
|
|
|
|
// anchoredDigestRegexp matches valid digests, anchored at the start and
|
|
|
|
// end of the matched string.
|
|
|
|
anchoredDigestRegexp = regexp.MustCompile(`^` + DigestRegexp.String() + `$`)
|
|
|
|
|
2015-09-08 23:00:48 +00:00
|
|
|
// NameRegexp is the format for the name component of references. The
|
|
|
|
// regexp has capturing groups for the hostname and name part omitting
|
|
|
|
// the seperating forward slash from either.
|
|
|
|
NameRegexp = regexp.MustCompile(`(?:` + hostnameRegexp.String() + `/)?` + nameRegexp.String())
|
|
|
|
|
|
|
|
// ReferenceRegexp is the full supported format of a reference. The
|
|
|
|
// regexp has capturing groups for name, tag, and digest components.
|
2015-10-10 00:09:54 +00:00
|
|
|
ReferenceRegexp = regexp.MustCompile(`^((?:` + hostnameRegexp.String() + `/)?` + nameRegexp.String() + `)(?:[:](` + TagRegexp.String() + `))?(?:[@](` + DigestRegexp.String() + `))?$`)
|
2015-09-08 23:00:48 +00:00
|
|
|
|
|
|
|
// anchoredNameRegexp is used to parse a name value, capturing hostname
|
|
|
|
anchoredNameRegexp = regexp.MustCompile(`^(?:(` + hostnameRegexp.String() + `)/)?(` + nameRegexp.String() + `)$`)
|
|
|
|
)
|