about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--pkgs/development/misc/bleeding-edge-repos/default.nix4
-rw-r--r--pkgs/tools/package-management/nix-repository-manager/default.nix78
-rw-r--r--pkgs/top-level/haskell-packages.nix5
3 files changed, 85 insertions, 2 deletions
diff --git a/pkgs/development/misc/bleeding-edge-repos/default.nix b/pkgs/development/misc/bleeding-edge-repos/default.nix
index 873919178d6d8..9187d910079ff 100644
--- a/pkgs/development/misc/bleeding-edge-repos/default.nix
+++ b/pkgs/development/misc/bleeding-edge-repos/default.nix
@@ -19,7 +19,7 @@ args:
                      "run NO_FETCH=1 nix-repository-manager <path to nixpkgs> --update <reponame> to add it automatically";
         localTarGZ = managedRepoDir+"/dist/${ lib.dropPath (head fetchinfo.urls) }"; # hack, dropPath should be implemented as primop
         fetchInfos = import ../../../misc/bleeding-edge-fetch-infos.nix; in
-    if (getConfig ["bleedingEdgeRepos" "useLocalRepos"] false )
+    if (getConfig ["bleedingEdgeRepos" "useLocalRepos"] false && builtins.pathExists localTarGZ)
         then localTarGZ else fetchinfo;
 
   repos = 
@@ -31,7 +31,7 @@ args:
     # each repository has 
     # a type, url and maybe a tag
     # you can add groups names to update some repositories at once
-    # see nix_repository_manager expression in all-packages.nix
+    # see nix-repository-manager expression in haskellPackages
 
       nix_repository_manager = { type = "darcs"; url = "http://mawercer.de/~marc/repos/nix-repository-manager"; };
 
diff --git a/pkgs/tools/package-management/nix-repository-manager/default.nix b/pkgs/tools/package-management/nix-repository-manager/default.nix
new file mode 100644
index 0000000000000..3275f71090fa1
--- /dev/null
+++ b/pkgs/tools/package-management/nix-repository-manager/default.nix
@@ -0,0 +1,78 @@
+{lib, bleedingEdgeRepos, writeText, ghcReal, getConfig, stdenv, writeScriptBin }:
+
+/* usage
+   see pkgs/development/misc/bleeding-edge-repos/default.nix [1]
+   and pkgs/misc/bleeding-edge-fetch-infos.nix
+
+   Either add repository definitions which can be used by sourceByName "foo"
+   to [1] or config.nix. Example:
+
+   bleedingEdgeRepos = {
+     useLocalRepos = true; # prefer local dist file if availible
+
+     repos = {
+        # the attr names are equal to the repo IDs [2]
+        getOptions = { type="darcs"; url="http://repetae.net/john/repos/GetOptions"; };
+        nobug = { type = "git"; url="git://git.pipapo.org/nobug"; };
+        anyterm = { type = "svn"; url="http://svn.anyterm.org/anyterm/tags/releases/1.1/1.1.25/"; };
+        gnash = { type = "cvs"; cvsRoot=":pserver:anonymous@cvs.sv.gnu.org:/sources/gnash"; module="gnash"; };
+        octave = { type = "hg"; url="http://www.octave.org/hg/octave"; groups="octave_group"; };
+     };
+   };
+
+
+   to fetch / update the repository given by ID [2] use:
+   $ run-nix-repository-manager-with-config [$PATH_TO_NIXPKGS] --update ID
+   This will also calculate the current hash of the dist file which will be
+   saved to $PATH_TO_NIXPKGS/pkgs/misc/bleeding-edge-fetch-infos.nix.
+
+   Distribute the dist file which is stored in ~/managed_repos/dist using
+   $ run-nix-repository-manager-with-config --publish ID
+   this will upload the file to my server. Contact MarcWeber to get login data.
+   It should be easy to add multiple mirror locations instead (?)
+
+   You can add groups="xorg"; as seen above to update / distribute all
+   packages belonging to that group.
+*/
+
+let
+  inherit (builtins) getAttr attrNames;
+  inherit (lib) concatStringsSep mapRecordFlatten;
+  toConfigLine = name : set : 
+    "[(\"name\",\"${name}\")," + ( concatStringsSep "," (map (a: "(\"${a}\",\"${getAttr a set}\")" ) (attrNames set)))+"]";
+  config = writeText "nix-repository-manager_config"
+        (bleedingEdgeRepos.managedRepoDir+"\n" +
+        concatStringsSep "\n" (mapRecordFlatten toConfigLine (bleedingEdgeRepos.repos)));
+
+  cfg = getConfig ["nixRepositoryManager" ] {};
+
+  provideSource = if (builtins.hasAttr "sourcefile" cfg) then
+     "cp ${cfg.sourcefile} source.hs "
+    else ''
+      src="${bleedingEdgeRepos.sourceByName "nix_repository_manager"}"
+      unpackPhase
+      mv nix_repsoitory_manager_tmp_dir/nix-repository-manager.hs source.hs
+    '';
+
+  nixRepositoryManager = stdenv.mkDerivation {
+    name = "nix-repository-manager";
+
+    phases="buildPhase";
+    buildPhase = ''
+      ${provideSource}
+      ensureDir $out/bin
+      ghc --make source.hs -o $out/bin/nix-repository-manager
+    '';
+
+    buildInputs = [ ghcReal ];
+
+    meta = { 
+        description = "makes it easy to keep some packages up to date";
+        license = "GPL";
+    };
+  };
+in writeScriptBin "run-nix-repository-manager-with-config" 
+''
+#!/bin/sh
+exec ${nixRepositoryManager}/bin/nix-repository-manager ${config} $@
+''
diff --git a/pkgs/top-level/haskell-packages.nix b/pkgs/top-level/haskell-packages.nix
index 25e22f42eb8bc..d41811e1657fa 100644
--- a/pkgs/top-level/haskell-packages.nix
+++ b/pkgs/top-level/haskell-packages.nix
@@ -538,6 +538,11 @@ rec {
     inherit (pkgs) stdenv fetchurl;
   };
 
+  nixRepositoryManager = import ../tools/package-management/nix-repository-manager {
+    inherit (pkgs) stdenv lib writeText writeScriptBin getConfig bleedingEdgeRepos ;
+    inherit ghcReal;
+  };
+
   # Games.
 
   MazesOfMonad = import ../games/MazesOfMonad {