blob: 0e2376496b502eca8237adc49534e27cd205a115 (
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
|
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 (all *Repos) UpdateGoPath(name string, gopath string) bool {
oldr := all.DeleteByPath(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()
func (all *Repos) IsReadOnly(gopath string) bool {
var match *Repo
loop := all.SortByPath() // get the list of repos
for loop.Scan() {
r := loop.Repo()
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
}
}
// 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
}
// is this a non-publishable repo?
func (all *Repos) IsPrivate(gopath string) bool {
var match *Repo
// sort by path means the simple 'match' logic
// here works in the sense the last directory match
// is the one that is used
loop := all.SortByPath() // get the list of repos
for loop.Scan() {
r := loop.Repo()
if r.GoPath == gopath {
// if private is set here, then ok, otherwise
// still check if a Directory match exists
if r.Private {
return true
}
}
// 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 IsPrivate()", gopath)
return false
}
// otherwise, assume not private
return match.Private
}
// returns the deb package
func (all *Repos) DebName(gopath string) string {
normalBase := filepath.Base(gopath)
loop := all.SortByPath()
for loop.Scan() {
r := loop.Repo()
if r.GoPath == gopath {
// if private is set here, then ok, otherwise
// still check if a Directory match exists
if r.DebName == "" {
return r.DebName
} else {
return normalBase
}
}
}
return normalBase
}
|