diff options
Diffstat (limited to 'repo.common.go')
| -rw-r--r-- | repo.common.go | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/repo.common.go b/repo.common.go index 906891a..2289eed 100644 --- a/repo.common.go +++ b/repo.common.go @@ -1,5 +1,14 @@ package gitpb +import ( + "errors" + "os" + "path/filepath" + "strings" + + "go.wit.com/log" +) + // does this repo build a binary? func (r *Repo) IsBinary() bool { if r.GoInfo != nil { @@ -16,3 +25,114 @@ func (r *Repo) IsGoPlugin() bool { } return false } + +// 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(WARN, "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(WARN, "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 +} |
