summaryrefslogtreecommitdiff
path: root/git.go
blob: e0be1e97820cc26f53e8690cdacf54b8fd62f7b9 (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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package repostatus

import (
	"errors"
	"strings"

	"go.wit.com/lib/gui/shell"
	"go.wit.com/lib/protobuf/gitpb"
	"go.wit.com/log"
)

// remove this everything
func (rs *RepoStatus) Path() string {
	return rs.realPath.String()
}

func (rs *RepoStatus) GitState() string {
	return rs.gitState.String()
}

func (rs *RepoStatus) GetStatus() string {
	return rs.gitState.String()
}

func (rs *RepoStatus) GetLastTagVersion() string {
	return rs.lasttag.String()
}

func (rs *RepoStatus) displayCurrentBranchName() string {
	out := rs.pb.GetCurrentBranchName()
	rs.currentBranch.SetValue(out)
	return out
}

// stores the current branch name
func (rs *RepoStatus) checkCurrentBranchName() string {
	currentname := rs.currentBranch.String()
	out := rs.pb.GetCurrentBranchName()
	if currentname == out {
		// nothing changed
		return currentname
	}
	rs.currentBranch.SetValue(out)
	if currentname == "" {
		return out // don't note if there was nothing before
	}
	rs.NoteChange("current branch has changed from " + currentname + " to " + out)
	return out
}

func (rs *RepoStatus) gitDescribeByHash(hash string) (string, error) {
	if hash == "" {
		return "", errors.New("hash was blank")
	}
	r := shell.PathRunLog(rs.realPath.String(), []string{"git", "describe", "--tags", "--always", hash}, INFO)
	out := strings.Join(r.Stdout, "\n")
	if r.Error != nil {
		log.Warn("not in a git repo or bad hash?", r.Error, rs.Path())
		return out, r.Error
	}
	return out, r.Error
}

func (rs *RepoStatus) gitDescribeByName(name string) (string, error) {
	name = strings.TrimSpace(name)

	if name == "" {
		// git will return the current tag
		r := shell.PathRunLog(rs.Path(), []string{"git", "describe", "--tags", "--always"}, INFO)
		output := strings.Join(r.Stdout, "\n")
		if r.Error != nil {
			log.Warn("gitDescribeByName() not in a git repo?", r.Error, rs.Path())
		}
		return strings.TrimSpace(output), r.Error
	}
	if !rs.LocalTagExists(name) {
		// tag does not exist
		return "", errors.New("gitDescribeByName() git fatal: Not a valid object name")
	}
	cmd := []string{"git", "describe", "--tags", "--always", name}
	r := shell.PathRunLog(rs.Path(), cmd, INFO)
	output := strings.Join(r.Stdout, "\n")
	if r.Error != nil {
		log.Warn("cmd =", cmd)
		log.Warn("err =", r.Error)
		log.Warn("not in a git repo or bad tag?", rs.Path())
	}

	return strings.TrimSpace(output), r.Error
}

// todo: don't run git every time?
func (rs *RepoStatus) checkCurrentBranchVersion() string {
	out := rs.pb.GetCurrentVersion()
	rs.currentVersion.SetValue(out)
	return out
}

// this should get the most recent tag
func (rs *RepoStatus) setLastTagVersion() {
	name := rs.pb.GetLastTagVersion()
	rs.lasttag.SetText(name)
	return
}

func (rs *RepoStatus) populateTags() {
	tmp := rs.realPath.String() + "/.git/refs/tags"
	log.Log(REPO, "populateTags() path =", tmp)
	for _, tag := range gitpb.ListFiles(tmp) {
		if rs.tags[tag] == "" {
			log.Log(REPO, "populateTags() Adding new tag", tag)
			// rs.tagsDrop.AddText(tag)
			rs.tags[tag] = "origin"
		}
	}
	// rs.tagsDrop.SetText(rs.lasttagrev)
}

// returns quickly based on the last time it was checked
func (rs *RepoStatus) IsDirty() bool {
	return rs.pb.IsDirty()
}

func (rs *RepoStatus) CheckDirty() bool {
	if rs.pb.IsDirty() {
		rs.dirtyLabel.SetValue("dirty")
		return true
	}
	rs.dirtyLabel.SetValue("")
	return false
}