Relaxes storagedriver path constraints (#47)

No longer requires that file paths match the repository naming scheme,
but instead allows path components as short as a single character, as to
accommodate for single-character tag names.
pull/50/head
Brian Bland 2015-01-06 17:16:43 -08:00
parent 5f863238c0
commit f6aadc2028
2 changed files with 12 additions and 17 deletions

View File

@ -71,16 +71,12 @@ type StorageDriver interface {
Delete(path string) error Delete(path string) error
} }
// PathComponentRegexp is the regular expression which each repository path // PathRegexp is the regular expression which each file path must match.
// component must match. // A file path is absolute, beginning with a slash and containing a
// A component of a repository path must be at least two characters, optionally // positive number of path components separated by slashes, where each component
// separated by periods, dashes or underscores. // is restricted to lowercase alphanumeric characters, optionally separated by
var PathComponentRegexp = regexp.MustCompile(`[a-z0-9]+([._-]?[a-z0-9])+`) // a period, underscore, or hyphen.
var PathRegexp = regexp.MustCompile(`^(/[a-z0-9]+([._-][a-z0-9]+)*)+$`)
// PathRegexp is the regular expression which each repository path must match.
// A repository path is absolute, beginning with a slash and containing a
// positive number of path components separated by slashes.
var PathRegexp = regexp.MustCompile(`^(/[a-z0-9]+([._-]?[a-z0-9])+)+$`)
// PathNotFoundError is returned when operating on a nonexistent path. // PathNotFoundError is returned when operating on a nonexistent path.
type PathNotFoundError struct { type PathNotFoundError struct {

View File

@ -122,7 +122,7 @@ func (suite *DriverSuite) TearDownTest(c *check.C) {
// storage driver. // storage driver.
func (suite *DriverSuite) TestValidPaths(c *check.C) { func (suite *DriverSuite) TestValidPaths(c *check.C) {
contents := randomContents(64) contents := randomContents(64)
validFiles := []string{"/aa", "/a.a", "/0-9/abcdefg", "/abcdefg/z.75", "/abc/1.2.3.4.5-6_zyx/123.z", "/docker/docker-registry"} validFiles := []string{"/a", "/2", "/aa", "/a.a", "/0-9/abcdefg", "/abcdefg/z.75", "/abc/1.2.3.4.5-6_zyx/123.z/4", "/docker/docker-registry"}
for _, filename := range validFiles { for _, filename := range validFiles {
err := suite.StorageDriver.PutContent(filename, contents) err := suite.StorageDriver.PutContent(filename, contents)
@ -139,7 +139,7 @@ func (suite *DriverSuite) TestValidPaths(c *check.C) {
// storage driver. // storage driver.
func (suite *DriverSuite) TestInvalidPaths(c *check.C) { func (suite *DriverSuite) TestInvalidPaths(c *check.C) {
contents := randomContents(64) contents := randomContents(64)
invalidFiles := []string{"", "/", "abc", "123.abc", "/abc./abc", "/.abc", "/a--b", "/a-.b", "/_.abc", "/a/bcd", "/abc_123/d", "/Docker/docker-registry"} invalidFiles := []string{"", "/", "abc", "123.abc", "/abc./abc", "/.abc", "/a--b", "/a-.b", "/_.abc", "//bcd", "/abc_123/", "/Docker/docker-registry"}
for _, filename := range invalidFiles { for _, filename := range invalidFiles {
err := suite.StorageDriver.PutContent(filename, contents) err := suite.StorageDriver.PutContent(filename, contents)
@ -1015,14 +1015,13 @@ var separatorChars = []byte("._-")
func randomPath(length int64) string { func randomPath(length int64) string {
path := "/" path := "/"
for int64(len(path)) < length { for int64(len(path)) < length {
chunkLength := rand.Int63n(length-int64(len(path)+1)) + 2 chunkLength := rand.Int63n(length-int64(len(path))) + 1
chunk := randomFilename(chunkLength) chunk := randomFilename(chunkLength)
path += chunk path += chunk
if length-int64(len(path)) == 1 { remaining := length - int64(len(path))
if remaining == 1 {
path += randomFilename(1) path += randomFilename(1)
} else if length-int64(len(path)) == 2 { } else if remaining > 1 {
path += randomFilename(2)
} else if length-int64(len(path)) > 2 {
path += "/" path += "/"
} }
} }