From 9f6c9832318f1f290d33244b022e688923d03834 Mon Sep 17 00:00:00 2001 From: Toast <39011842+toast003@users.noreply.github.com> Date: Tue, 29 Jul 2025 01:45:56 +0200 Subject: [PATCH 01/13] nix: get source tarball with update.py --- contrib/package/nix/copyparty/pin.json | 4 ++-- contrib/package/nix/copyparty/update.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/package/nix/copyparty/pin.json b/contrib/package/nix/copyparty/pin.json index eae921c7..e59e6ccd 100644 --- a/contrib/package/nix/copyparty/pin.json +++ b/contrib/package/nix/copyparty/pin.json @@ -1,5 +1,5 @@ { - "url": "https://github.com/9001/copyparty/releases/download/v1.18.6/copyparty-sfx.py", + "url": "https://github.com/9001/copyparty/releases/download/v1.18.6/copyparty-1.18.6.tar.gz", "version": "1.18.6", - "hash": "sha256-No89mzKHHZZH19ws9dqfvQO0pnZw7jKDMGhNa4LOFlY=" + "hash": "sha256-gHYtkayIgV5z0MooBsY5Hc+MzVIbxALMMSNJ87yOiyg=" } \ No newline at end of file diff --git a/contrib/package/nix/copyparty/update.py b/contrib/package/nix/copyparty/update.py index 363773c0..ca334d75 100755 --- a/contrib/package/nix/copyparty/update.py +++ b/contrib/package/nix/copyparty/update.py @@ -15,7 +15,7 @@ import re from pathlib import Path OUTPUT_FILE = Path("pin.json") -TARGET_ASSET = "copyparty-sfx.py" +TARGET_ASSET = lambda version: f"copyparty-{version}.tar.gz" HASH_TYPE = "sha256" LATEST_RELEASE_URL = "https://api.github.com/repos/9001/copyparty/releases/latest" DOWNLOAD_URL = lambda version: f"https://github.com/9001/copyparty/releases/download/v{version}/{TARGET_ASSET}" @@ -42,7 +42,7 @@ def remote_release_pin(): response = requests.get(LATEST_RELEASE_URL).json() version = response["tag_name"].lstrip("v") - asset_info = [a for a in response["assets"] if a["name"] == TARGET_ASSET][0] + asset_info = [a for a in response["assets"] if a["name"] == TARGET_ASSET(version)][0] download_url = asset_info["browser_download_url"] asset = requests.get(download_url) formatted_hash = get_formatted_hash(asset.content) From 76bf9d068a4104e05f92c41006d075f86a394554 Mon Sep 17 00:00:00 2001 From: Toast <39011842+toast003@users.noreply.github.com> Date: Tue, 29 Jul 2025 03:19:56 +0200 Subject: [PATCH 02/13] nix: build from source --- contrib/package/nix/copyparty/default.nix | 43 ++++++++++------------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/contrib/package/nix/copyparty/default.nix b/contrib/package/nix/copyparty/default.nix index 28d733ab..997d4289 100644 --- a/contrib/package/nix/copyparty/default.nix +++ b/contrib/package/nix/copyparty/default.nix @@ -1,10 +1,10 @@ { lib, - stdenv, - makeWrapper, + buildPythonApplication, fetchurl, util-linux, python, + setuptools, jinja2, impacket, pyopenssl, @@ -58,9 +58,15 @@ let pinData = lib.importJSON ./pin.json; - pyEnv = python.withPackages ( - ps: - with ps; + runtimeDeps = ([ util-linux ] ++ extraPackages ++ lib.optional withMediaProcessing ffmpeg); +in +buildPythonApplication { + pname = "copyparty"; + inherit (pinData) version; + src = fetchurl { + inherit (pinData) url hash; + }; + dependencies = [ jinja2 ] @@ -73,25 +79,13 @@ let ++ lib.optional withBasicAudioMetadata mutagen ++ lib.optional withHashedPasswords argon2-cffi ++ lib.optional withZeroMQ pyzmq - ++ (extraPythonPackages ps) - ); + ++ (extraPythonPackages python.packages); + makeWrapperArgs = [ "--prefix PATH : ${lib.makeBinPath runtimeDeps}" ]; - runtimeDeps = ([ util-linux ] ++ extraPackages ++ lib.optional withMediaProcessing ffmpeg); -in -stdenv.mkDerivation { - pname = "copyparty"; - inherit (pinData) version; - src = fetchurl { - inherit (pinData) url hash; - }; - nativeBuildInputs = [ makeWrapper ]; - dontUnpack = true; - installPhase = '' - install -Dm755 $src $out/share/copyparty-sfx.py - makeWrapper ${pyEnv.interpreter} $out/bin/copyparty \ - --prefix PATH : ${lib.makeBinPath runtimeDeps} \ - --add-flag $out/share/copyparty-sfx.py - ''; + pyproject = true; + build-system = [ + setuptools + ]; meta = { description = "Turn almost any device into a file server"; longDescription = '' @@ -101,8 +95,7 @@ stdenv.mkDerivation { homepage = "https://github.com/9001/copyparty"; changelog = "https://github.com/9001/copyparty/releases/tag/v${pinData.version}"; license = lib.licenses.mit; - inherit (python.meta) platforms; mainProgram = "copyparty"; - sourceProvenance = [ lib.sourceTypes.binaryBytecode ]; + sourceProvenance = [ lib.sourceTypes.fromSource ]; }; } From f013429f06f6b19ad86e75f8d0179d7ae9de8429 Mon Sep 17 00:00:00 2001 From: Toast <39011842+toast003@users.noreply.github.com> Date: Tue, 29 Jul 2025 03:38:09 +0200 Subject: [PATCH 03/13] nix: remove u2c and partyfuse packages The main copyparty package has u2c and partyfuse, so these packages are redundant now --- contrib/package/nix/partyfuse/default.nix | 26 ----------------------- contrib/package/nix/u2c/default.nix | 24 --------------------- flake.nix | 12 +---------- 3 files changed, 1 insertion(+), 61 deletions(-) delete mode 100644 contrib/package/nix/partyfuse/default.nix delete mode 100644 contrib/package/nix/u2c/default.nix diff --git a/contrib/package/nix/partyfuse/default.nix b/contrib/package/nix/partyfuse/default.nix deleted file mode 100644 index 59faa914..00000000 --- a/contrib/package/nix/partyfuse/default.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ - stdenvNoCC, - copyparty, - python3, - makeBinaryWrapper, -}: -let - python = python3.withPackages (p: [ p.fusepy ]); -in -stdenvNoCC.mkDerivation { - pname = "partyfuse"; - inherit (copyparty) version meta; - src = ../../../..; - - nativeBuildInputs = [ makeBinaryWrapper ]; - - installPhase = '' - runHook preInstall - - install -Dm444 bin/partyfuse.py -t $out/share/copyparty - makeWrapper ${python.interpreter} $out/bin/partyfuse \ - --add-flag $out/share/copyparty/partyfuse.py - - runHook postInstall - ''; -} diff --git a/contrib/package/nix/u2c/default.nix b/contrib/package/nix/u2c/default.nix deleted file mode 100644 index dc1e4c56..00000000 --- a/contrib/package/nix/u2c/default.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ - stdenvNoCC, - copyparty, - python312, - makeBinaryWrapper, -}: -stdenvNoCC.mkDerivation { - pname = "u2c"; - inherit (copyparty) version meta; - src = ../../../..; - - nativeBuildInputs = [ makeBinaryWrapper ]; - - installPhase = '' - runHook preInstall - - install -Dm444 bin/u2c.py -t $out/share/copyparty - mkdir $out/bin - makeWrapper ${python312.interpreter} $out/bin/u2c \ - --add-flag $out/share/copyparty/u2c.py - - runHook postInstall - ''; -} diff --git a/flake.nix b/flake.nix index 5f39d605..ccd66594 100644 --- a/flake.nix +++ b/flake.nix @@ -12,18 +12,10 @@ }: { nixosModules.default = ./contrib/nixos/modules/copyparty.nix; - overlays.default = final: prev: rec { + overlays.default = final: prev: { copyparty = final.python3.pkgs.callPackage ./contrib/package/nix/copyparty { ffmpeg = final.ffmpeg-full; }; - - partyfuse = prev.callPackage ./contrib/package/nix/partyfuse { - inherit copyparty; - }; - - u2c = prev.callPackage ./contrib/package/nix/u2c { - inherit copyparty; - }; }; } // flake-utils.lib.eachDefaultSystem ( @@ -54,8 +46,6 @@ packages = { inherit (pkgs) copyparty - partyfuse - u2c ; default = self.packages.${system}.copyparty; }; From 68236da2918de1f923e0fb154f71405e938e881d Mon Sep 17 00:00:00 2001 From: Toast <39011842+toast003@users.noreply.github.com> Date: Tue, 29 Jul 2025 11:08:49 +0200 Subject: [PATCH 04/13] nix: add pyfuse dependency --- contrib/package/nix/copyparty/default.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/package/nix/copyparty/default.nix b/contrib/package/nix/copyparty/default.nix index 997d4289..26a25d7a 100644 --- a/contrib/package/nix/copyparty/default.nix +++ b/contrib/package/nix/copyparty/default.nix @@ -15,6 +15,7 @@ pyzmq, ffmpeg, mutagen, + pyfuse, # for partyfuse # use argon2id-hashed passwords in config files (sha2 is always available) withHashedPasswords ? true, @@ -69,6 +70,7 @@ buildPythonApplication { dependencies = [ jinja2 + pyfuse ] ++ lib.optional withSMB impacket ++ lib.optional withFTPS pyopenssl From a3df6020c0e86bc55c554d8dd481eb7e175fca36 Mon Sep 17 00:00:00 2001 From: Toast <39011842+toast003@users.noreply.github.com> Date: Tue, 29 Jul 2025 12:02:22 +0200 Subject: [PATCH 05/13] fix: nix: use replace pyfuse with fusepy --- contrib/package/nix/copyparty/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/package/nix/copyparty/default.nix b/contrib/package/nix/copyparty/default.nix index 26a25d7a..a70375f3 100644 --- a/contrib/package/nix/copyparty/default.nix +++ b/contrib/package/nix/copyparty/default.nix @@ -15,7 +15,7 @@ pyzmq, ffmpeg, mutagen, - pyfuse, # for partyfuse + fusepy, # for partyfuse # use argon2id-hashed passwords in config files (sha2 is always available) withHashedPasswords ? true, @@ -70,7 +70,7 @@ buildPythonApplication { dependencies = [ jinja2 - pyfuse + fusepy ] ++ lib.optional withSMB impacket ++ lib.optional withFTPS pyopenssl From 46ed345750485df1d7c233128839d957a8ff8b27 Mon Sep 17 00:00:00 2001 From: Toast <39011842+toast003@users.noreply.github.com> Date: Tue, 29 Jul 2025 12:11:00 +0200 Subject: [PATCH 06/13] nix: remove unused code from update.py --- contrib/package/nix/copyparty/update.py | 31 ++----------------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/contrib/package/nix/copyparty/update.py b/contrib/package/nix/copyparty/update.py index ca334d75..4bdfb3e7 100755 --- a/contrib/package/nix/copyparty/update.py +++ b/contrib/package/nix/copyparty/update.py @@ -2,23 +2,18 @@ # Update the Nix package pin # -# Usage: ./update.sh [PATH] -# When the [PATH] is not set, it will fetch the latest release from the repo. -# With [PATH] set, it will hash the given file and generate the URL, -# base on the version contained within the file +# Usage: ./update.sh import base64 import json import hashlib import sys -import re from pathlib import Path OUTPUT_FILE = Path("pin.json") TARGET_ASSET = lambda version: f"copyparty-{version}.tar.gz" HASH_TYPE = "sha256" LATEST_RELEASE_URL = "https://api.github.com/repos/9001/copyparty/releases/latest" -DOWNLOAD_URL = lambda version: f"https://github.com/9001/copyparty/releases/download/v{version}/{TARGET_ASSET}" def get_formatted_hash(binary): @@ -29,14 +24,6 @@ def get_formatted_hash(binary): return f"{HASH_TYPE}-{encoded_hash}" -def version_from_sfx(binary): - result = re.search(b'^VER = "(.*)"$', binary, re.MULTILINE) - if result: - return result.groups(1)[0].decode("ascii") - - raise ValueError("version not found in provided file") - - def remote_release_pin(): import requests @@ -51,22 +38,8 @@ def remote_release_pin(): return result -def local_release_pin(path): - asset = path.read_bytes() - version = version_from_sfx(asset) - download_url = DOWNLOAD_URL(version) - formatted_hash = get_formatted_hash(asset) - - result = {"url": download_url, "version": version, "hash": formatted_hash} - return result - - def main(): - if len(sys.argv) > 1: - asset_path = Path(sys.argv[1]) - result = local_release_pin(asset_path) - else: - result = remote_release_pin() + result = remote_release_pin() print(result) json_result = json.dumps(result, indent=4) From 6bd46cef7e2c0e805362d1b977e87986140d7a8a Mon Sep 17 00:00:00 2001 From: Toast <39011842+toast003@users.noreply.github.com> Date: Tue, 29 Jul 2025 13:07:23 +0200 Subject: [PATCH 07/13] nix: fix extra python packages --- contrib/package/nix/copyparty/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/package/nix/copyparty/default.nix b/contrib/package/nix/copyparty/default.nix index a70375f3..5cc079b2 100644 --- a/contrib/package/nix/copyparty/default.nix +++ b/contrib/package/nix/copyparty/default.nix @@ -81,7 +81,7 @@ buildPythonApplication { ++ lib.optional withBasicAudioMetadata mutagen ++ lib.optional withHashedPasswords argon2-cffi ++ lib.optional withZeroMQ pyzmq - ++ (extraPythonPackages python.packages); + ++ (extraPythonPackages python.pkgs); makeWrapperArgs = [ "--prefix PATH : ${lib.makeBinPath runtimeDeps}" ]; pyproject = true; From 24bc2660bfb674b7c064adf4a10bd940cf9e67cc Mon Sep 17 00:00:00 2001 From: Toast <39011842+toast003@users.noreply.github.com> Date: Tue, 29 Jul 2025 14:46:37 +0200 Subject: [PATCH 08/13] nix: add optional dependencies --- contrib/package/nix/copyparty/default.nix | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/contrib/package/nix/copyparty/default.nix b/contrib/package/nix/copyparty/default.nix index 5cc079b2..05c088ef 100644 --- a/contrib/package/nix/copyparty/default.nix +++ b/contrib/package/nix/copyparty/default.nix @@ -15,6 +15,8 @@ pyzmq, ffmpeg, mutagen, + pyftpdlib, + magic, fusepy, # for partyfuse # use argon2id-hashed passwords in config files (sha2 is always available) @@ -41,12 +43,18 @@ # send ZeroMQ messages from event-hooks withZeroMQ ? true, + # enable FTP server + withFTP ? true, + # enable FTPS support in the FTP server withFTPS ? false, # samba/cifs server; dangerous and buggy, enable if you really need it withSMB ? false, + # enables filetype detection for nameless uploads + withMagic ? false, + # extra packages to add to the PATH extraPackages ? [ ], @@ -73,6 +81,7 @@ buildPythonApplication { fusepy ] ++ lib.optional withSMB impacket + ++ lib.optional withFTP pyftpdlib ++ lib.optional withFTPS pyopenssl ++ lib.optional withCertgen cfssl ++ lib.optional withThumbnails pillow @@ -81,6 +90,7 @@ buildPythonApplication { ++ lib.optional withBasicAudioMetadata mutagen ++ lib.optional withHashedPasswords argon2-cffi ++ lib.optional withZeroMQ pyzmq + ++ lib.optional withMagic magic ++ (extraPythonPackages python.pkgs); makeWrapperArgs = [ "--prefix PATH : ${lib.makeBinPath runtimeDeps}" ]; From f1c0ce518a14570e833abe0d6f3735927f6a84c2 Mon Sep 17 00:00:00 2001 From: Toast <39011842+toast003@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:31:51 +0200 Subject: [PATCH 09/13] nix: add partftpy package --- flake.nix | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/flake.nix b/flake.nix index ccd66594..1b358766 100644 --- a/flake.nix +++ b/flake.nix @@ -16,6 +16,19 @@ copyparty = final.python3.pkgs.callPackage ./contrib/package/nix/copyparty { ffmpeg = final.ffmpeg-full; }; + python3 = prev.python3.override { + packageOverrides = pyFinal: pyPrev: { + partftpy = pyFinal.tftpy.overrideAttrs { + pname = "partftpy"; + version = "0.4.0"; + src = final.fetchurl { + url = "https://github.com/9001/partftpy/releases/download/v0.4.0/partftpy-0.4.0.tar.gz"; + hash = "sha256-5Q2zyuJ892PGZmb+YXg0ZPW/DK8RDL1uE0j5HPd4We0="; + }; + pythonImportsCheck = [ "partftpy.TftpServer" ]; + }; + }; + }; }; } // flake-utils.lib.eachDefaultSystem ( From 2a3a59a058e07de5f69d3d6aeea5d482d286d36f Mon Sep 17 00:00:00 2001 From: Toast <39011842+toast003@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:38:32 +0200 Subject: [PATCH 10/13] nix: add tftp parameter to package --- contrib/package/nix/copyparty/default.nix | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/package/nix/copyparty/default.nix b/contrib/package/nix/copyparty/default.nix index 05c088ef..22ae5bcd 100644 --- a/contrib/package/nix/copyparty/default.nix +++ b/contrib/package/nix/copyparty/default.nix @@ -17,6 +17,7 @@ mutagen, pyftpdlib, magic, + partftpy, fusepy, # for partyfuse # use argon2id-hashed passwords in config files (sha2 is always available) @@ -49,6 +50,9 @@ # enable FTPS support in the FTP server withFTPS ? false, + # enable TFTP server + withTFTP ? false, + # samba/cifs server; dangerous and buggy, enable if you really need it withSMB ? false, @@ -83,6 +87,7 @@ buildPythonApplication { ++ lib.optional withSMB impacket ++ lib.optional withFTP pyftpdlib ++ lib.optional withFTPS pyopenssl + ++ lib.optional withTFTP partftpy ++ lib.optional withCertgen cfssl ++ lib.optional withThumbnails pillow ++ lib.optional withFastThumbnails pyvips From 738dee3d9bafb17fe98a4cf585aea9cb92f94d8a Mon Sep 17 00:00:00 2001 From: Toast <39011842+toast003@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:58:56 +0200 Subject: [PATCH 11/13] nix: enable pyproject for partftpy package --- flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/flake.nix b/flake.nix index 1b358766..403a7f15 100644 --- a/flake.nix +++ b/flake.nix @@ -25,6 +25,7 @@ url = "https://github.com/9001/partftpy/releases/download/v0.4.0/partftpy-0.4.0.tar.gz"; hash = "sha256-5Q2zyuJ892PGZmb+YXg0ZPW/DK8RDL1uE0j5HPd4We0="; }; + pyproject = true; pythonImportsCheck = [ "partftpy.TftpServer" ]; }; }; From b07b991ebb1ec30437e708a1af3e5c868273b3ad Mon Sep 17 00:00:00 2001 From: Toast <39011842+toast003@users.noreply.github.com> Date: Tue, 29 Jul 2025 17:42:09 +0200 Subject: [PATCH 12/13] nix: replace partftpy overlay with real package --- contrib/package/nix/partftpy/default.nix | 28 ++++++++++++++++++++++++ flake.nix | 11 +--------- 2 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 contrib/package/nix/partftpy/default.nix diff --git a/contrib/package/nix/partftpy/default.nix b/contrib/package/nix/partftpy/default.nix new file mode 100644 index 00000000..4bc1a79b --- /dev/null +++ b/contrib/package/nix/partftpy/default.nix @@ -0,0 +1,28 @@ +{ + lib, + buildPythonPackage, + fetchurl, + setuptools, +}: + +buildPythonPackage rec { + pname = "partftpy"; + version = "0.4.0"; + pyproject = true; + + src = fetchurl { + url = "https://github.com/9001/partftpy/releases/download/v0.4.0/partftpy-0.4.0.tar.gz"; + hash = "sha256-5Q2zyuJ892PGZmb+YXg0ZPW/DK8RDL1uE0j5HPd4We0="; + }; + + build-system = [ setuptools ]; + + pythonImportsCheck = [ "partftpy.TftpServer" ]; + + meta = { + description = "Pure Python TFTP library (copyparty edition)"; + homepage = "https://github.com/9001/partftpy"; + changelog = "https://github.com/9001/partftpy/releases/tag/${version}"; + license = lib.licenses.mit; + }; +} diff --git a/flake.nix b/flake.nix index 403a7f15..c5181bfe 100644 --- a/flake.nix +++ b/flake.nix @@ -18,16 +18,7 @@ }; python3 = prev.python3.override { packageOverrides = pyFinal: pyPrev: { - partftpy = pyFinal.tftpy.overrideAttrs { - pname = "partftpy"; - version = "0.4.0"; - src = final.fetchurl { - url = "https://github.com/9001/partftpy/releases/download/v0.4.0/partftpy-0.4.0.tar.gz"; - hash = "sha256-5Q2zyuJ892PGZmb+YXg0ZPW/DK8RDL1uE0j5HPd4We0="; - }; - pyproject = true; - pythonImportsCheck = [ "partftpy.TftpServer" ]; - }; + partftpy = pyFinal.callPackage ./contrib/package/nix/partftpy { }; }; }; }; From 7dff81840bf72c2c4983a4b93063032c1f98f2e7 Mon Sep 17 00:00:00 2001 From: Toast <39011842+toast003@users.noreply.github.com> Date: Tue, 29 Jul 2025 17:47:39 +0200 Subject: [PATCH 13/13] nix: add updater for partftpy --- contrib/package/nix/partftpy/default.nix | 8 ++-- contrib/package/nix/partftpy/pin.json | 5 +++ contrib/package/nix/partftpy/update.py | 50 ++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 contrib/package/nix/partftpy/pin.json create mode 100755 contrib/package/nix/partftpy/update.py diff --git a/contrib/package/nix/partftpy/default.nix b/contrib/package/nix/partftpy/default.nix index 4bc1a79b..8293b44a 100644 --- a/contrib/package/nix/partftpy/default.nix +++ b/contrib/package/nix/partftpy/default.nix @@ -4,15 +4,17 @@ fetchurl, setuptools, }: +let + pinData = lib.importJSON ./pin.json; +in buildPythonPackage rec { pname = "partftpy"; - version = "0.4.0"; + inherit (pinData) version; pyproject = true; src = fetchurl { - url = "https://github.com/9001/partftpy/releases/download/v0.4.0/partftpy-0.4.0.tar.gz"; - hash = "sha256-5Q2zyuJ892PGZmb+YXg0ZPW/DK8RDL1uE0j5HPd4We0="; + inherit (pinData) url hash; }; build-system = [ setuptools ]; diff --git a/contrib/package/nix/partftpy/pin.json b/contrib/package/nix/partftpy/pin.json new file mode 100644 index 00000000..99882f05 --- /dev/null +++ b/contrib/package/nix/partftpy/pin.json @@ -0,0 +1,5 @@ +{ + "url": "https://github.com/9001/partftpy/releases/download/v0.4.0/partftpy-0.4.0.tar.gz", + "version": "0.4.0", + "hash": "sha256-5Q2zyuJ892PGZmb+YXg0ZPW/DK8RDL1uE0j5HPd4We0=" +} \ No newline at end of file diff --git a/contrib/package/nix/partftpy/update.py b/contrib/package/nix/partftpy/update.py new file mode 100755 index 00000000..01f046b5 --- /dev/null +++ b/contrib/package/nix/partftpy/update.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 + +# Update the Nix package pin +# +# Usage: ./update.sh + +import base64 +import json +import hashlib +import sys +from pathlib import Path + +OUTPUT_FILE = Path("pin.json") +TARGET_ASSET = lambda version: f"partftpy-{version}.tar.gz" +HASH_TYPE = "sha256" +LATEST_RELEASE_URL = "https://api.github.com/repos/9001/partftpy/releases/latest" + + +def get_formatted_hash(binary): + hasher = hashlib.new("sha256") + hasher.update(binary) + asset_hash = hasher.digest() + encoded_hash = base64.b64encode(asset_hash).decode("ascii") + return f"{HASH_TYPE}-{encoded_hash}" + + +def remote_release_pin(): + import requests + + response = requests.get(LATEST_RELEASE_URL).json() + version = response["tag_name"].lstrip("v") + asset_info = [a for a in response["assets"] if a["name"] == TARGET_ASSET(version)][0] + download_url = asset_info["browser_download_url"] + asset = requests.get(download_url) + formatted_hash = get_formatted_hash(asset.content) + + result = {"url": download_url, "version": version, "hash": formatted_hash} + return result + + +def main(): + result = remote_release_pin() + + print(result) + json_result = json.dumps(result, indent=4) + OUTPUT_FILE.write_text(json_result) + + +if __name__ == "__main__": + main()