package git import ( "fmt" "os" "os/exec" "path/filepath" ) const hookDelegateScriptBody = `# AUTO GENERATED BY MUGIT, DO NOT MODIFY data=$(cat) exitcodes="" hookname=$(basename "$0") git_dir="${GIT_DIR:-$(dirname "$0")/..}" for hook in "${git_dir}/hooks/${hookname}.d"/*; do test -x "${hook}" && test -f "${hook}" || continue echo "${data}" | "${hook}" "$@" exitcodes="${exitcodes} $?" done for i in ${exitcodes}; do [ ${i} -eq 0 ] || exit ${i} done ` var serverHookNames = []string{"pre-receive", "post-receive", "post-update", "update"} func hookDelegateScript() (string, error) { bashPath, err := exec.LookPath("bash") if err != nil { return "", fmt.Errorf("failed to locate bash: %w", err) } return fmt.Sprintf("#!%s\n%s", bashPath, hookDelegateScriptBody), nil } // SetupHooks installs default server-side hook delegates for this repository. func (g *Repo) SetupHooks() error { delegateScript, err := hookDelegateScript() if err != nil { return err } for _, hook := range serverHookNames { hookDir := filepath.Join(g.path, "hooks", hook+".d") if err := os.MkdirAll(hookDir, 0o755); err != nil { return fmt.Errorf("failed to create %s: %w", hookDir, err) } delegatePath := filepath.Join(g.path, "hooks", hook) if err := os.WriteFile(delegatePath, []byte(delegateScript), 0o755); err != nil { return fmt.Errorf("failed to write hook delegate %s: %w", delegatePath, err) } } return nil }