Open patryk4815 opened 2 years ago
Hi, i needed the same feature today, so I made this function below, to map those URLs into something mach-nix can use. I don't think mach-nix can or should consume unpinned sources, so the below solution relies on the URL containing a git commit.
Nix file:
let
mach-nix = import (builtins.fetchGit {
url = "https://github.com/DavHau/mach-nix";
ref = "refs/tags/3.4.0";
}) { };
inherit (mach-nix.nixpkgs) lib;
# Given input requirements (str), return an attrset of 'packages' (list)
# containing mach-nix.buildPythonPackage results from 'git+https://...'
# entries in the requirements, and 'requirements' (str) being the remaining
# requirements.
splitRequirementsAndPackages = requirements:
let
lines = lib.splitString "\n" requirements;
urlLines = lib.filter (lib.hasPrefix "git+https://") lines;
nonUrlLines = lib.filter (x: !lib.hasPrefix "git+https://" x) lines;
getUrl = pipUrl:
lib.removePrefix "git+" (builtins.elemAt (lib.splitString "@" pipUrl) 0);
getRev = pipUrl:
let
parts = builtins.elemAt (lib.splitString "#egg=" pipUrl) 0;
in
builtins.elemAt (lib.splitString "@" parts) 1;
getPname = pipUrl:
builtins.elemAt (lib.splitString "#egg=" pipUrl) 1;
buildPackage = pipUrl:
let
src = builtins.fetchGit {
url = getUrl pipUrl;
rev = getRev pipUrl;
allRefs = true;
};
in
mach-nix.buildPythonPackage {
pname = builtins.unsafeDiscardStringContext (getPname pipUrl);
version = "0-${toString src.revCount}";
# This fails to resolve in mach-nix for some reason:
#version = "0-${toString src.revCount}-g${src.shortRev}";
inherit src;
};
in
{ requirements = lib.concatStringsSep "\n" nonUrlLines;
packages = map buildPackage urlLines;
};
originalRequirements = ''
git+https://github.com/discogs/python-cas-client.git@f1efa2f49a22d43135014cb1b8d9dd3875304318#egg=cas-client
'';
reqsAndPkgs = splitRequirementsAndPackages originalRequirements;
in
mach-nix.mkPython {
requirements = reqsAndPkgs.requirements;
packagesExtra = reqsAndPkgs.packages;
}
Build and run:
$ nix-build ./mach-nix-issue-406.nix && ./result/bin/python3 -c "import cas_client; print(cas_client.__version__)"
trace:
automatically detected requirements of cas-client:0-40 22.05pre-git:
pycryptodome
requests
six
tox
/nix/store/1vp2771zk8gpr1xk8ip8rlz8x6s0y7nr-python3-3.9.9-env
1.0.0
It would be nice to have this feature integrated into mach-nix, but I'm not sure how (yet).
Hi. I have this in my
requirements.txt
:mach-nix gen
fail with this message: