From 67c44b7d27a15dd415651ccb9a2ad486a3738183 Mon Sep 17 00:00:00 2001
From: Linquize <linquize@yahoo.com.hk>
Date: Sat, 4 Oct 2014 00:25:54 +0800
Subject: [PATCH] If git >= 2.0, sort tags in descending order by version
 number

---
 modules/git/repo_tag.go | 12 ++++++++++++
 modules/git/version.go  |  4 ++++
 2 files changed, 16 insertions(+)

diff --git a/modules/git/repo_tag.go b/modules/git/repo_tag.go
index 77ae3db00..ed994d48a 100644
--- a/modules/git/repo_tag.go
+++ b/modules/git/repo_tag.go
@@ -22,6 +22,9 @@ func (repo *Repository) IsTagExist(tagName string) bool {
 
 // GetTags returns all tags of given repository.
 func (repo *Repository) GetTags() ([]string, error) {
+	if gitVer.AtLeast(MustParseVersion("2.0.0")) {
+		return repo.getTagsReversed()
+	}
 	stdout, stderr, err := com.ExecCmdDir(repo.Path, "git", "tag", "-l")
 	if err != nil {
 		return nil, errors.New(stderr)
@@ -30,6 +33,15 @@ func (repo *Repository) GetTags() ([]string, error) {
 	return tags[:len(tags)-1], nil
 }
 
+func (repo *Repository) getTagsReversed() ([]string, error) {
+	stdout, stderr, err := com.ExecCmdDir(repo.Path, "git", "tag", "-l", "--sort=-v:refname")
+	if err != nil {
+		return nil, errors.New(stderr)
+	}
+	tags := strings.Split(stdout, "\n")
+	return tags[:len(tags)-1], nil
+}
+
 func (repo *Repository) CreateTag(tagName, idStr string) error {
 	_, stderr, err := com.ExecCmdDir(repo.Path, "git", "tag", tagName, idStr)
 	if err != nil {
diff --git a/modules/git/version.go b/modules/git/version.go
index 9908d11e2..b535521ec 100644
--- a/modules/git/version.go
+++ b/modules/git/version.go
@@ -74,6 +74,10 @@ 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 {