aboutsummaryrefslogtreecommitdiffstats
path: root/modules/git/version.go
blob: b535521ec447205b660a4e39110105f5242dd8e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// Copyright 2014 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.

package git

import (
	"errors"
	"strings"

	"github.com/Unknwon/com"
)

var (
	// Cached Git version.
	gitVer *Version
)

// Version represents version of Git.
type Version struct {
	Major, Minor, Patch int
}

func ParseVersion(verStr string) (*Version, error) {
	infos := strings.Split(verStr, ".")
	if len(infos) < 3 {
		return nil, errors.New("incorrect version input")
	}

	v := &Version{}
	for i, s := range infos {
		switch i {
		case 0:
			v.Major, _ = com.StrTo(s).Int()
		case 1:
			v.Minor, _ = com.StrTo(s).Int()
		case 2:
			v.Patch, _ = com.StrTo(strings.TrimSpace(s)).Int()
		}
	}
	return v, nil
}

func MustParseVersion(verStr string) *Version {
	v, _ := ParseVersion(verStr)
	return v
}

// Compare compares two versions,
// it returns 1 if original is greater, -1 if original is smaller, 0 if equal.
func (v *Version) Compare(that *Version) int {
	if v.Major > that.Major {
		return 1
	} else if v.Major < that.Major {
		return -1
	}

	if v.Minor > that.Minor {
		return 1
	} else if v.Minor < that.Minor {
		return -1
	}

	if v.Patch > that.Patch {
		return 1
	} else if v.Patch < that.Patch {
		return -1
	}

	return 0
}

func (v *Version) LessThan(that *Version) bool {
	return v.Compare(that) < 0
}

func (v *Version) AtLeast(that *Version) bool {
	return v.Compare(that) >= 0
}

// GetVersion returns current Git version installed.
func GetVersion() (*Version, error) {
	if gitVer != nil {
		return gitVer, nil
	}

	stdout, stderr, err := com.ExecCmd("git", "version")
	if err != nil {
		return nil, errors.New(stderr)
	}

	infos := strings.Split(stdout, " ")
	if len(infos) < 3 {
		return nil, errors.New("not enough output")
	}

	gitVer, err = ParseVersion(infos[2])
	return gitVer, err
}