feat(users/Profpatsch): add a rewriter for lib.stdenv changes
This is in order to advance the rewriting from stdenv.lib to lib. https://github.com/NixOS/nixpkgs/issues/108938 The hard part about changing the argument is that a package might not include lib in its arguments, which is why I use hnix to check whether lib is included and add it to the import list if it doesn’t already exist there. So far, only the really common pattern of meta = with stdenv.lib; is rewritten. Change-Id: I370f0a321b0e5a5bd21ec21fc7cefdd65ec845ed Reviewed-on: https://cl.tvl.fyi/c/depot/+/2345 Tested-by: BuildkiteCI Reviewed-by: Profpatsch <mail@profpatsch.de>
This commit is contained in:
parent
c1cb4c260c
commit
2f807d7f14
3 changed files with 187 additions and 0 deletions
84
users/Profpatsch/nixpkgs-rewriter/default.nix
Normal file
84
users/Profpatsch/nixpkgs-rewriter/default.nix
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
{ depot, pkgs, ... }:
|
||||
let
|
||||
inherit (depot.nix)
|
||||
writeExecline
|
||||
;
|
||||
inherit (depot.users.Profpatsch.lib)
|
||||
debugExec
|
||||
eprintf
|
||||
;
|
||||
|
||||
export-json-object = pkgs.writers.writePython3 "export-json-object" {} ''
|
||||
import json
|
||||
import sys
|
||||
import os
|
||||
|
||||
d = json.load(sys.stdin)
|
||||
|
||||
if d == {}:
|
||||
sys.exit(0)
|
||||
|
||||
for k, v in d.items():
|
||||
os.environ[k] = str(v)
|
||||
|
||||
os.execvp(sys.argv[1], sys.argv[1:])
|
||||
'';
|
||||
|
||||
meta-stdenv-lib = pkgs.writers.writeHaskell "meta-stdenv-lib" {
|
||||
libraries = [
|
||||
pkgs.haskellPackages.hnix
|
||||
pkgs.haskellPackages.aeson
|
||||
];
|
||||
} ./MetaStdenvLib.hs;
|
||||
|
||||
replace-between-lines = writeExecline "replace-between-lines" { readNArgs = 1; } [
|
||||
"importas" "-ui" "file" "fileName"
|
||||
"importas" "-ui" "from" "fromLine"
|
||||
"importas" "-ui" "to" "toLine"
|
||||
"if" [ eprintf "\${from}-\${to}" ]
|
||||
(debugExec "adding lib")
|
||||
"sed"
|
||||
"-e" "\${from},\${to} \${1}"
|
||||
"-i" "$file"
|
||||
];
|
||||
|
||||
add-lib-if-necessary = writeExecline "add-lib-if-necessary" { readNArgs = 1; } [
|
||||
"pipeline" [ meta-stdenv-lib "$1" ]
|
||||
export-json-object
|
||||
# first replace any stdenv.lib mentions in the arg header
|
||||
# if this is not done, the replace below kills these.
|
||||
# Since we want it anyway ultimately, let’s do it here.
|
||||
"if" [ replace-between-lines "s/stdenv\.lib/lib/" ]
|
||||
# then add the lib argument
|
||||
# (has to be before stdenv, otherwise default arguments might be in the way)
|
||||
replace-between-lines "s/stdenv/lib, stdenv/"
|
||||
];
|
||||
|
||||
metaString = ''meta = with stdenv.lib; {'';
|
||||
|
||||
replace-stdenv-lib = pkgs.writers.writeBash "replace-stdenv-lib" ''
|
||||
set -euo pipefail
|
||||
sourceDir="$1"
|
||||
for file in $(
|
||||
${pkgs.ripgrep}/bin/rg \
|
||||
--files-with-matches \
|
||||
--fixed-strings \
|
||||
-e '${metaString}' \
|
||||
"$sourceDir"
|
||||
)
|
||||
do
|
||||
echo "replacing stdenv.lib meta in $file" >&2
|
||||
sed -e '/${metaString}/ s/stdenv.lib/lib/' \
|
||||
-i "$file"
|
||||
${add-lib-if-necessary} "$file"
|
||||
done
|
||||
'';
|
||||
|
||||
in {
|
||||
# requires hnix, which we don’t want in tvl for now
|
||||
# uncomment manually if you want to use it.
|
||||
# inherit
|
||||
# meta-stdenv-lib
|
||||
# replace-stdenv-lib
|
||||
# ;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue