diff --git a/.gitignore b/.gitignore index b70c56b7..2f48b149 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ scripts/docker/*.err # nix build output link result +result-* # IDEA config .idea/ diff --git a/contrib/package/nix/copyparty/default.nix b/contrib/package/nix/copyparty/default.nix index 22ae5bcd..702431d6 100644 --- a/contrib/package/nix/copyparty/default.nix +++ b/contrib/package/nix/copyparty/default.nix @@ -67,18 +67,64 @@ # additional dependencies extraPythonPackages ? (_p: [ ]), + # to build stable + unstable with the same file + stable ? true, + + # for commit date, only used when stable = false + copypartyFlake ? null, + + nix-gitignore, }: let pinData = lib.importJSON ./pin.json; runtimeDeps = ([ util-linux ] ++ extraPackages ++ lib.optional withMediaProcessing ffmpeg); + inherit (copypartyFlake) lastModifiedDate; + # ex: "1970" "01" "01" + dateStringsZeroPrefixed = { + year = builtins.substring 0 4 lastModifiedDate; + month = builtins.substring 4 2 lastModifiedDate; + day = builtins.substring 6 2 lastModifiedDate; + }; + # ex: "1970" "1" "1" + dateStringsShort = builtins.mapAttrs (_: val: toString (lib.toIntBase10 val)) dateStringsZeroPrefixed; + unstableVersion = + if copypartyFlake == null then + "${pinData.version}-unstable" + else + with dateStringsZeroPrefixed; "${pinData.version}-unstable-${year}-${month}-${day}" + ; + version = if stable then pinData.version else unstableVersion; + stableSrc = fetchurl { + inherit (pinData) url hash; + }; + root = ../../../..; + unstableSrc = nix-gitignore.gitignoreSource [] root; + src = if stable then stableSrc else unstableSrc; + rev = copypartyFlake.shortRev or copypartyFlake.dirtyShortRev or "unknown"; + unstableCodename = "unstable" + (lib.optionalString (copypartyFlake != null) "-${rev}"); in buildPythonApplication { pname = "copyparty"; - inherit (pinData) version; - src = fetchurl { - inherit (pinData) url hash; - }; + inherit version src; + postPatch = lib.optionalString (!stable) '' + old_src="$(mktemp -d)" + tar -C "$old_src" -xf ${stableSrc} + declare -a folders + folders=("$old_src"/*) + count_folders="''${#folders[@]}" + if [[ $count_folders != 1 ]]; then + declare -p folders + echo "Expected 1 folder, found $count_folders" >&2 + exit 1 + fi + old_src_folder="''${folders[0]}" + cp -r "$old_src_folder"/copyparty/web/deps copyparty/web/deps + sed -i 's/^CODENAME =.*$/CODENAME = "${unstableCodename}"/' copyparty/__version__.py + ${lib.optionalString (copypartyFlake != null) (with dateStringsShort; '' + sed -i 's/^BUILD_DT =.*$/BUILD_DT = (${year}, ${month}, ${day})/' copyparty/__version__.py + '')} + ''; dependencies = [ jinja2 diff --git a/contrib/package/nix/overlay.nix b/contrib/package/nix/overlay.nix index ca8d5c6e..7b951c5b 100644 --- a/contrib/package/nix/overlay.nix +++ b/contrib/package/nix/overlay.nix @@ -1,8 +1,28 @@ -final: prev: { - copyparty = final.python3.pkgs.callPackage ./copyparty { - ffmpeg = final.ffmpeg-full; +final: prev: +let + fullAttrs = { + withHashedPasswords = true; + withCertgen = true; + withThumbnails = true; + withFastThumbnails = true; + withMediaProcessing = true; + withBasicAudioMetadata = true; + withZeroMQ = true; + withFTP = true; + withFTPS = true; + withTFTP = true; + withSMB = true; + withMagic = true; }; + call = attrs: final.python3.pkgs.callPackage ./copyparty ({ ffmpeg = final.ffmpeg-full; } // attrs); +in +{ + copyparty = call { stable = true; }; + copyparty-unstable = call { stable = false; }; + copyparty-full = call (fullAttrs // { stable = true; }); + copyparty-unstable-full = call (fullAttrs // { stable = false; }); + python3 = prev.python3.override { packageOverrides = pyFinal: pyPrev: { partftpy = pyFinal.callPackage ./partftpy { }; diff --git a/flake.nix b/flake.nix index 336642ee..d797ca9c 100644 --- a/flake.nix +++ b/flake.nix @@ -12,7 +12,8 @@ }: { nixosModules.default = ./contrib/nixos/modules/copyparty.nix; - overlays.default = import ./contrib/package/nix/overlay.nix; + overlays.default = final: prev: + (import ./contrib/package/nix/overlay.nix final prev) // { copypartyFlake = self; }; } // flake-utils.lib.eachDefaultSystem ( system: @@ -22,26 +23,26 @@ config = { allowAliases = false; }; - overlays = [ self.overlays.default ]; + overlays = [ + self.overlays.default + ]; }; in { # check that copyparty builds with all optionals turned on - checks.copyparty-full = self.packages.${system}.copyparty.override { - withHashedPasswords = true; - withCertgen = true; - withThumbnails = true; - withFastThumbnails = true; - withMediaProcessing = true; - withBasicAudioMetadata = true; - withZeroMQ = true; - withFTPS = true; - withSMB = true; + checks = { + inherit (pkgs) + copyparty-full + copyparty-unstable-full + ; }; packages = { inherit (pkgs) copyparty + copyparty-full + copyparty-unstable + copyparty-unstable-full ; default = self.packages.${system}.copyparty; };