opencontainers / distribution-spec

OCI Distribution Specification
https://opencontainers.org
Apache License 2.0
792 stars 199 forks source link

spec: fix regexp #426

Closed rogpeppe closed 1 year ago

rogpeppe commented 1 year ago

As pointed out by @andaaron in #425, the regular expression proposed there was bogus. It was actually wrong in two different ways. Mea culpa, my apologies.

This fixes it. I wrote a few test cases to check: https://go.dev/play/p/4_iYH4Hao1-

package main

import (
    "regexp"
    "testing"
)

func TestRepoPattern(t *testing.T) {
    r := regexp.MustCompile(`^[a-z0-9]+((\.|_|__|-+)[a-z0-9]+)*(/[a-z0-9]+((\.|_|__|-+)[a-z0-9]+)*)*$`)
    for _, test := range []struct {
        s    string
        want bool
    }{
        {"foo", true},
        {"foo/bar", true},
        {"foo/bar__baz", true},
        {"foo/bar___baz", false},
        {"/foo", false},
        {"foo//bar", false},
        {"foo-------b__x.com", true},
        {"foo-------b__x.com/p----x", true},
        {"foo-", false},
        {"-foo", false},
        {"foo/-bar", false},
        {"foo/bar-", false},
        {"foo-bar", true},
        {"foo----_bar", false},
        {"foo----bar_/x", false},
    } {
        if got, want := r.MatchString(test.s), test.want; got != want {
            t.Errorf("mismatch on %q; got %v want %v", test.s, got, want)
        }
    }
}

Ideally something like the above would be committed for CI testing but perhaps that's a stage too far.

sudo-bmitch commented 1 year ago

I'm not sure when it happened, but it looks like we've relaxed the restrictions from the Docker spec:

A repository name is broken up into path components. A component of a repository name must be at least one lowercase, alpha-numeric characters, optionally separated by periods, dashes or underscores. More strictly, it must match the regular expression [a-z0-9]+(?:[._-][a-z0-9]+)*.

https://docs.docker.com/registry/spec/api/