summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Fischer <martin@push-f.com>2025-03-22 21:55:38 +0100
committerMartin Fischer <martin@push-f.com>2025-03-26 08:23:57 +0100
commitfff83bca1b5069f49af4d2e1dc1e1b1da60d7a61 (patch)
tree120fa07a42c5ac7e02fdd2d5245a7bbf00525e7d
parent1c5b72f01ae4cac9740b43af6963e08c6277275c (diff)
build: use npins
-rw-r--r--default.nix11
-rw-r--r--deps/pywikiapi.nix16
-rw-r--r--npins/default.nix80
-rw-r--r--npins/sources.json13
4 files changed, 103 insertions, 17 deletions
diff --git a/default.nix b/default.nix
index f6cac5c..897ac2e 100644
--- a/default.nix
+++ b/default.nix
@@ -2,7 +2,16 @@
with pkgs.python310Packages;
let
- pywikiapi = import ./deps/pywikiapi.nix { inherit pkgs; };
+ sources = import ./npins;
+ pywikiapi = buildPythonPackage rec {
+ pname = "pywikiapi";
+ version = "pinned";
+ src = sources.pywikiapi;
+
+ dependencies = [
+ requests
+ ];
+ };
in
buildPythonApplication rec {
pname = "osm-proposals";
diff --git a/deps/pywikiapi.nix b/deps/pywikiapi.nix
deleted file mode 100644
index 856f0f0..0000000
--- a/deps/pywikiapi.nix
+++ /dev/null
@@ -1,16 +0,0 @@
-{ pkgs }:
-with pkgs.python310Packages;
-
-buildPythonPackage rec {
- pname = "pywikiapi";
- version = "4.3.0";
- src = pkgs.fetchPypi {
- inherit pname;
- inherit version;
- hash = "sha256-gynkx98y8Vx/N3i6xoQ7x9MgTW6qACoYcDwy71FDYIE=";
- };
-
- dependencies = [
- requests
- ];
-}
diff --git a/npins/default.nix b/npins/default.nix
new file mode 100644
index 0000000..5e7d086
--- /dev/null
+++ b/npins/default.nix
@@ -0,0 +1,80 @@
+# Generated by npins. Do not modify; will be overwritten regularly
+let
+ data = builtins.fromJSON (builtins.readFile ./sources.json);
+ version = data.version;
+
+ mkSource =
+ spec:
+ assert spec ? type;
+ let
+ path =
+ if spec.type == "Git" then
+ mkGitSource spec
+ else if spec.type == "GitRelease" then
+ mkGitSource spec
+ else if spec.type == "PyPi" then
+ mkPyPiSource spec
+ else if spec.type == "Channel" then
+ mkChannelSource spec
+ else
+ builtins.throw "Unknown source type ${spec.type}";
+ in
+ spec // { outPath = path; };
+
+ mkGitSource =
+ {
+ repository,
+ revision,
+ url ? null,
+ hash,
+ branch ? null,
+ ...
+ }:
+ assert repository ? type;
+ # At the moment, either it is a plain git repository (which has an url), or it is a GitHub/GitLab repository
+ # In the latter case, there we will always be an url to the tarball
+ if url != null then
+ (builtins.fetchTarball {
+ inherit url;
+ sha256 = hash; # FIXME: check nix version & use SRI hashes
+ })
+ else
+ assert repository.type == "Git";
+ let
+ urlToName =
+ url: rev:
+ let
+ matched = builtins.match "^.*/([^/]*)(\\.git)?$" repository.url;
+
+ short = builtins.substring 0 7 rev;
+
+ appendShort = if (builtins.match "[a-f0-9]*" rev) != null then "-${short}" else "";
+ in
+ "${if matched == null then "source" else builtins.head matched}${appendShort}";
+ name = urlToName repository.url revision;
+ in
+ builtins.fetchGit {
+ url = repository.url;
+ rev = revision;
+ inherit name;
+ # hash = hash;
+ };
+
+ mkPyPiSource =
+ { url, hash, ... }:
+ builtins.fetchurl {
+ inherit url;
+ sha256 = hash;
+ };
+
+ mkChannelSource =
+ { url, hash, ... }:
+ builtins.fetchTarball {
+ inherit url;
+ sha256 = hash;
+ };
+in
+if version == 3 then
+ builtins.mapAttrs (_: mkSource) data.pins
+else
+ throw "Unsupported format version ${toString version} in sources.json. Try running `npins upgrade`"
diff --git a/npins/sources.json b/npins/sources.json
new file mode 100644
index 0000000..3b57f31
--- /dev/null
+++ b/npins/sources.json
@@ -0,0 +1,13 @@
+{
+ "pins": {
+ "pywikiapi": {
+ "type": "PyPi",
+ "name": "pywikiapi",
+ "version_upper_bound": null,
+ "version": "4.3.0",
+ "url": "https://files.pythonhosted.org/packages/9e/f0/09741c61d3069c99195690321cf0ad17c0a63d6ed33f130f45d9d85c2cb6/pywikiapi-4.3.0.tar.gz",
+ "hash": "8329e4c7df32f15c7f3778bac6843bc7d3204d6eaa002a18703c32ef51436081"
+ }
+ },
+ "version": 3
+} \ No newline at end of file