diff options
| -rw-r--r-- | pkg/git/git.go | 59 | 
1 files changed, 51 insertions, 8 deletions
| diff --git a/pkg/git/git.go b/pkg/git/git.go index 7341c1b..a9c42ce 100644 --- a/pkg/git/git.go +++ b/pkg/git/git.go @@ -8,6 +8,7 @@ import (  	"io"  	"io/fs"  	"path" +	"sort"  	"time"  	"github.com/go-git/go-git/v5" @@ -26,10 +27,12 @@ type (  	GitRepository struct {  		path       string  		repository *git.Repository - -		ref plumbing.Hash -		// this is setRef when ref is setRef -		setRef bool +		ref        plumbing.Hash +		setRef     bool +	} +	TagReference struct { +		ref *plumbing.Reference +		tag *object.Tag  	}  	infoWrapper struct {  		name    string @@ -38,10 +41,9 @@ type (  		modTime time.Time  		isDir   bool  	} - -	TagReference struct { -		ref *plumbing.Reference -		tag *object.Tag +	tagList struct { +		refs []*TagReference +		r    *git.Repository  	}  ) @@ -152,6 +154,10 @@ func (g *GitRepository) Tags() ([]*TagReference, error) {  		return nil, err  	} +	// tagList modify the underlying tag list. +	tagList := &tagList{r: g.repository, refs: tags} +	sort.Sort(tagList) +  	return tags, nil  } @@ -395,3 +401,40 @@ func (t *TagReference) Message() string {  	return ""  } + +func (self *tagList) Len() int { +	return len(self.refs) +} + +func (self *tagList) Swap(i, j int) { +	self.refs[i], self.refs[j] = self.refs[j], self.refs[i] +} + +func (self *tagList) Less(i, j int) bool { +	var dateI time.Time +	var dateJ time.Time + +	if self.refs[i].tag != nil { +		dateI = self.refs[i].tag.Tagger.When +	} else { +		c, err := self.r.CommitObject(self.refs[i].ref.Hash()) +		if err != nil { +			dateI = time.Now() +		} else { +			dateI = c.Committer.When +		} +	} + +	if self.refs[j].tag != nil { +		dateJ = self.refs[j].tag.Tagger.When +	} else { +		c, err := self.r.CommitObject(self.refs[j].ref.Hash()) +		if err != nil { +			dateJ = time.Now() +		} else { +			dateJ = c.Committer.When +		} +	} + +	return dateI.After(dateJ) +} | 
