199 lines
4.3 KiB
Go
199 lines
4.3 KiB
Go
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
|
|
}
|