about summary refs log tree commit diff
path: root/nixpkgs/pkgs/build-support/fetchrepoproject/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/build-support/fetchrepoproject/default.nix')
-rw-r--r--nixpkgs/pkgs/build-support/fetchrepoproject/default.nix83
1 files changed, 83 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/build-support/fetchrepoproject/default.nix b/nixpkgs/pkgs/build-support/fetchrepoproject/default.nix
new file mode 100644
index 000000000000..a5e79c8d4ef9
--- /dev/null
+++ b/nixpkgs/pkgs/build-support/fetchrepoproject/default.nix
@@ -0,0 +1,83 @@
+{ lib, stdenvNoCC, gitRepo, cacert, copyPathsToStore }:
+
+{ name, manifest, rev ? "HEAD", sha256
+# Optional parameters:
+, repoRepoURL ? "", repoRepoRev ? "", referenceDir ? "", manifestName ? ""
+, localManifests ? [], createMirror ? false, useArchive ? false
+}:
+
+assert repoRepoRev != "" -> repoRepoURL != "";
+assert createMirror -> !useArchive;
+
+let
+  inherit (lib)
+    concatMapStringsSep
+    concatStringsSep
+    fetchers
+    optionalString
+    ;
+
+  extraRepoInitFlags = [
+    (optionalString (repoRepoURL != "") "--repo-url=${repoRepoURL}")
+    (optionalString (repoRepoRev != "") "--repo-branch=${repoRepoRev}")
+    (optionalString (referenceDir != "") "--reference=${referenceDir}")
+    (optionalString (manifestName != "") "--manifest-name=${manifestName}")
+  ];
+
+  repoInitFlags = [
+    "--manifest-url=${manifest}"
+    "--manifest-branch=${rev}"
+    "--depth=1"
+    (optionalString createMirror "--mirror")
+    (optionalString useArchive "--archive")
+  ] ++ extraRepoInitFlags;
+
+  local_manifests = copyPathsToStore localManifests;
+
+in stdenvNoCC.mkDerivation {
+  inherit name;
+
+  inherit cacert manifest rev repoRepoURL repoRepoRev referenceDir; # TODO
+
+  outputHashAlgo = "sha256";
+  outputHashMode = "recursive";
+  outputHash = sha256;
+
+  preferLocalBuild = true;
+  enableParallelBuilding = true;
+
+  impureEnvVars = fetchers.proxyImpureEnvVars ++ [
+    "GIT_PROXY_COMMAND" "SOCKS_SERVER"
+  ];
+
+  nativeBuildInputs = [ gitRepo cacert ];
+
+  GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt";
+
+  buildCommand = ''
+    # Path must be absolute (e.g. for GnuPG: ~/.repoconfig/gnupg/pubring.kbx)
+    export HOME="$(pwd)"
+
+    mkdir $out
+    cd $out
+
+    mkdir .repo
+    ${optionalString (local_manifests != []) ''
+      mkdir .repo/local_manifests
+      for local_manifest in ${concatMapStringsSep " " toString local_manifests}; do
+        cp $local_manifest .repo/local_manifests/$(stripHash $local_manifest)
+      done
+    ''}
+
+    repo init ${concatStringsSep " " repoInitFlags}
+    repo sync --jobs=$NIX_BUILD_CORES --current-branch
+
+    # TODO: The git-index files (and probably the files in .repo as well) have
+    # different contents each time and will therefore change the final hash
+    # (i.e. creating a mirror probably won't work).
+    ${optionalString (!createMirror) ''
+      rm -rf .repo
+      find -type d -name '.git' -prune -exec rm -rf {} +
+    ''}
+  '';
+}