func installHook()

in git-codereview/hook.go [24:77]


func installHook(args []string) {
	flags.Parse(args)
	hooksDir := gitPath("hooks")
	for _, hookFile := range hookFiles {
		filename := filepath.Join(hooksDir, hookFile)
		hookContent := fmt.Sprintf(hookScript, hookFile)

		if data, err := ioutil.ReadFile(filename); err == nil {
			// Special case: remove old hooks that use 'git-review'
			oldHookContent := fmt.Sprintf(oldHookScript, hookFile)
			if string(data) == oldHookContent {
				verbosef("removing old %v hook", hookFile)
				os.Remove(filename)
			}
			// Special case: remove old commit-msg shell script
			// in favor of invoking the git-codereview hook
			// implementation, which will be easier to change in
			// the future.
			if hookFile == "commit-msg" && string(data) == oldCommitMsgHook {
				verbosef("removing old commit-msg hook")
				os.Remove(filename)
			}
		}

		// If hook file exists, assume it is okay.
		_, err := os.Stat(filename)
		if err == nil {
			if *verbose > 0 {
				data, err := ioutil.ReadFile(filename)
				if err != nil {
					verbosef("reading hook: %v", err)
				} else if string(data) != hookContent {
					verbosef("unexpected hook content in %s", filename)
				}
			}
			continue
		}

		if !os.IsNotExist(err) {
			dief("checking hook: %v", err)
		}

		verbosef("installing %s hook", hookFile)
		if _, err := os.Stat(hooksDir); os.IsNotExist(err) {
			verbosef("creating hooks directory %s", hooksDir)
			if err := os.Mkdir(hooksDir, 0777); err != nil {
				dief("creating hooks directory: %v", err)
			}
		}
		if err := ioutil.WriteFile(filename, []byte(hookContent), 0700); err != nil {
			dief("writing hook: %v", err)
		}
	}
}