diff --git a/cmd/commithook/gico.go b/cmd/commithook/gico.go index 8e06e9c..52a147a 100644 --- a/cmd/commithook/gico.go +++ b/cmd/commithook/gico.go @@ -4,7 +4,6 @@ import ( "flag" "fmt" "os" - "time" "github.com/taigrr/gico/types" "github.com/taigrr/gico/ui" @@ -43,15 +42,6 @@ func NewDataSet() types.DataSet { return make(types.DataSet) } -func NewCommit(Author, Message, Repo, Path string, LOC int) types.Commit { - ci := types.Commit{ - Message: Message, - Author: Author, LOC: LOC, TimeStamp: time.Now(), - Repo: Repo, Path: Path, - } - return ci -} - func loadRepo() { } diff --git a/commits/cache.go b/commits/cache.go index ded46a2..e6ec48e 100644 --- a/commits/cache.go +++ b/commits/cache.go @@ -26,6 +26,23 @@ func init() { repoCache = make(map[string][]types.Commit) } +func CacheRepo(path string, commits []types.Commit) { + mapTex.Lock() + defer mapTex.Unlock() + repoCache[path] = commits +} + +func GetCachedRepo(path string, head string) ([]types.Commit, bool) { + mapTex.RLock() + defer mapTex.RUnlock() + if commits, ok := repoCache[path]; !ok { + return []types.Commit{}, false + } else if len(commits) > 0 && commits[0].Hash == head { + return commits, true + } + return []types.Commit{}, false +} + func IsRepoCached(path string, head string) bool { mapTex.RLock() defer mapTex.RUnlock() @@ -36,12 +53,6 @@ func IsRepoCached(path string, head string) bool { } } -func CacheRepo(path string, commits []types.Commit) { - mapTex.Lock() - defer mapTex.Unlock() - repoCache[path] = commits -} - func hashSlice(in []string) string { sort.Strings(in) sb := strings.Builder{} diff --git a/commits/chancommits.go b/commits/chancommits.go index 51b1aeb..40841dd 100644 --- a/commits/chancommits.go +++ b/commits/chancommits.go @@ -66,7 +66,7 @@ func YearFreqFromChan(cc chan types.Commit, year int) types.Freq { func (repo Repo) GetCommitChan() (chan types.Commit, error) { cc := make(chan types.Commit, 30) - r := git.Repository(repo) + r := git.Repository(repo.Repo) ref, err := r.Head() if err != nil { return cc, err diff --git a/commits/commits.go b/commits/commits.go index 4e42ea4..8487d12 100644 --- a/commits/commits.go +++ b/commits/commits.go @@ -61,14 +61,26 @@ func (paths RepoSet) Frequency(year int, authors []string) (types.Freq, error) { return gfreq, nil } +func (repo Repo) GetHead() (string, error) { + r := git.Repository(repo.Repo) + ref, err := r.Head() + if err != nil { + return "", err + } + return ref.String(), nil +} + func (repo Repo) GetCommitSet() (CommitSet, error) { cs := CommitSet{} commits := []types.Commit{} - r := git.Repository(repo) + r := git.Repository(repo.Repo) ref, err := r.Head() if err != nil { return cs, err } + if cachedRepo, ok := GetCachedRepo(repo.Path, ref.String()); ok { + return CommitSet{Commits: cachedRepo}, nil + } cIter, err := r.Log(&git.LogOptions{From: ref.Hash()}) if err != nil { return cs, err @@ -80,6 +92,7 @@ func (repo Repo) GetCommitSet() (CommitSet, error) { return nil }) cs.Commits = commits + CacheRepo(repo.Path, cs.Commits) return cs, nil } diff --git a/commits/common.go b/commits/common.go index 765d618..415d8d9 100644 --- a/commits/common.go +++ b/commits/common.go @@ -11,7 +11,10 @@ import ( ) type ( - Repo git.Repository + Repo struct { + Repo git.Repository + Path string + } CommitSet struct { Commits []types.Commit Year int @@ -28,7 +31,7 @@ func OpenRepo(directory string) (Repo, error) { } } r, err := git.PlainOpenWithOptions(directory, &(git.PlainOpenOptions{DetectDotGit: true})) - return Repo(*r), err + return Repo{Repo: *r, Path: directory}, err } func GetMRRepos() (RepoSet, error) { diff --git a/types/helpers.go b/types/helpers.go index 6332982..59725a6 100644 --- a/types/helpers.go +++ b/types/helpers.go @@ -10,12 +10,13 @@ func NewDataSet() DataSet { return make(DataSet) } -func NewCommit(Author, Message, Repo, Path string, LOC int) Commit { - return Commit{ - Message: Message, - Author: Author, LOC: LOC, TimeStamp: time.Now(), +func NewCommit(Author, Message, Repo, Path string, Added, Deleted, FilesChanged int) Commit { + ci := Commit{ + Message: Message, Added: Added, Deleted: Deleted, + Author: Author, FilesChanged: FilesChanged, TimeStamp: time.Now(), Repo: Repo, Path: Path, } + return ci } func (yf Freq) String() string {