diff --git a/pkg/component/pluginmanager/manager.go b/pkg/component/pluginmanager/manager.go index a4449f6..571bf35 100644 --- a/pkg/component/pluginmanager/manager.go +++ b/pkg/component/pluginmanager/manager.go @@ -204,7 +204,7 @@ func (b *BasicPluginManager) IsProtocInstalled(ctx context.Context, version stri return IsProtocInstalled(ctx, b.storageDir, version) } -// GetProtocLatestVersion is used to geet the latest version of protoc +// GetProtocLatestVersion is used to get the latest version of protoc func (b *BasicPluginManager) GetProtocLatestVersion(ctx context.Context) (string, error) { ctx, cancel := consts.GetContextWithPerCommandTimeout(ctx) defer cancel() @@ -216,7 +216,13 @@ func (b *BasicPluginManager) GetProtocLatestVersion(ctx context.Context) (string if len(versions) == 0 { return "", errors.New("no version list") } - return versions[len(versions)-1], nil + regularVersions := make([]string, 0, len(versions)) + for _, version := range versions { + if util.IsRegularVersion(version) { + regularVersions = append(regularVersions, version) + } + } + return regularVersions[len(regularVersions)-1], nil } // ListProtocVersions is used to list protoc version diff --git a/pkg/util/util.go b/pkg/util/util.go index 16fdbc6..238a649 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -115,7 +115,17 @@ func GetExitCode(err error) int { return 1 } -var regexpEnvironmentVar = regexp.MustCompile(`\$[A-Za-z_]+`) +var ( + regexpEnvironmentVar = regexp.MustCompile(`\$[A-Za-z_]+`) + regexpRegularVersion = regexp.MustCompile(`^v[0-9]+\.[0-9]+\.[0-9]+$`) +) + + +// IsRegularVersion is used to determine whether the version number is a regular version number +// Regular: va.b.c, and a, b, c are all numbers +func IsRegularVersion(s string) bool { + return regexpRegularVersion.MatchString(s) +} // RenderWithEnv is used to render string with env func RenderWithEnv(s string, ext map[string]string) string { diff --git a/pkg/util/util_test.go b/pkg/util/util_test.go index cdc341f..ca92222 100644 --- a/pkg/util/util_test.go +++ b/pkg/util/util_test.go @@ -120,3 +120,50 @@ func TestSortSemanticVersion(t *testing.T) { }) } } + +func TestIsRegularVersion(t *testing.T) { + type args struct { + s string + } + tests := []struct { + name string + args args + want bool + }{ + { + args: args{"v0.0.0"}, + want: true, + }, + { + args: args{"v11.0.0"}, + want: true, + }, + { + args: args{"v0.11.0"}, + want: true, + }, + { + args: args{"v0.0.11"}, + want: true, + }, + { + args: args{"0.0.11"}, + want: false, + }, + { + args: args{"0.0.a"}, + want: false, + }, + { + args: args{"v0.0.1-rc0"}, + want: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := IsRegularVersion(tt.args.s); got != tt.want { + t.Errorf("IsRegularVersion() = %v, want %v", got, tt.want) + } + }) + } +} \ No newline at end of file