[Vendor] Switch go-version lib (#12719)
* vendor: switch from "mcuadros/go-version" to "hashicorp/go-version" * Adapt P1 * simplify * fix lint * adapt * fix lint & rm old code * no deadlock * rm RWMutex and check GoVersion only 1-time * Copyright header Co-authored-by: techknowlogick <techknowlogick@gitea.io>
This commit is contained in:
2
go.mod
2
go.mod
@ -51,6 +51,7 @@ require (
|
||||
github.com/google/uuid v1.1.1
|
||||
github.com/gorilla/context v1.1.1
|
||||
github.com/hashicorp/go-retryablehttp v0.6.6 // indirect
|
||||
github.com/hashicorp/go-version v1.2.1
|
||||
github.com/huandu/xstrings v1.3.0
|
||||
github.com/issue9/assert v1.3.2 // indirect
|
||||
github.com/issue9/identicon v1.0.1
|
||||
@ -65,7 +66,6 @@ require (
|
||||
github.com/markbates/goth v1.61.2
|
||||
github.com/mattn/go-isatty v0.0.12
|
||||
github.com/mattn/go-sqlite3 v1.14.0
|
||||
github.com/mcuadros/go-version v0.0.0-20190308113854-92cdf37c5b75
|
||||
github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81
|
||||
github.com/mgechev/revive v1.0.2
|
||||
github.com/mholt/archiver/v3 v3.3.0
|
||||
|
4
go.sum
4
go.sum
@ -482,6 +482,8 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX
|
||||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||
github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=
|
||||
github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
@ -659,8 +661,6 @@ github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/
|
||||
github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/mcuadros/go-version v0.0.0-20190308113854-92cdf37c5b75 h1:Pijfgr7ZuvX7QIQiEwLdRVr3RoMG+i0SbBO1Qu+7yVk=
|
||||
github.com/mcuadros/go-version v0.0.0-20190308113854-92cdf37c5b75/go.mod h1:76rfSfYPWj01Z85hUf/ituArm797mNKcvINh1OlsZKo=
|
||||
github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 h1:QASJXOGm2RZ5Ardbc86qNFvby9AqkLDibfChMtAg5QM=
|
||||
github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg=
|
||||
github.com/mgechev/revive v1.0.2 h1:v0NxxQ7fSFz/u1NQydPo6EGdq7va0J1BtsZmae6kzUg=
|
||||
|
@ -1,3 +1,4 @@
|
||||
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2015 The Gogs Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
@ -11,12 +12,10 @@ import (
|
||||
"io"
|
||||
"os"
|
||||
"os/exec"
|
||||
"runtime"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"code.gitea.io/gitea/modules/process"
|
||||
"github.com/mcuadros/go-version"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -132,7 +131,7 @@ func (c *Command) RunInDirTimeoutEnvFullPipelineFunc(env []string, timeout time.
|
||||
}
|
||||
|
||||
// TODO: verify if this is still needed in golang 1.15
|
||||
if version.Compare(runtime.Version(), "go1.15", "<") {
|
||||
if goVersionLessThan115 {
|
||||
cmd.Env = append(cmd.Env, "GODEBUG=asyncpreemptoff=1")
|
||||
}
|
||||
cmd.Dir = dir
|
||||
|
@ -21,7 +21,6 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/go-git/go-git/v5/plumbing/object"
|
||||
"github.com/mcuadros/go-version"
|
||||
)
|
||||
|
||||
// Commit represents a git commit.
|
||||
@ -470,7 +469,7 @@ func (c *Commit) GetSubModule(entryname string) (*SubModule, error) {
|
||||
|
||||
// GetBranchName gets the closest branch name (as returned by 'git name-rev --name-only')
|
||||
func (c *Commit) GetBranchName() (string, error) {
|
||||
binVersion, err := BinVersion()
|
||||
err := LoadGitVersion()
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("Git version missing: %v", err)
|
||||
}
|
||||
@ -478,7 +477,7 @@ func (c *Commit) GetBranchName() (string, error) {
|
||||
args := []string{
|
||||
"name-rev",
|
||||
}
|
||||
if version.Compare(binVersion, "2.13.0", ">=") {
|
||||
if CheckGitVersionConstraint(">= 2.13.0") == nil {
|
||||
args = append(args, "--exclude", "refs/tags/*")
|
||||
}
|
||||
args = append(args, "--name-only", "--no-undefined", c.ID.String())
|
||||
|
@ -15,14 +15,9 @@ import (
|
||||
|
||||
"code.gitea.io/gitea/modules/process"
|
||||
|
||||
"github.com/mcuadros/go-version"
|
||||
"github.com/hashicorp/go-version"
|
||||
)
|
||||
|
||||
// Version return this package's current version
|
||||
func Version() string {
|
||||
return "0.4.2"
|
||||
}
|
||||
|
||||
var (
|
||||
// Debug enables verbose logging on everything.
|
||||
// This should be false in case Gogs starts in SSH mode.
|
||||
@ -39,7 +34,10 @@ var (
|
||||
// DefaultContext is the default context to run git commands in
|
||||
DefaultContext = context.Background()
|
||||
|
||||
gitVersion string
|
||||
gitVersion *version.Version
|
||||
|
||||
// will be checked on Init
|
||||
goVersionLessThan115 = true
|
||||
)
|
||||
|
||||
func log(format string, args ...interface{}) {
|
||||
@ -55,31 +53,43 @@ func log(format string, args ...interface{}) {
|
||||
}
|
||||
}
|
||||
|
||||
// BinVersion returns current Git version from shell.
|
||||
func BinVersion() (string, error) {
|
||||
if len(gitVersion) > 0 {
|
||||
// LocalVersion returns current Git version from shell.
|
||||
func LocalVersion() (*version.Version, error) {
|
||||
if err := LoadGitVersion(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return gitVersion, nil
|
||||
}
|
||||
|
||||
// LoadGitVersion returns current Git version from shell.
|
||||
func LoadGitVersion() error {
|
||||
// doesn't need RWMutex because its exec by Init()
|
||||
if gitVersion != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
stdout, err := NewCommand("version").Run()
|
||||
if err != nil {
|
||||
return "", err
|
||||
return err
|
||||
}
|
||||
|
||||
fields := strings.Fields(stdout)
|
||||
if len(fields) < 3 {
|
||||
return "", fmt.Errorf("not enough output: %s", stdout)
|
||||
return fmt.Errorf("not enough output: %s", stdout)
|
||||
}
|
||||
|
||||
var versionString string
|
||||
|
||||
// Handle special case on Windows.
|
||||
i := strings.Index(fields[2], "windows")
|
||||
if i >= 1 {
|
||||
gitVersion = fields[2][:i-1]
|
||||
return gitVersion, nil
|
||||
versionString = fields[2][:i-1]
|
||||
} else {
|
||||
versionString = fields[2]
|
||||
}
|
||||
|
||||
gitVersion = fields[2]
|
||||
return gitVersion, nil
|
||||
gitVersion, err = version.NewVersion(versionString)
|
||||
return err
|
||||
}
|
||||
|
||||
// SetExecutablePath changes the path of git executable and checks the file permission and version.
|
||||
@ -94,11 +104,17 @@ func SetExecutablePath(path string) error {
|
||||
}
|
||||
GitExecutable = absPath
|
||||
|
||||
gitVersion, err := BinVersion()
|
||||
err = LoadGitVersion()
|
||||
if err != nil {
|
||||
return fmt.Errorf("Git version missing: %v", err)
|
||||
}
|
||||
if version.Compare(gitVersion, GitVersionRequired, "<") {
|
||||
|
||||
versionRequired, err := version.NewVersion(GitVersionRequired)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if gitVersion.LessThan(versionRequired) {
|
||||
return fmt.Errorf("Git version not supported. Requires version > %v", GitVersionRequired)
|
||||
}
|
||||
|
||||
@ -108,6 +124,20 @@ func SetExecutablePath(path string) error {
|
||||
// Init initializes git module
|
||||
func Init(ctx context.Context) error {
|
||||
DefaultContext = ctx
|
||||
|
||||
// Save current git version on init to gitVersion otherwise it would require an RWMutex
|
||||
if err := LoadGitVersion(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Save if the go version used to compile gitea is greater or equal 1.15
|
||||
runtimeVersion, err := version.NewVersion(strings.TrimPrefix(runtime.Version(), "go"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
version115, _ := version.NewVersion("1.15")
|
||||
goVersionLessThan115 = runtimeVersion.LessThan(version115)
|
||||
|
||||
// Git requires setting user.name and user.email in order to commit changes - if they're not set just add some defaults
|
||||
for configKey, defaultValue := range map[string]string{"user.name": "Gitea", "user.email": "gitea@fake.local"} {
|
||||
if err := checkAndSetConfig(configKey, defaultValue, false); err != nil {
|
||||
@ -120,13 +150,13 @@ func Init(ctx context.Context) error {
|
||||
return err
|
||||
}
|
||||
|
||||
if version.Compare(gitVersion, "2.10", ">=") {
|
||||
if CheckGitVersionConstraint(">= 2.10") == nil {
|
||||
if err := checkAndSetConfig("receive.advertisePushOptions", "true", true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if version.Compare(gitVersion, "2.18", ">=") {
|
||||
if CheckGitVersionConstraint(">= 2.18") == nil {
|
||||
if err := checkAndSetConfig("core.commitGraph", "true", true); err != nil {
|
||||
return err
|
||||
}
|
||||
@ -143,6 +173,21 @@ func Init(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// CheckGitVersionConstraint check version constrain against local installed git version
|
||||
func CheckGitVersionConstraint(constraint string) error {
|
||||
if err := LoadGitVersion(); err != nil {
|
||||
return err
|
||||
}
|
||||
check, err := version.NewConstraint(constraint)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !check.Check(gitVersion) {
|
||||
return fmt.Errorf("installed git binary %s does not satisfy version constraint %s", gitVersion.Original(), constraint)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func checkAndSetConfig(key, defaultValue string, forceToDefault bool) error {
|
||||
stdout, stderr, err := process.GetManager().Exec("git.Init(get setting)", GitExecutable, "config", "--get", key)
|
||||
if err != nil {
|
||||
|
@ -7,8 +7,6 @@ package git
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
|
||||
"github.com/mcuadros/go-version"
|
||||
)
|
||||
|
||||
// CheckAttributeOpts represents the possible options to CheckAttribute
|
||||
@ -21,7 +19,7 @@ type CheckAttributeOpts struct {
|
||||
|
||||
// CheckAttribute return the Blame object of file
|
||||
func (repo *Repository) CheckAttribute(opts CheckAttributeOpts) (map[string]map[string]string, error) {
|
||||
binVersion, err := BinVersion()
|
||||
err := LoadGitVersion()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Git version missing: %v", err)
|
||||
}
|
||||
@ -42,7 +40,7 @@ func (repo *Repository) CheckAttribute(opts CheckAttributeOpts) (map[string]map[
|
||||
}
|
||||
|
||||
// git check-attr --cached first appears in git 1.7.8
|
||||
if opts.CachedOnly && version.Compare(binVersion, "1.7.8", ">=") {
|
||||
if opts.CachedOnly && CheckGitVersionConstraint(">= 1.7.8") == nil {
|
||||
cmdArgs = append(cmdArgs, "--cached")
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,6 @@ import (
|
||||
|
||||
"github.com/go-git/go-git/v5/plumbing"
|
||||
"github.com/go-git/go-git/v5/plumbing/object"
|
||||
"github.com/mcuadros/go-version"
|
||||
)
|
||||
|
||||
// GetRefCommitID returns the last commit ID string of given reference (branch or tag).
|
||||
@ -470,7 +469,7 @@ func (repo *Repository) getCommitsBeforeLimit(id SHA1, num int) (*list.List, err
|
||||
}
|
||||
|
||||
func (repo *Repository) getBranches(commit *Commit, limit int) ([]string, error) {
|
||||
if version.Compare(gitVersion, "2.7.0", ">=") {
|
||||
if CheckGitVersionConstraint(">= 2.7.0") == nil {
|
||||
stdout, err := NewCommand("for-each-ref", "--count="+strconv.Itoa(limit), "--format=%(refname:strip=2)", "--contains", commit.ID.String(), BranchPrefix).RunInDir(repo.Path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -10,7 +10,6 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/go-git/go-git/v5/plumbing"
|
||||
"github.com/mcuadros/go-version"
|
||||
)
|
||||
|
||||
// TagPrefix tags prefix path on the repository
|
||||
@ -239,8 +238,6 @@ func (repo *Repository) GetTags() ([]string, error) {
|
||||
return nil
|
||||
})
|
||||
|
||||
version.Sort(tagNames)
|
||||
|
||||
// Reverse order
|
||||
for i := 0; i < len(tagNames)/2; i++ {
|
||||
j := len(tagNames) - i - 1
|
||||
|
@ -11,8 +11,6 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/mcuadros/go-version"
|
||||
)
|
||||
|
||||
func (repo *Repository) getTree(id SHA1) (*Tree, error) {
|
||||
@ -65,7 +63,7 @@ type CommitTreeOpts struct {
|
||||
|
||||
// CommitTree creates a commit from a given tree id for the user with provided message
|
||||
func (repo *Repository) CommitTree(sig *Signature, tree *Tree, opts CommitTreeOpts) (SHA1, error) {
|
||||
binVersion, err := BinVersion()
|
||||
err := LoadGitVersion()
|
||||
if err != nil {
|
||||
return SHA1{}, err
|
||||
}
|
||||
@ -91,11 +89,11 @@ func (repo *Repository) CommitTree(sig *Signature, tree *Tree, opts CommitTreeOp
|
||||
_, _ = messageBytes.WriteString(opts.Message)
|
||||
_, _ = messageBytes.WriteString("\n")
|
||||
|
||||
if version.Compare(binVersion, "1.7.9", ">=") && (opts.KeyID != "" || opts.AlwaysSign) {
|
||||
if CheckGitVersionConstraint(">= 1.7.9") == nil && (opts.KeyID != "" || opts.AlwaysSign) {
|
||||
cmd.AddArguments(fmt.Sprintf("-S%s", opts.KeyID))
|
||||
}
|
||||
|
||||
if version.Compare(binVersion, "2.0.0", ">=") && opts.NoGPGSign {
|
||||
if CheckGitVersionConstraint(">= 2.0.0") == nil && opts.NoGPGSign {
|
||||
cmd.AddArguments("--no-gpg-sign")
|
||||
}
|
||||
|
||||
|
@ -19,8 +19,6 @@ import (
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/services/gitdiff"
|
||||
|
||||
"github.com/mcuadros/go-version"
|
||||
)
|
||||
|
||||
// TemporaryUploadRepository is a type to wrap our upload repositories as a shallow clone
|
||||
@ -196,7 +194,7 @@ func (t *TemporaryUploadRepository) CommitTreeWithDate(author, committer *models
|
||||
authorSig := author.NewGitSig()
|
||||
committerSig := committer.NewGitSig()
|
||||
|
||||
binVersion, err := git.BinVersion()
|
||||
err := git.LoadGitVersion()
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("Unable to get git version: %v", err)
|
||||
}
|
||||
@ -218,11 +216,11 @@ func (t *TemporaryUploadRepository) CommitTreeWithDate(author, committer *models
|
||||
args := []string{"commit-tree", treeHash, "-p", "HEAD"}
|
||||
|
||||
// Determine if we should sign
|
||||
if version.Compare(binVersion, "1.7.9", ">=") {
|
||||
if git.CheckGitVersionConstraint(">= 1.7.9") == nil {
|
||||
sign, keyID, _ := t.repo.SignCRUDAction(author, t.basePath, "HEAD")
|
||||
if sign {
|
||||
args = append(args, "-S"+keyID)
|
||||
} else if version.Compare(binVersion, "2.0.0", ">=") {
|
||||
} else if git.CheckGitVersionConstraint(">= 2.0.0") == nil {
|
||||
args = append(args, "--no-gpg-sign")
|
||||
}
|
||||
}
|
||||
@ -309,7 +307,7 @@ func (t *TemporaryUploadRepository) DiffIndex() (*gitdiff.Diff, error) {
|
||||
|
||||
// CheckAttribute checks the given attribute of the provided files
|
||||
func (t *TemporaryUploadRepository) CheckAttribute(attribute string, args ...string) (map[string]map[string]string, error) {
|
||||
binVersion, err := git.BinVersion()
|
||||
err := git.LoadGitVersion()
|
||||
if err != nil {
|
||||
log.Error("Error retrieving git version: %v", err)
|
||||
return nil, err
|
||||
@ -321,7 +319,7 @@ func (t *TemporaryUploadRepository) CheckAttribute(attribute string, args ...str
|
||||
cmdArgs := []string{"check-attr", "-z", attribute}
|
||||
|
||||
// git check-attr --cached first appears in git 1.7.8
|
||||
if version.Compare(binVersion, "1.7.8", ">=") {
|
||||
if git.CheckGitVersionConstraint(">= 1.7.8") == nil {
|
||||
cmdArgs = append(cmdArgs, "--cached")
|
||||
}
|
||||
cmdArgs = append(cmdArgs, "--")
|
||||
|
@ -19,7 +19,6 @@ import (
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
|
||||
"github.com/mcuadros/go-version"
|
||||
"github.com/unknwon/com"
|
||||
)
|
||||
|
||||
@ -122,7 +121,7 @@ func initRepoCommit(tmpPath string, repo *models.Repository, u *models.User, def
|
||||
return fmt.Errorf("git add --all: %v", err)
|
||||
}
|
||||
|
||||
binVersion, err := git.BinVersion()
|
||||
err = git.LoadGitVersion()
|
||||
if err != nil {
|
||||
return fmt.Errorf("Unable to get git version: %v", err)
|
||||
}
|
||||
@ -132,11 +131,11 @@ func initRepoCommit(tmpPath string, repo *models.Repository, u *models.User, def
|
||||
"-m", "Initial commit",
|
||||
}
|
||||
|
||||
if version.Compare(binVersion, "1.7.9", ">=") {
|
||||
if git.CheckGitVersionConstraint(">= 1.7.9") == nil {
|
||||
sign, keyID, _ := models.SignInitialCommit(tmpPath, u)
|
||||
if sign {
|
||||
args = append(args, "-S"+keyID)
|
||||
} else if version.Compare(binVersion, "2.0.0", ">=") {
|
||||
} else if git.CheckGitVersionConstraint(">= 2.0.0") == nil {
|
||||
args = append(args, "--no-gpg-sign")
|
||||
}
|
||||
}
|
||||
|
@ -9,8 +9,6 @@ import (
|
||||
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
|
||||
version "github.com/mcuadros/go-version"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -71,20 +69,20 @@ func newGit() {
|
||||
}
|
||||
git.DefaultCommandExecutionTimeout = time.Duration(Git.Timeout.Default) * time.Second
|
||||
|
||||
binVersion, err := git.BinVersion()
|
||||
version, err := git.LocalVersion()
|
||||
if err != nil {
|
||||
log.Fatal("Error retrieving git version: %v", err)
|
||||
}
|
||||
|
||||
if version.Compare(binVersion, "2.9", ">=") {
|
||||
if git.CheckGitVersionConstraint(">= 2.9") == nil {
|
||||
// Explicitly disable credential helper, otherwise Git credentials might leak
|
||||
git.GlobalCommandArgs = append(git.GlobalCommandArgs, "-c", "credential.helper=")
|
||||
}
|
||||
|
||||
var format = "Git Version: %s"
|
||||
var args = []interface{}{binVersion}
|
||||
var args = []interface{}{version.Original()}
|
||||
// Since git wire protocol has been released from git v2.18
|
||||
if Git.EnableAutoGitWireProtocol && version.Compare(binVersion, "2.18", ">=") {
|
||||
if Git.EnableAutoGitWireProtocol && git.CheckGitVersionConstraint(">= 2.18") == nil {
|
||||
git.GlobalCommandArgs = append(git.GlobalCommandArgs, "-c", "protocol.version=2")
|
||||
format += ", Wire Protocol %s Enabled"
|
||||
args = append(args, "Version 2") // for focus color
|
||||
|
@ -28,7 +28,6 @@ import (
|
||||
"code.gitea.io/gitea/modules/user"
|
||||
|
||||
shellquote "github.com/kballard/go-shellquote"
|
||||
version "github.com/mcuadros/go-version"
|
||||
"github.com/unknwon/com"
|
||||
ini "gopkg.in/ini.v1"
|
||||
"strk.kbt.io/projects/go/libravatar"
|
||||
@ -479,12 +478,12 @@ func CheckLFSVersion() {
|
||||
//Disable LFS client hooks if installed for the current OS user
|
||||
//Needs at least git v2.1.2
|
||||
|
||||
binVersion, err := git.BinVersion()
|
||||
err := git.LoadGitVersion()
|
||||
if err != nil {
|
||||
log.Fatal("Error retrieving git version: %v", err)
|
||||
}
|
||||
|
||||
if !version.Compare(binVersion, "2.1.2", ">=") {
|
||||
if git.CheckGitVersionConstraint(">= 2.1.2") != nil {
|
||||
LFS.StartServer = false
|
||||
log.Error("LFS server support needs at least Git v2.1.2")
|
||||
} else {
|
||||
|
@ -243,7 +243,9 @@ func Config(ctx *context.Context) {
|
||||
ctx.Data["DisableRouterLog"] = setting.DisableRouterLog
|
||||
ctx.Data["RunUser"] = setting.RunUser
|
||||
ctx.Data["RunMode"] = strings.Title(macaron.Env)
|
||||
ctx.Data["GitVersion"], _ = git.BinVersion()
|
||||
if version, err := git.LocalVersion(); err == nil {
|
||||
ctx.Data["GitVersion"] = version.Original()
|
||||
}
|
||||
ctx.Data["RepoRootPath"] = setting.RepoRootPath
|
||||
ctx.Data["CustomRootPath"] = setting.CustomPath
|
||||
ctx.Data["StaticRootPath"] = setting.StaticRootPath
|
||||
|
@ -33,7 +33,6 @@ import (
|
||||
gogit "github.com/go-git/go-git/v5"
|
||||
"github.com/go-git/go-git/v5/plumbing"
|
||||
"github.com/go-git/go-git/v5/plumbing/object"
|
||||
"github.com/mcuadros/go-version"
|
||||
"github.com/unknwon/com"
|
||||
)
|
||||
|
||||
@ -541,7 +540,7 @@ func LFSPointerFiles(ctx *context.Context) {
|
||||
return
|
||||
}
|
||||
ctx.Data["PageIsSettingsLFS"] = true
|
||||
binVersion, err := git.BinVersion()
|
||||
err := git.LoadGitVersion()
|
||||
if err != nil {
|
||||
log.Fatal("Error retrieving git version: %v", err)
|
||||
}
|
||||
@ -586,7 +585,7 @@ func LFSPointerFiles(ctx *context.Context) {
|
||||
go createPointerResultsFromCatFileBatch(catFileBatchReader, &wg, pointerChan, ctx.Repo.Repository, ctx.User)
|
||||
go pipeline.CatFileBatch(shasToBatchReader, catFileBatchWriter, &wg, basePath)
|
||||
go pipeline.BlobsLessThan1024FromCatFileBatchCheck(catFileCheckReader, shasToBatchWriter, &wg)
|
||||
if !version.Compare(binVersion, "2.6.0", ">=") {
|
||||
if git.CheckGitVersionConstraint(">= 2.6.0") != nil {
|
||||
revListReader, revListWriter := io.Pipe()
|
||||
shasToCheckReader, shasToCheckWriter := io.Pipe()
|
||||
wg.Add(2)
|
||||
|
@ -23,7 +23,6 @@ import (
|
||||
"code.gitea.io/gitea/modules/timeutil"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
|
||||
"github.com/mcuadros/go-version"
|
||||
"github.com/unknwon/com"
|
||||
)
|
||||
|
||||
@ -43,11 +42,11 @@ func readAddress(m *models.Mirror) {
|
||||
|
||||
func remoteAddress(repoPath string) (string, error) {
|
||||
var cmd *git.Command
|
||||
binVersion, err := git.BinVersion()
|
||||
err := git.LoadGitVersion()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if version.Compare(binVersion, "2.7", ">=") {
|
||||
if git.CheckGitVersionConstraint(">= 2.7") == nil {
|
||||
cmd = git.NewCommand("remote", "get-url", "origin")
|
||||
} else {
|
||||
cmd = git.NewCommand("config", "--get", "remote.origin.url")
|
||||
|
@ -25,8 +25,6 @@ import (
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/timeutil"
|
||||
issue_service "code.gitea.io/gitea/services/issue"
|
||||
|
||||
"github.com/mcuadros/go-version"
|
||||
)
|
||||
|
||||
// Merge merges pull request to base repository.
|
||||
@ -113,9 +111,9 @@ func Merge(pr *models.PullRequest, doer *models.User, baseGitRepo *git.Repositor
|
||||
|
||||
// rawMerge perform the merge operation without changing any pull information in database
|
||||
func rawMerge(pr *models.PullRequest, doer *models.User, mergeStyle models.MergeStyle, message string) (string, error) {
|
||||
binVersion, err := git.BinVersion()
|
||||
err := git.LoadGitVersion()
|
||||
if err != nil {
|
||||
log.Error("git.BinVersion: %v", err)
|
||||
log.Error("git.LoadGitVersion: %v", err)
|
||||
return "", fmt.Errorf("Unable to get git version: %v", err)
|
||||
}
|
||||
|
||||
@ -157,7 +155,7 @@ func rawMerge(pr *models.PullRequest, doer *models.User, mergeStyle models.Merge
|
||||
}
|
||||
|
||||
var gitConfigCommand func() *git.Command
|
||||
if version.Compare(binVersion, "1.8.0", ">=") {
|
||||
if git.CheckGitVersionConstraint(">= 1.8.0") == nil {
|
||||
gitConfigCommand = func() *git.Command {
|
||||
return git.NewCommand("config", "--local")
|
||||
}
|
||||
@ -213,11 +211,11 @@ func rawMerge(pr *models.PullRequest, doer *models.User, mergeStyle models.Merge
|
||||
|
||||
// Determine if we should sign
|
||||
signArg := ""
|
||||
if version.Compare(binVersion, "1.7.9", ">=") {
|
||||
if git.CheckGitVersionConstraint(">= 1.7.9") == nil {
|
||||
sign, keyID, _ := pr.SignMerge(doer, tmpBasePath, "HEAD", trackingBranch)
|
||||
if sign {
|
||||
signArg = "-S" + keyID
|
||||
} else if version.Compare(binVersion, "2.0.0", ">=") {
|
||||
} else if git.CheckGitVersionConstraint(">= 2.0.0") == nil {
|
||||
signArg = "--no-gpg-sign"
|
||||
}
|
||||
}
|
||||
|
354
vendor/github.com/hashicorp/go-version/LICENSE
generated
vendored
Normal file
354
vendor/github.com/hashicorp/go-version/LICENSE
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
66
vendor/github.com/hashicorp/go-version/README.md
generated
vendored
Normal file
66
vendor/github.com/hashicorp/go-version/README.md
generated
vendored
Normal file
@ -0,0 +1,66 @@
|
||||
# Versioning Library for Go
|
||||
[](https://circleci.com/gh/hashicorp/go-version/tree/master)
|
||||
[](https://godoc.org/github.com/hashicorp/go-version)
|
||||
|
||||
go-version is a library for parsing versions and version constraints,
|
||||
and verifying versions against a set of constraints. go-version
|
||||
can sort a collection of versions properly, handles prerelease/beta
|
||||
versions, can increment versions, etc.
|
||||
|
||||
Versions used with go-version must follow [SemVer](http://semver.org/).
|
||||
|
||||
## Installation and Usage
|
||||
|
||||
Package documentation can be found on
|
||||
[GoDoc](http://godoc.org/github.com/hashicorp/go-version).
|
||||
|
||||
Installation can be done with a normal `go get`:
|
||||
|
||||
```
|
||||
$ go get github.com/hashicorp/go-version
|
||||
```
|
||||
|
||||
#### Version Parsing and Comparison
|
||||
|
||||
```go
|
||||
v1, err := version.NewVersion("1.2")
|
||||
v2, err := version.NewVersion("1.5+metadata")
|
||||
|
||||
// Comparison example. There is also GreaterThan, Equal, and just
|
||||
// a simple Compare that returns an int allowing easy >=, <=, etc.
|
||||
if v1.LessThan(v2) {
|
||||
fmt.Printf("%s is less than %s", v1, v2)
|
||||
}
|
||||
```
|
||||
|
||||
#### Version Constraints
|
||||
|
||||
```go
|
||||
v1, err := version.NewVersion("1.2")
|
||||
|
||||
// Constraints example.
|
||||
constraints, err := version.NewConstraint(">= 1.0, < 1.4")
|
||||
if constraints.Check(v1) {
|
||||
fmt.Printf("%s satisfies constraints %s", v1, constraints)
|
||||
}
|
||||
```
|
||||
|
||||
#### Version Sorting
|
||||
|
||||
```go
|
||||
versionsRaw := []string{"1.1", "0.7.1", "1.4-beta", "1.4", "2"}
|
||||
versions := make([]*version.Version, len(versionsRaw))
|
||||
for i, raw := range versionsRaw {
|
||||
v, _ := version.NewVersion(raw)
|
||||
versions[i] = v
|
||||
}
|
||||
|
||||
// After this, the versions are properly sorted
|
||||
sort.Sort(version.Collection(versions))
|
||||
```
|
||||
|
||||
## Issues and Contributing
|
||||
|
||||
If you find an issue with this library, please report an issue. If you'd
|
||||
like, we welcome any contributions. Fork this library and submit a pull
|
||||
request.
|
204
vendor/github.com/hashicorp/go-version/constraint.go
generated
vendored
Normal file
204
vendor/github.com/hashicorp/go-version/constraint.go
generated
vendored
Normal file
@ -0,0 +1,204 @@
|
||||
package version
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Constraint represents a single constraint for a version, such as
|
||||
// ">= 1.0".
|
||||
type Constraint struct {
|
||||
f constraintFunc
|
||||
check *Version
|
||||
original string
|
||||
}
|
||||
|
||||
// Constraints is a slice of constraints. We make a custom type so that
|
||||
// we can add methods to it.
|
||||
type Constraints []*Constraint
|
||||
|
||||
type constraintFunc func(v, c *Version) bool
|
||||
|
||||
var constraintOperators map[string]constraintFunc
|
||||
|
||||
var constraintRegexp *regexp.Regexp
|
||||
|
||||
func init() {
|
||||
constraintOperators = map[string]constraintFunc{
|
||||
"": constraintEqual,
|
||||
"=": constraintEqual,
|
||||
"!=": constraintNotEqual,
|
||||
">": constraintGreaterThan,
|
||||
"<": constraintLessThan,
|
||||
">=": constraintGreaterThanEqual,
|
||||
"<=": constraintLessThanEqual,
|
||||
"~>": constraintPessimistic,
|
||||
}
|
||||
|
||||
ops := make([]string, 0, len(constraintOperators))
|
||||
for k := range constraintOperators {
|
||||
ops = append(ops, regexp.QuoteMeta(k))
|
||||
}
|
||||
|
||||
constraintRegexp = regexp.MustCompile(fmt.Sprintf(
|
||||
`^\s*(%s)\s*(%s)\s*$`,
|
||||
strings.Join(ops, "|"),
|
||||
VersionRegexpRaw))
|
||||
}
|
||||
|
||||
// NewConstraint will parse one or more constraints from the given
|
||||
// constraint string. The string must be a comma-separated list of
|
||||
// constraints.
|
||||
func NewConstraint(v string) (Constraints, error) {
|
||||
vs := strings.Split(v, ",")
|
||||
result := make([]*Constraint, len(vs))
|
||||
for i, single := range vs {
|
||||
c, err := parseSingle(single)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result[i] = c
|
||||
}
|
||||
|
||||
return Constraints(result), nil
|
||||
}
|
||||
|
||||
// Check tests if a version satisfies all the constraints.
|
||||
func (cs Constraints) Check(v *Version) bool {
|
||||
for _, c := range cs {
|
||||
if !c.Check(v) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// Returns the string format of the constraints
|
||||
func (cs Constraints) String() string {
|
||||
csStr := make([]string, len(cs))
|
||||
for i, c := range cs {
|
||||
csStr[i] = c.String()
|
||||
}
|
||||
|
||||
return strings.Join(csStr, ",")
|
||||
}
|
||||
|
||||
// Check tests if a constraint is validated by the given version.
|
||||
func (c *Constraint) Check(v *Version) bool {
|
||||
return c.f(v, c.check)
|
||||
}
|
||||
|
||||
func (c *Constraint) String() string {
|
||||
return c.original
|
||||
}
|
||||
|
||||
func parseSingle(v string) (*Constraint, error) {
|
||||
matches := constraintRegexp.FindStringSubmatch(v)
|
||||
if matches == nil {
|
||||
return nil, fmt.Errorf("Malformed constraint: %s", v)
|
||||
}
|
||||
|
||||
check, err := NewVersion(matches[2])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &Constraint{
|
||||
f: constraintOperators[matches[1]],
|
||||
check: check,
|
||||
original: v,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func prereleaseCheck(v, c *Version) bool {
|
||||
switch vPre, cPre := v.Prerelease() != "", c.Prerelease() != ""; {
|
||||
case cPre && vPre:
|
||||
// A constraint with a pre-release can only match a pre-release version
|
||||
// with the same base segments.
|
||||
return reflect.DeepEqual(c.Segments64(), v.Segments64())
|
||||
|
||||
case !cPre && vPre:
|
||||
// A constraint without a pre-release can only match a version without a
|
||||
// pre-release.
|
||||
return false
|
||||
|
||||
case cPre && !vPre:
|
||||
// OK, except with the pessimistic operator
|
||||
case !cPre && !vPre:
|
||||
// OK
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Constraint functions
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
func constraintEqual(v, c *Version) bool {
|
||||
return v.Equal(c)
|
||||
}
|
||||
|
||||
func constraintNotEqual(v, c *Version) bool {
|
||||
return !v.Equal(c)
|
||||
}
|
||||
|
||||
func constraintGreaterThan(v, c *Version) bool {
|
||||
return prereleaseCheck(v, c) && v.Compare(c) == 1
|
||||
}
|
||||
|
||||
func constraintLessThan(v, c *Version) bool {
|
||||
return prereleaseCheck(v, c) && v.Compare(c) == -1
|
||||
}
|
||||
|
||||
func constraintGreaterThanEqual(v, c *Version) bool {
|
||||
return prereleaseCheck(v, c) && v.Compare(c) >= 0
|
||||
}
|
||||
|
||||
func constraintLessThanEqual(v, c *Version) bool {
|
||||
return prereleaseCheck(v, c) && v.Compare(c) <= 0
|
||||
}
|
||||
|
||||
func constraintPessimistic(v, c *Version) bool {
|
||||
// Using a pessimistic constraint with a pre-release, restricts versions to pre-releases
|
||||
if !prereleaseCheck(v, c) || (c.Prerelease() != "" && v.Prerelease() == "") {
|
||||
return false
|
||||
}
|
||||
|
||||
// If the version being checked is naturally less than the constraint, then there
|
||||
// is no way for the version to be valid against the constraint
|
||||
if v.LessThan(c) {
|
||||
return false
|
||||
}
|
||||
// We'll use this more than once, so grab the length now so it's a little cleaner
|
||||
// to write the later checks
|
||||
cs := len(c.segments)
|
||||
|
||||
// If the version being checked has less specificity than the constraint, then there
|
||||
// is no way for the version to be valid against the constraint
|
||||
if cs > len(v.segments) {
|
||||
return false
|
||||
}
|
||||
|
||||
// Check the segments in the constraint against those in the version. If the version
|
||||
// being checked, at any point, does not have the same values in each index of the
|
||||
// constraints segments, then it cannot be valid against the constraint.
|
||||
for i := 0; i < c.si-1; i++ {
|
||||
if v.segments[i] != c.segments[i] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// Check the last part of the segment in the constraint. If the version segment at
|
||||
// this index is less than the constraints segment at this index, then it cannot
|
||||
// be valid against the constraint
|
||||
if c.segments[cs-1] > v.segments[cs-1] {
|
||||
return false
|
||||
}
|
||||
|
||||
// If nothing has rejected the version by now, it's valid
|
||||
return true
|
||||
}
|
1
vendor/github.com/hashicorp/go-version/go.mod
generated
vendored
Normal file
1
vendor/github.com/hashicorp/go-version/go.mod
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
module github.com/hashicorp/go-version
|
384
vendor/github.com/hashicorp/go-version/version.go
generated
vendored
Normal file
384
vendor/github.com/hashicorp/go-version/version.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
17
vendor/github.com/hashicorp/go-version/version_collection.go
generated
vendored
Normal file
17
vendor/github.com/hashicorp/go-version/version_collection.go
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
package version
|
||||
|
||||
// Collection is a type that implements the sort.Interface interface
|
||||
// so that versions can be sorted.
|
||||
type Collection []*Version
|
||||
|
||||
func (v Collection) Len() int {
|
||||
return len(v)
|
||||
}
|
||||
|
||||
func (v Collection) Less(i, j int) bool {
|
||||
return v[i].LessThan(v[j])
|
||||
}
|
||||
|
||||
func (v Collection) Swap(i, j int) {
|
||||
v[i], v[j] = v[j], v[i]
|
||||
}
|
22
vendor/github.com/mcuadros/go-version/.gitignore
generated
vendored
22
vendor/github.com/mcuadros/go-version/.gitignore
generated
vendored
@ -1,22 +0,0 @@
|
||||
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||
*.o
|
||||
*.a
|
||||
*.so
|
||||
|
||||
# Folders
|
||||
_obj
|
||||
_test
|
||||
|
||||
# Architecture specific extensions/prefixes
|
||||
*.[568vq]
|
||||
[568vq].out
|
||||
|
||||
*.cgo1.go
|
||||
*.cgo2.c
|
||||
_cgo_defun.c
|
||||
_cgo_gotypes.go
|
||||
_cgo_export.*
|
||||
|
||||
_testmain.go
|
||||
|
||||
*.exe
|
1
vendor/github.com/mcuadros/go-version/.travis.yml
generated
vendored
1
vendor/github.com/mcuadros/go-version/.travis.yml
generated
vendored
@ -1 +0,0 @@
|
||||
language: go
|
19
vendor/github.com/mcuadros/go-version/LICENSE
generated
vendored
19
vendor/github.com/mcuadros/go-version/LICENSE
generated
vendored
@ -1,19 +0,0 @@
|
||||
Copyright (c) 2013 Máximo Cuadros
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
80
vendor/github.com/mcuadros/go-version/README.md
generated
vendored
80
vendor/github.com/mcuadros/go-version/README.md
generated
vendored
@ -1,80 +0,0 @@
|
||||
go-version [](https://travis-ci.org/mcuadros/go-version) [](http://godoc.org/github.com/mcuadros/go-version)
|
||||
==============================
|
||||
|
||||
Version normalizer and comparison library for go, heavy based on PHP version_compare function and Version comparsion libs from [Composer](https://github.com/composer/composer) PHP project
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
The recommended way to install go-version
|
||||
|
||||
```
|
||||
go get github.com/mcuadros/go-version
|
||||
```
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
How import the package
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/mcuadros/go-version"
|
||||
)
|
||||
```
|
||||
|
||||
`version.Normalize()`: Normalizes a version string to be able to perform comparisons on it
|
||||
|
||||
```go
|
||||
version.Normalize("10.4.13-b")
|
||||
//Returns: 10.4.13.0-beta
|
||||
```
|
||||
|
||||
|
||||
`version.CompareSimple()`: Compares two normalizated version number strings
|
||||
|
||||
```go
|
||||
version.CompareSimple("1.2", "1.0.1")
|
||||
//Returns: 1
|
||||
|
||||
version.CompareSimple("1.0rc1", "1.0")
|
||||
//Returns: -1
|
||||
```
|
||||
|
||||
|
||||
`version.Compare()`: Compares two normalizated version number strings, for a particular relationship
|
||||
|
||||
```go
|
||||
version.Compare("1.0-dev", "1.0", "<")
|
||||
//Returns: true
|
||||
|
||||
version.Compare("1.0rc1", "1.0", ">=")
|
||||
//Returns: false
|
||||
|
||||
version.Compare("2.3.4", "v3.1.2", "<")
|
||||
//Returns: true
|
||||
```
|
||||
|
||||
`version.ConstrainGroup.Match()`: Match a given version againts a group of constrains, read about constraint string format at [Composer documentation](http://getcomposer.org/doc/01-basic-usage.md#package-versions)
|
||||
|
||||
```go
|
||||
c := version.NewConstrainGroupFromString(">2.0,<=3.0")
|
||||
c.Match("2.5.0beta")
|
||||
//Returns: true
|
||||
|
||||
c := version.NewConstrainGroupFromString("~1.2.3")
|
||||
c.Match("1.2.3.5")
|
||||
//Returns: true
|
||||
```
|
||||
|
||||
`version.Sort()`: Sorts a string slice of version number strings using version.CompareSimple()
|
||||
|
||||
```go
|
||||
version.Sort([]string{"1.10-dev", "1.0rc1", "1.0", "1.0-dev"})
|
||||
//Returns []string{"1.0-dev", "1.0rc1", "1.0", "1.10-dev"}
|
||||
```
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
MIT, see [LICENSE](LICENSE)
|
173
vendor/github.com/mcuadros/go-version/compare.go
generated
vendored
173
vendor/github.com/mcuadros/go-version/compare.go
generated
vendored
@ -1,173 +0,0 @@
|
||||
package version
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var regexpSigns = regexp.MustCompile(`[_\-+]`)
|
||||
var regexpDotBeforeDigit = regexp.MustCompile(`([^.\d]+)`)
|
||||
var regexpMultipleDots = regexp.MustCompile(`\.{2,}`)
|
||||
|
||||
var specialForms = map[string]int{
|
||||
"SNAPSHOT": -7,
|
||||
"snapshot": -7,
|
||||
"dev": -6,
|
||||
"alpha": -5,
|
||||
"a": -5,
|
||||
"beta": -4,
|
||||
"b": -4,
|
||||
"RC": -3,
|
||||
"rc": -3,
|
||||
"#": -2,
|
||||
"p": 1,
|
||||
"pl": 1,
|
||||
}
|
||||
|
||||
var unknownForm int = -7
|
||||
|
||||
// Compares two version number strings, for a particular relationship
|
||||
//
|
||||
// Usage
|
||||
// version.Compare("2.3.4", "v3.1.2", "<")
|
||||
// Returns: true
|
||||
//
|
||||
// version.Compare("1.0rc1", "1.0", ">=")
|
||||
// Returns: false
|
||||
func Compare(version1, version2, operator string) bool {
|
||||
version1N := Normalize(version1)
|
||||
version2N := Normalize(version2)
|
||||
|
||||
return CompareNormalized(version1N, version2N, operator)
|
||||
}
|
||||
|
||||
// Compares two normalizated version number strings, for a particular relationship
|
||||
//
|
||||
// The function first replaces _, - and + with a dot . in the version strings
|
||||
// and also inserts dots . before and after any non number so that for example
|
||||
// '4.3.2RC1' becomes '4.3.2.RC.1'.
|
||||
//
|
||||
// Then it splits the results like if you were using Split(version, '.').
|
||||
// Then it compares the parts starting from left to right. If a part contains
|
||||
// special version strings these are handled in the following order: any string
|
||||
// not found in this list:
|
||||
// < dev < alpha = a < beta = b < RC = rc < # < pl = p.
|
||||
//
|
||||
// Usage
|
||||
// version.CompareNormalized("1.0-dev", "1.0", "<")
|
||||
// Returns: true
|
||||
//
|
||||
// version.CompareNormalized("1.0rc1", "1.0", ">=")
|
||||
// Returns: false
|
||||
//
|
||||
// version.CompareNormalized("1.0", "1.0b1", "ge")
|
||||
// Returns: true
|
||||
func CompareNormalized(version1, version2, operator string) bool {
|
||||
compare := CompareSimple(version1, version2)
|
||||
|
||||
switch {
|
||||
case operator == ">" || operator == "gt":
|
||||
return compare > 0
|
||||
case operator == ">=" || operator == "ge":
|
||||
return compare >= 0
|
||||
case operator == "<=" || operator == "le":
|
||||
return compare <= 0
|
||||
case operator == "==" || operator == "=" || operator == "eq":
|
||||
return compare == 0
|
||||
case operator == "<>" || operator == "!=" || operator == "ne":
|
||||
return compare != 0
|
||||
case operator == "" || operator == "<" || operator == "lt":
|
||||
return compare < 0
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Compares two normalizated version number strings
|
||||
//
|
||||
// Just the same of CompareVersion but return a int result, 0 if both version
|
||||
// are equal, 1 if the right side is bigger and -1 if the right side is lower
|
||||
//
|
||||
// Usage
|
||||
// version.CompareSimple("1.2", "1.0.1")
|
||||
// Returns: 1
|
||||
//
|
||||
// version.CompareSimple("1.0rc1", "1.0")
|
||||
// Returns: -1
|
||||
func CompareSimple(version1, version2 string) int {
|
||||
var x, r, l int = 0, 0, 0
|
||||
|
||||
v1, v2 := prepVersion(version1), prepVersion(version2)
|
||||
len1, len2 := len(v1), len(v2)
|
||||
|
||||
if len1 > len2 {
|
||||
x = len1
|
||||
} else {
|
||||
x = len2
|
||||
}
|
||||
|
||||
for i := 0; i < x; i++ {
|
||||
if i < len1 && i < len2 {
|
||||
if v1[i] == v2[i] {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
r = 0
|
||||
if i < len1 {
|
||||
r = numVersion(v1[i])
|
||||
}
|
||||
|
||||
l = 0
|
||||
if i < len2 {
|
||||
l = numVersion(v2[i])
|
||||
}
|
||||
|
||||
if r < l {
|
||||
return -1
|
||||
} else if r > l {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
func prepVersion(version string) []string {
|
||||
if len(version) == 0 {
|
||||
return []string{""}
|
||||
}
|
||||
|
||||
version = regexpSigns.ReplaceAllString(version, ".")
|
||||
version = regexpDotBeforeDigit.ReplaceAllString(version, ".$1.")
|
||||
version = regexpMultipleDots.ReplaceAllString(version, ".")
|
||||
|
||||
return strings.Split(version, ".")
|
||||
}
|
||||
|
||||
func numVersion(value string) int {
|
||||
if value == "" {
|
||||
return 0
|
||||
}
|
||||
|
||||
if number, err := strconv.Atoi(value); err == nil {
|
||||
return number
|
||||
}
|
||||
|
||||
if special, ok := specialForms[value]; ok {
|
||||
return special
|
||||
}
|
||||
|
||||
return unknownForm
|
||||
}
|
||||
|
||||
func ValidSimpleVersionFormat(value string) bool {
|
||||
normalized := Normalize(value)
|
||||
for _, component := range prepVersion(normalized) {
|
||||
if numVersion(component) == unknownForm {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
49
vendor/github.com/mcuadros/go-version/constraint.go
generated
vendored
49
vendor/github.com/mcuadros/go-version/constraint.go
generated
vendored
@ -1,49 +0,0 @@
|
||||
package version
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Constraint struct {
|
||||
operator string
|
||||
version string
|
||||
}
|
||||
|
||||
// Return a new Constrain and sets operator and version to compare
|
||||
func NewConstrain(operator, version string) *Constraint {
|
||||
constraint := new(Constraint)
|
||||
constraint.SetOperator(operator)
|
||||
constraint.SetVersion(version)
|
||||
|
||||
return constraint
|
||||
}
|
||||
|
||||
// Sets operator to compare
|
||||
func (self *Constraint) SetOperator(operator string) {
|
||||
self.operator = operator
|
||||
}
|
||||
|
||||
// Get operator to compare
|
||||
func (self *Constraint) GetOperator() string {
|
||||
return self.operator
|
||||
}
|
||||
|
||||
// Sets version to compare
|
||||
func (self *Constraint) SetVersion(version string) {
|
||||
self.version = version
|
||||
}
|
||||
|
||||
// Get version to compare
|
||||
func (self *Constraint) GetVersion() string {
|
||||
return self.version
|
||||
}
|
||||
|
||||
// Match a given version againts the constraint
|
||||
func (self *Constraint) Match(version string) bool {
|
||||
return Compare(version, self.version, self.operator)
|
||||
}
|
||||
|
||||
// Return a string representation
|
||||
func (self *Constraint) String() string {
|
||||
return strings.Trim(self.operator+" "+self.version, " ")
|
||||
}
|
6
vendor/github.com/mcuadros/go-version/doc.go
generated
vendored
6
vendor/github.com/mcuadros/go-version/doc.go
generated
vendored
@ -1,6 +0,0 @@
|
||||
/*
|
||||
Version normalizer and comparison library for go, heavy based on PHP
|
||||
version_compare function and Version comparsion libs from Composer
|
||||
(https://github.com/composer/composer) PHP project
|
||||
*/
|
||||
package version
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user