diff --git a/registry/storage/catalog.go b/registry/storage/catalog.go index aec5f2e6..89616402 100644 --- a/registry/storage/catalog.go +++ b/registry/storage/catalog.go @@ -39,7 +39,7 @@ func (reg *registry) Repositories(ctx context.Context, repos []string, last stri _, file := path.Split(repoPath) if file == "_layers" { repoPath = strings.TrimSuffix(repoPath, "/_layers") - if repoPath > last { + if pathGreaterThan(repoPath, last) { foundRepos = append(foundRepos, repoPath) } return ErrSkipDir @@ -95,3 +95,23 @@ func (reg *registry) Enumerate(ctx context.Context, ingester func(string) error) return nil } + +func pathGreaterThan(pathX, pathY string) (b bool) { + splitPathX := strings.SplitN(pathX, "/", 2) + splitPathY := strings.SplitN(pathY, "/", 2) + + if splitPathX[0] == splitPathY[0] { + if len(splitPathX) == 1 && len(splitPathY) == 1 { + return false + } else if len(splitPathX) == 1 && len(splitPathY) != 1 { + return false + } else if len(splitPathX) != 1 && len(splitPathY) == 1 { + return true + } + + return pathGreaterThan(splitPathX[1], splitPathY[1]) + + } + + return splitPathX[0] > splitPathY[0] +} diff --git a/registry/storage/catalog_test.go b/registry/storage/catalog_test.go index b7288ed2..c125cb17 100644 --- a/registry/storage/catalog_test.go +++ b/registry/storage/catalog_test.go @@ -33,9 +33,13 @@ func setupFS(t *testing.T) *setupEnv { repos := []string{ "foo/a", "foo/b", + "foo-bar/a", "bar/c", "bar/d", + "bar/e", "foo/d/in", + "foo-bar/b", + "test", } for _, repo := range repos { @@ -45,9 +49,13 @@ func setupFS(t *testing.T) *setupEnv { expected := []string{ "bar/c", "bar/d", + "bar/e", "foo/a", "foo/b", "foo/d/in", + "foo-bar/a", + "foo-bar/b", + "test", } return &setupEnv{ @@ -118,7 +126,7 @@ func TestCatalog(t *testing.T) { func TestCatalogInParts(t *testing.T) { env := setupFS(t) - chunkLen := 2 + chunkLen := 3 p := make([]string, chunkLen) numFilled, err := env.registry.Repositories(env.ctx, p, "") @@ -144,12 +152,23 @@ func TestCatalogInParts(t *testing.T) { lastRepo = p[len(p)-1] numFilled, err = env.registry.Repositories(env.ctx, p, lastRepo) + if err != io.EOF || numFilled != len(p) { + t.Errorf("Expected end of catalog") + } + + if !testEq(p, env.expected[chunkLen*2:chunkLen*3], numFilled) { + t.Errorf("Expected catalog third chunk err") + } + + lastRepo = p[len(p)-1] + numFilled, err = env.registry.Repositories(env.ctx, p, lastRepo) + if err != io.EOF { t.Errorf("Catalog has more values which we aren't expecting") } - if !testEq(p, env.expected[chunkLen*2:chunkLen*3-1], numFilled) { - t.Errorf("Expected catalog third chunk err") + if numFilled != 0 { + t.Errorf("Expected catalog fourth chunk err") } }