Commit Graph

54 Commits

Author SHA1 Message Date
Graham Christensen
152c63c9ff
Convert libs to a fixed-point
This does break the API of being able to import any lib file and get
its libs, however I'm not sure people did this.

I made this while exploring being able to swap out docFn with a stub
in #2305, to avoid functor performance problems. I don't know if that
is going to move forward (or if it is a problem or not,) but after
doing all this work figured I'd put it up anyway :)

Two notable advantages to this approach:

1. when a lib inherits another lib's functions, it doesn't
   automatically get put in to the scope of lib
2. when a lib implements a new obscure functions, it doesn't
   automatically get put in to the scope of lib

Using the test script (later in this commit) I got the following diff
on the API:

  + diff master fixed-lib
  11764a11765,11766
  > .types.defaultFunctor
  > .types.defaultTypeMerge
  11774a11777,11778
  > .types.isOptionType
  > .types.isType
  11781a11786
  > .types.mkOptionType
  11788a11794
  > .types.setType
  11795a11802
  > .types.types

This means that this commit _adds_ to the API, however I can't find a
way to fix these last remaining discrepancies. At least none are
_removed_.

Test script (run with nix-repl in the PATH):

  #!/bin/sh

  set -eux

  repl() {
      suff=${1:-}
      echo "(import ./lib)$suff" \
          | nix-repl 2>&1
  }

  attrs_to_check() {
      repl "${1:-}" \
          | tr ';'  $'\n' \
          | grep "\.\.\." \
          | cut -d' ' -f2 \
          | sed -e "s/^/${1:-}./" \
          | sort
  }

  summ() {
      repl "${1:-}" \
          | tr ' ' $'\n' \
          | sort \
          | uniq
  }

  deep_summ() {
      suff="${1:-}"
      depth="${2:-4}"
      depth=$((depth - 1))
      summ "$suff"

      for attr in $(attrs_to_check "$suff" | grep -v "types.types"); do
          if [ $depth -eq 0 ]; then
              summ "$attr" | sed -e "s/^/$attr./"
          else
              deep_summ "$attr" "$depth" | sed -e "s/^/$attr./"
          fi
      done
  }

  (
      cd nixpkgs

      #git add .
      #git commit -m "Auto-commit, sorry" || true
      git checkout fixed-lib
      deep_summ > ../fixed-lib
      git checkout master
      deep_summ > ../master
  )

  if diff master fixed-lib; then
      echo "SHALLOW MATCH!"
  fi

  (
      cd nixpkgs
      git checkout fixed-lib
      repl .types
  )
