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)
}
}
}