Skip to main content

gn_sync/
hooks.rs

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    // Make executable on unix-like
28    #[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}