diff options
Diffstat (limited to 'pkgs')
-rw-r--r-- | pkgs/development/python-modules/generic/wrap.sh | 7 | ||||
-rw-r--r-- | pkgs/top-level/python-packages.nix | 26 |
2 files changed, 27 insertions, 6 deletions
diff --git a/pkgs/development/python-modules/generic/wrap.sh b/pkgs/development/python-modules/generic/wrap.sh index e343536b8fa..220ddf26b30 100644 --- a/pkgs/development/python-modules/generic/wrap.sh +++ b/pkgs/development/python-modules/generic/wrap.sh @@ -26,12 +26,7 @@ wrapPythonProgramsIn() { # dont wrap EGG-INFO scripts since they are called from python if echo "$i" | grep -v EGG-INFO/scripts; then echo "wrapping \`$i'..." - sed -i "$i" -re '1 { - /^#!/!b; :r - /\\$/{N;b r} - /__future__|^ *(#.*)?$/{n;b r} - /^ *[^# ]/i import sys; sys.argv[0] = '"'$(basename "$i")'"' - }' + sed -i "$i" -re '@magicalSedExpression@' wrapProgram "$i" \ --prefix PYTHONPATH ":" $program_PYTHONPATH \ --prefix PATH ":" $program_PATH diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index c0791d186ba..5f79ddea816 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -50,6 +50,32 @@ let { deps = pkgs.makeWrapper; substitutions.libPrefix = python.libPrefix; substitutions.executable = "${python}/bin/${python.executable}"; + substitutions.magicalSedExpression = let + # Looks weird? Of course, it's between single quoted shell strings. + # NOTE: Order DOES matter here, so single character quotes need to be + # at the last position. + quoteVariants = [ "'\"'''\"'" "\"\"\"" "\"" "'\"'\"'" ]; # hey Vim: '' + + mkStringSkipper = labelNum: quote: let + label = "q${toString labelNum}"; + isSingle = elem quote [ "\"" "'\"'\"'" ]; + endQuote = if isSingle then "[^\\\\]${quote}" else quote; + in '' + /^ *[a-z]?${quote}/ { + /${quote}${quote}|${quote}.*${endQuote}/{n;br} + :${label}; n; /^${quote}/{n;br}; /${endQuote}/{n;br}; b${label} + } + ''; + + in '' + 1 { + /^#!/!b; :r + /\\$/{N;br} + /__future__|^ *(#.*)?$/{n;br} + ${concatImapStrings mkStringSkipper quoteVariants} + /^ *[^# ]/i import sys; sys.argv[0] = '"'$(basename "$i")'"' + } + ''; } ../development/python-modules/generic/wrap.sh; |