aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x.dev-suite/hooked/applypatch-msg1
-rwxr-xr-x.dev-suite/hooked/commit-msg1
-rwxr-xr-x.dev-suite/hooked/post-applypatch1
-rwxr-xr-x.dev-suite/hooked/post-checkout1
-rwxr-xr-x.dev-suite/hooked/post-commit1
-rwxr-xr-x.dev-suite/hooked/post-merge1
-rwxr-xr-x.dev-suite/hooked/post-receive1
-rwxr-xr-x.dev-suite/hooked/post-rewrite1
-rwxr-xr-x.dev-suite/hooked/post-update1
-rwxr-xr-x.dev-suite/hooked/pre-auto-gc1
-rwxr-xr-x.dev-suite/hooked/pre-commit1
-rwxr-xr-x.dev-suite/hooked/pre-push1
-rwxr-xr-x.dev-suite/hooked/pre-rebase1
-rwxr-xr-x.dev-suite/hooked/pre-receive1
-rwxr-xr-x.dev-suite/hooked/prepare-commit-msg1
-rwxr-xr-x.dev-suite/hooked/push-to-checkout1
-rwxr-xr-x.dev-suite/hooked/sendemail-validate1
-rwxr-xr-x.dev-suite/hooked/update1
-rw-r--r--.dev-suite/ticket/closed/2-create-git-hooks-tool.toml (renamed from .dev-suite/ticket/open/2-create-git-hooks-tool.toml)2
-rw-r--r--Cargo.lock10
-rw-r--r--Cargo.toml1
-rw-r--r--hooked/Cargo.toml13
-rw-r--r--hooked/src/bin/hooked-commit-msg.rs3
-rw-r--r--hooked/src/main.rs85
24 files changed, 131 insertions, 1 deletions
diff --git a/.dev-suite/hooked/applypatch-msg b/.dev-suite/hooked/applypatch-msg
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/applypatch-msg
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/commit-msg b/.dev-suite/hooked/commit-msg
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/commit-msg
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/post-applypatch b/.dev-suite/hooked/post-applypatch
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/post-applypatch
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/post-checkout b/.dev-suite/hooked/post-checkout
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/post-checkout
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/post-commit b/.dev-suite/hooked/post-commit
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/post-commit
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/post-merge b/.dev-suite/hooked/post-merge
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/post-merge
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/post-receive b/.dev-suite/hooked/post-receive
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/post-receive
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/post-rewrite b/.dev-suite/hooked/post-rewrite
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/post-rewrite
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/post-update b/.dev-suite/hooked/post-update
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/post-update
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/pre-auto-gc b/.dev-suite/hooked/pre-auto-gc
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/pre-auto-gc
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/pre-commit b/.dev-suite/hooked/pre-commit
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/pre-commit
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/pre-push b/.dev-suite/hooked/pre-push
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/pre-push
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/pre-rebase b/.dev-suite/hooked/pre-rebase
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/pre-rebase
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/pre-receive b/.dev-suite/hooked/pre-receive
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/pre-receive
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/prepare-commit-msg b/.dev-suite/hooked/prepare-commit-msg
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/prepare-commit-msg
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/push-to-checkout b/.dev-suite/hooked/push-to-checkout
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/push-to-checkout
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/sendemail-validate b/.dev-suite/hooked/sendemail-validate
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/sendemail-validate
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/hooked/update b/.dev-suite/hooked/update
new file mode 100755
index 0000000..efcbaec
--- /dev/null
+++ b/.dev-suite/hooked/update
@@ -0,0 +1 @@
+#! /bin/bash \ No newline at end of file
diff --git a/.dev-suite/ticket/open/2-create-git-hooks-tool.toml b/.dev-suite/ticket/closed/2-create-git-hooks-tool.toml
index 19d8904..c51799c 100644
--- a/.dev-suite/ticket/open/2-create-git-hooks-tool.toml
+++ b/.dev-suite/ticket/closed/2-create-git-hooks-tool.toml
@@ -1,5 +1,5 @@
title = 'Create git hooks tool'
-status = 'Open'
+status = 'Closed'
number = 2
description = '''
Git hooks are great, but the problem is that it's hard to standardize
diff --git a/Cargo.lock b/Cargo.lock
index a5ec158..0e50a59 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -190,6 +190,16 @@ dependencies = [
]
[[package]]
+name = "hooked"
+version = "0.1.0"
+dependencies = [
+ "anyhow 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)",
+ "paw 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "shared 0.1.0",
+ "structopt 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index 5651345..3d82563 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -2,4 +2,5 @@
members = [
"shared",
"ticket",
+ "hooked",
]
diff --git a/hooked/Cargo.toml b/hooked/Cargo.toml
new file mode 100644
index 0000000..acde074
--- /dev/null
+++ b/hooked/Cargo.toml
@@ -0,0 +1,13 @@
+[package]
+name = "hooked"
+version = "0.1.0"
+authors = ["Michael Gattozzi <mgattozzi@gmail.com>"]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+anyhow = "1.0"
+paw = "1.0"
+shared = { path = "../shared" }
+structopt = { version = "0.3", features = ["paw"] }
diff --git a/hooked/src/bin/hooked-commit-msg.rs b/hooked/src/bin/hooked-commit-msg.rs
new file mode 100644
index 0000000..80a1832
--- /dev/null
+++ b/hooked/src/bin/hooked-commit-msg.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("Hello, world!");
+}
diff --git a/hooked/src/main.rs b/hooked/src/main.rs
new file mode 100644
index 0000000..d412469
--- /dev/null
+++ b/hooked/src/main.rs
@@ -0,0 +1,85 @@
+#[cfg(windows)]
+use anyhow::bail;
+use anyhow::Result;
+use shared::find_root;
+#[cfg(not(windows))]
+use std::os::unix::fs::{
+ symlink,
+ PermissionsExt,
+};
+#[cfg(windows)]
+use std::os::windows::fs::symlink_file;
+use std::{
+ fs,
+ io::Write,
+};
+
+const HOOKS: [&str; 18] = [
+ "applypatch-msg",
+ "post-applypatch",
+ "pre-commit",
+ "prepare-commit-msg",
+ "commit-msg",
+ "post-commit",
+ "pre-rebase",
+ "post-checkout",
+ "post-merge",
+ "pre-push",
+ "pre-receive",
+ "update",
+ "post-receive",
+ "post-update",
+ "push-to-checkout",
+ "pre-auto-gc",
+ "post-rewrite",
+ "sendemail-validate",
+];
+
+#[derive(structopt::StructOpt)]
+enum Args {
+ /// Initialize the repo to use ticket
+ Init,
+}
+
+#[paw::main]
+fn main(args: Args) {
+ if let Err(e) = match args {
+ Args::Init => init(),
+ } {
+ eprintln!("{}", e);
+ std::process::exit(1);
+ }
+}
+
+fn init() -> Result<()> {
+ #[cfg(windows)]
+ bail!("Windows is currently unsupported!");
+
+ let root = find_root()?;
+ let git_hooks = &root.join(".git").join("hooks");
+ let root = root.join(".dev-suite").join("hooked");
+ fs::create_dir_all(&root)?;
+
+ for hook in &HOOKS {
+ let path = &root.join(hook);
+ let git_hook = &git_hooks.join(hook);
+
+ if !path.exists() {
+ let mut file = fs::File::create(&path)?;
+ let mut perms = file.metadata()?.permissions();
+ perms.set_mode(0o755);
+ file.set_permissions(perms)?;
+ file.write_all(b"#! /bin/bash")?;
+ }
+ let path = path.canonicalize()?;
+
+ if !git_hook.exists() {
+ #[cfg(not(windows))]
+ symlink(&path, &git_hook)?;
+ #[cfg(windows)]
+ symlink_file(&path, &git_hook)?;
+ }
+ }
+
+ Ok(())
+}