summaryrefslogtreecommitdiff
path: root/repoSettings.go
blob: 66677f83628a6ea6ed1c0abf75a9232d861af832 (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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
package forgepb

/*
	check settings for a particular gopath
	this provides checks for:

	IsReadOnly()	// user can't push commits
	IsPrivate()	// repo can't be published to the pkg.go.dev system
	DebName()	// for 'zookeeper' returns 'zookeeper-go'
*/

import (
	"path/filepath"
	"strings"
)

/*
func (f *Forge) SortByGoPath() *ForgeConfigIterator {
	return f.Config.SortByPath()
}
*/

/*
func (all *ForgeConfigs) UpdateGoPath(name string, gopath string) bool {
	oldr := all.DeleteByGoPath(name)
	if oldr == nil {
		// nothing to update
		return false
	}

	// update gopath and append it back to the list
	oldr.GoPath = gopath
	return all.Append(oldr)
}
*/

// returns true if gopath is readonly()
// will attempt to match IsWritable("foo") against anything ending in "foo"
func (f *Forge) IsReadOnly(gopath string) bool {
	var match *ForgeConfig

	loop := f.Config.SortByGoPath() // get the list of repos
	for loop.Scan() {
		r := loop.Next()
		if r.GoPath == gopath {
			// exact gopath match
			if r.Writable {
				return false
			}
			if r.ReadOnly {
				return true
			}
			// private is assumed to be r/w unless above is specifically set
			if r.Private {
				return false
			}
		}
		// if gopath == "foo" will return false if "go.wit.com/apps/foo" is Writable
		base := filepath.Base(r.GoPath)
		if base == gopath {
			if r.Writable {
				return false
			}
		}
		// search for potential dir matches
		if r.Directory {
			// test the dir
			if strings.HasPrefix(gopath, r.GoPath) {
				match = r
			}
		}
	}

	if match == nil {
		// log.Info("did not match in IsReadOnly()", gopath)
		return true
	}

	// take the settings from the directory match
	if match.Writable {
		return false
	}
	if match.ReadOnly {
		return true
	}
	// private is assumed to be r/w unless above is specifically set
	if match.Private {
		return false
	}

	// always assume readonly
	return true
}

// returns the deb package name
// this let's you check a git tag version against a package .deb version
// allows gopath's to not need to match the .deb name
// this is important in lots of cases! It is normal and happens often enough.
func (f *Forge) DebName(gopath string) string {
	// get "zookeeper" from "go.wit.com/apps/zookeeper"
	normalBase := filepath.Base(gopath)

	loop := f.Config.SortByGoPath()
	for loop.Scan() {
		r := loop.Next()
		if r.GoPath == gopath {
			// returns "zookeeper-go" for "go.wit.com/apps/zookeeper"
			if r.DebName != "" {
				// log.Info("FOUND DebName", r.DebName)
				return r.DebName
			} else {
				return normalBase
			}
		}
	}
	return normalBase
}

// is this a non-publishable repo?
// matches package names from apt
//
// IsPrivate("foo") will match anything in the config file ending in "foo"
//
// IsPrivate("go.foo.com/jcarr/foo") returns true if private
// IsPrivate("foo") also returns true if "go.bar.com/jcarr/foo" is private
func (f *Forge) IsPrivate(thing string) bool {
	var match *ForgeConfig

	// sort by path means the simple 'match' logic
	// here works in the sense the last directory match
	// is the one that is used
	loop := f.Config.SortByGoPath() // get the list of repos
	for loop.Scan() {
		r := loop.Next()
		if r.GoPath == thing {
			// if private is set here, then ok, otherwise
			// still check if a Directory match exists
			if r.Private {
				return true
			}
		}
		base := filepath.Base(r.GoPath)
		if base == thing {
			if r.Private {
				return true
			}
		}
		// check to see if IsPrivate("foo")
		// search for potential dir matches
		if r.Directory {
			// test the dir
			if strings.HasPrefix(thing, r.GoPath) {
				match = r
			}
		}
	}
	if match == nil {
		// log.Info("did not match in IsPrivate()", thing)
		return false
	}

	// otherwise, assume not private
	return match.Private
}

// IsFavorite() -- fun option for the config
// file that lets you set things as favorites
// so you can just go-clone a bunch of common things
// on a new box or after you reset/delete your ~/go/src dir
func (f *Forge) IsFavorite(thing string) bool {
	var match *ForgeConfig

	loop := f.Config.SortByGoPath() // get the list of repos
	for loop.Scan() {
		r := loop.Next()
		if r.GoPath == thing {
			if r.Favorite {
				return true
			}
		}
		base := filepath.Base(r.GoPath)
		if base == thing {
			if r.Favorite {
				return true
			}
		}
		if r.Directory {
			if strings.HasPrefix(thing, r.GoPath) {
				match = r
			}
		}
	}
	if match == nil {
		return false
	}

	return match.Favorite
}