diff --git a/internal/config/config.go b/internal/config/config.go index eb6d3bcc907921df387c24f3917cc93a2476ecf7..ef96c9549f2c3232390b551c19fcb3ccfc012951 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -4,6 +4,7 @@ import ( "os/exec" "path/filepath" "strings" + "sync" "golang.org/x/crypto/ssh" "gopkg.in/yaml.v2" @@ -28,6 +29,7 @@ type Config struct { Repos []Repo `yaml:"repos"` Source *git.RepoSource Cfg *config.Config + reloadMtx sync.Mutex } // User contains user-level configuration for a repository. @@ -107,6 +109,8 @@ func NewConfig(cfg *config.Config) (*Config, error) { // Reload reloads the configuration. func (cfg *Config) Reload() error { + cfg.reloadMtx.Lock() + defer cfg.reloadMtx.Unlock() err := cfg.Source.LoadRepos() if err != nil { return err diff --git a/internal/config/git.go b/internal/config/git.go index 063a098d3cbfbb842783c80fcffe8318c426dad6..e7f39248e5e64e9cec126e44865db02a250eb07c 100644 --- a/internal/config/git.go +++ b/internal/config/git.go @@ -10,13 +10,15 @@ import ( // Push registers Git push functionality for the given repo and key. func (cfg *Config) Push(repo string, pk ssh.PublicKey) { - err := cfg.Reload() - if err != nil { - log.Printf("error reloading after push: %s", err) - } - if cfg.Cfg.Callbacks != nil { - cfg.Cfg.Callbacks.Push(repo) - } + go func() { + err := cfg.Reload() + if err != nil { + log.Printf("error reloading after push: %s", err) + } + if cfg.Cfg.Callbacks != nil { + cfg.Cfg.Callbacks.Push(repo) + } + }() } // Fetch registers Git fetch functionality for the given repo and key.