diff --git a/generate/generate.go b/generate/generate.go index 8ad5a7d..00edb79 100644 --- a/generate/generate.go +++ b/generate/generate.go @@ -439,6 +439,11 @@ func (u *updater) allocateSources(conf *config.Config, pkgDir string, sources ma return nil, err } + existingRuleNames := map[string]struct{}{} + for _, r := range rules { + existingRuleNames[r.Name()] = struct{}{} + } + var newRules []*edit.Rule for _, src := range unallocated { importedFile := sources[src] @@ -465,7 +470,9 @@ func (u *updater) allocateSources(conf *config.Config, pkgDir string, sources ma } } if rule == nil { - name := filepath.Base(pkgDir) + baseName := filepath.Base(pkgDir) + name := baseName + isExternal := importedFile.IsExternal(filepath.Join(u.plzConf.ImportPath(), pkgDir)) kind := "go_library" if importedFile.IsTest() { name += "_test" @@ -475,11 +482,24 @@ func (u *updater) allocateSources(conf *config.Config, pkgDir string, sources ma kind = "go_binary" name = "main" } + _, nameExists := existingRuleNames[name] + if nameExists { + if importedFile.IsTest() { + if isExternal { + name = fmt.Sprintf("%s_external_test", baseName) + } else { + name = fmt.Sprintf("%s_internal_test", baseName) + } + } else { + return nil, fmt.Errorf("rule with name %s already exists in %s", name, pkgDir) + } + } rule = edit.NewRule(edit.NewRuleExpr(kind, name), kinds.DefaultKinds[kind], pkgDir) - if importedFile.IsExternal(filepath.Join(u.plzConf.ImportPath(), pkgDir)) { + if isExternal { setExternal(rule) } newRules = append(newRules, rule) + existingRuleNames[name] = struct{}{} } rule.AddSrc(src) diff --git a/generate/generate_test.go b/generate/generate_test.go index 9dcb924..c7456d7 100644 --- a/generate/generate_test.go +++ b/generate/generate_test.go @@ -51,7 +51,7 @@ func TestAllocateSources(t *testing.T) { require.NoError(t, err) require.Len(t, newRules, 1) - assert.Equal(t, "foo_test", newRules[0].Name()) + assert.Equal(t, "foo_external_test", newRules[0].Name()) assert.ElementsMatch(t, []string{"external_test.go"}, mustGetSources(t, u, newRules[0])) assert.ElementsMatch(t, []string{"foo.go", "bar.go"}, mustGetSources(t, u, rules[0]))