// cmdInstall first calls cmdInstallPrereq() then install the // .git/hooks/pre-commit and pre-push hooks. // // Silently ignore installing the hooks when running under a CI. In // particular, circleci.com doesn't create the directory .git/hooks. func (a *application) cmdInstall(repo scm.ReadOnlyRepo, modes []checks.Mode, noUpdate bool, prereqReady *sync.WaitGroup) (err error) { errCh := make(chan error, 1) go func() { defer prereqReady.Done() errCh <- a.cmdInstallPrereq(repo, modes, noUpdate) }() defer func() { if err2 := <-errCh; err == nil { err = err2 } }() if checks.IsContinuousIntegration() { log.Printf("Running under CI; not installing hooks") return nil } log.Printf("Installing hooks") hookDir, err2 := repo.HookPath() if err2 != nil { return err2 } for _, t := range []string{"pre-commit", "pre-push"} { // Always remove hook first if it exists, in case it's a symlink. p := filepath.Join(hookDir, t) _ = os.Remove(p) if err = ioutil.WriteFile(p, []byte(fmt.Sprintf(hookContent, t)), 0777); err != nil { return err } } log.Printf("Installation done") return nil }