about summary refs log tree commit diff
path: root/pkgs/lib
diff options
context:
space:
mode:
authorMichael Raskin <7c6f434c@mail.ru>2008-02-15 08:41:31 +0000
committerMichael Raskin <7c6f434c@mail.ru>2008-02-15 08:41:31 +0000
commitca34aa0514bc98592f70b47ebd57ced608d57133 (patch)
tree309ef839a89d026045a4abc3d639a102e4d1dcd3 /pkgs/lib
parentd607e902afee834b9a68ca323f1ff11b5c4fd920 (diff)
downloadnixlib-ca34aa0514bc98592f70b47ebd57ced608d57133.tar
nixlib-ca34aa0514bc98592f70b47ebd57ced608d57133.tar.gz
nixlib-ca34aa0514bc98592f70b47ebd57ced608d57133.tar.bz2
nixlib-ca34aa0514bc98592f70b47ebd57ced608d57133.tar.lz
nixlib-ca34aa0514bc98592f70b47ebd57ced608d57133.tar.xz
nixlib-ca34aa0514bc98592f70b47ebd57ced608d57133.tar.zst
nixlib-ca34aa0514bc98592f70b47ebd57ced608d57133.zip
Forward port of lib
svn path=/nixpkgs/branches/stdenv-updates/; revision=10700
Diffstat (limited to 'pkgs/lib')
-rw-r--r--pkgs/lib/default.nix41
1 files changed, 38 insertions, 3 deletions
diff --git a/pkgs/lib/default.nix b/pkgs/lib/default.nix
index 0d22070ee98d..4ffe50aa035d 100644
--- a/pkgs/lib/default.nix
+++ b/pkgs/lib/default.nix
@@ -55,6 +55,8 @@ rec {
   # Map and concatenate the result.
   concatMap = f: list: concatLists (map f list);
 
+  concatMapStrings = f: list: concatStrings (map f list);
+  
 
   # Place an element between each element of a list, e.g.,
   # `intersperse "," ["a" "b" "c"]' returns ["a" "," "b" "," "c"].
@@ -91,6 +93,10 @@ rec {
       then getAttr (tail attrPath) default (builtins.getAttr attr e)
       else default;
 
+  # shortcut for getAttr ["name"] default attrs
+  maybeAttr = name: default: attrs:
+    if (__hasAttr name attrs) then (__getAttr name attrs) else default;
+
 
   # Filter a list using a predicate; that is, return a list containing
   # every element from `list' for which `pred' returns true.
@@ -153,15 +159,16 @@ rec {
        substring (sub lenFileName lenExt) lenFileName fileName == ext;
 
   hasSuffixHack = a: b: hasSuffix (a+(substring 0 0 b)) ((substring 0 0 a)+b);
-       
+
+         
   # Bring in a path as a source, filtering out all Subversion and CVS
   # directories, as well as backup files (*~).
   cleanSource =
     let filter = name: type: let baseName = baseNameOf (toString name); in ! (
       # Filter out Subversion and CVS directories.
-      (type == "directory" && (name == ".svn" || name == "CVS")) ||
+      (type == "directory" && (baseName == ".svn" || baseName == "CVS")) ||
       # Filter out backup files.
-      (hasSuffix "~" name)
+      (hasSuffix "~" baseName)
     );
     in src: builtins.filterSource filter src;
 
@@ -316,6 +323,18 @@ rec {
   debugVal = if builtins ? trace then x: (builtins.trace x x) else x: x;
   debugXMLVal = if builtins ? trace then x: (builtins.trace (builtins.toXML x) x) else x: x;
 
+  # this can help debug your code as well - designed to not produce thousands of lines
+  traceWhatis = x : __trace (whatis x) x;
+  whatis = x : 
+      if (__isAttrs x) then
+          if (x ? outPath) then "x is a derivation with name ${x.name}"
+          else "x is an attr set with attributes ${builtins.toString (__attrNames x)}"
+      else if (__isFunction x) then "x is a function"
+      else if (__isList x) then "x is a list, first item is : ${whatis (__head x)}"
+      else if (x == true || x == false) then builtins.toString x
+      else "x is propably a string starting, starting characters: ${__substring 0 50 x}..";
+
+
   innerClosePropagation = ready: list: if list == [] then ready else
     if (head list) ? propagatedBuildInputs then 
       innerClosePropagation (ready ++ [(head list)]) 
@@ -324,6 +343,16 @@ rec {
 
   closePropagation = list: (uniqList {inputList = (innerClosePropagation [] list);});
 
+  stringToCharacters = s : let l = __stringLength s; in
+    if (__lessThan l 1) then [""] else  [(__substring 0 1 s)] ++ stringToCharacters (__substring 1 (__sub l 1) s);
+
+  # should this be implemented as primop ? Yes it should..
+  escapeShellArg = s :
+    let escapeChar = x : if ( x == "'" ) then "'\"'\"'" else x;
+    in "'" + concatStrings (map escapeChar (stringToCharacters s) ) +"'";
+
+  defineShList = name : list : "\n${name}=(${concatStringsSep " " (map escapeShellArg list)})\n";
+
   # calls a function (f attr value ) for each record item. returns a list
   mapRecordFlatten = f : r : map (attr: f attr (builtins.getAttr attr r) ) (attrNames r);
 
@@ -357,6 +386,12 @@ rec {
   flattenAttrs = set : map ( attr : builtins.getAttr attr set) (attrNames set);
   mapIf = cond : f :  fold ( x : l : if (cond x) then [(f x)] ++ l else l) [];
 
+  # pick attrs subset_attr_names and apply f 
+  subsetmap = f : attrs : subset_attr_names : 
+    listToAttrs (fold ( attr : r : if __hasAttr attr attrs
+          then r ++ [ (  nv attr ( f (__getAttr attr attrs) ) ) ] else r ) []
+      subset_attr_names );
+
 # Marc 2nd proposal: (not everything has been tested in detail yet..)
 
   # usage / example