summaryrefslogtreecommitdiff
path: root/repo.new.go
blob: fa1d2584fe58be60b47bfef76e54087fab84c9b0 (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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package gitpb

import (
	"errors"
	"os"
	"path/filepath"
	"time"

	"go.wit.com/log"
	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
)

// scans in a new git repo. If it detects the repo is a golang project,
// then it parses the go.mod/go.sum files
// TODO: try adding python, rails, perl, rust, other language things?
// I probably will never have time to try that, but I'd take patches for anyone
// that might see this note and feel so inclined.
func (all *Repos) NewGoPath(basepath string, gopath string, url string) (*Repo, error) {
	if gopath == "" {
		return nil, errors.New("blank gopath")
	}
	if r := all.FindByGoPath(gopath); r != nil {
		log.Info("gitpb.NewGoPath() already has gopath", r.GoPath)
		log.Info("gitpb.NewGoPath() already has FullPath", r.FullPath)
		log.Info("gitpb.NewGoPath() already has URL", r.URL)
		// already had this gopath
		return r, errors.New("gitpb.NewGoPath() duplicate gopath " + gopath)
	}
	log.Info("gitpb.NewGoPath() Attempting to add new path", basepath, gopath)

	// if .git doesn't exist, error out here
	gitpath := filepath.Join(basepath, gopath, ".git")
	_, err := os.Stat(gitpath)
	if err != nil {
		log.Warn("gitpb.NewGoPath() not a git directory", gitpath)
		return nil, err
	}

	// add a new one here
	newr := Repo{
		FullPath: filepath.Join(basepath, gopath),
		GoPath:   gopath,
		URL:      url,
	}
	newr.Tags = new(GitTags)
	newr.UpdateGitTags()
	newr.GoDeps = new(GoDeps)

	switch newr.goListRepoType() {
	case "plugin":
		newr.GoPlugin = true
	case "protobuf":
		newr.GoProtobuf = true
	case "library":
		newr.GoLibrary = true
	case "binary":
		newr.GoBinary = true
	}

	lastpull, err := newr.LastGitPull()
	if err == nil {
		newr.LastPull = timestamppb.New(lastpull)
	}

	if all.AppendUniqueGoPath(&newr) {
		// worked
		return &newr, nil
	} else {
		// this is dumb, probably never happens. todo: use Repos.Lock()
		if r := all.FindByGoPath(gopath); r != nil {
			// already had this gopath
			return r, errors.New("gitpb.NewGoPath() AppendUnique() failed but Find() worked" + gopath)
		}
	}
	// todo: use Repos.Lock()
	return nil, errors.New("repo gitpb.NewGoPath() should never have gotten here " + gopath)
}

func (repo *Repo) SetDevelBranchName(bname string) {
	repo.DevelBranchName = bname
}

func (repo *Repo) SetUserBranchName(bname string) {
	repo.UserBranchName = bname
}

func (repo *Repo) GitChanged() bool {
	fullfile := filepath.Join(repo.FullPath, ".git/FETCH_HEAD")
	lasttime, err := repo.LastGitPull()
	if err == nil {
		// if error, something is wrong, assume true
		log.Info("gitpb:", fullfile, "changed")
		return true
	}
	newtime := repo.LastPull.AsTime()

	if lasttime == newtime {
		return false
	}
	log.Info("gitpb:", fullfile, "changed")
	return true
}

func (repo *Repo) GitPullAge() time.Duration {
	lastpull, err := repo.LastGitPull()
	if err == nil {
		// if error, something is wrong, assume true
		ltime := repo.LastPull.AsTime()
		return time.Since(ltime)
	}

	return time.Since(lastpull)
}