diff options
Diffstat (limited to 'settings.go')
| -rw-r--r-- | settings.go | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/settings.go b/settings.go new file mode 100644 index 0000000..afe5e8a --- /dev/null +++ b/settings.go @@ -0,0 +1,110 @@ +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 ( + "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 +} |
