36 lines
1.2 KiB
Nix
36 lines
1.2 KiB
Nix
|
{ pkgs ? import <nixpkgs> { }
|
||
|
, lib ? pkgs.lib
|
||
|
}:
|
||
|
{
|
||
|
genNetrc =
|
||
|
{ projectDir ? null
|
||
|
, poetry ? projectDir + "/poetry.toml"
|
||
|
, pyproject ? projectDir + "/pyproject.toml"
|
||
|
}:
|
||
|
let
|
||
|
poetryToml = builtins.fromTOML (builtins.readFile poetry);
|
||
|
pyprojectToml = builtins.fromTOML (builtins.readFile pyproject);
|
||
|
|
||
|
sourceNames = builtins.attrNames poetryToml.http-basic;
|
||
|
authSources =
|
||
|
let
|
||
|
sourceNeedsAuth = { name, ... }: builtins.elem name sourceNames;
|
||
|
in
|
||
|
builtins.filter sourceNeedsAuth pyprojectToml.tool.poetry.source;
|
||
|
mergedSources = map (source: source // (builtins.getAttr source.name poetryToml.http-basic)) authSources;
|
||
|
|
||
|
mkMachine = url:
|
||
|
let
|
||
|
matches = builtins.split "(https?://)([^/]*)(.*)" url;
|
||
|
mainMatch = builtins.elemAt matches 1;
|
||
|
domain = builtins.elemAt mainMatch 1;
|
||
|
in
|
||
|
domain;
|
||
|
mkEntry = { url, username, password, ... }:
|
||
|
"machine ${mkMachine url} login ${username} password ${password}";
|
||
|
entries = map mkEntry mergedSources;
|
||
|
contents = lib.concatLines entries;
|
||
|
in
|
||
|
pkgs.writeText "netrc" contents;
|
||
|
}
|