diff --git a/hack/make-rules/helpers/go2make/go2make.go b/hack/make-rules/helpers/go2make/go2make.go deleted file mode 100644 index ceaeed0e550..00000000000 --- a/hack/make-rules/helpers/go2make/go2make.go +++ /dev/null @@ -1,215 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "bytes" - goflag "flag" - "fmt" - "go/build" - "io" - "os" - "sort" - "strings" - - "github.com/spf13/pflag" -) - -var flPrune = pflag.StringSlice("prune", nil, "sub-packages to prune (recursive, may be specified multiple times)") -var flDebug = pflag.BoolP("debug", "d", false, "enable debugging output") -var flHelp = pflag.BoolP("help", "h", false, "print help and exit") - -func main() { - pflag.CommandLine.AddGoFlagSet(goflag.CommandLine) - pflag.Usage = func() { help(os.Stderr) } - pflag.Parse() - - debug("PWD", getwd()) - - build.Default.BuildTags = []string{"ignore_autogenerated"} - build.Default.UseAllFiles = false - - if *flHelp { - help(os.Stdout) - os.Exit(0) - } - if len(pflag.Args()) == 0 { - help(os.Stderr) - os.Exit(1) - } - for _, in := range pflag.Args() { - if strings.HasSuffix(in, "/...") { - // Recurse. - debug("starting", in) - pkgName := strings.TrimSuffix(in, "/...") - if err := WalkPkg(pkgName, visitPkg); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - } else { - // Import one package. - if err := saveImport(in); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(2) - } - } - } -} - -func help(out io.Writer) { - fmt.Fprintf(out, "Usage: %s [FLAG...] \n", os.Args[0]) - fmt.Fprintf(out, "\n") - fmt.Fprintf(out, "go2make calculates all of the dependencies of a set of Go packages and prints\n") - fmt.Fprintf(out, "them as variable definitions suitable for use as a Makefile.\n") - fmt.Fprintf(out, "\n") - fmt.Fprintf(out, "Package specifications may be simple (e.g. 'example.com/txt/color') or\n") - fmt.Fprintf(out, "recursive (e.g. 'example.com/txt/...')\n") - fmt.Fprintf(out, " Example:\n") - fmt.Fprintf(out, " $ %s ./example.com/pretty\n", os.Args[0]) - fmt.Fprintf(out, " example.com/txt/split := \\\n") - fmt.Fprintf(out, " /go/src/example.com/txt/split/ \\\n") - fmt.Fprintf(out, " /go/src/example.com/txt/split/split.go \\\n") - fmt.Fprintf(out, " ./example.com/pretty := \\\n") - fmt.Fprintf(out, " /go/src/example.com/pretty/ \\\n") - fmt.Fprintf(out, " /go/src/example.com/pretty/print.go \\\n") - fmt.Fprintf(out, " /go/src/example.com/txt/split/ \\\n") - fmt.Fprintf(out, " /go/src/example.com/txt/split/split.go\n") - fmt.Fprintf(out, "\n") - fmt.Fprintf(out, " Flags:\n") - - pflag.PrintDefaults() -} - -func debug(items ...interface{}) { - if *flDebug { - x := []interface{}{"DBG:"} - x = append(x, items...) - fmt.Println(x...) - } -} - -func visitPkg(importPath, absPath string) error { - debug("visit", importPath) - return saveImport(importPath) -} - -func prune(pkgName string) bool { - for _, pr := range *flPrune { - if pr == pkgName { - return true - } - } - return false -} - -// cache keeps track of which packages we have already loaded. -var cache = map[string]*build.Package{} - -func saveImport(pkgName string) error { - if cache[pkgName] != nil { - return nil - } - if prune(pkgName) { - debug("prune", pkgName) - return ErrSkipPkg - } - pkg, err := loadPackage(pkgName) - if err != nil { - return err - } - debug("save", pkgName) - cache[pkgName] = pkg - - debug("recurse", pkgName) - defer func() { debug("done ", pkgName) }() - if !pkg.Goroot && (len(pkg.GoFiles)+len(pkg.Imports) > 0) { - // Process deps of this package before the package itself. - for _, impName := range pkg.Imports { - if impName == "C" { - continue - } - debug("depends on", impName) - saveImport(impName) - } - - // Emit a variable for each package. - var buf bytes.Buffer - buf.WriteString("GODEPS_" + pkgName) - buf.WriteString(" := ") - - // Packages depend on their own directories, their own files, and - // transitive list of all deps' directories and files. - all := map[string]struct{}{} - all[pkg.Dir+"/"] = struct{}{} - filesForPkg(pkg, all) - for _, imp := range pkg.Imports { - pkg := cache[imp] - if pkg == nil || pkg.Goroot { - continue - } - all[pkg.Dir+"/"] = struct{}{} - filesForPkg(pkg, all) - } - // Sort and de-dup them. - files := flatten(all) - for _, f := range files { - buf.WriteString(" \\\n ") - buf.WriteString(f) - } - - fmt.Println(buf.String()) - } - return nil -} - -func filesForPkg(pkg *build.Package, all map[string]struct{}) { - for _, file := range pkg.GoFiles { - if pkg.Dir != "." { - file = pkg.Dir + "/" + file - } - all[file] = struct{}{} - } -} - -func flatten(all map[string]struct{}) []string { - list := make([]string, 0, len(all)) - for k := range all { - list = append(list, k) - } - sort.Strings(list) - return list -} - -func loadPackage(pkgName string) (*build.Package, error) { - debug("load", pkgName) - pkg, err := build.Import(pkgName, getwd(), 0) - if err != nil { - // We can ignore NoGoError. Anything else is real. - if _, ok := err.(*build.NoGoError); !ok { - return nil, err - } - } - return pkg, nil -} - -func getwd() string { - pwd, err := os.Getwd() - if err != nil { - panic(fmt.Sprintf("can't get working directory: %v", err)) - } - return pwd -} diff --git a/hack/make-rules/helpers/go2make/pkgwalk.go b/hack/make-rules/helpers/go2make/pkgwalk.go deleted file mode 100644 index 6d8dfdb0f7a..00000000000 --- a/hack/make-rules/helpers/go2make/pkgwalk.go +++ /dev/null @@ -1,117 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "fmt" - "go/build" - "os" - "path" - "sort" -) - -// VisitFunc is a function called by WalkPkg to examine a single package. -type VisitFunc func(importPath string, absPath string) error - -// ErrSkipPkg can be returned by a VisitFunc to indicate that the package in -// question should not be walked any further. -var ErrSkipPkg = fmt.Errorf("package skipped") - -// WalkPkg recursively visits all packages under pkgName. This is similar -// to filepath.Walk, except that it follows symlinks. A package is always -// visited before the children of that package. If visit returns ErrSkipPkg, -// pkgName will not be walked. -func WalkPkg(pkgName string, visit VisitFunc) error { - // Visit the package itself. - pkg, err := findPackage(pkgName) - if err != nil { - return err - } - if err := visit(pkg.ImportPath, pkg.Dir); err == ErrSkipPkg { - return nil - } else if err != nil { - return err - } - - // Read all of the child dirents and find sub-packages. - infos, err := readDirInfos(pkg.Dir) - if err != nil { - return err - } - for _, info := range infos { - if !info.IsDir() { - continue - } - name := info.Name() - if name[0] == '_' || (len(name) > 1 && name[0] == '.') || name == "testdata" { - continue - } - // Don't use path.Join() because it drops leading `./` via path.Clean(). - err := WalkPkg(pkgName+"/"+name, visit) - if err != nil { - return err - } - } - return nil -} - -// findPackage finds a Go package. -func findPackage(pkgName string) (*build.Package, error) { - debug("find", pkgName) - pkg, err := build.Import(pkgName, getwd(), build.FindOnly) - if err != nil { - return nil, err - } - return pkg, nil -} - -// readDirInfos returns a list of os.FileInfo structures for the dirents under -// dirPath. The result list is sorted by name. This is very similar to -// ioutil.ReadDir, except that it follows symlinks. -func readDirInfos(dirPath string) ([]os.FileInfo, error) { - names, err := readDirNames(dirPath) - if err != nil { - return nil, err - } - sort.Strings(names) - - infos := make([]os.FileInfo, 0, len(names)) - for _, n := range names { - info, err := os.Stat(path.Join(dirPath, n)) - if err != nil { - return nil, err - } - infos = append(infos, info) - } - return infos, nil -} - -// readDirNames returns a list of all dirents in dirPath. The result list is -// not sorted or filtered. -func readDirNames(dirPath string) ([]string, error) { - d, err := os.Open(dirPath) - if err != nil { - return nil, err - } - defer d.Close() - - names, err := d.Readdirnames(-1) - if err != nil { - return nil, err - } - return names, nil -} diff --git a/hack/make-rules/helpers/go2make/pkgwalk_test.go b/hack/make-rules/helpers/go2make/pkgwalk_test.go deleted file mode 100644 index 140f5121558..00000000000 --- a/hack/make-rules/helpers/go2make/pkgwalk_test.go +++ /dev/null @@ -1,222 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "path" - "reflect" - "sort" - "testing" -) - -func Test_WalkPkg(t *testing.T) { - testCases := []struct { - pkg string - fail bool - expected []string - }{ - { - pkg: "./testdata/nonexistent-dir", - fail: true, - }, - { - pkg: "./testdata/dir-without-gofiles", - expected: []string{"./testdata/dir-without-gofiles"}, - }, - { - pkg: "./testdata/dir-with-gofiles", - expected: []string{"./testdata/dir-with-gofiles", "./testdata/dir-with-gofiles/subdir"}, - }, - } - - for i, tc := range testCases { - visited := []string{} - err := WalkPkg(tc.pkg, func(imp, abs string) error { - if _, base := path.Split(imp); base == "skipme" { - return ErrSkipPkg - } - visited = append(visited, imp) - return nil - }) - if err != nil && tc.fail { - continue - } - if err != nil { - t.Errorf("[%d] unexpected error: %v", i, err) - continue - } - if tc.fail { - t.Errorf("[%d] expected error", i) - continue - } - if !reflect.DeepEqual(visited, tc.expected) { - t.Errorf("[%d] unexpected results: %v", i, visited) - } - } -} -func Test_findPackage(t *testing.T) { - testCases := []struct { - pkg string - fail bool - }{ - { - pkg: "./testdata/nonexistent-dir", - fail: true, - }, - { - pkg: "./testdata/dir-without-gofiles", - }, - { - pkg: "./testdata/dir-with-gofiles", - }, - } - - for i, tc := range testCases { - _, err := findPackage(tc.pkg) - if err != nil && tc.fail { - continue - } - if err != nil { - t.Errorf("[%d] unexpected error: %v", i, err) - continue - } - if tc.fail { - t.Errorf("[%d] expected error", i) - continue - } - } -} - -func Test_readDirInfos(t *testing.T) { - testCases := []struct { - dir string - fail bool - expected map[string]bool - }{ - { - dir: "./testdata/nonexistent-dir", - fail: true, - }, - { - dir: "./testdata/dir-without-gofiles", - expected: map[string]bool{"README": true}, - }, - { - dir: "./testdata/dir-with-gofiles", - expected: map[string]bool{ - "README": true, - "foo.go": true, - "bar.go": true, - "subdir": true, - "testdata": true, - "_underscore": true, - ".dot": true, - "skipme": true, - }, - }, - } - - for i, tc := range testCases { - infos, err := readDirInfos(tc.dir) - if err != nil && tc.fail { - continue - } - if err != nil { - t.Errorf("[%d] unexpected error: %v", i, err) - continue - } - if tc.fail { - t.Errorf("[%d] expected error", i) - continue - } - result := make([]string, len(infos)) - sorted := make([]string, len(infos)) - for i, inf := range infos { - result[i] = inf.Name() - sorted[i] = inf.Name() - } - sort.Strings(sorted) - if !reflect.DeepEqual(result, sorted) { - t.Errorf("[%d] result was not sorted: %v", i, result) - } - for _, r := range result { - if !tc.expected[r] { - t.Errorf("[%d] got unexpected result: %s", i, r) - } else { - delete(tc.expected, r) - } - } - for r := range tc.expected { - t.Errorf("[%d] missing expected result: %s", i, r) - } - } -} - -func Test_readDirNames(t *testing.T) { - testCases := []struct { - dir string - fail bool - expected map[string]bool - }{ - { - dir: "./testdata/nonexistent-dir", - fail: true, - }, - { - dir: "./testdata/dir-without-gofiles", - expected: map[string]bool{"README": true}, - }, - { - dir: "./testdata/dir-with-gofiles", - expected: map[string]bool{ - "README": true, - "foo.go": true, - "bar.go": true, - "subdir": true, - "testdata": true, - "_underscore": true, - ".dot": true, - "skipme": true, - }, - }, - } - - for i, tc := range testCases { - result, err := readDirNames(tc.dir) - if err != nil && tc.fail { - continue - } - if err != nil { - t.Errorf("[%d] unexpected error: %v", i, err) - continue - } - if tc.fail { - t.Errorf("[%d] expected error", i) - continue - } - for _, r := range result { - if !tc.expected[r] { - t.Errorf("[%d] got unexpected result: %s", i, r) - } else { - delete(tc.expected, r) - } - } - for r := range tc.expected { - t.Errorf("[%d] missing expected result: %s", i, r) - } - } -} diff --git a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/.dot/README b/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/.dot/README deleted file mode 100644 index e845566c06f..00000000000 --- a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/.dot/README +++ /dev/null @@ -1 +0,0 @@ -README diff --git a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/.dot/subsubdir/README b/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/.dot/subsubdir/README deleted file mode 100644 index e845566c06f..00000000000 --- a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/.dot/subsubdir/README +++ /dev/null @@ -1 +0,0 @@ -README diff --git a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/README b/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/README deleted file mode 100644 index e845566c06f..00000000000 --- a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/README +++ /dev/null @@ -1 +0,0 @@ -README diff --git a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/_underscore/README b/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/_underscore/README deleted file mode 100644 index e845566c06f..00000000000 --- a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/_underscore/README +++ /dev/null @@ -1 +0,0 @@ -README diff --git a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/_underscore/subsubdir/README b/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/_underscore/subsubdir/README deleted file mode 100644 index e845566c06f..00000000000 --- a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/_underscore/subsubdir/README +++ /dev/null @@ -1 +0,0 @@ -README diff --git a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/bar.go b/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/bar.go deleted file mode 100644 index 7e52fa5039d..00000000000 --- a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/bar.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package gofiles - -func Bar() { -} diff --git a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/foo.go b/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/foo.go deleted file mode 100644 index 4b6f08251ea..00000000000 --- a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/foo.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package gofiles - -func Foo() { -} diff --git a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/skipme/README b/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/skipme/README deleted file mode 100644 index e845566c06f..00000000000 --- a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/skipme/README +++ /dev/null @@ -1 +0,0 @@ -README diff --git a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/skipme/subsubdir/README b/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/skipme/subsubdir/README deleted file mode 100644 index e845566c06f..00000000000 --- a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/skipme/subsubdir/README +++ /dev/null @@ -1 +0,0 @@ -README diff --git a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/subdir/README b/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/subdir/README deleted file mode 100644 index e845566c06f..00000000000 --- a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/subdir/README +++ /dev/null @@ -1 +0,0 @@ -README diff --git a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/testdata/README b/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/testdata/README deleted file mode 100644 index e845566c06f..00000000000 --- a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/testdata/README +++ /dev/null @@ -1 +0,0 @@ -README diff --git a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/testdata/subsubdir/README b/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/testdata/subsubdir/README deleted file mode 100644 index e845566c06f..00000000000 --- a/hack/make-rules/helpers/go2make/testdata/dir-with-gofiles/testdata/subsubdir/README +++ /dev/null @@ -1 +0,0 @@ -README diff --git a/hack/make-rules/helpers/go2make/testdata/dir-without-gofiles/README b/hack/make-rules/helpers/go2make/testdata/dir-without-gofiles/README deleted file mode 100644 index e845566c06f..00000000000 --- a/hack/make-rules/helpers/go2make/testdata/dir-without-gofiles/README +++ /dev/null @@ -1 +0,0 @@ -README