1use anyhow::Result;
2use std::fs;
3use std::path::Path;
4
5pub fn install_hooks(repo_path: &Path) -> Result<()> {
6 let hooks_dir = repo_path.join(".git").join("hooks");
7 if !hooks_dir.exists() {
8 fs::create_dir_all(&hooks_dir)?;
9 }
10
11 let post_merge_path = hooks_dir.join("post-merge");
12 let pre_push_path = hooks_dir.join("pre-push");
13
14 let post_merge_script = r#"#!/bin/sh
15# git-notes auto-sync pull
16git-notes sync pull
17"#;
18
19 let pre_push_script = r#"#!/bin/sh
20# git-notes auto-sync push
21git-notes sync push
22"#;
23
24 fs::write(&post_merge_path, post_merge_script)?;
25 fs::write(&pre_push_path, pre_push_script)?;
26
27 #[cfg(unix)]
29 {
30 use std::os::unix::fs::PermissionsExt;
31 let mut perms = fs::metadata(&post_merge_path)?.permissions();
32 perms.set_mode(0o755);
33 fs::set_permissions(&post_merge_path, perms.clone())?;
34 fs::set_permissions(&pre_push_path, perms)?;
35 }
36
37 Ok(())
38}
39
40pub fn uninstall_hooks(repo_path: &Path) -> Result<()> {
41 let hooks_dir = repo_path.join(".git").join("hooks");
42
43 let post_merge_path = hooks_dir.join("post-merge");
44 if post_merge_path.exists() {
45 fs::remove_file(post_merge_path)?;
46 }
47
48 let pre_push_path = hooks_dir.join("pre-push");
49 if pre_push_path.exists() {
50 fs::remove_file(pre_push_path)?;
51 }
52
53 Ok(())
54}