about summary refs log tree commit diff
path: root/users/grfn/system/home/modules/lib/cloneRepo.nix
blob: dc487dc6bd059bf3442d9546a1644960819cf240 (plain) (blame)
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
59
60
61
62
63
64
65
66
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;
  };
}