about summary refs log tree commit diff
path: root/users/grfn/system/home/modules/lib/cloneRepo.nix
diff options
context:
space:
mode:
authorGriffin Smith <grfn@gws.fyi>2021-04-11T21·53-0400
committerglittershark <grfn@gws.fyi>2021-04-12T14·45+0000
commit6266c5d32f9ff651fcfc3a4cc0c68e89da56ca65 (patch)
tree5be3967585787c4456e17cb29423770217fdcede /users/grfn/system/home/modules/lib/cloneRepo.nix
parent968effb5dc1a4617a0dceaffc70e986abe300c6e (diff)
refactor(users/glittershark): Rename to grfn r/2485
Rename my //users directory and all places that refer to glittershark to
grfn, including nix references and documentation.

This may require some extra attention inside of gerrit's database after
it lands to allow me to actually push things.

Change-Id: I4728b7ec2c60024392c1c1fa6e0d4a59b3e266fa
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2933
Tested-by: BuildkiteCI
Reviewed-by: tazjin <mail@tazj.in>
Reviewed-by: lukegb <lukegb@tvl.fyi>
Reviewed-by: glittershark <grfn@gws.fyi>
Diffstat (limited to 'users/grfn/system/home/modules/lib/cloneRepo.nix')
-rw-r--r--users/grfn/system/home/modules/lib/cloneRepo.nix67
1 files changed, 67 insertions, 0 deletions
diff --git a/users/grfn/system/home/modules/lib/cloneRepo.nix b/users/grfn/system/home/modules/lib/cloneRepo.nix
new file mode 100644
index 000000000000..dc487dc6bd05
--- /dev/null
+++ b/users/grfn/system/home/modules/lib/cloneRepo.nix
@@ -0,0 +1,67 @@
+{ lib, config, ... }:
+with lib;
+{
+  options = {
+    grfn.impure.clonedRepos = mkOption {
+      description = "Repositories to clone";
+      default = {};
+      type = with types; loaOf (
+        let sm = submodule {
+          options = {
+            url = mkOption {
+              type = nullOr str;
+              description = "URL of repository to clone";
+              default = null;
+            };
+
+            github = mkOption {
+              type = nullOr str;
+              description = "Github owner/repo of repository to clone";
+              default = null;
+            };
+
+            path = mkOption {
+              type = str;
+              description = "Path to clone to";
+            };
+
+            onClone = mkOption {
+              type = str;
+              description = ''
+                Shell command to run after cloning the repo for the first time.
+                Runs inside the repo itself.
+              '';
+              default = "";
+            };
+
+            after = mkOption {
+              type = listOf str;
+              description = "Activation hooks that this repository must be cloned after";
+              default = [];
+            };
+          };
+        };
+        in addCheck sm (cr: (! isNull cr.url || ! isNull cr.github))
+      );
+    };
+  };
+
+  config = {
+    home.activation =
+      mapAttrs
+      (_: {
+        url, path, github, onClone, after, ...
+      }:
+        let repoURL = if isNull url then "git@github.com:${github}" else url;
+        in hm.dag.entryAfter (["writeBoundary"] ++ after) ''
+          $DRY_RUN_CMD mkdir -p $(dirname "${path}")
+          if [[ ! -d ${path} ]]; then
+            $DRY_RUN_CMD git clone "${repoURL}" "${path}"
+            pushd ${path}
+            $DRY_RUN_CMD ${onClone}
+            popd
+          fi
+        '')
+      config.grfn.impure.clonedRepos;
+  };
+}