diff --git a/default.nix b/default.nix index 44b9600..13d97a8 100644 --- a/default.nix +++ b/default.nix @@ -1,7 +1,4 @@ -let - pkgs = import { - config = { }; - overlays = [ ]; - }; -in +{ + pkgs ? import { }, +}: import ./pkgs/all-packages.nix { } pkgs diff --git a/flake.lock b/flake.lock index 24c48b0..15012bd 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1751011381, - "narHash": "sha256-krGXKxvkBhnrSC/kGBmg5MyupUUT5R6IBCLEzx9jhMM=", + "lastModified": 1742669843, + "narHash": "sha256-G5n+FOXLXcRx+3hCJ6Rt6ZQyF1zqQ0DL0sWAMn2Nk0w=", "owner": "nixos", "repo": "nixpkgs", - "rev": "30e2e2857ba47844aa71991daa6ed1fc678bcbb7", + "rev": "1e5b653dff12029333a6546c11e108ede13052eb", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 24073eb..2d7985a 100644 --- a/flake.nix +++ b/flake.nix @@ -37,6 +37,7 @@ overlays.default = import ./pkgs/all-packages.nix; nixosModules = { + reposilite = import ./modules/reposilite.nix; asus-numpad = lib.modules.importApply ./modules/asus-numpad.nix { inherit self; }; shlink = lib.modules.importApply ./modules/shlink.nix { inherit self; }; }; diff --git a/modules/reposilite.nix b/modules/reposilite.nix new file mode 100644 index 0000000..fab7389 --- /dev/null +++ b/modules/reposilite.nix @@ -0,0 +1,443 @@ +{ + lib, + config, + pkgs, + ... +}: +let + cfg = config.services.reposilite; + format = pkgs.formats.cdn { }; + configFile = format.generate "reposilite.cdn" cfg.settings; + + useEmbeddedDb = cfg.database.type == "sqlite" || cfg.database.type == "h2"; + useMySQL = cfg.database.type == "mariadb" || cfg.database.type == "mysql"; + usePostgres = cfg.database.type == "postgresql"; + + # db password is appended at runtime by the service script (if needed) + dbString = + if useEmbeddedDb then + "${cfg.database.type} ${cfg.database.path}" + else + "${cfg.database.type} ${cfg.database.host}:${builtins.toString cfg.database.port} ${cfg.database.dbname} ${cfg.database.user} $(<${cfg.database.passwordFile})"; + + certDir = config.security.acme.certs.${cfg.useACMEHost}.directory; + + databaseModule = { + options = { + type = lib.mkOption { + type = lib.types.enum [ + "h2" + "mariadb" + "mysql" + "postgresql" + "sqlite" + ]; + description = '' + Database engine to use. + ''; + default = "sqlite"; + }; + + path = lib.mkOption { + type = lib.types.str; + description = '' + Path to the embedded database file. Set to `--temporary` to use an in-memory database. + ''; + default = "reposilite.db"; + }; + + host = lib.mkOption { + type = lib.types.str; + description = '' + Database host address. + ''; + default = "127.0.0.1"; + }; + + port = lib.mkOption { + type = lib.types.port; + description = '' + Database TCP port. + ''; + defaultText = lib.literalExpression '' + if type == "postgresql" then 5432 else 3306 + ''; + default = if usePostgres then config.services.postgresql.settings.port else 3306; + }; + + dbname = lib.mkOption { + type = lib.types.str; + description = '' + Database name. + ''; + default = "reposilite"; + }; + + user = lib.mkOption { + type = lib.types.str; + description = '' + Database user. + ''; + default = "reposilite"; + }; + + passwordFile = lib.mkOption { + type = lib.types.nullOr lib.types.path; + description = '' + Path to the file containing the password for the database connection. + This file must be readable by {option}`services.reposilite.user`. + ''; + default = null; + }; + }; + }; + + settingsModule = { + freeformType = format.type; + options = { + hostname = lib.mkOption { + type = lib.types.str; + description = '' + The hostname to bind to. Set to `0.0.0.0` to accept connections from everywhere, or `127.0.0.1` to restrict to localhost." + ''; + default = "0.0.0.0"; + example = "127.0.0.1"; + }; + + port = lib.mkOption { + type = lib.types.port; + description = '' + The TCP port to bind to. + ''; + default = 3000; + }; + + database = lib.mkOption { + type = lib.types.nullOr lib.types.str; + description = '' + Database connection string. Please use {option}`services.reposilite.database` instead. + See https://reposilite.com/guide/general#local-configuration for valid values. + ''; + default = null; + }; + + sslEnabled = lib.mkOption { + type = lib.types.bool; + description = '' + Whether to listen for encrypted connections on {option}`settings.sslPort`. + ''; + default = false; + }; + + sslPort = lib.mkOption { + type = lib.types.port; # cant be null + description = "SSL port to bind to. SSL needs to be enabled explicitly via {option}`settings.enableSsl`."; + default = 443; + }; + + keyPath = lib.mkOption { + type = lib.types.nullOr lib.types.str; + description = '' + Path to the .jsk KeyStore or paths to the PKCS#8 certificate and private key, separated by a space (see example). + You can use `''${WORKING_DIRECTORY}` to refer to paths relative to Reposilite's working directory. + If you are using a Java KeyStore, don't forget to specify the password via the {var}`REPOSILITE_LOCAL_KEYPASSWORD` environment variable. + See https://reposilite.com/guide/ssl for more information on how to set SSL up. + ''; + default = null; + example = "\${WORKING_DIRECTORY}/cert.pem \${WORKING_DIRECTORY}/key.pem"; + }; + + keyPassword = lib.mkOption { + type = lib.types.nullOr lib.types.str; + description = '' + Plaintext password used to unlock the Java KeyStore set in {option}`services.reposilite.settings.keyPath`. + WARNING: this option is insecure and should not be used to store the password. + Consider using {option}`services.reposilite.keyPasswordFile` instead. + ''; + default = null; + }; + + enforceSsl = lib.mkOption { + type = lib.types.bool; + description = '' + Whether to redirect all traffic to SSL. + ''; + default = false; + }; + + webThreadPool = lib.mkOption { + type = lib.types.ints.between 5 65535; + description = '' + Maximum amount of threads used by the core thread pool. (min: 5) + The web thread pool handles the first few steps of incoming HTTP connections, tasks are redirected as soon as possible to the IO thread pool. + ''; + default = 16; + }; + + ioThreadPool = lib.mkOption { + type = lib.types.ints.between 2 65535; + description = '' + The IO thread pool handles all tasks that may benefit from non-blocking IO. (min: 2) + Because most tasks are redirected to IO thread pool, it might be a good idea to keep it at least equal to web thread pool. + ''; + default = 8; + }; + + databaseThreadPool = lib.mkOption { + type = lib.types.ints.positive; + description = '' + Maximum amount of concurrent connections to the database. (one per thread) + Embedded databases (sqlite, h2) do not support truly concurrent connections, so the value will always be `1` if they are used. + ''; + default = 1; + }; + + compressionStrategy = lib.mkOption { + type = lib.types.enum [ + "none" + "gzip" + ]; + description = '' + Compression algorithm used by this instance of Reposilite. + `none` reduces usage of CPU & memory, but requires transfering more data. + ''; + default = "none"; + }; + + idleTimeout = lib.mkOption { + type = lib.types.ints.unsigned; + description = '' + Default idle timeout used by Jetty. + ''; + default = 30000; + }; + + bypassExternalCache = lib.mkOption { + type = lib.types.bool; + description = '' + Add cache bypass headers to responses from /api/* to avoid issues with proxies such as Cloudflare. + ''; + default = true; + }; + + cachedLogSize = lib.mkOption { + type = lib.types.ints.unsigned; + description = '' + Amount of messages stored in the cache logger. + ''; + default = 50; + }; + + defaultFrontend = lib.mkOption { + type = lib.types.bool; + description = '' + Whether to enable the default included frontend with a dashboard. + ''; + default = true; + }; + + basePath = lib.mkOption { + type = lib.types.str; + description = '' + Custom base path for this Reposilite instance. + It is not recommended changing this, you should instead prioritize using a different subdomain. + ''; + default = "/"; + }; + + debugEnabled = lib.mkOption { + type = lib.types.bool; + description = '' + Whether to enable debug mode. + ''; + default = false; + }; + }; + }; +in +{ + options.services.reposilite = { + enable = lib.mkEnableOption "Reposilite"; + package = lib.mkPackageOption pkgs "reposilite" { } // { + apply = + pkg: + pkg.override (old: { + plugins = (old.plugins or [ ]) ++ cfg.plugins; + }); + }; + + plugins = lib.mkOption { + type = lib.types.listOf lib.types.package; + description = '' + List of plugins to add to Reposilite. + ''; + default = [ ]; + example = "with reposilitePlugins; [ checksum groovy ]"; + }; + + database = lib.mkOption { + description = "Database options."; + default = { }; + type = lib.types.submodule databaseModule; + }; + + keyPasswordFile = lib.mkOption { + type = lib.types.nullOr lib.types.path; + description = '' + Path the the file containing the password used to unlock the Java KeyStore file specified in {option}`services.reposilite.settings.keyPath`. + This file must be readable my {option}`services.reposilite.user`. + ''; + default = null; + }; + + useACMEHost = lib.mkOption { + type = lib.types.nullOr lib.types.str; + description = '' + Host of an existing Let's Encrypt certificate to use for SSL. + Make sure that the certificate directory is readable by the `reposilite` user or group, for example via {option}`security.acme.certs..group`. + *Note that this option does not create any certificates, nor it does add subdomains to existing ones – you will need to create them manually using {option}`security.acme.certs`* + ''; + default = null; + }; + + settings = lib.mkOption { + description = "Configuration written to the reposilite.cdn file"; + default = { }; + type = lib.types.submodule settingsModule; + }; + + workingDirectory = lib.mkOption { + type = lib.types.path; + description = '' + Working directory for Reposilite. + ''; + default = "/var/lib/reposilite"; + }; + + extraArgs = lib.mkOption { + type = lib.types.listOf lib.types.str; + description = '' + Extra arguments/parameters passed to the Reposilite. Can be used for first token generation. + ''; + default = [ ]; + example = lib.literalExpression ''[ "--token" "name:tempsecrettoken" ]''; + }; + + user = lib.mkOption { + type = lib.types.str; + description = '' + The user to run Reposilite under. + ''; + default = "reposilite"; + }; + + group = lib.mkOption { + type = lib.types.str; + description = '' + The group to run Reposilite under. + ''; + default = "reposilite"; + }; + + openFirewall = lib.mkOption { + type = lib.types.bool; + description = '' + Whether to open the firewall ports for Reposilite. If SSL is enabled, its port will be opened too. + ''; + default = false; + }; + }; + + config = lib.mkIf cfg.enable { + assertions = [ + { + assertion = cfg.settings.sslEnabled -> cfg.settings.keyPath != null; + message = '' + Reposilite was configured to enable SSL, but no valid paths to certificate files were provided via `settings.keyPath`. + Read more about SSL certificates here: https://reposilite.com/guide/ssl + ''; + } + { + assertion = cfg.settings.enforceSsl -> cfg.settings.sslEnabled; + message = "You cannot enforce SSL if SSL is not enabled."; + } + { + assertion = !useEmbeddedDb -> cfg.database.passwordFile != null; + message = "You need to set `services.reposilite.database.passwordFile` when using MySQL or Postgres."; + } + ]; + + services.reposilite.settings.keyPath = lib.mkIf ( + cfg.useACMEHost != null + ) "${certDir}/fullchain.pem ${certDir}/key.pem"; + + environment.systemPackages = [ cfg.package ]; + + users = lib.mkMerge [ + (lib.mkIf (cfg.user == "reposilite") { + groups.${cfg.group} = { }; + }) + (lib.mkIf (cfg.user == "reposilite") { + users.${cfg.user} = { + isSystemUser = true; + group = cfg.group; + }; + }) + ]; + + networking.firewall = lib.mkIf cfg.openFirewall ( + lib.mkMerge [ + { + allowedTCPPorts = [ cfg.settings.port ]; + } + (lib.mkIf cfg.settings.sslEnabled { + allowedTCPPorts = [ cfg.settings.sslPort ]; + }) + ] + ); + + systemd.services.reposilite = { + enable = true; + wantedBy = [ "multi-user.target" ]; + after = + [ "network.target" ] + ++ (lib.optional useMySQL "mysql.service") + ++ (lib.optional usePostgres "postgresql.service"); + + script = + lib.optionalString (cfg.keyPasswordFile != null && cfg.settings.keyPassword == null) '' + export REPOSILITE_LOCAL_KEYPASSWORD="$(<${cfg.keyPasswordFile})" + '' + + '' + export REPOSILITE_LOCAL_DATABASE="${dbString}" + + ${lib.getExe cfg.package} --local-configuration ${configFile} --local-configuration-mode none --working-directory ${cfg.workingDirectory} ${lib.escapeShellArgs cfg.extraArgs} + ''; + + serviceConfig = lib.mkMerge [ + (lib.mkIf (builtins.dirOf cfg.workingDirectory == "/var/lib") { + StateDirectory = builtins.baseNameOf cfg.workingDirectory; + StateDirectoryMode = "700"; + }) + { + Type = "exec"; + Restart = "on-failure"; + + User = cfg.user; + Group = cfg.group; + WorkingDirectory = cfg.workingDirectory; + + # TODO better hardening + LimitNOFILE = "1048576"; + PrivateTmp = true; + PrivateDevices = true; + ProtectHome = true; + ProtectSystem = "strict"; + AmbientCapabilities = "CAP_NET_BIND_SERVICE"; + } + ]; + }; + }; + + meta.maintainers = [ lib.maintainers.uku3lig ]; +} diff --git a/pkgs/all-packages.nix b/pkgs/all-packages.nix index 4e3cbc0..ca3fb9e 100644 --- a/pkgs/all-packages.nix +++ b/pkgs/all-packages.nix @@ -2,11 +2,8 @@ final: prev: { asus-numpad = prev.callPackage ./asus-numpad.nix { }; enigma = prev.callPackage ./enigma.nix { }; jaspersoft-studio-community = prev.callPackage ./jaspersoft-studio-community.nix { }; - liberica-17 = prev.callPackage ./liberica.nix { }; openwebstart = prev.callPackage ./openwebstart.nix { }; - project-sekai-cursors = prev.callPackage ./project-sekai-cursors/package.nix { }; shlink = prev.callPackage ./shlink/package.nix { }; - sql-developer = prev.callPackage ./sql-developer.nix { }; - touhou-cursors = prev.callPackage ./touhou-cursors.nix { }; + undertalemodtool = prev.callPackage ./undertalemodtool/package.nix { }; vineflower = prev.callPackage ./vineflower.nix { }; } diff --git a/pkgs/liberica.nix b/pkgs/liberica.nix deleted file mode 100644 index 110683e..0000000 --- a/pkgs/liberica.nix +++ /dev/null @@ -1,95 +0,0 @@ -{ - lib, - stdenv, - alsa-lib, - autoPatchelfHook, - fetchurl, - xorg, - zlib, - gtk3, - cairo, - glib, - cups, - makeWrapper, - setJavaClassPath, - freetype, -}: -let - runtimeLibs = [ - cups - gtk3 - glib - cairo - ]; -in -stdenv.mkDerivation (finalAttrs: { - pname = "liberica-jdk-bin"; - version = "17.0.15+10"; - - src = fetchurl { - url = "https://download.bell-sw.com/java/${finalAttrs.version}/bellsoft-jdk${finalAttrs.version}-linux-amd64.tar.gz"; - hash = "sha256-dKKSwrMmQ15v7k354JeQi/IuLFPQ20BUB41YYPFOUzQ="; - }; - - nativeBuildInputs = [ - autoPatchelfHook - makeWrapper - ]; - - buildInputs = [ - alsa-lib - freetype - xorg.libX11 - xorg.libXext - xorg.libXi - xorg.libXrender - xorg.libXtst - zlib - ]; - - installPhase = '' - runHook preInstall - - cd .. - mv $sourceRoot $out - - # jni.h expects jni_md.h to be in the header search path. - ln -s $out/include/linux/*_md.h $out/include/ - - # Remove some broken manpages. - # Only for 11 and earlier. - [ -e "$out/man/ja" ] && rm -r $out/man/ja* - - # Remove embedded freetype to avoid problems like - # https://github.com/NixOS/nixpkgs/issues/57733 - find "$out" -name 'libfreetype.so*' -delete - - # Propagate the setJavaClassPath setup hook from the JDK so that - # any package that depends on the JDK has $CLASSPATH set up - # properly. - mkdir -p $out/nix-support - printWords ${setJavaClassPath} > $out/nix-support/propagated-build-inputs - - # Set JAVA_HOME automatically. - cat <> "$out/nix-support/setup-hook" - if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out; fi - EOF - - # We cannot use -exec since wrapProgram is a function but not a command. - # - # jspawnhelper is executed from JVM, so it doesn't need to wrap it, and it - # breaks building OpenJDK (#114495). - for bin in $( find "$out" -executable -type f -not -name jspawnhelper ); do - if patchelf --print-interpreter "$bin" &> /dev/null; then - wrapProgram "$bin" --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath runtimeLibs}" - fi - done - - runHook postInstall - ''; - - meta = { - mainProgram = "java"; - platforms = lib.platforms.linux; - }; -}) diff --git a/pkgs/project-sekai-cursors/fetch-hashes.sh b/pkgs/project-sekai-cursors/fetch-hashes.sh deleted file mode 100755 index 6e24768..0000000 --- a/pkgs/project-sekai-cursors/fetch-hashes.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env nix-shell -#!nix-shell -i bash -p curl jq - -# shellcheck shell=bash - -set -euo pipefail - -groups=("VirtualSinger" "leoneed" "MMJ" "VBS" "WxS" "N25") - -for group in "${groups[@]}"; do - tmpfile=$(mktemp) - curl -o "$tmpfile" "https://www.colorfulstage.com/upload_images/media/Download/ani%20file-animation-${group}.zip" - hash=$(nix-hash --sri --flat --type sha256 "$tmpfile") - - updatedContent=$(jq ".\"$group-ani\" = \"$hash\"" ./hashes.json) - echo -E "$updatedContent" > ./hashes.json -done - -for group in "${groups[@]}"; do - tmpfile=$(mktemp) - curl -o "$tmpfile" "https://www.colorfulstage.com/upload_images/media/Download/cur%20file-static-${group}.zip" - hash=$(nix-hash --sri --flat --type sha256 "$tmpfile") - - updatedContent=$(jq ".\"$group-cur\" = \"$hash\"" ./hashes.json) - echo -E "$updatedContent" > ./hashes.json -done diff --git a/pkgs/project-sekai-cursors/hashes.json b/pkgs/project-sekai-cursors/hashes.json deleted file mode 100644 index ac2c9a4..0000000 --- a/pkgs/project-sekai-cursors/hashes.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "VirtualSinger-ani": "sha256-YUWi9VFoU3UkLMJjC5SB3jzkmXrcoLttj3w/D35Vrco=", - "leoneed-ani": "sha256-5HlCdQ5SZ2TCeMjD33FmkhZN+BJOT1Y/eHBvsgsAblk=", - "MMJ-ani": "sha256-AYOkEGiScmVtO+NOpe4xtbyn4408iRVXN6Bhdh/pNig=", - "VBS-ani": "sha256-oh2rj0oIPBXMWdi7gHNhqlb7VatQiVOfIjt32juAE5o=", - "WxS-ani": "sha256-r7+UW0m72QVDIShDsUhrzfVwHy82q3KfHGTcBl9nooE=", - "N25-ani": "sha256-clGFuHrFMUV5Va/btiKctQBXVx5c6MGCkAs6Iw3G0Ig=", - "VirtualSinger-cur": "sha256-s9+CVTaj+z2UKgbEq0+3z3ql+30S1Q2w2iGFR/FZRxE=", - "leoneed-cur": "sha256-o/d8le0+4TnKvyPj3SgETQCZ30fhppgqvsr/uHa5dho=", - "MMJ-cur": "sha256-fsLPVuKDqxJjpZl27Ih3+6ybj8aEzVvIZpW4Wmu34v4=", - "VBS-cur": "sha256-+Me8JuSK/4bA37l0Gin2s+0A2xe7PKQ1LR8y5SmI1Sc=", - "WxS-cur": "sha256-eNJtX/dwOuVdXVeGOjDHxLWQ/UdCMcwuZE4DO2d9sbI=", - "N25-cur": "sha256-PJxBWW8klKDE/G77hIHJRSyy5p6W/ICmFMobaw3c3Ww=" -} diff --git a/pkgs/project-sekai-cursors/package.nix b/pkgs/project-sekai-cursors/package.nix deleted file mode 100644 index d4ab141..0000000 --- a/pkgs/project-sekai-cursors/package.nix +++ /dev/null @@ -1,76 +0,0 @@ -{ - lib, - stdenvNoCC, - fetchurl, - unzip, - win2xcur, - # options - group ? "", - animated ? false, - # can be specified if the provided hashes do not suffice - hash ? null, -}: -let - format = if animated then "ani" else "cur"; - suffix = if animated then "animation" else "static"; - - hashes = lib.importJSON ./hashes.json; - - addmissing = fetchurl { - url = "https://gist.githubusercontent.com/uku3lig/1a761983e4ae467009a682bea505a513/raw/80ff57a2f4866ede5984e34c48dba1413d1ad353/addmissing.sh"; - hash = "sha256-UTe3LKcmES6G1XHVvCN9Mvs3fVqaj0+bsv+0E33PmYk="; - }; -in -stdenvNoCC.mkDerivation { - pname = "project-sekai-cursors-${group}-${suffix}"; - version = "0"; - - src = fetchurl { - url = "https://www.colorfulstage.com/upload_images/media/Download/${format}%20file-${suffix}-${group}.zip"; - hash = hashes."${group}-${format}" or hash; - }; - - nativeBuildInputs = [ - unzip - win2xcur - ]; - - unpackCmd = "unzip $src -d source"; - sourceRoot = "source"; - - buildPhase = '' - mkdir output/ - win2xcur *.{ani,cur} -o output - - pushd output - mv Busy wait - mv Diagonal1 size_fdiag - mv Diagonal2 size_bdiag - mv Help help - mv Horizontal ew-resize - mv Link pointer - mv Move move - mv Normal default - mv Precision cross - mv Text text - mv Unavailable not-allowed - mv Vertical ns-resize - mv Working half-busy - - bash ${addmissing} - popd - ''; - - installPhase = '' - mkdir -p "$out/share/icons/${group} Miku/cursors" - cp output/{*,.*} "$out/share/icons/${group} Miku/cursors" - - echo -e "[Icon Theme]\nName=${group} Miku" > "$out/share/icons/${group} Miku/index.theme" - echo -e "[Icon Theme]\nInherits=${group} Miku" > "$out/share/icons/${group} Miku/cursor.theme" - ''; - - meta = { - platforms = lib.platforms.all; - hydraPlatforms = [ ]; - }; -} diff --git a/pkgs/shlink/package.nix b/pkgs/shlink/package.nix index f7de262..7cd04e6 100644 --- a/pkgs/shlink/package.nix +++ b/pkgs/shlink/package.nix @@ -36,10 +36,6 @@ php84.buildComposerProject (finalAttrs: { composerLock = ./composer.lock; vendorHash = "sha256-M+3eGiezHsr8H5TyUXhYLsVK316iZzcFVSo9Jwc5W/o="; - postPatch = '' - sed -i "s/%SHLINK_VERSION%/${finalAttrs.version}/g" module/Core/src/Config/Options/AppOptions.php - ''; - postInstall = '' mkdir -p $out/bin ln -s $out/share/php/shlink/bin/cli $out/bin/shlink diff --git a/pkgs/sql-developer.nix b/pkgs/sql-developer.nix deleted file mode 100644 index 263f237..0000000 --- a/pkgs/sql-developer.nix +++ /dev/null @@ -1,69 +0,0 @@ -{ - lib, - stdenvNoCC, - autoPatchelfHook, - copyDesktopItems, - fetchzip, - file, - gtk2-x11, - gtk3, - makeDesktopItem, - makeWrapper, - temurin-bin-17, - xorg, -}: -stdenvNoCC.mkDerivation (finalAttrs: { - pname = "sql-developer"; - version = "24.3.1.347.1826"; - - src = fetchzip { - url = "https://download.oracle.com/otn_software/java/sqldeveloper/sqldeveloper-${finalAttrs.version}-no-jre.zip"; - hash = "sha256-y32TVnCuLhpHpo2nn8wOV1zV7nuRnBkApSxrOhx7wZg="; - }; - - nativeBuildInputs = [ - autoPatchelfHook - copyDesktopItems - makeWrapper - ]; - - buildInputs = [ - gtk2-x11 - gtk3 - temurin-bin-17 - xorg.libXxf86vm - ]; - - autoPatchelfIgnoreMissingDeps = [ "libav*" ]; - - postBuild = '' - echo "AddVM9OrHigherOption --add-exports=java.desktop/com.sun.java.swing.plaf.gtk=ALL-UNNAMED" >> ide/bin/jdk.conf - ''; - - installPhase = '' - runHook preInstall - - mkdir -p $out/share/sql-developer - cp -r {,.}* $out/share/sql-developer/ - - install -Dm644 icon.png $out/share/pixmaps/sql-developer.png - - makeWrapper $out/share/sql-developer/sqldeveloper.sh $out/bin/sql-developer \ - --set JAVA_HOME ${temurin-bin-17} \ - --prefix PATH : ${lib.makeBinPath [ file ]} - - runHook postInstall - ''; - - desktopItems = [ - (makeDesktopItem { - name = "sql-developer"; - desktopName = "Oracle SQL Developer"; - type = "Application"; - exec = "sql-developer %U"; - icon = "sql-developer"; - }) - ]; - - meta.mainProgram = "sql-developer"; -}) diff --git a/pkgs/touhou-cursors.nix b/pkgs/touhou-cursors.nix deleted file mode 100644 index 7718c51..0000000 --- a/pkgs/touhou-cursors.nix +++ /dev/null @@ -1,36 +0,0 @@ -{ - lib, - stdenvNoCC, - fetchFromGitHub, - character ? "", -}: -stdenvNoCC.mkDerivation { - pname = "touhou-cursors-${character}"; - version = "0"; - - src = fetchFromGitHub { - owner = "mabequinho"; - repo = "touhou-cursors"; - rev = "92a5513c5d247fb1813e27ac2986e85def510204"; - hash = "sha256-XYmEpRkvZK7O9F7s3nKFA9rd7xO0ECEWlVyUb8/whq4="; - }; - - installPhase = - if character == "" then - '' - rm README.md - echo "No character provided, please override the package with one of the available characters (eg. 'touhou-cursors.override { character = \"Patchouli\";}')" - echo * - exit 1 - '' - else - '' - mkdir -p $out/share/icons - cp -r ${character} $out/share/icons - ''; - - meta = { - platforms = lib.platforms.all; - hydraPlatforms = [ ]; - }; -} diff --git a/pkgs/undertalemodtool/deps.json b/pkgs/undertalemodtool/deps.json new file mode 100644 index 0000000..0d5b210 --- /dev/null +++ b/pkgs/undertalemodtool/deps.json @@ -0,0 +1,92 @@ +[ + { + "pname": "Fody", + "version": "6.9.1", + "hash": "sha256-yDzLI06oFVNI4wiexSQK114YZlSOoGPTr8LIlr22M8I=" + }, + { + "pname": "Magick.NET-Q8-AnyCPU", + "version": "13.10.0", + "hash": "sha256-mG+aUxfTlipYWDBml3pmMx5ELCJcM7KbDPL0/xlRjPk=" + }, + { + "pname": "Magick.NET.Core", + "version": "13.10.0", + "hash": "sha256-nbWL93wzrqdL57CgKdxOqmeoSeD7HK36TuLWxj1AQy8=" + }, + { + "pname": "Microsoft.CodeAnalysis.Analyzers", + "version": "3.3.4", + "hash": "sha256-qDzTfZBSCvAUu9gzq2k+LOvh6/eRvJ9++VCNck/ZpnE=" + }, + { + "pname": "Microsoft.CodeAnalysis.Common", + "version": "4.11.0", + "hash": "sha256-cX/xgM0VmS+Bsu63KZk2ofjFOOy1mzI+CCVEY6kI+Qk=" + }, + { + "pname": "Microsoft.CodeAnalysis.CSharp", + "version": "4.11.0", + "hash": "sha256-E9jEOjp9g/CFecsc5/QfRKOPXMRpSw0Tf79XsRgL+Mk=" + }, + { + "pname": "Microsoft.CodeAnalysis.CSharp.Scripting", + "version": "4.11.0", + "hash": "sha256-8zooZAPoUIXB4KwI5joPU3QHg1iq4UP+u3g6TTXN+Lg=" + }, + { + "pname": "Microsoft.CodeAnalysis.Scripting.Common", + "version": "4.11.0", + "hash": "sha256-2JC9TipfoAQ1ug4i+PexZemJHFhjnFNv/FqjBIsV6J0=" + }, + { + "pname": "Microsoft.CSharp", + "version": "4.4.1", + "hash": "sha256-7/gsQHWAuFWrcVpVharASTNL+Mvl6Gw+AAw41k0MzXw=" + }, + { + "pname": "Microsoft.CSharp", + "version": "4.7.0", + "hash": "sha256-Enknv2RsFF68lEPdrf5M+BpV1kHoLTVRApKUwuk/pj0=" + }, + { + "pname": "Newtonsoft.Json", + "version": "13.0.3", + "hash": "sha256-hy/BieY4qxBWVVsDqqOPaLy1QobiIapkbrESm6v2PHc=" + }, + { + "pname": "PropertyChanged.Fody", + "version": "4.1.0", + "hash": "sha256-SAId/w7y5RZqMnpnJ6nmMjaPXQIr2h6QsRKZ4yuoYYU=" + }, + { + "pname": "runtime.osx.10.10-x64.CoreCompat.System.Drawing", + "version": "6.0.5.128", + "hash": "sha256-upmM1/1NGfoBrpNfbaAxFBqqDo+vQ5eDkA/WlxUcXdg=" + }, + { + "pname": "SharpZipLib", + "version": "1.4.2", + "hash": "sha256-/giVqikworG2XKqfN9uLyjUSXr35zBuZ2FX2r8X/WUY=" + }, + { + "pname": "System.Collections.Immutable", + "version": "8.0.0", + "hash": "sha256-F7OVjKNwpqbUh8lTidbqJWYi476nsq9n+6k0+QVRo3w=" + }, + { + "pname": "System.CommandLine", + "version": "2.0.0-beta1.21308.1", + "hash": "sha256-14pgyMy3F86XickXZB+AMX6uMTkVvBg5tV90p1G+4yY=" + }, + { + "pname": "System.Memory", + "version": "4.5.4", + "hash": "sha256-3sCEfzO4gj5CYGctl9ZXQRRhwAraMQfse7yzKoRe65E=" + }, + { + "pname": "System.Reflection.Metadata", + "version": "8.0.0", + "hash": "sha256-dQGC30JauIDWNWXMrSNOJncVa1umR1sijazYwUDdSIE=" + } +] diff --git a/pkgs/undertalemodtool/package.nix b/pkgs/undertalemodtool/package.nix new file mode 100644 index 0000000..d935bbe --- /dev/null +++ b/pkgs/undertalemodtool/package.nix @@ -0,0 +1,26 @@ +{ + buildDotnetModule, + dotnetCorePackages, + fetchFromGitHub, +}: +buildDotnetModule rec { + pname = "undertalemodtool"; + version = "0.7.0.0"; + + src = fetchFromGitHub { + owner = "UnderminersTeam"; + repo = "UndertaleModTool"; + tag = version; + hash = "sha256-Ya7M+CBbto/3X0CZbG15XX96i0+bXh9Qxr25dlSXO/8="; + }; + + nugetDeps = ./deps.json; + + dotnet-sdk = dotnetCorePackages.sdk_8_0-bin; + + dotnetRestoreFlags = "UndertaleModCli"; + dotnetBuildFlags = "UndertaleModCli --no-restore"; + dotnetInstallFlags = "UndertaleModCli"; + + meta.mainProgram = "UndertaleModCli"; +} diff --git a/pkgs/vineflower.nix b/pkgs/vineflower.nix index 62ad53a..dfa1f1c 100644 --- a/pkgs/vineflower.nix +++ b/pkgs/vineflower.nix @@ -6,11 +6,11 @@ }: stdenv.mkDerivation (finalAttrs: { pname = "vineflower"; - version = "1.11.1"; + version = "1.11.0"; src = fetchurl { url = "https://github.com/Vineflower/vineflower/releases/download/${finalAttrs.version}/vineflower-${finalAttrs.version}.jar"; - hash = "sha256-phXQfdu81Ik2lnT0DkLfY5wyvpVBCJCzjxc9XB4uo5w="; + hash = "sha256-/bYp9DFRIh4FrVM32TwyLka8J1FiNElCrpKnzqb4ESk="; }; nativeBuildInputs = [ makeWrapper ];