@@ -439,6 +439,50 @@ var AllRules = func(l *Linter) Rules { //nolint:gocyclo
439439 return fmt .Errorf ("no main package or subpackage test found" )
440440 },
441441 },
442+ {
443+ Name : "valid-version-stream" ,
444+ Description : "check the provides and tag filter if version stream suffix is passed to package name" ,
445+ Severity : SeverityError ,
446+ LintFunc : func (c config.Configuration ) error {
447+ // This regex captures a string that ends with a semantic version (semver) suffix.
448+ // It returns two groups:
449+ // - Group 1: The prefix part of the string before the semver.
450+ // - Group 2: The semver (major.minor or major.minor.patch).
451+ // If there is no semver suffix, the string will not match.
452+ re := regexp .MustCompile (`^(.*?)-(\d+\.\d+(?:\.\d+)?)$` )
453+
454+ // It means that the package is not a version streamed, so early return.
455+ if ! re .MatchString (c .Package .Name ) {
456+ return nil
457+ }
458+
459+ matches := re .FindStringSubmatch (c .Package .Name )
460+ if len (matches ) != 3 {
461+ return fmt .Errorf ("invalid package name %s for version stream, regex matches %+v" , c .Package .Name , matches )
462+ }
463+
464+ packageName := matches [1 ]
465+ versionStream := matches [2 ]
466+
467+ // package-name=${{package.full-version}}
468+ provides := fmt .Sprintf ("%s=%s-r%d" , packageName , c .Package .Version , c .Package .Epoch )
469+ // Some packages does not have ${{package.full-version}}, instead they have PACKAGE=VERSION.999. This is for backward compatibility.
470+ provides999 := fmt .Sprintf ("%s=%s.999" , packageName , versionStream )
471+ if ! slices .Contains (c .Package .Dependencies .Provides , provides ) && ! slices .Contains (c .Package .Dependencies .Provides , provides999 ) {
472+ return fmt .Errorf ("package is version streamed but %s=${{package.full-version}} is missing on dependencies.provides" , packageName )
473+ }
474+
475+ if c .Update .Enabled && ! c .Update .Manual && c .Update .GitHubMonitor != nil {
476+ // package-name-X.Y, package-name-X.Y., X.Y, vX.Y, X.Y., vX.Y., release-X.Y, release-X.Y.
477+ filtersToCheck := []string {c .Package .Name , c .Package .Name + "." , versionStream , "v" + versionStream , versionStream + "." , "v" + versionStream + "." , "release-" + versionStream , "release-" + versionStream + "." }
478+
479+ if ! slices .Contains (filtersToCheck , c .Update .GitHubMonitor .TagFilter ) && ! slices .Contains (filtersToCheck , c .Update .GitHubMonitor .TagFilterPrefix ) {
480+ return fmt .Errorf ("package is version streamed but tag filter %s is missing on update.github" , versionStream )
481+ }
482+ }
483+ return nil
484+ },
485+ },
442486 }
443487}
444488
0 commit comments