Skip to content

Commit 6fa876b

Browse files
authored
gitindex: preserve explicit zoekt.name repo config (#1146)
2cb1991 regressed caller-supplied repository name preservation by restoring the fallback name only after template configuration succeeded. If origin URL template inference partially updated desc.Name and then failed, IndexGitRepo logged the error and continued indexing under the inferred remote name instead of the intended caller-provided name.
1 parent a874caf commit 6fa876b

2 files changed

Lines changed: 110 additions & 8 deletions

File tree

gitindex/index.go

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -236,19 +236,44 @@ func setTemplatesFromConfig(desc *zoekt.Repository, repoDir string) error {
236236
}
237237

238238
func setTemplatesFromRepo(desc *zoekt.Repository, repo *git.Repository, repoDir string) error {
239-
// A caller-supplied name identifies the repository and its shards, so it
240-
// takes precedence over names derived from zoekt config or the origin URL.
241-
// Other repository fields are intentionally refreshed from that config.
242-
if desc.Name != "" {
243-
defer func(name string) { desc.Name = name }(desc.Name)
244-
}
239+
// The caller-supplied name is a fallback for repos without zoekt.name. It
240+
// still identifies the repository and shard names better than an inferred
241+
// origin URL, but an explicit repo config should win.
242+
name := desc.Name
245243

246244
cfg, err := repo.Config()
247245
if err == nil {
248-
return setTemplatesFromRepoConfig(desc, cfg)
246+
return setTemplatesFromRepoConfigPreservingName(desc, cfg, name)
247+
}
248+
249+
// Some repositories, notably worktrees with .git files, need the plainOpenRepo
250+
// fallback to resolve their common dir before go-git can read config.
251+
repo, err = plainOpenRepo(repoDir)
252+
if err != nil {
253+
return err
249254
}
250255

251-
return setTemplatesFromConfig(desc, repoDir)
256+
cfg, err = repo.Config()
257+
if err != nil {
258+
return err
259+
}
260+
261+
return setTemplatesFromRepoConfigPreservingName(desc, cfg, name)
262+
}
263+
264+
func setTemplatesFromRepoConfigPreservingName(desc *zoekt.Repository, cfg *config.Config, name string) error {
265+
if name != "" && cfg.Raw.Section("zoekt").Options.Get("name") == "" {
266+
defer func() {
267+
// A caller-supplied name identifies the repository and its shards, so it
268+
// takes precedence over names derived from the origin URL. Other repository
269+
// fields are intentionally refreshed from config.
270+
desc.Name = name
271+
}()
272+
}
273+
if err := setTemplatesFromRepoConfig(desc, cfg); err != nil {
274+
return err
275+
}
276+
return nil
252277
}
253278

254279
func setTemplatesFromRepoConfig(desc *zoekt.Repository, cfg *config.Config) error {

gitindex/index_test.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,83 @@ func TestIndexGitRepoPreservesRepositoryName(t *testing.T) {
207207
}
208208
}
209209

210+
func TestIndexGitRepoPrefersConfiguredRepositoryName(t *testing.T) {
211+
t.Parallel()
212+
213+
configuredName := "github.com/sgtest/go-diff"
214+
fallbackName := url.QueryEscape(configuredName)
215+
repoDir, _ := initGitWorktree(t, "file1.go", "package main\n\nfunc main() {}\n")
216+
runGit(t, repoDir, "config", "zoekt.name", configuredName)
217+
218+
indexDir := t.TempDir()
219+
opts := Options{
220+
RepoDir: repoDir,
221+
Branches: []string{"HEAD"},
222+
BuildOptions: index.Options{
223+
RepositoryDescription: zoekt.Repository{Name: fallbackName},
224+
IndexDir: indexDir,
225+
DisableCTags: true,
226+
},
227+
}
228+
229+
if _, err := IndexGitRepo(opts); err != nil {
230+
t.Fatal(err)
231+
}
232+
shards, err := filepath.Glob(filepath.Join(indexDir, "*.zoekt"))
233+
if err != nil {
234+
t.Fatal(err)
235+
}
236+
if len(shards) != 1 {
237+
t.Fatalf("got %d shards, want 1", len(shards))
238+
}
239+
repositories, _, err := index.ReadMetadataPath(shards[0])
240+
if err != nil {
241+
t.Fatal(err)
242+
}
243+
if got := repositories[0].Name; got != configuredName {
244+
t.Fatalf("repository name is %q, want %q", got, configuredName)
245+
}
246+
if got, wantPrefix := filepath.Base(shards[0]), url.QueryEscape(configuredName)+"_v"; !strings.HasPrefix(got, wantPrefix) {
247+
t.Fatalf("shard name is %q, want prefix %q", got, wantPrefix)
248+
}
249+
}
250+
251+
func TestIndexGitRepoPreservesRepositoryNameOnTemplateError(t *testing.T) {
252+
t.Parallel()
253+
254+
repoDir, _ := initGitWorktree(t, "file1.go", "package main\n\nfunc main() {}\n")
255+
runGit(t, repoDir, "config", "remote.origin.url", "git@example.com:sourcegraph/zoekt.git")
256+
257+
indexDir := t.TempDir()
258+
opts := Options{
259+
RepoDir: repoDir,
260+
Branches: []string{"HEAD"},
261+
BuildOptions: index.Options{
262+
RepositoryDescription: zoekt.Repository{Name: "local/repo"},
263+
IndexDir: indexDir,
264+
DisableCTags: true,
265+
},
266+
}
267+
268+
if _, err := IndexGitRepo(opts); err != nil {
269+
t.Fatal(err)
270+
}
271+
shards, err := filepath.Glob(filepath.Join(indexDir, "*.zoekt"))
272+
if err != nil {
273+
t.Fatal(err)
274+
}
275+
if len(shards) != 1 {
276+
t.Fatalf("got %d shards, want 1", len(shards))
277+
}
278+
repositories, _, err := index.ReadMetadataPath(shards[0])
279+
if err != nil {
280+
t.Fatal(err)
281+
}
282+
if got, want := repositories[0].Name, opts.BuildOptions.RepositoryDescription.Name; got != want {
283+
t.Fatalf("repository name is %q, want %q", got, want)
284+
}
285+
}
286+
210287
func TestOpenRepoVariants(t *testing.T) {
211288
t.Parallel()
212289

0 commit comments

Comments
 (0)