···16161717import (
1818 "bytes"
1919+ "fmt"
1920 "log"
2021 "os"
2122 "os/exec"
···2627 "github.com/go-git/go-git/v5/config"
2728)
28293030+// Updates the zoekt.* git config options after a repo is cloned.
3131+// Once a repo is cloned, we can no longer use the --config flag to update all
3232+// of it's zoekt.* settings at once. `git config` is limited to one option at once.
3333+func updateZoektGitConfig(repoDest string, settings map[string]string) error {
3434+ var keys []string
3535+ for k := range settings {
3636+ keys = append(keys, k)
3737+ }
3838+ sort.Strings(keys)
3939+4040+ for _, k := range keys {
4141+ if settings[k] != "" {
4242+ if err := exec.Command("git", "-C", repoDest, "config", k, settings[k]).Run(); err != nil {
4343+ return err
4444+ }
4545+ }
4646+ }
4747+4848+ return nil
4949+}
5050+2951// CloneRepo clones one repository, adding the given config
3052// settings. It returns the bare repo directory. The `name` argument
3153// determines where the repo is stored relative to `destDir`. Returns
···38603961 repoDest := filepath.Join(parent, filepath.Base(name)+".git")
4062 if _, err := os.Lstat(repoDest); err == nil {
6363+ // Repository exists, ensure settings are in sync
6464+ if err := updateZoektGitConfig(repoDest, settings); err != nil {
6565+ return "", fmt.Errorf("failed to update repository settings: %w", err)
6666+ }
4167 return "", nil
4268 }
4369