diff --git a/src/names/project.go b/src/names/project.go index 39ab9b5..51457b1 100644 --- a/src/names/project.go +++ b/src/names/project.go @@ -12,7 +12,6 @@ var ErrInvalidProjectName = errors.New("invalid project name") var ErrInvalidProjectURL = errors.New("invalid project URL") const indexProject = ".index" -const previewSeparator = "@" // Name of a git-pages project. The index project corresponds to the root URL of a domain, and // non-index projects are distinguished by the first path segment of the URL. @@ -49,13 +48,13 @@ func (p Project) IsIndex() bool { // a preview project name for a pull request. In the latter case, prNumber is set correspondingly, // and baseName contains the repository name. Otherwise, baseName equals p.String(). func (p Project) GetPullRequest() (baseName string, prNumber int64, isPreview bool) { - var atSuffix string - if baseName, atSuffix, isPreview = strings.Cut(p.String(), "@"); isPreview { - prNumber, _ = strconv.ParseInt(atSuffix, 10, 64) - } else { - baseName = p.String() + if repoName, atSuffix, isPreview := strings.Cut(p.String(), "@"); isPreview { + if prNumber, err := strconv.ParseInt(atSuffix, 10, 64); err == nil && prNumber > 0 { + baseName = repoName + return repoName, prNumber, true + } } - return + return p.String(), 0, false } func validateProjectName(name string) (proj Project, err error) { @@ -70,21 +69,6 @@ func validateProjectName(name string) (proj Project, err error) { return } - if strings.Count(name, previewSeparator) > 1 { - err = fmt.Errorf("%w: must contain at most one %q", ErrInvalidProjectName, previewSeparator) - return - } - - if _, atSuffix, isPreview := strings.Cut(name, "@"); isPreview { - if prNumber, parseErr := strconv.ParseInt(atSuffix, 10, 64); parseErr != nil { - err = fmt.Errorf("%w: malformed pull request number", ErrInvalidProjectName) - return - } else if prNumber <= 0 { - err = fmt.Errorf("%w: malformed pull request number", ErrInvalidProjectName) - return - } - } - proj.name = name return } diff --git a/src/names/project_test.go b/src/names/project_test.go index b318dba..16fe87f 100644 --- a/src/names/project_test.go +++ b/src/names/project_test.go @@ -58,10 +58,6 @@ func TestParseProjectName(t *testing.T) { checkErr(t, ParseProjectName, "meow\\miau", ErrInvalidProjectName) checkErr(t, ParseProjectName, "meow%miau", ErrInvalidProjectName) checkErr(t, ParseProjectName, "meow*", ErrInvalidProjectName) - checkErr(t, ParseProjectName, "foo@10@11", ErrInvalidProjectName) - checkErr(t, ParseProjectName, "foo@awa", ErrInvalidProjectName) - checkErr(t, ParseProjectName, "foo@0", ErrInvalidProjectName) - checkErr(t, ParseProjectName, "foo@-10", ErrInvalidProjectName) } func TestParseProjectURL(t *testing.T) { @@ -97,6 +93,26 @@ func TestProjectProperties(t *testing.T) { checkEq(t, prNumber, 0) checkEq(t, isPreview, false) + baseName, prNumber, isPreview = Project{"foo@10@11"}.GetPullRequest() + checkEq(t, baseName, "foo@10@11") + checkEq(t, prNumber, 0) + checkEq(t, isPreview, false) + + baseName, prNumber, isPreview = Project{"foo@-1"}.GetPullRequest() + checkEq(t, baseName, "foo@-1") + checkEq(t, prNumber, 0) + checkEq(t, isPreview, false) + + baseName, prNumber, isPreview = Project{"foo@0"}.GetPullRequest() + checkEq(t, baseName, "foo@0") + checkEq(t, prNumber, 0) + checkEq(t, isPreview, false) + + baseName, prNumber, isPreview = Project{"foo@meow"}.GetPullRequest() + checkEq(t, baseName, "foo@meow") + checkEq(t, prNumber, 0) + checkEq(t, isPreview, false) + baseName, prNumber, isPreview = Project{"foo@10"}.GetPullRequest() checkEq(t, baseName, "foo") checkEq(t, prNumber, 10)