gitpb/repo.protofiles.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
}