diff --git a/tools/git/git.go b/tools/git/git.go new file mode 100644 index 00000000..964ed43a --- /dev/null +++ b/tools/git/git.go @@ -0,0 +1,58 @@ +package git + +import ( + "os" + "os/exec" + "path/filepath" + "strings" +) + +const ( + VersionUndefined = "undefined" +) + +func getRepoRoot() string { + GOPATH := os.Getenv("GOPATH") + return filepath.Join(GOPATH, "src", "github.com", "v2ray", "v2ray-core") +} + +func RevParse(args ...string) (string, error) { + args = append([]string{"rev-parse"}, args...) + cmd := exec.Command("git", args...) + cmd.Dir = getRepoRoot() + output, err := cmd.Output() + if err != nil { + return "", err + } + return strings.TrimSpace(string(output)), nil +} + +func NameRev(args ...string) (string, error) { + args = append([]string{"name-rev"}, args...) + cmd := exec.Command("git", args...) + cmd.Dir = getRepoRoot() + output, err := cmd.Output() + if err != nil { + return "", err + } + return strings.TrimSpace(string(output)), nil +} + +func RepoVersion(rev string) (string, error) { + rev, err := RevParse(rev) + if err != nil { + return "", err + } + version, err := NameRev("name-rev", "--tags", "--name-only", rev) + if err != nil { + return "", err + } + if strings.HasSuffix(version, "^0") { + version = version[:len(version)-2] + } + return version, nil +} + +func RepoVersionHead() (string, error) { + return RepoVersion("HEAD") +} diff --git a/tools/git/git_test.go b/tools/git/git_test.go new file mode 100644 index 00000000..d7a17307 --- /dev/null +++ b/tools/git/git_test.go @@ -0,0 +1,31 @@ +package git + +import ( + "testing" + + "github.com/v2ray/v2ray-core/testing/unit" +) + +func TestRevParse(t *testing.T) { + assert := unit.Assert(t) + + rev, err := RevParse("HEAD") + assert.Error(err).IsNil() + assert.Int(len(rev)).GreaterThan(0) + + rev, err = RevParse("v0.8") + assert.Error(err).IsNil() + assert.String(rev).Equals("de7a1d30c3e6bda6a1297b5815369fcfa0e74f0e") +} + +func TestRepoVersion(t *testing.T) { + assert := unit.Assert(t) + + version, err := RepoVersionHead() + assert.Error(err).IsNil() + assert.Int(len(version)).GreaterThan(0) + + version, err = RepoVersion("de7a1d30c3e6bda6a1297b5815369fcfa0e74f0e") + assert.Error(err).IsNil() + assert.String(version).Equals("v0.8") +}