Browse Source

add `shallow` option to git source type

Enno Lohmeier 1 month ago
parent
commit
54eb1c89cf
3 changed files with 23 additions and 3 deletions
  1. 4 0
      README.md
  2. 4 0
      lib/types/populate.nix
  3. 15 3
      pkgs/populate/default.nix

+ 4 - 0
README.md

@@ -242,6 +242,10 @@ Supported attributes:
 * `clean.exclude` -
   List of patterns that should be excluded from Git cleaning.
 
+* `shallow` (optional)
+  boolean that controls whether only the requested commit ref. should be fetched
+  instead of the whole history, to save disk space and bandwith. Defaults to `false`.
+
 
 ### `pass`
 

+ 4 - 0
lib/types/populate.nix

@@ -140,6 +140,10 @@
         url = lib.mkOption {
           type = lib.types.str; # TODO lib.types.git.url
         };
+        shallow = lib.mkOption {
+          default = false;
+          type = lib.types.bool;
+        };
       };
     };
     pass = lib.types.submodule {

+ 15 - 3
pkgs/populate/default.nix

@@ -53,7 +53,11 @@ let
   pop.git = target: source: runShell target /* sh */ ''
     set -efu
     if ! test -e ${quote target.path}; then
-      git clone --recurse-submodules ${quote source.url} ${quote target.path}
+      ${if source.shallow then /* sh */ ''
+        git init ${quote target.path}
+      '' else /* sh */ ''
+        git clone --recurse-submodules ${quote source.url} ${quote target.path}  
+      ''}
     fi
     cd ${quote target.path}
     if ! url=$(git config remote.origin.url); then
@@ -67,10 +71,18 @@ let
 
     if ! test "$(git log --format=%H -1)" = "$hash"; then
       ${if source.fetchAlways then /* sh */ ''
-        git fetch origin
+        ${if source.shallow then /* sh */ ''
+          git fetch --depth=1 origin "$hash"
+        '' else /* sh */ ''
+          git fetch origin
+        ''}
       '' else /* sh */ ''
         if ! git log -1 "$hash" >/dev/null 2>&1; then
-          git fetch origin
+          ${if source.shallow then /* sh */ ''
+            git fetch --depth=1 origin "$hash"
+          '' else /* sh */ ''
+            git fetch origin
+          ''}
         fi
       ''}
       git reset --hard "$hash" >&2