Home

ugit @main - refs - log -
-
https://git.jolheiser.com/ugit.git
The code powering this h*ckin' site
tree log patch
git: add post-receive hook support
Signature
-----BEGIN SSH SIGNATURE----- U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgBTEvCQk6VqUAdN2RuH6bj1dNkY oOpbPWj+jw4ua1B1cAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5 AAAAQHw4C6zc+8enZT9YYCmvMKW0LRrj+Ivz7T+g8jdo/hbnYvo+FuVzfxC4QzGS+cIeqL /N/AlLVHsGLd6hMOWftQo= -----END SSH SIGNATURE-----
jolheiser <git@jolheiser.com>
6 hours ago
2 changed files, 45 additions(+), 12 deletions(-)
cmd/ugitd/main.gonix/module.nix
M cmd/ugitd/main.go -> cmd/ugitd/main.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
diff --git a/cmd/ugitd/main.go b/cmd/ugitd/main.go
index 6dfa3d9dfefc302d856bf424042d2e9d6444b1e5..4e330289478424e28bee7d5224f560b06ba919a4 100644
--- a/cmd/ugitd/main.go
+++ b/cmd/ugitd/main.go
@@ -23,9 +23,11 @@ 	"go.jolheiser.com/ugit/internal/ssh"
 )
 
 func main() {
-	if len(os.Args) > 1 && os.Args[1] == "pre-receive-hook" {
-		preReceive()
-		return
+	if len(os.Args) > 1 {
+		if os.Args[1] == "pre-receive-hook" {
+			preReceive()
+			return
+		}
 	}
 
 	args, err := parseArgs(os.Args[1:])
@@ -133,7 +135,19 @@ 	fp := filepath.Join(repoDir, "hooks")
 	if err := os.MkdirAll(fp, os.ModePerm); err != nil {
 		return err
 	}
-	fp = filepath.Join(fp, "pre-receive")
+
+	if err := hookFS(fp, "pre-receive", bin); err != nil {
+		return err
+	}
+	if err := hookFS(fp, "post-receive", ""); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func hookFS(hookPath, hookName, bin string) error {
+	fp := filepath.Join(hookPath, hookName)
 
 	if err := os.MkdirAll(fp+".d", os.ModePerm); err != nil {
 		return err
@@ -144,7 +158,9 @@ 	if err != nil {
 		return err
 	}
 	fmt.Fprintln(fi, "#!/usr/bin/env bash")
-	fmt.Fprintf(fi, "%s pre-receive-hook\n", bin)
+	if bin != "" {
+		fmt.Fprintf(fi, "%s %s-hook\n", bin, hookName)
+	}
 	fmt.Fprintf(fi, `for hook in %s.d/*; do
 	test -x "${hook}" && test -f "${hook}" || continue
 	"${hook}"
M nix/module.nix -> nix/module.nix
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
diff --git a/nix/module.nix b/nix/module.nix
index ca0c8ac1375bd7667ea5c2b086d266ffdf7111b6..6fb1dde987677fc33205ed56188377c73dc5cabd 100644
--- a/nix/module.nix
+++ b/nix/module.nix
@@ -50,9 +50,15 @@           default = "ugit-${name}";
           description = "Group account under which ugit runs";
         };
 
-        hooks = mkOption {
+        preHooks = mkOption {
           type = types.listOf (types.submodule hookOption);
           description = "A list of pre-receive hooks to run";
+          default = [ ];
+        };
+
+        postHooks = mkOption {
+          type = types.listOf (types.submodule hookOption);
+          description = "A list of post-receive hooks to run";
           default = [ ];
         };
 
@@ -221,19 +227,30 @@               User = instanceCfg.user;
               Group = instanceCfg.group;
               ExecStart =
                 let
-                  hookDir = "${instanceCfg.repoDir}/hooks/pre-receive.d";
-                  mkHookScript =
+                  preHookDir = "${instanceCfg.repoDir}/hooks/pre-receive.d";
+                  mkPreHookScript =
+                    hook:
+                    let
+                      script = pkgs.writeShellScript "ugit-${name}-${hook.name}-pre" hook.content;
+                    in
+                    ''
+                      mkdir -p ${preHookDir}
+                      ln -sf ${script} ${preHookDir}/${hook.name}
+                    '';
+                  postHookDir = "${instanceCfg.repoDir}/hooks/post-receive.d";
+                  mkPostHookScript =
                     hook:
                     let
-                      script = pkgs.writeShellScript "ugit-${name}-${hook.name}" hook.content;
+                      script = pkgs.writeShellScript "ugit-${name}-${hook.name}-post" hook.content;
                     in
                     ''
-                      mkdir -p ${hookDir}
-                      ln -sf ${script} ${hookDir}/${hook.name}
+                      mkdir -p ${postHookDir}
+                      ln -sf ${script} ${postHookDir}/${hook.name}
                     '';
                 in
                 pkgs.writeShellScript "ugit-${name}-hooks-setup" ''
-                  ${builtins.concatStringsSep "\n" (map mkHookScript instanceCfg.hooks)}
+                  ${builtins.concatStringsSep "\n" (map mkPreHookScript instanceCfg.preHooks)}
+                  ${builtins.concatStringsSep "\n" (map mkPostHookScript instanceCfg.postHooks)}
                 '';
             };
           };