2017-09-16 21:36:43 -04:00
zimbatm
4d545297d8 lib: introduce imap0, imap1 (#25543)
* lib: introduce imap0, imap1

For historical reasons, imap starts counting at 1 and it's not
consistent with the rest of the lib.

So for now we split imap into imap0 that starts counting at zero and
imap1 that starts counting at 1. And imap is marked as deprecated.

See c71e2d4235 (commitcomment-21873221)

* replace uses of lib.imap

* lib: move imap to deprecated.nix
2017-07-04 23:29:23 +01:00
Profpatsch
2b0a8427e6 lib/string: make isStorePath total (#26216)
fix #9278
2017-05-30 00:20:37 +01:00
Tom Saeger
5989515b94 lib: trivial spelling fixes 2017-04-19 19:37:55 -05:00
Orivej Desh
02126b69e5
lib.readPathsFromFile: simplify, /cc #24036
This part isn't needed after 36de745e1b.
2017-03-19 14:52:47 +01:00
Vladimír Čunát
36de745e1b
readPathsFromFile: fixup after #23851
The final newline would produce an empty string;
let's filter all empty lines as well.
2017-03-19 10:19:20 +01:00
Léo Gaspard
da6619cffe libs: make splitString also split last separator (#23851)
* libs: make splitString also split last separator

* libs: add tests for splitStrings
2017-03-15 21:16:04 +00:00
Domen Kožar
661415d4eb getVersion: first try drv.version before parsing drv.name 2016-08-13 17:17:36 +02:00
Данило Глинський (Danylo Hlynskyi)
0a0b7eb5f2 fix documentation typo in lib/strings.nix (#17684) 2016-08-12 08:30:11 +00:00
Domen Kožar
221f7f18c1 hasSuffix: human readable inputs 2016-08-10 20:06:52 +02:00
Eric Sagnes
56575cc0ac lib: add fileContents function 2016-08-01 18:35:25 +09:00
aszlig
df475092e9
lib: Make escapeShellArg more robust
Quoting various characters that the shell *may* interpret specially is a
very fragile thing to do.

I've used something more robust all over the place in various Nix
expression I've written just because I didn't trust escapeShellArg.

Here is a proof of concept showing that I was indeed right in
distrusting escapeShellArg:

with import <nixpkgs> {};

let
  payload = runCommand "payload" {} ''
    # \x00 is not allowed for Nix strings, so let's begin at 1
    for i in $(seq 1 255); do
      echo -en "\\x$(printf %02x $i)"
    done > "$out"
  '';

  escapers = with lib; {
    current = escapeShellArg;
    better = arg: let
      backslashEscapes = stringToCharacters "\"\\ ';$`()|<>\r\t*[]&!~#";
      search = backslashEscapes ++ [ "\n" ];
      replace = map (c: "\\${c}") backslashEscapes ++ [ "'\n'" ];
    in replaceStrings search replace (toString arg);
    best = arg: "'${replaceStrings ["'"] ["'\\''"] (toString arg)}'";
  };

  testWith = escaper: let
    escaped = escaper (builtins.readFile payload);
  in runCommand "test" {} ''
    if ! r="$(bash -c ${escapers.best "echo -nE ${escaped}"} 2> /dev/null)"
    then
      echo bash eval error > "$out"
      exit 0
    fi
    if echo -n "$r" | cmp -s "${payload}"; then
      echo success > "$out"
    else
      echo failed > "$out"
    fi
  '';

in runCommand "results" {} ''
  echo "Test results:"
  ${lib.concatStrings (lib.mapAttrsToList (name: impl: ''
    echo "  ${name}: $(< "${testWith impl}")"
  '') escapers)}
  exit 1
''

The resulting output is the following:

Test results:
  best: success
  better: success
  current: bash eval error

I did the "better" implementation just to illustrate that the method of
quoting only "harmful" characters results in madness in terms of
implementation and performance.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra, @zimbatm
2016-06-20 23:53:36 +02:00
zimbatm
b0f8416c5c Merge pull request #16180 from zimbatm/shell-escaping
Escape all shell arguments uniformly
2016-06-19 23:27:52 +01:00
zimbatm
bec28d748c Remove unecessary branching on old nix versions
All these builtins are available since 1.10 or earlier (1.10 being the
lib/minver.nix)
2016-06-17 11:06:48 +01:00
zimbatm
28fa4a2f03 Escape all shell arguments uniformly 2016-06-12 18:11:37 +01:00
Nikolay Amiantov
cdff1f61f0 lib: revert my bogus comment fix
See 5445e521b6 (commitcomment-17531945)
2016-05-19 01:26:04 +03:00
Nikolay Amiantov
5445e521b6 firefox: restore gstreamer support for older firefox releases 2016-05-19 00:28:49 +03:00
Nikolay Amiantov
c779e30d53 make*Path: implement via makeSearchPathOutput 2016-04-25 13:24:39 +03:00
Nikolay Amiantov
ab0a0c004e makeSearchPathOutputs: refactor to makeSearchPathOutput 2016-04-25 13:24:39 +03:00
Nikolay Amiantov
9b9fea305f makeSearchPath (and derivatives): check outputUnspecified 2016-04-13 22:09:41 +03:00
Nikolay Amiantov
e26119619f makePerlPath: try to guess outputs 2016-04-13 22:05:45 +03:00
Nikolay Amiantov
2a3b3d6f8b makeSearchPathOutputs: init function 2016-04-13 22:05:45 +03:00
Nikolay Amiantov
5ef56700b9 makeBinPath: guess outputs 2016-04-13 22:05:45 +03:00
Vladimír Čunát
30f14243c3 Merge branch 'master' into closure-size
Comparison to master evaluations on Hydra:
  - 1255515 for nixos
  - 1255502 for nixpkgs
2016-04-10 11:17:52 +02:00
Eelco Dolstra
fd2273e419 Stronger warning against usage of splitString 2016-04-01 13:52:54 +02:00
Vladimír Čunát
ab15a62c68 Merge branch 'master' into closure-size
Beware that stdenv doesn't build. It seems something more will be needed
than just resolution of merge conflicts.
2016-04-01 10:06:01 +02:00
zimbatm
7883ca774b lib/strings: document all the functions 2016-03-10 12:31:06 +00:00
Vladimír Čunát
716aac2519 Merge branch 'staging' into closure-size 2016-01-19 09:55:31 +01:00
Peter Simons
7ca8e13918 lib.getVersion: extend the function to cope with strings as well as derivations 2016-01-05 20:09:39 +01:00
Vladimír Čunát
f9f6f41bff Merge branch 'master' into closure-size
TODO: there was more significant refactoring of qtbase and plasma 5.5
on master, and I'm deferring pointing to correct outputs to later.
2015-12-31 09:53:02 +01:00
Thomas Tuegel
8baebb55d4 lib/strings: add readPathsFromFile 2015-12-16 15:00:34 -06:00
Luca Bruno
5b0352a6a4 Merge branch 'master' into closure-size 2015-12-11 18:31:00 +01:00
Domen Kožar
66c90e6e1f add makeBinPath function for abstracting away pkg/bin:pkg2/bin.. 2015-12-10 12:47:32 +01:00
Luca Bruno
a412927924 Merge remote-tracking branch 'origin/master' into closure-size 2015-11-25 21:37:30 +01:00
Christian Zagrodnick
1cdacc6aa2 lib/strings: add a toInt helper (close #11242)
While the function itself is pretty easy, it's not straitforward to find a way to convert string to int with nix.
2015-11-25 08:50:02 +01:00
Vladimír Čunát
5227fb1dd5 Merge commit staging+systemd into closure-size
Many non-conflict problems weren't (fully) resolved in this commit yet.
2015-10-03 13:33:37 +02:00
Eelco Dolstra
214d4fb73c Allow options with type "package" to be store paths
For example, this allows writing

  nix.package = /nix/store/786mlvhd17xvcp2r4jmmay6jj4wj6b7f-nix-1.10pre4206_896428c;

Also, document types.package in the manual.
2015-08-07 03:09:57 +02:00
Eelco Dolstra
c399f94bb3 intersperse: Fix quadratic performance 2015-07-24 15:58:34 +02:00
Eelco Dolstra
2d9885db9e Remove eqStrings
It's no longer needed. Also clean up some comments.
2015-07-24 15:58:34 +02:00
Eelco Dolstra
9cfd128a42 Use replaceStrings primop 2015-07-24 15:58:34 +02:00
Eelco Dolstra
6f6f66ac98 Use concatStringSep primop 2015-07-24 15:58:34 +02:00
Eelco Dolstra
0ae8b365b3 Rename misc.nix -> deprecated.nix 2015-07-23 18:31:54 +02:00
Eelco Dolstra
637e35deb9 Use foldl' instead of fold in some places 2015-07-23 18:31:54 +02:00
Nicolas B. Pierron
be65ac7c32 Issue 8152 - Reduce number of attribute set created by replaceChars. 2015-07-13 23:46:38 +02:00
Vladimír Čunát
c2fff72836 systemPackages, makeLibraryPath: try to guess outputs 2015-05-05 11:56:31 +02:00
Nikita Mikhailov
63ae447a0f Add 'fixedWidthString' and 'fixedWidthNumber' formatting functions 2015-03-08 19:02:32 +01:00
Eelco Dolstra
6c2bf141cf lib: Use arithmetic operators rather than builtins.add etc. 2014-10-05 01:10:06 +02:00
Igor Pashev
0383b57b3c Added concatMapStringsSep and concatImapStringsSep
Example: configure rewrite rules for Mediawiki

    RewriteEngine On
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
    ${concatMapStringsSep "\n" (u: "RewriteCond %{REQUEST_URI} !^${u.urlPath}") serverInfo.serverConfig.servedDirs}
    RewriteRule ${if config.enableUploads
2014-08-25 10:23:10 +02:00
Kirill Elagin
751a01063d lib: Do not take string context into account
Close #2883.
2014-06-11 20:22:58 +02:00
Vladimír Čunát
bf2bc0f0dc lib/strings: add hasPrefix and simplify hasSuffix
It was discussed as a part of #2570.
2014-05-13 11:05:37 +02:00