diff --git a/go/tools/gopackagesdriver/bazel_json_builder.go b/go/tools/gopackagesdriver/bazel_json_builder.go index ad6e6dedea..d27d33dd5c 100644 --- a/go/tools/gopackagesdriver/bazel_json_builder.go +++ b/go/tools/gopackagesdriver/bazel_json_builder.go @@ -19,6 +19,7 @@ import ( "fmt" "path/filepath" "strings" + "regexp" ) type BazelJSONBuilder struct { @@ -32,13 +33,24 @@ const ( var _defaultKinds = []string{"go_library", "go_test", "go_binary"} +var externalRe = regexp.MustCompile(".*\\/external\\/([^\\/]+)(\\/(.*))?\\/([^\\/]+.go)") + func (b *BazelJSONBuilder) fileQuery(filename string) string { + label := filename + if filepath.IsAbs(filename) { - fp, _ := filepath.Rel(b.bazel.WorkspaceRoot(), filename) - filename = fp + label, _ = filepath.Rel(b.bazel.WorkspaceRoot(), filename) } + + if matches := externalRe.FindStringSubmatch(filename); len(matches) == 5 { + // if filepath is for a third party lib, we need to know, what external + // library this file is part of. + matches = append(matches[:2], matches[3:]...) + label = fmt.Sprintf("@%s//%s", matches[1], strings.Join(matches[2:], ":")) + } + kinds := append(_defaultKinds, additionalKinds...) - return fmt.Sprintf(`kind("%s", same_pkg_direct_rdeps("%s"))`, strings.Join(kinds, "|"), filename) + return fmt.Sprintf(`kind("%s", same_pkg_direct_rdeps("%s"))`, strings.Join(kinds, "|"), label) } func (b *BazelJSONBuilder) packageQuery(importPath string) string {