122 lines
2.8 KiB
Go
122 lines
2.8 KiB
Go
package gitpb
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"go.wit.com/log"
|
|
)
|
|
|
|
// This returns the list of autogenerated protobuf files
|
|
// it assumes any file *.pb.go is autogenerated
|
|
//
|
|
// this are made from protoc / proto-gen-go
|
|
// these packages also use go.wit.com/apps/autogenpb
|
|
//
|
|
// errors() if a .proto file does not have an autogenerated .pb.go file
|
|
func (repo *Repo) IsProtobuf() (bool, []string, error) {
|
|
fullp, fullc, err := scanForProtobuf(repo.FullPath)
|
|
protos := make(map[string]string)
|
|
protoc := make(map[string]string)
|
|
var anyfound bool = false
|
|
for _, s := range fullp {
|
|
filebase := filepath.Base(s)
|
|
name := strings.TrimSuffix(filebase, ".proto")
|
|
anyfound = true
|
|
protos[name] = s
|
|
}
|
|
// make sure every .proto file has a .pb.go file
|
|
for pname, _ := range protos {
|
|
var found bool = false
|
|
for _, s := range fullc {
|
|
cfilebase := filepath.Base(s)
|
|
cname := strings.TrimSuffix(cfilebase, ".pb.go")
|
|
protoc[cname] = s
|
|
if cname == pname {
|
|
found = true
|
|
}
|
|
}
|
|
if found {
|
|
// log.Info("found ok")
|
|
} else {
|
|
// log.Info("gitpb: IsProtobuf() missing compiled proto file:", pname+".pb.go")
|
|
err = errors.New("compiled file " + pname + ".pb.go missing")
|
|
}
|
|
}
|
|
|
|
// assume every .pb.go file is autogenerated
|
|
var allc []string
|
|
for _, testf := range fullc {
|
|
if strings.HasSuffix(testf, ".pb.go") {
|
|
basef := filepath.Base(testf)
|
|
allc = append(allc, basef) // no, not the 3.5" floppy disks
|
|
}
|
|
}
|
|
return anyfound, allc, err
|
|
}
|
|
|
|
// look for any proto files. do not enter directories
|
|
// note: good golang libraries are best done in a single directory
|
|
func scanForProtobuf(srcDir string) ([]string, []string, error) {
|
|
var protofiles []string
|
|
var compiled []string
|
|
err := filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error {
|
|
if err != nil {
|
|
log.Log(GITPBWARN, "Error accessing path:", path, err)
|
|
return err
|
|
}
|
|
|
|
// ignore the start dir
|
|
if srcDir == path {
|
|
return nil
|
|
}
|
|
|
|
if strings.HasSuffix(path, ".proto") {
|
|
//
|
|
protofiles = append(protofiles, path)
|
|
}
|
|
|
|
if strings.HasSuffix(path, ".pb.go") {
|
|
compiled = append(compiled, path)
|
|
}
|
|
|
|
// don't go into any directories
|
|
if info.IsDir() {
|
|
return filepath.SkipDir
|
|
}
|
|
return nil
|
|
})
|
|
|
|
return protofiles, compiled, err
|
|
}
|
|
|
|
func (repo *Repo) GetProtoFiles() ([]string, error) {
|
|
var protofiles []string
|
|
srcDir := repo.GetFullPath()
|
|
err := filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error {
|
|
if err != nil {
|
|
log.Log(GITPBWARN, "Error accessing path:", path, err)
|
|
return err
|
|
}
|
|
|
|
// ignore the start dir
|
|
if srcDir == path {
|
|
return nil
|
|
}
|
|
|
|
if strings.HasSuffix(path, ".proto") {
|
|
//
|
|
protofiles = append(protofiles, path)
|
|
}
|
|
|
|
if info.IsDir() {
|
|
return filepath.SkipDir
|
|
}
|
|
return nil
|
|
})
|
|
|
|
return protofiles, err
|
|
}
|