summaryrefslogtreecommitdiff
path: root/repo.protofiles.go
blob: 54f7c7cf191b3aaa6cdeb3c283912cdc3fcc7e31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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("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
}