Compare commits
	
		
			72 Commits
		
	
	
		
			bcd4c4a269
			...
			update_fla
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 502a26b8d9 | ||
| f0f3f19c21 | |||
| f05330dd60 | |||
| 1f4adea38e | |||
| 8fe36cfddc | |||
| 66fe96f8ce | |||
| ac27bd0bec | |||
| 6df2a1a659 | |||
| 5a6dd50718 | |||
| 67d062e9b0 | |||
| de4bb6a60e | |||
| 101ab28b9b | |||
| d2e3803d2d | |||
|  | cff7f6163f | ||
| 242f3e0052 | |||
| c340ee3659 | |||
| 2940e7c5fb | |||
| a984858a7f | |||
| 504b715b42 | |||
|  | 5d757c2fcf | ||
|  | 8ccdad907f | ||
| 47b05d81c1 | |||
| d5421d87db | |||
|  | d2eec57ac2 | ||
| cf0dcee23f | |||
| 706e911539 | |||
| 5f20482f72 | |||
| f515a00748 | |||
| eb40cab148 | |||
| 739324df92 | |||
| a840f3f3d6 | |||
| 36897a543d | |||
| 161a4a3164 | |||
| 6920f115fc | |||
| c3ae074b0e | |||
| 17013e425e | |||
| e5934da311 | |||
| 4c8d7df432 | |||
| 94a18eac26 | |||
| 0b76292a1f | |||
| 747aae7774 | |||
| 95d04865b6 | |||
| 92401c5f6d | |||
| 3cd3ab43e4 | |||
| 02172cd3cf | |||
| 388891aa55 | |||
| a6c7ddbb34 | |||
| 98797b25cf | |||
| 0a0ce21db9 | |||
| c1563bf348 | |||
| f496e54902 | |||
|  | 4720d618ae | ||
| 0fe44e3a8b | |||
| ef2a2412ff | |||
| 149270cfb1 | |||
| 273d1906e1 | |||
|  | a28eebd24f | ||
|  | 2fb4aa7a7d | ||
| 870d0e90bd | |||
| c2e4b1331c | |||
| 6be46457dd | |||
| b099d2b28c | |||
| e83e621d6c | |||
|  | c401d92d7e | ||
|  | ec2163ee6a | ||
| 0627c79441 | |||
| f3efd6f932 | |||
|  | 45cf064f13 | ||
|  | 25b0104686 | ||
| aa31825452 | |||
| b130423331 | |||
| fc9e687e8d | 
| @@ -8,14 +8,15 @@ jobs: | |||||||
|     strategy: |     strategy: | ||||||
|       matrix: |       matrix: | ||||||
|         check: |         check: | ||||||
|           - nixpkgs-fmt |           # - nixpkgs-fmt | ||||||
|           - deadnix |           # - deadnix | ||||||
|           - nur |           - nur | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout repository |       - name: Checkout repository | ||||||
|         uses: actions/checkout@v4 |         uses: https://gitea.com/actions/checkout@v3 | ||||||
|       - uses: cachix/install-nix-action@v23 |       - name: Install nix | ||||||
|  |         uses: https://github.com/cachix/install-nix-action@v24 | ||||||
|       - name: Check ${{ matrix.check }} |       - name: Check ${{ matrix.check }} | ||||||
|         # Depends on nixos/nix#7759 to simply `nix flake check` |         # Depends on nixos/nix#7759 to simply `nix flake check` | ||||||
|         run: nix run .#checks.$(nix eval --raw --impure --expr "builtins.currentSystem").${{ matrix.check }} |         run: nix run .#checks.$(nix eval --raw --impure --expr "builtins.currentSystem").${{ matrix.check }} | ||||||
| @@ -43,13 +44,13 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|     - name: Checkout repository |     - name: Checkout repository | ||||||
|       uses: actions/checkout@v4 |       uses: https://gitea.com/actions/checkout@v3 | ||||||
|     - name: Install nix |     - name: Install nix | ||||||
|       uses: cachix/install-nix-action@v23 |       uses: https://github.com/cachix/install-nix-action@v24 | ||||||
|     - name: Show nixpkgs version |     - name: Show nixpkgs version | ||||||
|       run: nix eval --impure --expr '(import ./flake-compat.nix { src = ./.; }).lib.version' |       run: nix eval --impure --expr '(import ./flake-compat.nix { src = ./.; }).lib.version' | ||||||
|     - name: Setup cachix |     - name: Setup cachix | ||||||
|       uses: cachix/cachix-action@v12 |       uses: https://github.com/cachix/cachix-action@v12 | ||||||
|       if: ${{ matrix.cachixName != '<YOUR_CACHIX_NAME>' }} |       if: ${{ matrix.cachixName != '<YOUR_CACHIX_NAME>' }} | ||||||
|       with: |       with: | ||||||
|         name: ${{ matrix.cachixName }} |         name: ${{ matrix.cachixName }} | ||||||
| @@ -15,7 +15,7 @@ jobs: | |||||||
|       - uses: cachix/install-nix-action@v23 |       - uses: cachix/install-nix-action@v23 | ||||||
|         with: |         with: | ||||||
|           extra_nix_config: | |           extra_nix_config: | | ||||||
|             access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} |             access-tokens = github.com=${{ secrets.INPUT_GITHUB_ACCESS_TOKEN }} | ||||||
|       - name: "flake: update inputs" |       - name: "flake: update inputs" | ||||||
|         uses: DeterminateSystems/update-flake-lock@v20 |         uses: DeterminateSystems/update-flake-lock@v20 | ||||||
|         with: |         with: | ||||||
							
								
								
									
										28
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								.travis.yml
									
									
									
									
									
								
							| @@ -1,28 +0,0 @@ | |||||||
| version: ~> 1.0 |  | ||||||
| import: nix-community/nix-travis-ci:nix.yml@main |  | ||||||
|  |  | ||||||
| dist: xenial |  | ||||||
| os: linux |  | ||||||
|  |  | ||||||
| env: |  | ||||||
|   global: |  | ||||||
|     - CACHIX_CACHE="xeals" |  | ||||||
|     - NUR_REPO="xeals" |  | ||||||
|  |  | ||||||
| jobs: |  | ||||||
|   include: |  | ||||||
|     - env: NIX_PATH=nixpkgs=channel:nixpkgs-unstable |  | ||||||
|     - env: NIX_PATH=nixpkgs=channel:nixos-unstable |  | ||||||
|     # - env: NIX_PATH=nixpkgs=channel:nixos-20.03 |  | ||||||
|  |  | ||||||
| script: |  | ||||||
|  - nix-build ci.nix -kA buildOutputs |  | ||||||
|  - nix eval -f default.nix 'lib' |  | ||||||
|  - nix eval -f default.nix 'modules' |  | ||||||
|  - nix eval -f default.nix 'overlays' |  | ||||||
|  |  | ||||||
| after_success: |  | ||||||
|   - if [ -n "${CACHIX_CACHE}" ]; then nix-build ci.nix -kA cacheOutputs | cachix push "${CACHIX_CACHE}"; fi |  | ||||||
|   - if [[ NUR_REPO != "xeals" && "cron" != "${TRAVIS_EVENT_TYPE}" && "false" = "${TRAVIS_PULL_REQUEST}" && "master" = "${TRAVIS_BRANCH}" ]]; then |  | ||||||
|       curl -XPOST "https://nur-update.herokuapp.com/update?repo=${NUR_REPO}"; fi |  | ||||||
|  |  | ||||||
							
								
								
									
										52
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								README.md
									
									
									
									
									
								
							| @@ -2,44 +2,28 @@ | |||||||
|  |  | ||||||
| **My personal [NUR](https://github.com/nix-community/NUR) repository** | **My personal [NUR](https://github.com/nix-community/NUR) repository** | ||||||
|  |  | ||||||
| [](https://github.com/xeals/nur-packages/actions) [](https://xeals.cachix.org) | [](https://git.xeals.me/xeals/nur-packages/actions) | ||||||
|  | [](https://xeals.cachix.org) | ||||||
|  |  | ||||||
| ## Noteworthy packages |  | ||||||
|  |  | ||||||
| ### Jetbrains with plugins | ## Using | ||||||
|  |  | ||||||
| A fan of the Emacs/Vim/VSCode plugin builder? Now enjoy it with your favourite Jetbrains IDE! | Using packages is easier through the combined [NUR](https://github.com/nix-community/NUR) flake. | ||||||
|  |  | ||||||
| The system is mostly proof-of-concept and there are a couple of issues with it at the moment, but it works for what is available in the repo. |  | ||||||
|  |  | ||||||
| #### Using |  | ||||||
|  |  | ||||||
| ```nix | ```nix | ||||||
| { pkgs ? import <nixpkgs> {} }: | # flake.nix | ||||||
| let | { | ||||||
|   xeals = import (builtins.fetchTarball "https://git.xeal.me/xeals/nur-packages/archive/master.tar.gz") { |   inputs = { | ||||||
|     inherit pkgs; |     xeals.url = "git+https://git.xeal.me/xeals/nur-packages"; # Direct | ||||||
|  |     xeals.url = "github:xeals/nur-packages"; # GitHub mirror | ||||||
|   }; |   }; | ||||||
| in |    | ||||||
|   # e.g., for IntelliJ IDEA |   outputs = { nixpkgs, xeals, ... }: { | ||||||
|   xeals.jetbrains.ideaCommunityWithPlugins (jpkgs: [ |     nixosConfigurations.foo = nixpkgs.lib.nixosSystem { | ||||||
|     jpkgs.ideavim |       modules = [ | ||||||
|     jpkgs.checkstyle-idea |         xeals.nixosModules.betanin | ||||||
|   ]) |       ]; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| #### Issues |  | ||||||
|  |  | ||||||
| - [ ] The plugin derivation overrides the base instead of extending it; this is really only an issue for the open-source IDEs, and only once they're actually built from source (instead of repackaging the JARs) |  | ||||||
| - [ ] Plugins must be manually added to the repo; long-term, I'd really want some way to scrape them, or at least have a script to add and update |  | ||||||
|  |  | ||||||
| ### spotify-ripper |  | ||||||
|  |  | ||||||
| `spotify-ripper` is pretty flexible in the formats it supports, so the derivation allows you to customize which support packages to build with. |  | ||||||
|  |  | ||||||
| The default package comes with nothing (which is not entirely useful -- this will probably change at some point). See [the builder](./pkgs/tools/misc/spotify-ripper/default.nix) for options. |  | ||||||
|  |  | ||||||
| ## General issues |  | ||||||
|  |  | ||||||
| - [ ] `spotify-ripper` does not build on stable NixOS channels before 20.09 when built with m4a or mp4 support, as `fdk-aac-encoder` is not available |  | ||||||
| - [ ] Due to changes in toolchains affected fixed output hashes, anything using `buildGoModule` and `buildRustPackage` will fail on NixOS 20.03. Override the hashes of `vendor` and `cargoDeps` attributes as needed |  | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										12
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							| @@ -5,11 +5,11 @@ | |||||||
|         "systems": "systems" |         "systems": "systems" | ||||||
|       }, |       }, | ||||||
|       "locked": { |       "locked": { | ||||||
|         "lastModified": 1694529238, |         "lastModified": 1731533236, | ||||||
|         "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=", |         "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", | ||||||
|         "owner": "numtide", |         "owner": "numtide", | ||||||
|         "repo": "flake-utils", |         "repo": "flake-utils", | ||||||
|         "rev": "ff7b65b44d01cf9ba6a71320833626af21126384", |         "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", | ||||||
|         "type": "github" |         "type": "github" | ||||||
|       }, |       }, | ||||||
|       "original": { |       "original": { | ||||||
| @@ -20,11 +20,11 @@ | |||||||
|     }, |     }, | ||||||
|     "nixpkgs": { |     "nixpkgs": { | ||||||
|       "locked": { |       "locked": { | ||||||
|         "lastModified": 1694948089, |         "lastModified": 1761349956, | ||||||
|         "narHash": "sha256-d2B282GmQ9o8klc22/Rbbbj6r99EnELQpOQjWMyv0rU=", |         "narHash": "sha256-tH3wHnOJms+U4k/rK2Nn1RfBrhffX92jLP/2VndSn0w=", | ||||||
|         "owner": "NixOS", |         "owner": "NixOS", | ||||||
|         "repo": "nixpkgs", |         "repo": "nixpkgs", | ||||||
|         "rev": "5148520bfab61f99fd25fb9ff7bfbb50dad3c9db", |         "rev": "02f2cb8e0feb4596d20cc52fda73ccee960e3538", | ||||||
|         "type": "github" |         "type": "github" | ||||||
|       }, |       }, | ||||||
|       "original": { |       "original": { | ||||||
|   | |||||||
							
								
								
									
										29
									
								
								flake.nix
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								flake.nix
									
									
									
									
									
								
							| @@ -5,10 +5,6 @@ | |||||||
|   inputs.flake-utils.url = "github:numtide/flake-utils"; |   inputs.flake-utils.url = "github:numtide/flake-utils"; | ||||||
|  |  | ||||||
|   outputs = { self, nixpkgs, flake-utils }: |   outputs = { self, nixpkgs, flake-utils }: | ||||||
|     let |  | ||||||
|       inherit (nixpkgs) lib; |  | ||||||
|       inherit (flake-utils.lib) mkApp; |  | ||||||
|     in |  | ||||||
|     flake-utils.lib.eachDefaultSystem |     flake-utils.lib.eachDefaultSystem | ||||||
|       (system: |       (system: | ||||||
|         let |         let | ||||||
| @@ -17,13 +13,12 @@ | |||||||
|         { |         { | ||||||
|           packages = import ./pkgs/top-level { localSystem = system; inherit pkgs; }; |           packages = import ./pkgs/top-level { localSystem = system; inherit pkgs; }; | ||||||
|  |  | ||||||
|  |           formatter = pkgs.writeShellScriptBin "nur-packages-fmt" '' | ||||||
|  |             ${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt . | ||||||
|  |             ${pkgs.deadnix}/bin/deadnix -e . | ||||||
|  |           ''; | ||||||
|  |  | ||||||
|           checks = { |           checks = { | ||||||
|             nixpkgs-fmt = pkgs.writeShellScriptBin "nixpkgs-fmt-check" '' |  | ||||||
|               ${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt --check . |  | ||||||
|             ''; |  | ||||||
|             deadnix = pkgs.writeShellScriptBin "deadnix-check" '' |  | ||||||
|               ${pkgs.deadnix}/bin/deadnix --fail . |  | ||||||
|             ''; |  | ||||||
|             # Ensures that the NUR bot can evaluate and find all our packages. |             # Ensures that the NUR bot can evaluate and find all our packages. | ||||||
|             # Normally we'd also run with `--option restrict-eval true`, but |             # Normally we'd also run with `--option restrict-eval true`, but | ||||||
|             # this is incompatible with flakes because reasons. |             # this is incompatible with flakes because reasons. | ||||||
| @@ -46,21 +41,11 @@ | |||||||
|           devShells.ci = pkgs.mkShellNoCC { |           devShells.ci = pkgs.mkShellNoCC { | ||||||
|             buildInputs = [ pkgs.nix-build-uncached ]; |             buildInputs = [ pkgs.nix-build-uncached ]; | ||||||
|           }; |           }; | ||||||
|  |  | ||||||
|           apps = { |  | ||||||
|             alacritty = mkApp { drv = pkgs.alacritty-ligatures; exePath = "/bin/alacritty"; }; |  | ||||||
|             protonmail-bridge = mkApp { drv = pkgs.protonmail-bridge; }; |  | ||||||
|             protonmail-bridge-headless = mkApp { drv = pkgs.protonmail-bridge; }; |  | ||||||
|             psst-cli = mkApp { drv = pkgs.psst; exePath = "/bin/psst-cli"; }; |  | ||||||
|             psst-gui = mkApp { drv = pkgs.psst; exePath = "/bin/psst-gui"; }; |  | ||||||
|             samrewritten = mkApp { drv = pkgs.samrewritten; }; |  | ||||||
|             spotify-ripper = mkApp { drv = pkgs.spotify-ripper; }; |  | ||||||
|           }; |  | ||||||
|         }) |         }) | ||||||
|     // { |     // { | ||||||
|       nixosModules = lib.mapAttrs (_: path: import path) (import ./modules) // { |       nixosModules = nixpkgs.lib.mapAttrs (_: path: import path) (import ./modules) // { | ||||||
|         default = { |         default = { | ||||||
|           imports = lib.attrValues self.nixosModules; |           imports = nixpkgs.lib.attrValues self.nixosModules; | ||||||
|         }; |         }; | ||||||
|       }; |       }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,6 +4,8 @@ | |||||||
|   amdgpu-pwm = ./services/hardware/amdgpu-pwm.nix; |   amdgpu-pwm = ./services/hardware/amdgpu-pwm.nix; | ||||||
|   betanin = ./services/web-apps/betanin.nix; |   betanin = ./services/web-apps/betanin.nix; | ||||||
|   dunst = ./services/x11/dunst.nix; |   dunst = ./services/x11/dunst.nix; | ||||||
|  |   koillection = ./services/web-apps/koillection.nix; | ||||||
|  |   porkbun-ddns = ./services/networking/porkbun-ddns.nix; | ||||||
|   radeon-profile-daemon = ./services/hardware/radeon-profile-daemon.nix; |   radeon-profile-daemon = ./services/hardware/radeon-profile-daemon.nix; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										74
									
								
								modules/services/networking/porkbun-ddns.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								modules/services/networking/porkbun-ddns.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | let | ||||||
|  |   inherit (lib) mkOption types; | ||||||
|  |  | ||||||
|  |   cfg = config.services.porkbun-ddns; | ||||||
|  | in | ||||||
|  | { | ||||||
|  |   options = { | ||||||
|  |     services.porkbun-ddns = { | ||||||
|  |       enable = lib.mkEnableOption "Porkbun dynamic DNS client"; | ||||||
|  |  | ||||||
|  |       package = mkOption { | ||||||
|  |         # TODO: How do I use mkPackageOption when the package isn't in the | ||||||
|  |         #  package set? | ||||||
|  |         type = types.package; | ||||||
|  |         default = pkgs.callPackage ../../../pkgs/by-name/po/porkbun-ddns/package.nix { }; | ||||||
|  |         defaultText = "pkgs.porkbun-ddns"; | ||||||
|  |         description = lib.mdDoc "The porkbun-ddns package to use."; | ||||||
|  |       }; | ||||||
|  |  | ||||||
|  |       interval = mkOption { | ||||||
|  |         type = types.str; | ||||||
|  |         default = "10m"; | ||||||
|  |         description = lib.mdDoc '' | ||||||
|  |           Interval to update dynamic DNS records. The default is to update every | ||||||
|  |           10 minutes. The format is described in {manpage}`systemd.time(7)`. | ||||||
|  |         ''; | ||||||
|  |       }; | ||||||
|  |  | ||||||
|  |       domains = mkOption { | ||||||
|  |         type = types.listOf types.str; | ||||||
|  |         default = [ ]; | ||||||
|  |         description = lib.mdDoc "Domains to update."; | ||||||
|  |       }; | ||||||
|  |  | ||||||
|  |       apiKeyFile = mkOption { | ||||||
|  |         type = types.nullOr types.path; | ||||||
|  |         description = lib.mdDoc '' | ||||||
|  |           File containing the API key to use when running the client. | ||||||
|  |         ''; | ||||||
|  |       }; | ||||||
|  |  | ||||||
|  |       secretApiKeyFile = mkOption { | ||||||
|  |         type = types.nullOr types.path; | ||||||
|  |         description = lib.mdDoc '' | ||||||
|  |           File containing the secret API key to use when running the | ||||||
|  |           client. | ||||||
|  |         ''; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   config = lib.mkIf cfg.enable { | ||||||
|  |     systemd.services.porkbun-ddns = { | ||||||
|  |       description = "Porkbun dynamic DNS client"; | ||||||
|  |       script = '' | ||||||
|  |         ${cfg.package}/bin/porkbun-ddns \ | ||||||
|  |           -K ${cfg.apiKeyFile} \ | ||||||
|  |           -S ${cfg.secretApiKeyFile} \ | ||||||
|  |           ${lib.concatStringsSep " " cfg.domains} | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     systemd.timers.porkbun-ddns = { | ||||||
|  |       description = "Porkbun dynamic DNS client"; | ||||||
|  |       wants = [ "network-online.target" ]; | ||||||
|  |       wantedBy = [ "timers.target" ]; | ||||||
|  |       timerConfig = { | ||||||
|  |         OnBootSec = cfg.interval; | ||||||
|  |         OnUnitActiveSec = cfg.interval; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @@ -1,51 +1,16 @@ | |||||||
| { config, lib, pkgs, ... }: | { config, lib, pkgs, ... }: | ||||||
|  |  | ||||||
| let | let | ||||||
|   inherit (lib) mkIf mkOption optionalAttrs optionalString types; |   inherit (builtins) hashString; | ||||||
|  |   inherit (lib) mkIf mkOption optionalAttrs types; | ||||||
|  |  | ||||||
|   cfg = config.services.betanin; |   cfg = config.services.betanin; | ||||||
|  |  | ||||||
|   defaultUser = "betanin"; |  | ||||||
|   defaultGroup = "betanin"; |  | ||||||
|   defaultSettings = { |  | ||||||
|     notifications = { |  | ||||||
|       services = { }; |  | ||||||
|       strings = { |  | ||||||
|         title = "[betanin] torrent `$name` $status"; |  | ||||||
|         body = "@ $time. view/use the console at http://127.0.0.1:${toString cfg.port}/$console_path"; |  | ||||||
|       }; |  | ||||||
|     }; |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
|   finalSettings = |  | ||||||
|     let |  | ||||||
|       base = lib.filterAttrsRecursive (n: _: !(lib.hasSuffix "_file" n)) cfg.settings; |  | ||||||
|       clean = { |  | ||||||
|         frontend.password = |  | ||||||
|           if cfg.settings.frontend.password_file != null |  | ||||||
|           then "@password@" |  | ||||||
|           else cfg.settings.frontend.password; |  | ||||||
|         clients.api_key = |  | ||||||
|           if cfg.settings.clients.api_key_file != null |  | ||||||
|           then "@api_key@" |  | ||||||
|           else cfg.settings.clients.api_key; |  | ||||||
|       }; |  | ||||||
|     in |  | ||||||
|     lib.foldl' lib.recursiveUpdate defaultSettings [ base clean ]; |  | ||||||
|  |  | ||||||
|   settingsFormat = pkgs.formats.toml { }; |   settingsFormat = pkgs.formats.toml { }; | ||||||
|   settingsFile = settingsFormat.generate "betanin.toml" finalSettings; |  | ||||||
|  |  | ||||||
|   beetsFormat = pkgs.formats.yaml { }; |   beetsFormat = pkgs.formats.yaml { }; | ||||||
|   beetsFile = |  | ||||||
|     if (cfg.beetsFile != null) |  | ||||||
|     then cfg.beetsFile |  | ||||||
|     else if (cfg.beetsConfig != { }) |  | ||||||
|     then beetsFormat.generate "betanin-beets.yaml" cfg.beetsConfig |  | ||||||
|     else null; |  | ||||||
| in | in | ||||||
| { | { | ||||||
|   options = { |   options.services.betanin = { | ||||||
|     services.betanin = { |  | ||||||
|     enable = lib.mkEnableOption "betanin"; |     enable = lib.mkEnableOption "betanin"; | ||||||
|  |  | ||||||
|     package = mkOption { |     package = mkOption { | ||||||
| @@ -69,13 +34,13 @@ in | |||||||
|     user = mkOption { |     user = mkOption { | ||||||
|       description = "User that the betanin program should run under."; |       description = "User that the betanin program should run under."; | ||||||
|       type = types.str; |       type = types.str; | ||||||
|         default = defaultUser; |       default = "betanin"; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     group = mkOption { |     group = mkOption { | ||||||
|       description = "Group that the betanin program should run under."; |       description = "Group that the betanin program should run under."; | ||||||
|       type = types.str; |       type = types.str; | ||||||
|         default = defaultGroup; |       default = "betanin"; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     dataDir = mkOption { |     dataDir = mkOption { | ||||||
| @@ -85,106 +50,49 @@ in | |||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     settings = mkOption { |     settings = mkOption { | ||||||
|         type = types.submodule { |       type = settingsFormat.type; | ||||||
|           freeformType = settingsFormat.type; |       default = { }; | ||||||
|  |  | ||||||
|           options.frontend.username = mkOption { |  | ||||||
|             type = types.str; |  | ||||||
|             default = ""; |  | ||||||
|             description = "Username used to log into the frontend. Must be set."; |  | ||||||
|           }; |  | ||||||
|  |  | ||||||
|           options.frontend.password = mkOption { |  | ||||||
|             type = types.str; |  | ||||||
|             default = ""; |  | ||||||
|             description = '' |  | ||||||
|               Password used to log into the frontend. Either password or |  | ||||||
|               password_file must be set. |  | ||||||
|             ''; |  | ||||||
|           }; |  | ||||||
|  |  | ||||||
|           options.frontend.password_file = mkOption { |  | ||||||
|             type = with types; nullOr (either str path); |  | ||||||
|             default = null; |  | ||||||
|             description = '' |  | ||||||
|               File containing the password used to log into the frontend. The |  | ||||||
|               file must be readable by the betanin user/group. |  | ||||||
|  |  | ||||||
|               Using a password file keeps the password out of the Nix store, but |  | ||||||
|               the password is still stored in plain text in the service data |  | ||||||
|               directory. |  | ||||||
|             ''; |  | ||||||
|           }; |  | ||||||
|  |  | ||||||
|           options.clients.api_key = mkOption { |  | ||||||
|             type = types.nullOr types.str; |  | ||||||
|             default = ""; |  | ||||||
|             description = '' |  | ||||||
|               API key used to access Betanin (e.g., from other services). |  | ||||||
|             ''; |  | ||||||
|           }; |  | ||||||
|  |  | ||||||
|           options.clients.api_key_file = mkOption { |  | ||||||
|             type = with types; nullOr (either str path); |  | ||||||
|             default = null; |  | ||||||
|             description = '' |  | ||||||
|               File containing the API key used to access Betanin (e.g., from |  | ||||||
|               other services). The file must be readable by the betanin |  | ||||||
|               user/group. |  | ||||||
|  |  | ||||||
|               Using a API key file keeps the API key out of the Nix store, but |  | ||||||
|               the API key is still stored in plain text in the service data |  | ||||||
|               directory. |  | ||||||
|             ''; |  | ||||||
|           }; |  | ||||||
|         }; |  | ||||||
|         default = defaultSettings; |  | ||||||
|       example = lib.literalExpression '' |       example = lib.literalExpression '' | ||||||
|         { |         { | ||||||
|           frontend = { |           frontend = { | ||||||
|             username = "foo"; |             username = "foo"; | ||||||
|               password_file = "/run/secrets/betaninPasswordFile"; |             password = { _secret = "/run/secrets/betaninPasswordFile"; }; | ||||||
|           }; |           }; | ||||||
|           clients = { |           clients = { | ||||||
|               api_key_file = "/run/secrets/betaninApiKeyFile"; |             api_key = { _secret = "/run/secrets/betaninApiKeyFile"; }; | ||||||
|           }; |           }; | ||||||
|           server = { |           server = { | ||||||
|             num_parallel_jobs = 1; |             num_parallel_jobs = 1; | ||||||
|           }; |           }; | ||||||
|         } |         } | ||||||
|       ''; |       ''; | ||||||
|         description = "Configuration for betanin."; |       description = '' | ||||||
|  |         Configuration for betanin. | ||||||
|  |  | ||||||
|  |         Options containing secret data should be set to an attribute set | ||||||
|  |         containing the attribute `_secret` - a string pointing to a file | ||||||
|  |         containing the value the option should be set to. | ||||||
|  |       ''; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|       beetsConfig = mkOption { |     beets.settings = mkOption { | ||||||
|         description = "beets configuration."; |  | ||||||
|       type = beetsFormat.type; |       type = beetsFormat.type; | ||||||
|       default = { }; |       default = { }; | ||||||
|       }; |       description = "Configuration for beets used by betanin."; | ||||||
|  |  | ||||||
|       beetsFile = mkOption { |  | ||||||
|         description = "beets configuration file."; |  | ||||||
|         type = with types; nullOr (either str path); |  | ||||||
|         default = null; |  | ||||||
|       }; |  | ||||||
|     }; |     }; | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   config = mkIf cfg.enable { |   config = mkIf cfg.enable { | ||||||
|     assertions = [ |     services.betanin.settings = { | ||||||
|       { |       notifications = { | ||||||
|         assertion = cfg.settings.frontend.username != ""; |         # Required to exist. | ||||||
|         message = "services.betanin.settings.frontend.username is required"; |         services = { }; | ||||||
|       } |         strings = { | ||||||
|       { |           title = lib.mkDefault "[betanin] torrent `$name` $status"; | ||||||
|         assertion = (cfg.settings.frontend.password == "") != (cfg.settings.frontend.password_file == null); |           body = lib.mkDefault "@ $time. view/use the console at http://127.0.0.1:${toString cfg.port}/$console_path"; | ||||||
|         message = "services.betanin.settings.frontend.password or services.betanin.settings.frontend.password_file is required"; |         }; | ||||||
|       } |       }; | ||||||
|       { |     }; | ||||||
|         assertion = (cfg.settings.clients.api_key == "") != (cfg.settings.clients.api_key_file == null); |  | ||||||
|         message = "services.betanin.settings.clients.api_key or services.betanin.settings.clients.api_key_file is required"; |  | ||||||
|       } |  | ||||||
|     ]; |  | ||||||
|  |  | ||||||
|     networking.firewall = mkIf cfg.openFirewall { |     networking.firewall = mkIf cfg.openFirewall { | ||||||
|       allowedTCPPorts = [ cfg.port ]; |       allowedTCPPorts = [ cfg.port ]; | ||||||
| @@ -192,59 +100,67 @@ in | |||||||
|  |  | ||||||
|     systemd.services.betanin = |     systemd.services.betanin = | ||||||
|       let |       let | ||||||
|         replaceSecret = secretFile: placeholder: targetFile: |         isSecret = v: lib.isAttrs v && v ? _secret && lib.isString v._secret; | ||||||
|           optionalString (secretFile != null) '' |         sanitisedConfig = lib.mapAttrsRecursiveCond | ||||||
|             ${pkgs.replace-secret}/bin/replace-secret ${placeholder} ${secretFile} ${targetFile} |           (as: !isSecret as) | ||||||
|  |           (_: v: if isSecret v then hashString "sha256" v._secret else v) | ||||||
|  |           cfg.settings; | ||||||
|  |         settingsFile = settingsFormat.generate "betanin.toml" sanitisedConfig; | ||||||
|  |  | ||||||
|  |         secretPaths = lib.catAttrs "_secret" (lib.collect isSecret cfg.settings); | ||||||
|  |         mkSecretReplacement = file: '' | ||||||
|  |           replace-secret ${hashString "sha256" file} ${file} "${cfg.dataDir}/.config/betanin/config.toml" | ||||||
|         ''; |         ''; | ||||||
|         replaceConfigSecret = secretFile: placeholder: |         secretReplacements = lib.concatMapStrings mkSecretReplacement secretPaths; | ||||||
|           replaceSecret secretFile placeholder "${cfg.dataDir}/.config/betanin/config.toml"; |  | ||||||
|  |         beetsFile = beetsFormat.generate "betanin-beets.yaml" cfg.beets.settings; | ||||||
|       in |       in | ||||||
|       { |       { | ||||||
|         description = "Betanin service"; |         description = "Betanin service"; | ||||||
|         wantedBy = [ "multi-user.target" ]; |         wantedBy = [ "multi-user.target" ]; | ||||||
|         after = [ "networking.target" ]; |         after = [ "network.target" ]; | ||||||
|  |         path = [ pkgs.replace-secret ]; | ||||||
|  |  | ||||||
|         environment = { |         environment = { | ||||||
|           HOME = cfg.dataDir; |           HOME = cfg.dataDir; | ||||||
|         }; |         }; | ||||||
|         path = [ pkgs.replace-secret ]; |  | ||||||
|  |  | ||||||
|         script = '' |         script = '' | ||||||
|           mkdir -p ${cfg.dataDir}/.config/betanin \ |           ln -sf ${beetsFile} ${cfg.dataDir}/.config/beets/config.yaml | ||||||
|             ${cfg.dataDir}/.config/beets \ |  | ||||||
|             ${cfg.dataDir}/.local/share/betanin |  | ||||||
|           cat ${settingsFile} > ${cfg.dataDir}/.config/betanin/config.toml |           cat ${settingsFile} > ${cfg.dataDir}/.config/betanin/config.toml | ||||||
|  |           ${secretReplacements} | ||||||
|           ${optionalString (beetsFile != null) '' |  | ||||||
|             ln -sf ${beetsFile} ${cfg.dataDir}/.config/betanin/config.toml |  | ||||||
|           ''} |  | ||||||
|           ${replaceConfigSecret cfg.settings.frontend.password_file "@password@"} |  | ||||||
|           ${replaceConfigSecret cfg.settings.clients.api_key_file "@api_key@"} |  | ||||||
|  |  | ||||||
|           ${cfg.package}/bin/betanin --port ${toString cfg.port} |           ${cfg.package}/bin/betanin --port ${toString cfg.port} | ||||||
|         ''; |         ''; | ||||||
|  |  | ||||||
|         serviceConfig = lib.mkMerge [ |         serviceConfig = { | ||||||
|           { |  | ||||||
|           User = cfg.user; |           User = cfg.user; | ||||||
|           Group = cfg.group; |           Group = cfg.group; | ||||||
|           PrivateTmp = true; |           PrivateTmp = true; | ||||||
|           Restart = "always"; |           Restart = "always"; | ||||||
|           WorkingDirectory = cfg.dataDir; |           WorkingDirectory = cfg.dataDir; | ||||||
|           } |           StateDirectory = mkIf (cfg.dataDir == "/var/lib/betanin") "betanin"; | ||||||
|           (mkIf (cfg.dataDir == "/var/lib/betanin") { |         }; | ||||||
|             StateDirectory = "betanin"; |  | ||||||
|           }) |  | ||||||
|         ]; |  | ||||||
|       }; |       }; | ||||||
|  |  | ||||||
|     users.users = optionalAttrs (cfg.user == defaultUser) { |     systemd.tmpfiles.rules = [ | ||||||
|  |       "d ${cfg.dataDir}                            0710 ${cfg.user} ${cfg.group} - -" | ||||||
|  |       "d ${cfg.dataDir}/.config                    0750 ${cfg.user} ${cfg.group} - -" | ||||||
|  |       "d ${cfg.dataDir}/.config/betanin            0750 ${cfg.user} ${cfg.group} - -" | ||||||
|  |       "d ${cfg.dataDir}/.config/beets              0750 ${cfg.user} ${cfg.group} - -" | ||||||
|  |       "d ${cfg.dataDir}/.local                     0750 ${cfg.user} ${cfg.group} - -" | ||||||
|  |       "d ${cfg.dataDir}/.local/share               0750 ${cfg.user} ${cfg.group} - -" | ||||||
|  |       "d ${cfg.dataDir}/.local/share/betanin       0750 ${cfg.user} ${cfg.group} - -" | ||||||
|  |     ]; | ||||||
|  |  | ||||||
|  |     users.users = optionalAttrs (cfg.user == "betanin") { | ||||||
|       ${cfg.user} = { |       ${cfg.user} = { | ||||||
|         isSystemUser = true; |         isSystemUser = true; | ||||||
|         group = cfg.group; |         group = cfg.group; | ||||||
|       }; |       }; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     users.groups = optionalAttrs (cfg.group == defaultGroup) { |     users.groups = optionalAttrs (cfg.group == "betanin") { | ||||||
|       ${cfg.group} = { }; |       ${cfg.group} = { }; | ||||||
|     }; |     }; | ||||||
|   }; |   }; | ||||||
|   | |||||||
							
								
								
									
										318
									
								
								modules/services/web-apps/koillection.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										318
									
								
								modules/services/web-apps/koillection.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,318 @@ | |||||||
|  | { config, lib, modulesPath, options, pkgs, ... }: | ||||||
|  | let | ||||||
|  |   inherit (lib) literalExpression mkEnableOption mkIf mkOption optionalString types; | ||||||
|  |  | ||||||
|  |   opt = options.services.koillection; | ||||||
|  |   cfg = config.services.koillection; | ||||||
|  |   db = cfg.database; | ||||||
|  |  | ||||||
|  |   koillection = (pkgs.koillection or pkgs.callPackage ../../../pkgs/by-name/ko/koillection/package.nix { }).override { | ||||||
|  |     dataDir = cfg.dataDir; | ||||||
|  |   }; | ||||||
|  |   inherit (koillection.passthru) phpPackage; | ||||||
|  | in | ||||||
|  | { | ||||||
|  |   options.services.koillection = { | ||||||
|  |     enable = mkEnableOption "Koillection, a collection manager"; | ||||||
|  |  | ||||||
|  |     user = mkOption { | ||||||
|  |       type = types.str; | ||||||
|  |       default = "koillection"; | ||||||
|  |       description = lib.mdDoc "User Koillection runs as."; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     group = mkOption { | ||||||
|  |       type = types.str; | ||||||
|  |       default = "koillection"; | ||||||
|  |       description = lib.mdDoc "Group Koillection runs as."; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     hostName = lib.mkOption { | ||||||
|  |       type = types.str; | ||||||
|  |       default = config.networking.fqdnOrHostName; | ||||||
|  |       defaultText = "config.networking.fqdnOrHostName"; | ||||||
|  |       example = "koillection.example.com"; | ||||||
|  |       description = lib.mdDoc "The hostname to serve Koillection on."; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     dataDir = mkOption { | ||||||
|  |       description = lib.mdDoc "Koillection data directory"; | ||||||
|  |       default = "/var/lib/koillection"; | ||||||
|  |       type = types.path; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     database = { | ||||||
|  |       host = mkOption { | ||||||
|  |         type = types.str; | ||||||
|  |         default = if db.createLocally then "/run/postgresql" else null; | ||||||
|  |         defaultText = literalExpression '' | ||||||
|  |           if config.${opt.database.createLocally} | ||||||
|  |           then "/run/postgresql" | ||||||
|  |           else null | ||||||
|  |         ''; | ||||||
|  |         example = "192.168.12.85"; | ||||||
|  |         description = lib.mdDoc "Database host address or unix socket."; | ||||||
|  |       }; | ||||||
|  |       port = mkOption { | ||||||
|  |         type = types.port; | ||||||
|  |         default = 5432; | ||||||
|  |         description = lib.mdDoc "Database host port."; | ||||||
|  |       }; | ||||||
|  |       name = mkOption { | ||||||
|  |         type = types.str; | ||||||
|  |         default = "koillection"; | ||||||
|  |         description = lib.mdDoc "Database name."; | ||||||
|  |       }; | ||||||
|  |       user = mkOption { | ||||||
|  |         type = types.str; | ||||||
|  |         default = cfg.user; | ||||||
|  |         defaultText = literalExpression "user"; | ||||||
|  |         description = lib.mdDoc "Database username."; | ||||||
|  |       }; | ||||||
|  |       passwordFile = mkOption { | ||||||
|  |         type = with types; nullOr path; | ||||||
|  |         default = null; | ||||||
|  |         example = "/run/keys/koillection-dbpassword"; | ||||||
|  |         description = lib.mdDoc '' | ||||||
|  |           A file containing the password corresponding to | ||||||
|  |           {option}`database.user`. | ||||||
|  |         ''; | ||||||
|  |       }; | ||||||
|  |       createLocally = mkOption { | ||||||
|  |         type = types.bool; | ||||||
|  |         default = false; | ||||||
|  |         description = lib.mdDoc "Create the database and database user locally."; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     poolConfig = mkOption { | ||||||
|  |       type = with types; attrsOf (oneOf [ str int bool ]); | ||||||
|  |       default = { | ||||||
|  |         "pm" = "dynamic"; | ||||||
|  |         "pm.max_children" = 32; | ||||||
|  |         "pm.start_servers" = 2; | ||||||
|  |         "pm.min_spare_servers" = 2; | ||||||
|  |         "pm.max_spare_servers" = 4; | ||||||
|  |         "pm.max_requests" = 500; | ||||||
|  |       }; | ||||||
|  |       description = lib.mdDoc '' | ||||||
|  |         Options for the bookstack PHP pool. See the documentation on `php-fpm.conf` | ||||||
|  |         for details on configuration directives. | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     nginx = mkOption { | ||||||
|  |       type = types.submodule ( | ||||||
|  |         lib.recursiveUpdate | ||||||
|  |           (import "${modulesPath}/services/web-servers/nginx/vhost-options.nix" { inherit config lib; }) | ||||||
|  |           { } | ||||||
|  |       ); | ||||||
|  |       default = { }; | ||||||
|  |       example = literalExpression '' | ||||||
|  |         { | ||||||
|  |           serverAliases = [ | ||||||
|  |             "koillection.''${config.networking.domain}" | ||||||
|  |           ]; | ||||||
|  |           # To enable encryption and let let's encrypt take care of certificate | ||||||
|  |           forceSSL = true; | ||||||
|  |           enableACME = true; | ||||||
|  |         } | ||||||
|  |       ''; | ||||||
|  |       description = lib.mdDoc '' | ||||||
|  |         With this option, you can customize the nginx virtualHost settings. | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     config = mkOption { | ||||||
|  |       type = with types; | ||||||
|  |         attrsOf | ||||||
|  |           (nullOr | ||||||
|  |             (either | ||||||
|  |               (oneOf [ bool int port path str ]) | ||||||
|  |               (submodule { | ||||||
|  |                 options = { | ||||||
|  |                   _secret = mkOption { | ||||||
|  |                     type = nullOr str; | ||||||
|  |                     description = lib.mdDoc '' | ||||||
|  |                       The path to a file containing the value the option should | ||||||
|  |                       be set to in the final configuration file. | ||||||
|  |                     ''; | ||||||
|  |                   }; | ||||||
|  |                 }; | ||||||
|  |               }))); | ||||||
|  |       default = { }; | ||||||
|  |       example = literalExpression '' | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   config = mkIf cfg.enable { | ||||||
|  |     services.koillection.config = { | ||||||
|  |       APP_ENV = "prod"; | ||||||
|  |       # DB_DRIVER = "pdo_pgsql"; | ||||||
|  |       DB_USER = db.user; | ||||||
|  |       DB_PASSWORD._secret = db.passwordFile; | ||||||
|  |       DB_HOST = db.host; | ||||||
|  |       DB_PORT = db.port; | ||||||
|  |       DB_NAME = db.name; | ||||||
|  |       # FIXME | ||||||
|  |       # DB_VERSION = lib.versions.major config.services.postgresql.package.version; | ||||||
|  |       DB_VERSION = "15"; | ||||||
|  |       PHP_TZ = config.time.timeZone; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     services.postgresql = mkIf db.createLocally { | ||||||
|  |       enable = true; | ||||||
|  |       ensureDatabases = [ db.name ]; | ||||||
|  |       ensureUsers = [{ | ||||||
|  |         name = db.user; | ||||||
|  |         ensureDBOwnership = true; | ||||||
|  |       }]; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     services.phpfpm.pools.koillection = { | ||||||
|  |       inherit (cfg) user group; | ||||||
|  |       inherit phpPackage; | ||||||
|  |       # Copied from docker/php.ini | ||||||
|  |       phpOptions = '' | ||||||
|  |         max_execution_time = 200 | ||||||
|  |  | ||||||
|  |         apc.enabled = 1 | ||||||
|  |         apc.shm_size = 64M | ||||||
|  |         apc.ttl = 7200 | ||||||
|  |  | ||||||
|  |         opcache.enable = 1 | ||||||
|  |         opcache.memory_consumption = 256 | ||||||
|  |         opcache.max_accelerated_files = 20000 | ||||||
|  |         opcache.max_wasted_percentage = 10 | ||||||
|  |         opcache.validate_timestamps = 0 | ||||||
|  |         opcache.preload = ${koillection}/share/php/koillection/config/preload.php | ||||||
|  |         opcache.preload_user = ${cfg.user} | ||||||
|  |         expose_php = Off | ||||||
|  |  | ||||||
|  |         session.cookie_httponly = 1 | ||||||
|  |         realpath_cache_size = 4096K | ||||||
|  |         realpath_cache_ttle = 600 | ||||||
|  |       ''; | ||||||
|  |       settings = { | ||||||
|  |         "listen.mode" = "0660"; | ||||||
|  |         "listen.owner" = cfg.user; | ||||||
|  |         "listen.group" = cfg.group; | ||||||
|  |       } // cfg.poolConfig; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     services.nginx = { | ||||||
|  |       enable = lib.mkDefault true; | ||||||
|  |       virtualHosts."${cfg.hostName}" = lib.mkMerge [ | ||||||
|  |         cfg.nginx | ||||||
|  |         { | ||||||
|  |           root = lib.mkForce "${koillection}/share/php/koillection/public"; | ||||||
|  |           extraConfig = optionalString (cfg.nginx.addSSL || cfg.nginx.forceSSL || cfg.nginx.onlySSL || cfg.nginx.enableACME) "fastcgi_param HTTPS on;"; | ||||||
|  |           locations = { | ||||||
|  |             "/" = { | ||||||
|  |               index = "index.php"; | ||||||
|  |               extraConfig = ''try_files $uri $uri/ /index.php?query_string;''; | ||||||
|  |             }; | ||||||
|  |             "~ \.php$" = { | ||||||
|  |               extraConfig = '' | ||||||
|  |                 try_files $uri $uri/ /index.php?$query_string; | ||||||
|  |                 include ${config.services.nginx.package}/conf/fastcgi_params; | ||||||
|  |                 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | ||||||
|  |                 fastcgi_param REDIRECT_STATUS 200; | ||||||
|  |                 fastcgi_pass unix:${config.services.phpfpm.pools."koillection".socket}; | ||||||
|  |                 ${optionalString (cfg.nginx.addSSL || cfg.nginx.forceSSL || cfg.nginx.onlySSL || cfg.nginx.enableACME) "fastcgi_param HTTPS on;"} | ||||||
|  |               ''; | ||||||
|  |             }; | ||||||
|  |             "~ \.(js|css|gif|png|ico|jpg|jpeg)$" = { | ||||||
|  |               extraConfig = "expires 365d;"; | ||||||
|  |             }; | ||||||
|  |           }; | ||||||
|  |         } | ||||||
|  |       ]; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     systemd.services.koillection-setup = { | ||||||
|  |       description = "Preparation tasks for koillection"; | ||||||
|  |       before = [ "phpfpm-koillection.service" ]; | ||||||
|  |       wantedBy = [ "multi-user.target" ]; | ||||||
|  |       serviceConfig = { | ||||||
|  |         Type = "oneshot"; | ||||||
|  |         RemainAfterExit = true; | ||||||
|  |         User = cfg.user; | ||||||
|  |         WorkingDirectory = koillection; | ||||||
|  |         RuntimeDirectory = "koillection/cache"; | ||||||
|  |         RuntimeDirectoryMode = "0700"; | ||||||
|  |       }; | ||||||
|  |       path = [ pkgs.replace-secret ]; | ||||||
|  |       script = | ||||||
|  |         let | ||||||
|  |           isSecret = v: lib.isAttrs v && v ? _secret && lib.isString v._secret; | ||||||
|  |           koillectionEnvVars = lib.generators.toKeyValue { | ||||||
|  |             mkKeyValue = lib.flip lib.generators.mkKeyValueDefault "=" { | ||||||
|  |               mkValueString = v: with builtins; | ||||||
|  |                 if isInt v then toString v | ||||||
|  |                 else if lib.isString v then v | ||||||
|  |                 else if true == v then "true" | ||||||
|  |                 else if false == v then "false" | ||||||
|  |                 else if isSecret v then hashString "sha256" v._secret | ||||||
|  |                 else throw "unsupported type ${typeOf v}: ${(lib.generators.toPretty {}) v}"; | ||||||
|  |             }; | ||||||
|  |           }; | ||||||
|  |           secretPaths = lib.mapAttrsToList (_: v: v._secret) (lib.filterAttrs (_: isSecret) cfg.config); | ||||||
|  |           mkSecretReplacement = file: '' | ||||||
|  |             replace-secret ${lib.escapeShellArgs [ ( builtins.hashString "sha256" file ) file "${cfg.dataDir}/.env" ]} | ||||||
|  |           ''; | ||||||
|  |           secretReplacements = lib.concatMapStrings mkSecretReplacement secretPaths; | ||||||
|  |           filteredConfig = lib.converge (lib.filterAttrsRecursive (_: v: ! builtins.elem v [{ } null])) cfg.config; | ||||||
|  |           koillectionEnv = pkgs.writeText "koillection.env" (koillectionEnvVars filteredConfig); | ||||||
|  |         in | ||||||
|  |         '' | ||||||
|  |           # error handling | ||||||
|  |           set -euo pipefail | ||||||
|  |  | ||||||
|  |           # set permissions | ||||||
|  |           umask 077 | ||||||
|  |  | ||||||
|  |           # create .env file | ||||||
|  |           install -T -m 0600 -o ${cfg.user} ${koillectionEnv} "${cfg.dataDir}/.env" | ||||||
|  |           ${secretReplacements} | ||||||
|  |  | ||||||
|  |           # prepend `base64:` if it does not exist in APP_KEY | ||||||
|  |  | ||||||
|  |           if ! grep 'APP_KEY=base64:' "${cfg.dataDir}/.env" >/dev/null; then | ||||||
|  |               sed -i 's/APP_KEY=/APP_KEY=base64:/' "${cfg.dataDir}/.env" | ||||||
|  |           fi | ||||||
|  |  | ||||||
|  |           # migrate db | ||||||
|  |           ${lib.getExe phpPackage} ${koillection}/share/php/koillection/bin/console doctrine:migrations:migrate --no-interaction --allow-no-migration | ||||||
|  |  | ||||||
|  |           # dump translations | ||||||
|  |           # TODO: Might need pointing somewhere else. | ||||||
|  |           ${lib.getExe phpPackage} ${koillection}/share/php/koillection/bin/console app:translations:dump | ||||||
|  |         ''; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     systemd.tmpfiles.rules = [ | ||||||
|  |       "d ${cfg.dataDir}                            0710 ${cfg.user} ${cfg.group} - -" | ||||||
|  |       "d ${cfg.dataDir}/public                     0750 ${cfg.user} ${cfg.group} - -" | ||||||
|  |       "d ${cfg.dataDir}/public/uploads             0750 ${cfg.user} ${cfg.group} - -" | ||||||
|  |       "d ${cfg.dataDir}/var                        0700 ${cfg.user} ${cfg.group} - -" | ||||||
|  |       "d ${cfg.dataDir}/var/cache                  0700 ${cfg.user} ${cfg.group} - -" | ||||||
|  |       "d ${cfg.dataDir}/var/cache/prod             0700 ${cfg.user} ${cfg.group} - -" | ||||||
|  |       "d ${cfg.dataDir}/var/logs                   0700 ${cfg.user} ${cfg.group} - -" | ||||||
|  |     ]; | ||||||
|  |  | ||||||
|  |     users = { | ||||||
|  |       users = mkIf (cfg.user == "koillection") { | ||||||
|  |         koillection = { | ||||||
|  |           inherit (cfg) group; | ||||||
|  |           isSystemUser = true; | ||||||
|  |         }; | ||||||
|  |         "${config.services.nginx.user}".extraGroups = [ cfg.group ]; | ||||||
|  |       }; | ||||||
|  |       groups = mkIf (cfg.group == "koillection") { | ||||||
|  |         koillection = { }; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @@ -18,6 +18,8 @@ python3Packages.buildPythonApplication rec { | |||||||
|  |  | ||||||
|   propagatedBuildInputs = [ mopidy python3Packages.py-sonic ]; |   propagatedBuildInputs = [ mopidy python3Packages.py-sonic ]; | ||||||
|  |  | ||||||
|  |   format = "setuptools"; | ||||||
|  |  | ||||||
|   doCheck = false; |   doCheck = false; | ||||||
|  |  | ||||||
|   meta = with lib; { |   meta = with lib; { | ||||||
|   | |||||||
| @@ -1,11 +0,0 @@ | |||||||
| diff --git a/include/components/types.hpp b/include/components/types.hpp |  | ||||||
| index 8125d4b..c435f4a 100644 |  | ||||||
| --- a/include/components/types.hpp |  | ||||||
| +++ b/include/components/types.hpp |  | ||||||
| @@ -43,5 +43,6 @@ enum class controltag { |  | ||||||
|    DOUBLE_MIDDLE, |  | ||||||
|    DOUBLE_RIGHT, |  | ||||||
| +  EXTRA, |  | ||||||
|    // Terminator value, do not use |  | ||||||
|    BTN_COUNT, |  | ||||||
|  }; |  | ||||||
| @@ -1,44 +0,0 @@ | |||||||
| { qtbase, go, goModules }: |  | ||||||
|  |  | ||||||
| { |  | ||||||
|   pname = "protonmail-bridge"; |  | ||||||
|  |  | ||||||
|   tags = "pmapi_prod"; |  | ||||||
|  |  | ||||||
|   QT_PKG_CONFIG = "true"; |  | ||||||
|   QT_VERSION = qtbase.version; |  | ||||||
|  |  | ||||||
|   nativeBuildInputs = [ |  | ||||||
|     goModules.qt |  | ||||||
|     qtbase |  | ||||||
|   ]; |  | ||||||
|  |  | ||||||
|   buildPhase = '' |  | ||||||
|     cp cmd/Desktop-Bridge/main.go . |  | ||||||
|  |  | ||||||
|     ## Enable writable vendor |  | ||||||
|     GOMODULE=gomodule |  | ||||||
|     mv vendor $GOMODULE-vendor |  | ||||||
|     mkdir vendor |  | ||||||
|     readarray -t files < <(find $GOMODULE-vendor/ -type f | grep -v github.com/therecipe/qt | sed "s/$GOMODULE-//") |  | ||||||
|     for f in "''${files[@]}"; do |  | ||||||
|       mkdir -p $(dirname $f) |  | ||||||
|       cp -s $PWD/$GOMODULE-$f $f |  | ||||||
|     done |  | ||||||
|     unset GOMODULE |  | ||||||
|  |  | ||||||
|     ## |  | ||||||
|     mkdir -p vendor/github.com/therecipe |  | ||||||
|     cp -r gomodule-vendor/github.com/therecipe/qt vendor/github.com/therecipe/qt |  | ||||||
|     chmod -R a+w vendor/github.com/therecipe/qt |  | ||||||
|  |  | ||||||
|     # Add vendor to GOPATH because fuck |  | ||||||
|     mkdir -p $GOPATH |  | ||||||
|     ln -s $PWD/vendor $GOPATH/src |  | ||||||
|  |  | ||||||
|     qtsetup check |  | ||||||
|     GOROOT=${go}/share/go qtdeploy "''${buildFlagsArray[@]}" build desktop |  | ||||||
|   ''; |  | ||||||
|  |  | ||||||
|   meta.broken = true; |  | ||||||
| } |  | ||||||
| @@ -1,48 +0,0 @@ | |||||||
| { lib |  | ||||||
| , fetchFromGitHub |  | ||||||
| , buildGoModule |  | ||||||
| , pkg-config |  | ||||||
| , libsecret |  | ||||||
| }: |  | ||||||
|  |  | ||||||
| { pname |  | ||||||
| , tags |  | ||||||
| , ... |  | ||||||
| }@args: |  | ||||||
|  |  | ||||||
| buildGoModule (lib.recursiveUpdate args rec { |  | ||||||
|   inherit pname; |  | ||||||
|   version = "1.8.10"; |  | ||||||
|  |  | ||||||
|   src = fetchFromGitHub { |  | ||||||
|     owner = "ProtonMail"; |  | ||||||
|     repo = "proton-bridge"; |  | ||||||
|     rev = "br-${version}"; |  | ||||||
|     sha256 = "1na8min9cmn82lpad58abw6837k303fr09l6cvzswaxs73f231ig"; |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
|   vendorSha256 = "1219xa1347877bfhnid15y6w9s4hf1czbrmll2iha4gpsmg066bb"; |  | ||||||
|  |  | ||||||
|   nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ |  | ||||||
|     pkg-config |  | ||||||
|   ]; |  | ||||||
|  |  | ||||||
|   buildInputs = (args.buildInputs or [ ]) ++ [ |  | ||||||
|     libsecret |  | ||||||
|   ]; |  | ||||||
|  |  | ||||||
|   inherit tags; |  | ||||||
|  |  | ||||||
|   ldflags = [ |  | ||||||
|     "-X github.com/ProtonMail/proton-bridge/pkg/constants.Version=${version}" |  | ||||||
|     "-X github.com/ProtonMail/proton-bridge/pkg/constants.Revision=${version}" |  | ||||||
|     "-X github.com/ProtonMail/proton-bridge/pkg/constants.BuildDate=unknown" |  | ||||||
|   ]; |  | ||||||
|  |  | ||||||
|   meta = with lib; { |  | ||||||
|     description = "Integrate ProtonMail paid account with any program that supports IMAP and SMTP"; |  | ||||||
|     homepage = "https://protonmail.com"; |  | ||||||
|     license = licenses.gpl3; |  | ||||||
|     plaforms = platforms.x86_64; |  | ||||||
|   }; |  | ||||||
| }) |  | ||||||
| @@ -1,19 +0,0 @@ | |||||||
| { lib |  | ||||||
| , fetchFromGitHub |  | ||||||
| , buildGoModule |  | ||||||
|  |  | ||||||
| , go |  | ||||||
| , goModules |  | ||||||
| , libsecret |  | ||||||
| , pkg-config |  | ||||||
| , qtbase |  | ||||||
| }: |  | ||||||
| let |  | ||||||
|   builder = import ./common.nix { |  | ||||||
|     inherit lib fetchFromGitHub buildGoModule libsecret pkg-config; |  | ||||||
|   }; |  | ||||||
| in |  | ||||||
| { |  | ||||||
|   protonmail-bridge = builder (import ./app.nix { inherit qtbase go goModules; }); |  | ||||||
|   protonmail-bridge-headless = builder (import ./headless.nix { }); |  | ||||||
| } |  | ||||||
| @@ -1,768 +0,0 @@ | |||||||
| # file generated from go.mod using vgo2nix (https://github.com/adisbladis/vgo2nix) |  | ||||||
| [ |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/0xAX/notificator"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/0xAX/notificator"; |  | ||||||
|       rev = "3962a5ea8da1"; |  | ||||||
|       sha256 = "1lkn6mmghsd4a2h3na8x0r5xgckjn3c0v5vsp6bzhl2k1zxb640p"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/BurntSushi/toml"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/BurntSushi/toml"; |  | ||||||
|       rev = "v0.3.1"; |  | ||||||
|       sha256 = "1fjdwwfzyzllgiwydknf1pwjvy49qxfsczqx5gz3y0izs7as99j6"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/ProtonMail/go-appdir"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ProtonMail/go-appdir"; |  | ||||||
|       rev = "v1.1.0"; |  | ||||||
|       sha256 = "1pl43h5f79g2r0z98glrxasbb69yzigpd85csl7zmyhg63vzbkqw"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/ProtonMail/go-apple-mobileconfig"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ProtonMail/go-apple-mobileconfig"; |  | ||||||
|       rev = "7ea9927a11f6"; |  | ||||||
|       sha256 = "1vlm9m54xmq0r8bhgwzdmxnxf97sz01lgi6lw8pcjbljmzb9l75f"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/ProtonMail/go-autostart"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ProtonMail/go-autostart"; |  | ||||||
|       rev = "c5272053443a"; |  | ||||||
|       sha256 = "0cjnsbqrkhlapma2070cqcxr4wkvv55is3byqn8zmkzi0l3217nf"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/ProtonMail/go-imap-id"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ProtonMail/go-imap-id"; |  | ||||||
|       rev = "ed0baee567ee"; |  | ||||||
|       sha256 = "1kljw64pi3kabbd3gi7zy9wqzaypsxrdi5mfwf6akl438bq44jm4"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/ProtonMail/go-mime"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ProtonMail/go-mime"; |  | ||||||
|       rev = "09454e3dbe72"; |  | ||||||
|       sha256 = "1ncca6191nf0lsfhhhdxdbhxg3b2q1cmvjhq2428g0b50dlfkrnn"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/ProtonMail/go-vcard"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ProtonMail/go-vcard"; |  | ||||||
|       rev = "33aaa0a0c8a5"; |  | ||||||
|       sha256 = "19cify6lxd2yirqc92yfgzvn5qlc8a01a2kxjdg83jv0lx6ps26q"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/ProtonMail/gopenpgp"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ProtonMail/gopenpgp"; |  | ||||||
|       rev = "d398098113ed"; |  | ||||||
|       sha256 = "0ry69mymb6q00g4khdbzllrz7b44zhxvdzavhz6936n9dzsay13v"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/abiosoft/ishell"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/abiosoft/ishell"; |  | ||||||
|       rev = "v2.0.0"; |  | ||||||
|       sha256 = "11r6l133aaz6khm60x0a410ckpzvqzv2az7z5b088c2vddnp538r"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/abiosoft/readline"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/abiosoft/readline"; |  | ||||||
|       rev = "155bce2042db"; |  | ||||||
|       sha256 = "104q8dazj8yf6b089jjr82fy9h1g80zyyzvp3g8b44a7d8ngjj6r"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/allan-simon/go-singleinstance"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/allan-simon/go-singleinstance"; |  | ||||||
|       rev = "79edcfdc2dfc"; |  | ||||||
|       sha256 = "06xrxifz5cd98iji7v46zq9xf63zf77sqbr72w1ics3s2hyfkpjz"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/andybalholm/cascadia"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/andybalholm/cascadia"; |  | ||||||
|       rev = "v1.1.0"; |  | ||||||
|       sha256 = "1slh68ysbixc21gbni4msrgq971n59gnn2x3ys196jd413a6qf0f"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/cention-sany/utf7"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/cention-sany/utf7"; |  | ||||||
|       rev = "26cad61bd60a"; |  | ||||||
|       sha256 = "1jy15ryfcln1iwchrksqyrnyfy41gisymm4f9sr1d73ja029bznm"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/certifi/gocertifi"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/certifi/gocertifi"; |  | ||||||
|       rev = "c7c1fbc02894"; |  | ||||||
|       sha256 = "018bsy1vclsdk2kns9f37giabibg3kggk3vpj0yr3dv0k72gzybk"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/chzyer/logex"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/chzyer/logex"; |  | ||||||
|       rev = "v1.1.10"; |  | ||||||
|       sha256 = "08pbjj3wx9acavlwyr055isa8a5hnmllgdv5k6ra60l5y1brmlq4"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/chzyer/test"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/chzyer/test"; |  | ||||||
|       rev = "a1ea475d72b1"; |  | ||||||
|       sha256 = "0rns2aqk22i9xsgyap0pq8wi4cfaxsri4d9q6xxhhyma8jjsnj2k"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/cpuguy83/go-md2man"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/cpuguy83/go-md2man"; |  | ||||||
|       rev = "f79a8a8ca69d"; |  | ||||||
|       sha256 = "0r1f7v475dxxgzqci1mxfliwadcrk86ippflx9n411325l4g3ghv"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/cucumber/godog"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/cucumber/godog"; |  | ||||||
|       rev = "v0.8.1"; |  | ||||||
|       sha256 = "00bplmx3r7mjaxyf1ky1mh9ps17p78656xjpkqf3wkfhchssm3ny"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/danieljoos/wincred"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/danieljoos/wincred"; |  | ||||||
|       rev = "v1.0.2"; |  | ||||||
|       sha256 = "1ym8mygjrf3rw1qka9irw76b2yisr2l5pq2w581s40yldnbfq4lc"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/davecgh/go-spew"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/davecgh/go-spew"; |  | ||||||
|       rev = "v1.1.1"; |  | ||||||
|       sha256 = "0hka6hmyvp701adzag2g26cxdj47g21x6jz4sc6jjz1mn59d474y"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/docker/docker-credential-helpers"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ProtonMail/docker-credential-helpers"; |  | ||||||
|       rev = "0326642117d8"; |  | ||||||
|       sha256 = "02qfw1w6v14kfjlc6slg7hvv2raan5263ivymdn2pjm3hdcgs7lh"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/emersion/go-imap"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ProtonMail/go-imap"; |  | ||||||
|       rev = "0e686f0e855f"; |  | ||||||
|       sha256 = "1gijqy3wq6lbqbrljl4l12w5snji3c9fpvywhk9wyd56mdsy7wyr"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/emersion/go-imap-appendlimit"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/emersion/go-imap-appendlimit"; |  | ||||||
|       rev = "beeb382f2a42"; |  | ||||||
|       sha256 = "089kgnryvignl9z5c3fi5bxyc3jl7jgmz6ykhk73n8nqp8kgi43b"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/emersion/go-imap-idle"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/emersion/go-imap-idle"; |  | ||||||
|       rev = "e03ba1e0ed89"; |  | ||||||
|       sha256 = "0yavndwl9g3q4j97659kq1mpyc22q27vq0lg0f7v704irmbbkanp"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/emersion/go-imap-move"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/emersion/go-imap-move"; |  | ||||||
|       rev = "88aef42b0f1d"; |  | ||||||
|       sha256 = "006l76qxkf7gnb0kc7r9xmxg7nmmwfw8sf5lsg05093rwcg232f4"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/emersion/go-imap-quota"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ProtonMail/go-imap-quota"; |  | ||||||
|       rev = "20f0ba8904de"; |  | ||||||
|       sha256 = "1qvhzsm0wjg0ndk963l9wcmdiyacbrmslhvmg1zhj3k9np41ravv"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/emersion/go-imap-specialuse"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/emersion/go-imap-specialuse"; |  | ||||||
|       rev = "ba031ced6a62"; |  | ||||||
|       sha256 = "0f8rxgr4z5a7nphhz6vnsqgjr04wwrvdcnsxp5rl2lh60yvj3wig"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/emersion/go-imap-unselect"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/emersion/go-imap-unselect"; |  | ||||||
|       rev = "1e6dc73ac8fe"; |  | ||||||
|       sha256 = "0higgjn41ksgsl11zphljbz690i17swzhfkij51dghjnj9q287ff"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/emersion/go-sasl"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/emersion/go-sasl"; |  | ||||||
|       rev = "430746ea8b9b"; |  | ||||||
|       sha256 = "11rhbayr1w3zhpl3q7gd6i15qz97pk0k4xs0n39m91hrgl1fj03c"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/emersion/go-smtp"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ProtonMail/go-smtp"; |  | ||||||
|       rev = "8261df20d309"; |  | ||||||
|       sha256 = "0n6k7xbffzsxfjcc74q21nh8dp5s44v3xh9hrsi7a147n8qm83iq"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/emersion/go-textwrapper"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/emersion/go-textwrapper"; |  | ||||||
|       rev = "d0e65e56babe"; |  | ||||||
|       sha256 = "1nw8qpjjbpkz49wd19yg2qsln1dmdfxi83wp2aa819cv6xxf2y7l"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/emersion/go-vcard"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/emersion/go-vcard"; |  | ||||||
|       rev = "8856043f13c5"; |  | ||||||
|       sha256 = "1dzw5awqbkf2nc09ynmn3zlylj4n1na96rziv5z8p42b1bmbklwk"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/fatih/color"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/fatih/color"; |  | ||||||
|       rev = "v1.9.0"; |  | ||||||
|       sha256 = "086z8ssmr1fn9ba4mqnw7pnccfpys6l5yfhvycv1gdrsk7n27mvs"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/flynn-archive/go-shlex"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/flynn-archive/go-shlex"; |  | ||||||
|       rev = "3f9db97f8568"; |  | ||||||
|       sha256 = "1j743lysygkpa2s2gii2xr32j7bxgc15zv4113b0q9jhn676ysia"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/getsentry/raven-go"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/getsentry/raven-go"; |  | ||||||
|       rev = "v0.2.0"; |  | ||||||
|       sha256 = "0imfwmsb72168fqandf2lxhzhngf2flxhzaar8hcnnfjv2a291lf"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/go-resty/resty"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/go-resty/resty"; |  | ||||||
|       rev = "v2.2.0"; |  | ||||||
|       sha256 = "0khfcq07kq6z2vq0i42an8fd16pl1rc980rlf7c1x4szsf8qcajm"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/go-test/deep"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/go-test/deep"; |  | ||||||
|       rev = "v1.0.2"; |  | ||||||
|       sha256 = "1dax5bbp95lvkns0jjwf6l3rqj5q4xxd37whpqa8nyyjcakdxnqd"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/gogs/chardet"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/gogs/chardet"; |  | ||||||
|       rev = "2404f7772561"; |  | ||||||
|       sha256 = "1dki2pqhnzcmzlqrq4d4jwknnjxm82xqnmizjjdblb6h98ans1cd"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/golang/mock"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/golang/mock"; |  | ||||||
|       rev = "v1.4.3"; |  | ||||||
|       sha256 = "1p37xnja1dgq5ykx24n7wincwz2gahjh71b95p8vpw7ss2g8j8wx"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/google/go-cmp"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/google/go-cmp"; |  | ||||||
|       rev = "v0.4.0"; |  | ||||||
|       sha256 = "1x5pvl3fb5sbyng7i34431xycnhmx8xx94gq2n19g6p0vz68z2v2"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/gopherjs/gopherjs"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/gopherjs/gopherjs"; |  | ||||||
|       rev = "3e4dfb77656c"; |  | ||||||
|       sha256 = "0bmapn4dskpr4a79kcr5irkw19px4a71ls5gspffxiva7sapgyvw"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/hashicorp/errwrap"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/hashicorp/errwrap"; |  | ||||||
|       rev = "v1.0.0"; |  | ||||||
|       sha256 = "0slfb6w3b61xz04r32bi0a1bygc82rjzhqkxj2si2074wynqnr1c"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/hashicorp/go-multierror"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/hashicorp/go-multierror"; |  | ||||||
|       rev = "v1.0.0"; |  | ||||||
|       sha256 = "00nyn8llqzbfm8aflr9kwsvpzi4kv8v45c141v88xskxp5xf6z49"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/jameskeane/bcrypt"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ProtonMail/bcrypt"; |  | ||||||
|       rev = "7509ea014998"; |  | ||||||
|       sha256 = "12xi8i4sb6q4h4wd6w1phqpzxpff5c629ard8cnkjp7qmznvcc20"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/jaytaylor/html2text"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/jaytaylor/html2text"; |  | ||||||
|       rev = "61d9dc4d7195"; |  | ||||||
|       sha256 = "19cn6k8anx8w2ar8kwza6vlijim2xbj4hqxy1m79y0m386b2hapl"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/jhillyerd/enmime"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/jhillyerd/enmime"; |  | ||||||
|       rev = "v0.8.0"; |  | ||||||
|       sha256 = "1wzz3hzf8bnn0wbxznzrfdrs4x7qxdgqpf1xirlsisq8z0r8hn9z"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/kardianos/osext"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/kardianos/osext"; |  | ||||||
|       rev = "2bc1f35cddc0"; |  | ||||||
|       sha256 = "1pvrbrvmrf4mx0fxbfaphbzgqgwn8v6lkfk2vyrs0znxrs1xyc5r"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/keybase/go-keychain"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/keybase/go-keychain"; |  | ||||||
|       rev = "86d4642e4ce2"; |  | ||||||
|       sha256 = "05prxx2bbcqwk5lwk1gdqsrwy256mp4k4im316h9ar3sh42frha6"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/konsorten/go-windows-terminal-sequences"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/konsorten/go-windows-terminal-sequences"; |  | ||||||
|       rev = "v1.0.2"; |  | ||||||
|       sha256 = "09mn209ika7ciy87xf2x31dq5fnqw39jidgaljvmqxwk7ff1hnx7"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/logrusorgru/aurora"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/logrusorgru/aurora"; |  | ||||||
|       rev = "e9ef32dff381"; |  | ||||||
|       sha256 = "19laya9dav84miw3d0c9vgiv577wzrhydv5mdiii59sgbd780hhq"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/mattn/go-colorable"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/mattn/go-colorable"; |  | ||||||
|       rev = "v0.1.4"; |  | ||||||
|       sha256 = "1yxcz08kminqr1221zxpibnbzfcgs3fafin0z9zqb3gqvf74jywz"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/mattn/go-isatty"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/mattn/go-isatty"; |  | ||||||
|       rev = "v0.0.11"; |  | ||||||
|       sha256 = "0h671sv7hfprja495kavazkalkx7xzaqksjh13brcnwq67ijrali"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/mattn/go-runewidth"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/mattn/go-runewidth"; |  | ||||||
|       rev = "v0.0.4"; |  | ||||||
|       sha256 = "00b3ssm7wiqln3k54z2wcnxr3k3c7m1ybyhb9h8ixzbzspld0qzs"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/miekg/dns"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/miekg/dns"; |  | ||||||
|       rev = "v1.1.29"; |  | ||||||
|       sha256 = "1bkk930cg46w1akii60bqqkgy9h9axlcfnqk252r6w8qqpf4z5hh"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/myesui/uuid"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/myesui/uuid"; |  | ||||||
|       rev = "v1.0.0"; |  | ||||||
|       sha256 = "1si8cfjin9dyzprnyvfk8pckbsvg97hzs9hffz91505lpidlb9bc"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/nsf/jsondiff"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/nsf/jsondiff"; |  | ||||||
|       rev = "8443391ee9b6"; |  | ||||||
|       sha256 = "1zxk0mzil5x197zaqjld403f3vvzilgvciq1z62zl1c1vbwbpwch"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/olekukonko/tablewriter"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/olekukonko/tablewriter"; |  | ||||||
|       rev = "v0.0.1"; |  | ||||||
|       sha256 = "0hh95glg7d2md185r03wn52j2r33jc4zil0qvcrs66ka7bdxi7vj"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/pkg/errors"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/pkg/errors"; |  | ||||||
|       rev = "v0.9.1"; |  | ||||||
|       sha256 = "1761pybhc2kqr6v5fm8faj08x9bql8427yqg6vnfv6nhrasx1mwq"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/pmezard/go-difflib"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/pmezard/go-difflib"; |  | ||||||
|       rev = "v1.0.0"; |  | ||||||
|       sha256 = "0c1cn55m4rypmscgf0rrb88pn58j3ysvc2d0432dp3c6fqg6cnzw"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/russross/blackfriday"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/russross/blackfriday"; |  | ||||||
|       rev = "v2.0.1"; |  | ||||||
|       sha256 = "0nlz7isdd4rgnwzs68499hlwicxz34j2k2a0b8jy0y7ycd2bcr5j"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/saintfish/chardet"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/saintfish/chardet"; |  | ||||||
|       rev = "3af4cd4741ca"; |  | ||||||
|       sha256 = "0czh50md64k9lbllayq0asir3174saxb88yzxrh640yhfxd98pcb"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/shurcooL/sanitized_anchor_name"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/shurcooL/sanitized_anchor_name"; |  | ||||||
|       rev = "v1.0.0"; |  | ||||||
|       sha256 = "1gv9p2nr46z80dnfjsklc6zxbgk96349sdsxjz05f3z6wb6m5l8f"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/sirupsen/logrus"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/sirupsen/logrus"; |  | ||||||
|       rev = "v1.4.2"; |  | ||||||
|       sha256 = "087k2lxrr9p9dh68yw71d05h5g9p5v26zbwd6j7lghinjfaw334x"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/skratchdot/open-golang"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/skratchdot/open-golang"; |  | ||||||
|       rev = "eef842397966"; |  | ||||||
|       sha256 = "0n6387csjn024db8wldadsiy8ljz7lk7szl6ls28fcbkax7rw86y"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/ssor/bom"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ssor/bom"; |  | ||||||
|       rev = "6386211fdfcf"; |  | ||||||
|       sha256 = "09g5496ifwqxqclh2iw58plcwcz0sczlnxwqxzwmnl4shdl371ld"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/stretchr/objx"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/stretchr/objx"; |  | ||||||
|       rev = "v0.2.0"; |  | ||||||
|       sha256 = "0pcdvakxgddaiwcdj73ra4da05a3q4cgwbpm2w75ycq4kzv8ij8k"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/stretchr/testify"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/stretchr/testify"; |  | ||||||
|       rev = "v1.5.1"; |  | ||||||
|       sha256 = "09r89m1wy4cjv2nps1ykp00qjpi0531r07q3s34hr7m6njk4srkl"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/therecipe/qt"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/therecipe/qt"; |  | ||||||
|       rev = "5074eb6d8c41"; |  | ||||||
|       sha256 = "1zpil531gjravag76p1032c7wizpskzanymdpc74rs8ixckws9zi"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/twinj/uuid"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/twinj/uuid"; |  | ||||||
|       rev = "v1.0.0"; |  | ||||||
|       sha256 = "1si8cfjin9dyzprnyvfk8pckbsvg97hzs9hffz91505lpidlb9bc"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/urfave/cli"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/urfave/cli"; |  | ||||||
|       rev = "v1.22.3"; |  | ||||||
|       sha256 = "1lz6i6h4mcb4zqclj2lgy34hwpj1bpkxwzkgrqikfsd8pp9wyq9q"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "go.etcd.io/bbolt"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/etcd-io/bbolt"; |  | ||||||
|       rev = "v1.3.3"; |  | ||||||
|       sha256 = "0dn0zngks9xiz0rrrb3911f73ghl64z84jsmzai2yfmzqr7cdkqc"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "golang.org/x/crypto"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/ProtonMail/crypto"; |  | ||||||
|       rev = "d3d8a14a4d4f"; |  | ||||||
|       sha256 = "1w5q5snw1nqsdwqffvk0rlmsqx5b6mpfi45adr2j4lzzpw1ab03a"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "golang.org/x/mod"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://go.googlesource.com/mod"; |  | ||||||
|       rev = "c90efee705ee"; |  | ||||||
|       sha256 = "0i5md645rmcy5z5ij9ng428k9rz4g3k1kjy3blsq1264rn426gdf"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "golang.org/x/net"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://go.googlesource.com/net"; |  | ||||||
|       rev = "244492dfa37a"; |  | ||||||
|       sha256 = "0vm2q44phz4vjnzq9428rjk58c82fxf003whczp7c9ryn9fazh7s"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "golang.org/x/sync"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://go.googlesource.com/sync"; |  | ||||||
|       rev = "112230192c58"; |  | ||||||
|       sha256 = "05i2k43j2d0llq768hg5pf3hb2yhfzp9la1w5wp0rsnnzblr0lfn"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "golang.org/x/sys"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://go.googlesource.com/sys"; |  | ||||||
|       rev = "33540a1f6037"; |  | ||||||
|       sha256 = "0fjcv0vzvi6za0b4xmnk3932pr9f9gczzf03y0kgq3ry9rqg169y"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "golang.org/x/text"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://go.googlesource.com/text"; |  | ||||||
|       rev = "v0.3.2"; |  | ||||||
|       sha256 = "0flv9idw0jm5nm8lx25xqanbkqgfiym6619w575p7nrdh0riqwqh"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "golang.org/x/tools"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://go.googlesource.com/tools"; |  | ||||||
|       rev = "49a3e744a425"; |  | ||||||
|       sha256 = "0xx4gv9wpv36crk7gv7imf5vzzs2mz7zla2q2jkck3xnzff8fw3v"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "golang.org/x/xerrors"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://go.googlesource.com/xerrors"; |  | ||||||
|       rev = "9bdfabe68543"; |  | ||||||
|       sha256 = "1yjfi1bk9xb81lqn85nnm13zz725wazvrx3b50hx19qmwg7a4b0c"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "gopkg.in/check.v1"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://gopkg.in/check.v1"; |  | ||||||
|       rev = "20d25e280405"; |  | ||||||
|       sha256 = "0k1m83ji9l1a7ng8a7v40psbymxasmssbrrhpdv2wl4rhs0nc3np"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "gopkg.in/stretchr/testify.v1"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://gopkg.in/stretchr/testify.v1"; |  | ||||||
|       rev = "v1.2.2"; |  | ||||||
|       sha256 = "0dlszlshlxbmmfxj5hlwgv3r22x0y1af45gn1vd198nvvs3pnvfs"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "gopkg.in/yaml.v2"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://gopkg.in/yaml.v2"; |  | ||||||
|       rev = "v2.2.2"; |  | ||||||
|       sha256 = "01wj12jzsdqlnidpyjssmj0r4yavlqy7dwrg7adqd8dicjc4ncsa"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "rsc.io/quote"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/rsc/quote"; |  | ||||||
|       rev = "v3.1.0"; |  | ||||||
|       sha256 = "0nvv97hwwrl1mx5gzsbdm1ndnwpg3m7i2jb10ig9wily7zmvki0i"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "rsc.io/sampler"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/rsc/sampler"; |  | ||||||
|       rev = "v1.3.0"; |  | ||||||
|       sha256 = "0byxk2ynba50py805kcvbvjzh59l1r308i1xgyzpw6lff4xx9xjh"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
| ] |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| {}: |  | ||||||
|  |  | ||||||
| { |  | ||||||
|   pname = "protonmail-bridge-headless"; |  | ||||||
|  |  | ||||||
|   tags = [ "pmapi_prod" "nogui" ]; |  | ||||||
|  |  | ||||||
|   # REVIEW: Some issue with IMAP tests that probably fail due to network |  | ||||||
|   # sandboxing. |  | ||||||
|   doCheck = false; |  | ||||||
|  |  | ||||||
|   # Fix up name. |  | ||||||
|   postInstall = '' |  | ||||||
|     mv $out/bin/Desktop-Bridge $out/bin/protonmail-bridge |  | ||||||
|     mv $out/bin/Import-Export $out/bin/protonmail-import-export |  | ||||||
|   ''; |  | ||||||
| } |  | ||||||
| @@ -1,55 +0,0 @@ | |||||||
| { stdenv |  | ||||||
| , lib |  | ||||||
| , fetchFromGitHub |  | ||||||
|  |  | ||||||
| , alacritty |  | ||||||
|  |  | ||||||
| , fontconfig |  | ||||||
| , freetype |  | ||||||
| , libglvnd |  | ||||||
| , libxcb |  | ||||||
| }: |  | ||||||
|  |  | ||||||
| alacritty.overrideAttrs (oldAttrs: rec { |  | ||||||
|   pname = "${oldAttrs.pname}-ligatures"; |  | ||||||
|   version = "0.7.2.20210209.g3ed0430"; |  | ||||||
|  |  | ||||||
|   src = fetchFromGitHub { |  | ||||||
|     owner = "zenixls2"; |  | ||||||
|     repo = "alacritty"; |  | ||||||
|     fetchSubmodules = true; |  | ||||||
|     rev = "3ed043046fc74f288d4c8fa7e4463dc201213500"; |  | ||||||
|     sha256 = "1dGk4ORzMSUQhuKSt5Yo7rOJCJ5/folwPX2tLiu0suA="; |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
|   cargoDeps = oldAttrs.cargoDeps.overrideAttrs (lib.const { |  | ||||||
|     name = "${pname}-${version}-vendor.tar.gz"; |  | ||||||
|     inherit src; |  | ||||||
|     outputSha256 = "pONu6caJmEKnbr7j+o9AyrYNpS4Q8OEjNZOhGTalncc="; |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   ligatureInputs = [ |  | ||||||
|     fontconfig |  | ||||||
|     freetype |  | ||||||
|     libglvnd |  | ||||||
|     stdenv.cc.cc.lib |  | ||||||
|     libxcb |  | ||||||
|   ]; |  | ||||||
|  |  | ||||||
|   preferLocalBuild = true; |  | ||||||
|  |  | ||||||
|   buildInputs = (oldAttrs.buildInputs or [ ]) ++ ligatureInputs; |  | ||||||
|  |  | ||||||
|   # HACK: One of the ligature libraries required the C++ stdlib at runtime, |  | ||||||
|   # and I can't work out a better way to push it to the RPATH. |  | ||||||
|   postInstall = lib.optional (!stdenv.isDarwin) '' |  | ||||||
|     patchelf \ |  | ||||||
|       --set-rpath ${lib.makeLibraryPath ligatureInputs}:"$(patchelf --print-rpath $out/bin/alacritty)" \ |  | ||||||
|       $out/bin/alacritty |  | ||||||
|   ''; |  | ||||||
|  |  | ||||||
|   meta = oldAttrs.meta // { |  | ||||||
|     description = "Alacritty with ligature patch applied"; |  | ||||||
|     homepage = "https://github.com/zenixls2/alacritty/tree/ligature"; |  | ||||||
|   }; |  | ||||||
| }) |  | ||||||
| @@ -20,6 +20,8 @@ python3Packages.buildPythonApplication rec { | |||||||
|     pyyaml |     pyyaml | ||||||
|   ]; |   ]; | ||||||
|  |  | ||||||
|  |   format = "setuptools"; | ||||||
|  |  | ||||||
|   patchPhase = '' |   patchPhase = '' | ||||||
|     substituteInPlace setup.py \ |     substituteInPlace setup.py \ | ||||||
|       --replace PROJECTVERSION "${version}" |       --replace PROJECTVERSION "${version}" | ||||||
|   | |||||||
| @@ -1,46 +0,0 @@ | |||||||
| { stdenv |  | ||||||
| , lib |  | ||||||
| , fetchurl |  | ||||||
| , makeWrapper |  | ||||||
| , jdk17 |  | ||||||
| , udev |  | ||||||
| , xorg |  | ||||||
| }: |  | ||||||
|  |  | ||||||
| stdenv.mkDerivation rec { |  | ||||||
|   pname = "atlauncher"; |  | ||||||
|   version = "3.4.34.0"; |  | ||||||
|  |  | ||||||
|   src = fetchurl { |  | ||||||
|     url = "https://github.com/ATLauncher/ATLauncher/releases/download/v${version}/ATLauncher-${version}.jar"; |  | ||||||
|     hash = "sha256-gHUYZaxADchikoCmAfqFjVbMYhhiwg2BZKctmww1Mlw="; |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
|   dontUnpack = true; |  | ||||||
|  |  | ||||||
|   nativeBuildInputs = [ makeWrapper ]; |  | ||||||
|  |  | ||||||
|   installPhase = '' |  | ||||||
|     mkdir -p $out/bin $out/share/java |  | ||||||
|     cp $src $out/share/java/ATLauncher.jar |  | ||||||
|     makeWrapper ${jdk17}/bin/java $out/bin/atlauncher \ |  | ||||||
|       --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ xorg.libXxf86vm udev ]}" \ |  | ||||||
|       --add-flags "-jar $out/share/java/ATLauncher.jar" \ |  | ||||||
|       --add-flags "--working-dir \''${XDG_DATA_HOME:-\$HOME/.local/share}/ATLauncher" \ |  | ||||||
|       --add-flags "--no-launcher-update" |  | ||||||
|   ''; |  | ||||||
|  |  | ||||||
|   meta = { |  | ||||||
|     description = "Minecraft launcher"; |  | ||||||
|     longDescription = '' |  | ||||||
|       ATLauncher is a Launcher for Minecraft which integrates multiple different |  | ||||||
|       ModPacks to allow you to download and install ModPacks easily and quickly. |  | ||||||
|     ''; |  | ||||||
|     sourceProvenance = [ |  | ||||||
|       (lib.sourceTypes.binaryBytecode or { shortName = "binaryBytecode"; isSource = false; }) |  | ||||||
|     ]; |  | ||||||
|     license = lib.licenses.gpl3Only; |  | ||||||
|     platforms = lib.platforms.all; |  | ||||||
|     homepage = "https://atlauncher.com/"; |  | ||||||
|   }; |  | ||||||
| } |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| # This file has been generated by node2nix 1.11.1. Do not edit! |  | ||||||
|  |  | ||||||
| {pkgs ? import <nixpkgs> { |  | ||||||
|     inherit system; |  | ||||||
|   }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs_18"}: |  | ||||||
|  |  | ||||||
| let |  | ||||||
|   nodeEnv = import ./node-env.nix { |  | ||||||
|     inherit (pkgs) stdenv lib python2 runCommand writeTextFile writeShellScript; |  | ||||||
|     inherit pkgs nodejs; |  | ||||||
|     libtool = if pkgs.stdenv.isDarwin then pkgs.darwin.cctools else null; |  | ||||||
|   }; |  | ||||||
| in |  | ||||||
| import ./packages.nix { |  | ||||||
|   inherit (pkgs) fetchurl nix-gitignore stdenv lib fetchgit; |  | ||||||
|   inherit nodeEnv; |  | ||||||
| } |  | ||||||
| @@ -1,21 +0,0 @@ | |||||||
| { pkgs |  | ||||||
| , stdenv |  | ||||||
| , src |  | ||||||
| , version |  | ||||||
| }: |  | ||||||
|  |  | ||||||
| let |  | ||||||
|   nodeComposition = import ./composition.nix { |  | ||||||
|     inherit pkgs; |  | ||||||
|     inherit (stdenv.hostPlatform) system; |  | ||||||
|   }; |  | ||||||
| in |  | ||||||
| nodeComposition.package.override { |  | ||||||
|   pname = "betanin"; |  | ||||||
|   inherit version; |  | ||||||
|   src = "${src}/betanin_client"; |  | ||||||
|  |  | ||||||
|   postInstall = '' |  | ||||||
|     PRODUCTION=true npm run-script build |  | ||||||
|   ''; |  | ||||||
| } |  | ||||||
| @@ -1,29 +0,0 @@ | |||||||
| #!/usr/bin/env bash |  | ||||||
|  |  | ||||||
| # Requires node2nix and jq |  | ||||||
|  |  | ||||||
| cd "$(dirname "$0")" || exit 1 |  | ||||||
|  |  | ||||||
| set -euo pipefail |  | ||||||
|  |  | ||||||
| nix build ..#betanin.src 2>/dev/null |  | ||||||
|  |  | ||||||
| tempDir=$(mktemp -d) |  | ||||||
| cp result/betanin_client/package.json "$tempDir/" |  | ||||||
| cp result/betanin_client/package-lock.json "$tempDir/" |  | ||||||
| pushd "$tempDir" |  | ||||||
|  |  | ||||||
| node2nix \ |  | ||||||
|     --input package.json \ |  | ||||||
|     --lock package-lock.json \ |  | ||||||
|     --output packages.nix \ |  | ||||||
|     --composition composition.nix \ |  | ||||||
|     --strip-optional-dependencies \ |  | ||||||
|     --development \ |  | ||||||
|     --nodejs-18 |  | ||||||
|  |  | ||||||
| popd |  | ||||||
| cp "$tempDir"/*.nix . |  | ||||||
|  |  | ||||||
| rm result |  | ||||||
| rm -rf "$tempDir" |  | ||||||
| @@ -1,689 +0,0 @@ | |||||||
| # This file originates from node2nix |  | ||||||
|  |  | ||||||
| {lib, stdenv, nodejs, python2, pkgs, libtool, runCommand, writeTextFile, writeShellScript}: |  | ||||||
|  |  | ||||||
| let |  | ||||||
|   # Workaround to cope with utillinux in Nixpkgs 20.09 and util-linux in Nixpkgs master |  | ||||||
|   utillinux = if pkgs ? utillinux then pkgs.utillinux else pkgs.util-linux; |  | ||||||
|  |  | ||||||
|   python = if nodejs ? python then nodejs.python else python2; |  | ||||||
|  |  | ||||||
|   # Create a tar wrapper that filters all the 'Ignoring unknown extended header keyword' noise |  | ||||||
|   tarWrapper = runCommand "tarWrapper" {} '' |  | ||||||
|     mkdir -p $out/bin |  | ||||||
|  |  | ||||||
|     cat > $out/bin/tar <<EOF |  | ||||||
|     #! ${stdenv.shell} -e |  | ||||||
|     $(type -p tar) "\$@" --warning=no-unknown-keyword --delay-directory-restore |  | ||||||
|     EOF |  | ||||||
|  |  | ||||||
|     chmod +x $out/bin/tar |  | ||||||
|   ''; |  | ||||||
|  |  | ||||||
|   # Function that generates a TGZ file from a NPM project |  | ||||||
|   buildNodeSourceDist = |  | ||||||
|     { name, version, src, ... }: |  | ||||||
|  |  | ||||||
|     stdenv.mkDerivation { |  | ||||||
|       name = "node-tarball-${name}-${version}"; |  | ||||||
|       inherit src; |  | ||||||
|       buildInputs = [ nodejs ]; |  | ||||||
|       buildPhase = '' |  | ||||||
|         export HOME=$TMPDIR |  | ||||||
|         tgzFile=$(npm pack | tail -n 1) # Hooks to the pack command will add output (https://docs.npmjs.com/misc/scripts) |  | ||||||
|       ''; |  | ||||||
|       installPhase = '' |  | ||||||
|         mkdir -p $out/tarballs |  | ||||||
|         mv $tgzFile $out/tarballs |  | ||||||
|         mkdir -p $out/nix-support |  | ||||||
|         echo "file source-dist $out/tarballs/$tgzFile" >> $out/nix-support/hydra-build-products |  | ||||||
|       ''; |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|   # Common shell logic |  | ||||||
|   installPackage = writeShellScript "install-package" '' |  | ||||||
|     installPackage() { |  | ||||||
|       local packageName=$1 src=$2 |  | ||||||
|  |  | ||||||
|       local strippedName |  | ||||||
|  |  | ||||||
|       local DIR=$PWD |  | ||||||
|       cd $TMPDIR |  | ||||||
|  |  | ||||||
|       unpackFile $src |  | ||||||
|  |  | ||||||
|       # Make the base dir in which the target dependency resides first |  | ||||||
|       mkdir -p "$(dirname "$DIR/$packageName")" |  | ||||||
|  |  | ||||||
|       if [ -f "$src" ] |  | ||||||
|       then |  | ||||||
|           # Figure out what directory has been unpacked |  | ||||||
|           packageDir="$(find . -maxdepth 1 -type d | tail -1)" |  | ||||||
|  |  | ||||||
|           # Restore write permissions to make building work |  | ||||||
|           find "$packageDir" -type d -exec chmod u+x {} \; |  | ||||||
|           chmod -R u+w "$packageDir" |  | ||||||
|  |  | ||||||
|           # Move the extracted tarball into the output folder |  | ||||||
|           mv "$packageDir" "$DIR/$packageName" |  | ||||||
|       elif [ -d "$src" ] |  | ||||||
|       then |  | ||||||
|           # Get a stripped name (without hash) of the source directory. |  | ||||||
|           # On old nixpkgs it's already set internally. |  | ||||||
|           if [ -z "$strippedName" ] |  | ||||||
|           then |  | ||||||
|               strippedName="$(stripHash $src)" |  | ||||||
|           fi |  | ||||||
|  |  | ||||||
|           # Restore write permissions to make building work |  | ||||||
|           chmod -R u+w "$strippedName" |  | ||||||
|  |  | ||||||
|           # Move the extracted directory into the output folder |  | ||||||
|           mv "$strippedName" "$DIR/$packageName" |  | ||||||
|       fi |  | ||||||
|  |  | ||||||
|       # Change to the package directory to install dependencies |  | ||||||
|       cd "$DIR/$packageName" |  | ||||||
|     } |  | ||||||
|   ''; |  | ||||||
|  |  | ||||||
|   # Bundle the dependencies of the package |  | ||||||
|   # |  | ||||||
|   # Only include dependencies if they don't exist. They may also be bundled in the package. |  | ||||||
|   includeDependencies = {dependencies}: |  | ||||||
|     lib.optionalString (dependencies != []) ( |  | ||||||
|       '' |  | ||||||
|         mkdir -p node_modules |  | ||||||
|         cd node_modules |  | ||||||
|       '' |  | ||||||
|       + (lib.concatMapStrings (dependency: |  | ||||||
|         '' |  | ||||||
|           if [ ! -e "${dependency.packageName}" ]; then |  | ||||||
|               ${composePackage dependency} |  | ||||||
|           fi |  | ||||||
|         '' |  | ||||||
|       ) dependencies) |  | ||||||
|       + '' |  | ||||||
|         cd .. |  | ||||||
|       '' |  | ||||||
|     ); |  | ||||||
|  |  | ||||||
|   # Recursively composes the dependencies of a package |  | ||||||
|   composePackage = { name, packageName, src, dependencies ? [], ... }@args: |  | ||||||
|     builtins.addErrorContext "while evaluating node package '${packageName}'" '' |  | ||||||
|       installPackage "${packageName}" "${src}" |  | ||||||
|       ${includeDependencies { inherit dependencies; }} |  | ||||||
|       cd .. |  | ||||||
|       ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} |  | ||||||
|     ''; |  | ||||||
|  |  | ||||||
|   pinpointDependencies = {dependencies, production}: |  | ||||||
|     let |  | ||||||
|       pinpointDependenciesFromPackageJSON = writeTextFile { |  | ||||||
|         name = "pinpointDependencies.js"; |  | ||||||
|         text = '' |  | ||||||
|           var fs = require('fs'); |  | ||||||
|           var path = require('path'); |  | ||||||
|  |  | ||||||
|           function resolveDependencyVersion(location, name) { |  | ||||||
|               if(location == process.env['NIX_STORE']) { |  | ||||||
|                   return null; |  | ||||||
|               } else { |  | ||||||
|                   var dependencyPackageJSON = path.join(location, "node_modules", name, "package.json"); |  | ||||||
|  |  | ||||||
|                   if(fs.existsSync(dependencyPackageJSON)) { |  | ||||||
|                       var dependencyPackageObj = JSON.parse(fs.readFileSync(dependencyPackageJSON)); |  | ||||||
|  |  | ||||||
|                       if(dependencyPackageObj.name == name) { |  | ||||||
|                           return dependencyPackageObj.version; |  | ||||||
|                       } |  | ||||||
|                   } else { |  | ||||||
|                       return resolveDependencyVersion(path.resolve(location, ".."), name); |  | ||||||
|                   } |  | ||||||
|               } |  | ||||||
|           } |  | ||||||
|  |  | ||||||
|           function replaceDependencies(dependencies) { |  | ||||||
|               if(typeof dependencies == "object" && dependencies !== null) { |  | ||||||
|                   for(var dependency in dependencies) { |  | ||||||
|                       var resolvedVersion = resolveDependencyVersion(process.cwd(), dependency); |  | ||||||
|  |  | ||||||
|                       if(resolvedVersion === null) { |  | ||||||
|                           process.stderr.write("WARNING: cannot pinpoint dependency: "+dependency+", context: "+process.cwd()+"\n"); |  | ||||||
|                       } else { |  | ||||||
|                           dependencies[dependency] = resolvedVersion; |  | ||||||
|                       } |  | ||||||
|                   } |  | ||||||
|               } |  | ||||||
|           } |  | ||||||
|  |  | ||||||
|           /* Read the package.json configuration */ |  | ||||||
|           var packageObj = JSON.parse(fs.readFileSync('./package.json')); |  | ||||||
|  |  | ||||||
|           /* Pinpoint all dependencies */ |  | ||||||
|           replaceDependencies(packageObj.dependencies); |  | ||||||
|           if(process.argv[2] == "development") { |  | ||||||
|               replaceDependencies(packageObj.devDependencies); |  | ||||||
|           } |  | ||||||
|           else { |  | ||||||
|               packageObj.devDependencies = {}; |  | ||||||
|           } |  | ||||||
|           replaceDependencies(packageObj.optionalDependencies); |  | ||||||
|           replaceDependencies(packageObj.peerDependencies); |  | ||||||
|  |  | ||||||
|           /* Write the fixed package.json file */ |  | ||||||
|           fs.writeFileSync("package.json", JSON.stringify(packageObj, null, 2)); |  | ||||||
|         ''; |  | ||||||
|       }; |  | ||||||
|     in |  | ||||||
|     '' |  | ||||||
|       node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"} |  | ||||||
|  |  | ||||||
|       ${lib.optionalString (dependencies != []) |  | ||||||
|         '' |  | ||||||
|           if [ -d node_modules ] |  | ||||||
|           then |  | ||||||
|               cd node_modules |  | ||||||
|               ${lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies} |  | ||||||
|               cd .. |  | ||||||
|           fi |  | ||||||
|         ''} |  | ||||||
|     ''; |  | ||||||
|  |  | ||||||
|   # Recursively traverses all dependencies of a package and pinpoints all |  | ||||||
|   # dependencies in the package.json file to the versions that are actually |  | ||||||
|   # being used. |  | ||||||
|  |  | ||||||
|   pinpointDependenciesOfPackage = { packageName, dependencies ? [], production ? true, ... }@args: |  | ||||||
|     '' |  | ||||||
|       if [ -d "${packageName}" ] |  | ||||||
|       then |  | ||||||
|           cd "${packageName}" |  | ||||||
|           ${pinpointDependencies { inherit dependencies production; }} |  | ||||||
|           cd .. |  | ||||||
|           ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} |  | ||||||
|       fi |  | ||||||
|     ''; |  | ||||||
|  |  | ||||||
|   # Extract the Node.js source code which is used to compile packages with |  | ||||||
|   # native bindings |  | ||||||
|   nodeSources = runCommand "node-sources" {} '' |  | ||||||
|     tar --no-same-owner --no-same-permissions -xf ${nodejs.src} |  | ||||||
|     mv node-* $out |  | ||||||
|   ''; |  | ||||||
|  |  | ||||||
|   # Script that adds _integrity fields to all package.json files to prevent NPM from consulting the cache (that is empty) |  | ||||||
|   addIntegrityFieldsScript = writeTextFile { |  | ||||||
|     name = "addintegrityfields.js"; |  | ||||||
|     text = '' |  | ||||||
|       var fs = require('fs'); |  | ||||||
|       var path = require('path'); |  | ||||||
|  |  | ||||||
|       function augmentDependencies(baseDir, dependencies) { |  | ||||||
|           for(var dependencyName in dependencies) { |  | ||||||
|               var dependency = dependencies[dependencyName]; |  | ||||||
|  |  | ||||||
|               // Open package.json and augment metadata fields |  | ||||||
|               var packageJSONDir = path.join(baseDir, "node_modules", dependencyName); |  | ||||||
|               var packageJSONPath = path.join(packageJSONDir, "package.json"); |  | ||||||
|  |  | ||||||
|               if(fs.existsSync(packageJSONPath)) { // Only augment packages that exist. Sometimes we may have production installs in which development dependencies can be ignored |  | ||||||
|                   console.log("Adding metadata fields to: "+packageJSONPath); |  | ||||||
|                   var packageObj = JSON.parse(fs.readFileSync(packageJSONPath)); |  | ||||||
|  |  | ||||||
|                   if(dependency.integrity) { |  | ||||||
|                       packageObj["_integrity"] = dependency.integrity; |  | ||||||
|                   } else { |  | ||||||
|                       packageObj["_integrity"] = "sha1-000000000000000000000000000="; // When no _integrity string has been provided (e.g. by Git dependencies), add a dummy one. It does not seem to harm and it bypasses downloads. |  | ||||||
|                   } |  | ||||||
|  |  | ||||||
|                   if(dependency.resolved) { |  | ||||||
|                       packageObj["_resolved"] = dependency.resolved; // Adopt the resolved property if one has been provided |  | ||||||
|                   } else { |  | ||||||
|                       packageObj["_resolved"] = dependency.version; // Set the resolved version to the version identifier. This prevents NPM from cloning Git repositories. |  | ||||||
|                   } |  | ||||||
|  |  | ||||||
|                   if(dependency.from !== undefined) { // Adopt from property if one has been provided |  | ||||||
|                       packageObj["_from"] = dependency.from; |  | ||||||
|                   } |  | ||||||
|  |  | ||||||
|                   fs.writeFileSync(packageJSONPath, JSON.stringify(packageObj, null, 2)); |  | ||||||
|               } |  | ||||||
|  |  | ||||||
|               // Augment transitive dependencies |  | ||||||
|               if(dependency.dependencies !== undefined) { |  | ||||||
|                   augmentDependencies(packageJSONDir, dependency.dependencies); |  | ||||||
|               } |  | ||||||
|           } |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       if(fs.existsSync("./package-lock.json")) { |  | ||||||
|           var packageLock = JSON.parse(fs.readFileSync("./package-lock.json")); |  | ||||||
|  |  | ||||||
|           if(![1, 2].includes(packageLock.lockfileVersion)) { |  | ||||||
|             process.stderr.write("Sorry, I only understand lock file versions 1 and 2!\n"); |  | ||||||
|             process.exit(1); |  | ||||||
|           } |  | ||||||
|  |  | ||||||
|           if(packageLock.dependencies !== undefined) { |  | ||||||
|               augmentDependencies(".", packageLock.dependencies); |  | ||||||
|           } |  | ||||||
|       } |  | ||||||
|     ''; |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
|   # Reconstructs a package-lock file from the node_modules/ folder structure and package.json files with dummy sha1 hashes |  | ||||||
|   reconstructPackageLock = writeTextFile { |  | ||||||
|     name = "reconstructpackagelock.js"; |  | ||||||
|     text = '' |  | ||||||
|       var fs = require('fs'); |  | ||||||
|       var path = require('path'); |  | ||||||
|  |  | ||||||
|       var packageObj = JSON.parse(fs.readFileSync("package.json")); |  | ||||||
|  |  | ||||||
|       var lockObj = { |  | ||||||
|           name: packageObj.name, |  | ||||||
|           version: packageObj.version, |  | ||||||
|           lockfileVersion: 2, |  | ||||||
|           requires: true, |  | ||||||
|           packages: { |  | ||||||
|               "": { |  | ||||||
|                   name: packageObj.name, |  | ||||||
|                   version: packageObj.version, |  | ||||||
|                   license: packageObj.license, |  | ||||||
|                   bin: packageObj.bin, |  | ||||||
|                   dependencies: packageObj.dependencies, |  | ||||||
|                   engines: packageObj.engines, |  | ||||||
|                   optionalDependencies: packageObj.optionalDependencies |  | ||||||
|               } |  | ||||||
|           }, |  | ||||||
|           dependencies: {} |  | ||||||
|       }; |  | ||||||
|  |  | ||||||
|       function augmentPackageJSON(filePath, packages, dependencies) { |  | ||||||
|           var packageJSON = path.join(filePath, "package.json"); |  | ||||||
|           if(fs.existsSync(packageJSON)) { |  | ||||||
|               var packageObj = JSON.parse(fs.readFileSync(packageJSON)); |  | ||||||
|               packages[filePath] = { |  | ||||||
|                   version: packageObj.version, |  | ||||||
|                   integrity: "sha1-000000000000000000000000000=", |  | ||||||
|                   dependencies: packageObj.dependencies, |  | ||||||
|                   engines: packageObj.engines, |  | ||||||
|                   optionalDependencies: packageObj.optionalDependencies |  | ||||||
|               }; |  | ||||||
|               dependencies[packageObj.name] = { |  | ||||||
|                   version: packageObj.version, |  | ||||||
|                   integrity: "sha1-000000000000000000000000000=", |  | ||||||
|                   dependencies: {} |  | ||||||
|               }; |  | ||||||
|               processDependencies(path.join(filePath, "node_modules"), packages, dependencies[packageObj.name].dependencies); |  | ||||||
|           } |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       function processDependencies(dir, packages, dependencies) { |  | ||||||
|           if(fs.existsSync(dir)) { |  | ||||||
|               var files = fs.readdirSync(dir); |  | ||||||
|  |  | ||||||
|               files.forEach(function(entry) { |  | ||||||
|                   var filePath = path.join(dir, entry); |  | ||||||
|                   var stats = fs.statSync(filePath); |  | ||||||
|  |  | ||||||
|                   if(stats.isDirectory()) { |  | ||||||
|                       if(entry.substr(0, 1) == "@") { |  | ||||||
|                           // When we encounter a namespace folder, augment all packages belonging to the scope |  | ||||||
|                           var pkgFiles = fs.readdirSync(filePath); |  | ||||||
|  |  | ||||||
|                           pkgFiles.forEach(function(entry) { |  | ||||||
|                               if(stats.isDirectory()) { |  | ||||||
|                                   var pkgFilePath = path.join(filePath, entry); |  | ||||||
|                                   augmentPackageJSON(pkgFilePath, packages, dependencies); |  | ||||||
|                               } |  | ||||||
|                           }); |  | ||||||
|                       } else { |  | ||||||
|                           augmentPackageJSON(filePath, packages, dependencies); |  | ||||||
|                       } |  | ||||||
|                   } |  | ||||||
|               }); |  | ||||||
|           } |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       processDependencies("node_modules", lockObj.packages, lockObj.dependencies); |  | ||||||
|  |  | ||||||
|       fs.writeFileSync("package-lock.json", JSON.stringify(lockObj, null, 2)); |  | ||||||
|     ''; |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
|   # Script that links bins defined in package.json to the node_modules bin directory |  | ||||||
|   # NPM does not do this for top-level packages itself anymore as of v7 |  | ||||||
|   linkBinsScript = writeTextFile { |  | ||||||
|     name = "linkbins.js"; |  | ||||||
|     text = '' |  | ||||||
|       var fs = require('fs'); |  | ||||||
|       var path = require('path'); |  | ||||||
|  |  | ||||||
|       var packageObj = JSON.parse(fs.readFileSync("package.json")); |  | ||||||
|  |  | ||||||
|       var nodeModules = Array(packageObj.name.split("/").length).fill("..").join(path.sep); |  | ||||||
|  |  | ||||||
|       if(packageObj.bin !== undefined) { |  | ||||||
|           fs.mkdirSync(path.join(nodeModules, ".bin")) |  | ||||||
|  |  | ||||||
|           if(typeof packageObj.bin == "object") { |  | ||||||
|               Object.keys(packageObj.bin).forEach(function(exe) { |  | ||||||
|                   if(fs.existsSync(packageObj.bin[exe])) { |  | ||||||
|                       console.log("linking bin '" + exe + "'"); |  | ||||||
|                       fs.symlinkSync( |  | ||||||
|                           path.join("..", packageObj.name, packageObj.bin[exe]), |  | ||||||
|                           path.join(nodeModules, ".bin", exe) |  | ||||||
|                       ); |  | ||||||
|                   } |  | ||||||
|                   else { |  | ||||||
|                       console.log("skipping non-existent bin '" + exe + "'"); |  | ||||||
|                   } |  | ||||||
|               }) |  | ||||||
|           } |  | ||||||
|           else { |  | ||||||
|               if(fs.existsSync(packageObj.bin)) { |  | ||||||
|                   console.log("linking bin '" + packageObj.bin + "'"); |  | ||||||
|                   fs.symlinkSync( |  | ||||||
|                       path.join("..", packageObj.name, packageObj.bin), |  | ||||||
|                       path.join(nodeModules, ".bin", packageObj.name.split("/").pop()) |  | ||||||
|                   ); |  | ||||||
|               } |  | ||||||
|               else { |  | ||||||
|                   console.log("skipping non-existent bin '" + packageObj.bin + "'"); |  | ||||||
|               } |  | ||||||
|           } |  | ||||||
|       } |  | ||||||
|       else if(packageObj.directories !== undefined && packageObj.directories.bin !== undefined) { |  | ||||||
|           fs.mkdirSync(path.join(nodeModules, ".bin")) |  | ||||||
|  |  | ||||||
|           fs.readdirSync(packageObj.directories.bin).forEach(function(exe) { |  | ||||||
|               if(fs.existsSync(path.join(packageObj.directories.bin, exe))) { |  | ||||||
|                   console.log("linking bin '" + exe + "'"); |  | ||||||
|                   fs.symlinkSync( |  | ||||||
|                       path.join("..", packageObj.name, packageObj.directories.bin, exe), |  | ||||||
|                       path.join(nodeModules, ".bin", exe) |  | ||||||
|                   ); |  | ||||||
|               } |  | ||||||
|               else { |  | ||||||
|                   console.log("skipping non-existent bin '" + exe + "'"); |  | ||||||
|               } |  | ||||||
|           }) |  | ||||||
|       } |  | ||||||
|     ''; |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
|   prepareAndInvokeNPM = {packageName, bypassCache, reconstructLock, npmFlags, production}: |  | ||||||
|     let |  | ||||||
|       forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com"; |  | ||||||
|     in |  | ||||||
|     '' |  | ||||||
|         # Pinpoint the versions of all dependencies to the ones that are actually being used |  | ||||||
|         echo "pinpointing versions of dependencies..." |  | ||||||
|         source $pinpointDependenciesScriptPath |  | ||||||
|  |  | ||||||
|         # Patch the shebangs of the bundled modules to prevent them from |  | ||||||
|         # calling executables outside the Nix store as much as possible |  | ||||||
|         patchShebangs . |  | ||||||
|  |  | ||||||
|         # Deploy the Node.js package by running npm install. Since the |  | ||||||
|         # dependencies have been provided already by ourselves, it should not |  | ||||||
|         # attempt to install them again, which is good, because we want to make |  | ||||||
|         # it Nix's responsibility. If it needs to install any dependencies |  | ||||||
|         # anyway (e.g. because the dependency parameters are |  | ||||||
|         # incomplete/incorrect), it fails. |  | ||||||
|         # |  | ||||||
|         # The other responsibilities of NPM are kept -- version checks, build |  | ||||||
|         # steps, postprocessing etc. |  | ||||||
|  |  | ||||||
|         export HOME=$TMPDIR |  | ||||||
|         cd "${packageName}" |  | ||||||
|         runHook preRebuild |  | ||||||
|  |  | ||||||
|         ${lib.optionalString bypassCache '' |  | ||||||
|           ${lib.optionalString reconstructLock '' |  | ||||||
|             if [ -f package-lock.json ] |  | ||||||
|             then |  | ||||||
|                 echo "WARNING: Reconstruct lock option enabled, but a lock file already exists!" |  | ||||||
|                 echo "This will most likely result in version mismatches! We will remove the lock file and regenerate it!" |  | ||||||
|                 rm package-lock.json |  | ||||||
|             else |  | ||||||
|                 echo "No package-lock.json file found, reconstructing..." |  | ||||||
|             fi |  | ||||||
|  |  | ||||||
|             node ${reconstructPackageLock} |  | ||||||
|           ''} |  | ||||||
|  |  | ||||||
|           node ${addIntegrityFieldsScript} |  | ||||||
|         ''} |  | ||||||
|  |  | ||||||
|         npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} rebuild |  | ||||||
|  |  | ||||||
|         runHook postRebuild |  | ||||||
|  |  | ||||||
|         if [ "''${dontNpmInstall-}" != "1" ] |  | ||||||
|         then |  | ||||||
|             # NPM tries to download packages even when they already exist if npm-shrinkwrap is used. |  | ||||||
|             rm -f npm-shrinkwrap.json |  | ||||||
|  |  | ||||||
|             npm ${forceOfflineFlag} --nodedir=${nodeSources} --no-bin-links --ignore-scripts ${npmFlags} ${lib.optionalString production "--production"} install |  | ||||||
|         fi |  | ||||||
|  |  | ||||||
|         # Link executables defined in package.json |  | ||||||
|         node ${linkBinsScript} |  | ||||||
|     ''; |  | ||||||
|  |  | ||||||
|   # Builds and composes an NPM package including all its dependencies |  | ||||||
|   buildNodePackage = |  | ||||||
|     { name |  | ||||||
|     , packageName |  | ||||||
|     , version ? null |  | ||||||
|     , dependencies ? [] |  | ||||||
|     , buildInputs ? [] |  | ||||||
|     , production ? true |  | ||||||
|     , npmFlags ? "" |  | ||||||
|     , dontNpmInstall ? false |  | ||||||
|     , bypassCache ? false |  | ||||||
|     , reconstructLock ? false |  | ||||||
|     , preRebuild ? "" |  | ||||||
|     , dontStrip ? true |  | ||||||
|     , unpackPhase ? "true" |  | ||||||
|     , buildPhase ? "true" |  | ||||||
|     , meta ? {} |  | ||||||
|     , ... }@args: |  | ||||||
|  |  | ||||||
|     let |  | ||||||
|       extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" "dontStrip" "dontNpmInstall" "preRebuild" "unpackPhase" "buildPhase" "meta" ]; |  | ||||||
|     in |  | ||||||
|     stdenv.mkDerivation ({ |  | ||||||
|       name = "${name}${if version == null then "" else "-${version}"}"; |  | ||||||
|       buildInputs = [ tarWrapper python nodejs ] |  | ||||||
|         ++ lib.optional (stdenv.isLinux) utillinux |  | ||||||
|         ++ lib.optional (stdenv.isDarwin) libtool |  | ||||||
|         ++ buildInputs; |  | ||||||
|  |  | ||||||
|       inherit nodejs; |  | ||||||
|  |  | ||||||
|       inherit dontStrip; # Stripping may fail a build for some package deployments |  | ||||||
|       inherit dontNpmInstall preRebuild unpackPhase buildPhase; |  | ||||||
|  |  | ||||||
|       compositionScript = composePackage args; |  | ||||||
|       pinpointDependenciesScript = pinpointDependenciesOfPackage args; |  | ||||||
|  |  | ||||||
|       passAsFile = [ "compositionScript" "pinpointDependenciesScript" ]; |  | ||||||
|  |  | ||||||
|       installPhase = '' |  | ||||||
|         source ${installPackage} |  | ||||||
|  |  | ||||||
|         # Create and enter a root node_modules/ folder |  | ||||||
|         mkdir -p $out/lib/node_modules |  | ||||||
|         cd $out/lib/node_modules |  | ||||||
|  |  | ||||||
|         # Compose the package and all its dependencies |  | ||||||
|         source $compositionScriptPath |  | ||||||
|  |  | ||||||
|         ${prepareAndInvokeNPM { inherit packageName bypassCache reconstructLock npmFlags production; }} |  | ||||||
|  |  | ||||||
|         # Create symlink to the deployed executable folder, if applicable |  | ||||||
|         if [ -d "$out/lib/node_modules/.bin" ] |  | ||||||
|         then |  | ||||||
|             ln -s $out/lib/node_modules/.bin $out/bin |  | ||||||
|  |  | ||||||
|             # Fixup all executables |  | ||||||
|             ls $out/bin/* | while read i |  | ||||||
|             do |  | ||||||
|                 file="$(readlink -f "$i")" |  | ||||||
|                 chmod u+rwx "$file" |  | ||||||
|                 if isScript "$file" |  | ||||||
|                 then |  | ||||||
|                     sed -i 's/\r$//' "$file"  # convert crlf to lf |  | ||||||
|                 fi |  | ||||||
|             done |  | ||||||
|         fi |  | ||||||
|  |  | ||||||
|         # Create symlinks to the deployed manual page folders, if applicable |  | ||||||
|         if [ -d "$out/lib/node_modules/${packageName}/man" ] |  | ||||||
|         then |  | ||||||
|             mkdir -p $out/share |  | ||||||
|             for dir in "$out/lib/node_modules/${packageName}/man/"* |  | ||||||
|             do |  | ||||||
|                 mkdir -p $out/share/man/$(basename "$dir") |  | ||||||
|                 for page in "$dir"/* |  | ||||||
|                 do |  | ||||||
|                     ln -s $page $out/share/man/$(basename "$dir") |  | ||||||
|                 done |  | ||||||
|             done |  | ||||||
|         fi |  | ||||||
|  |  | ||||||
|         # Run post install hook, if provided |  | ||||||
|         runHook postInstall |  | ||||||
|       ''; |  | ||||||
|  |  | ||||||
|       meta = { |  | ||||||
|         # default to Node.js' platforms |  | ||||||
|         platforms = nodejs.meta.platforms; |  | ||||||
|       } // meta; |  | ||||||
|     } // extraArgs); |  | ||||||
|  |  | ||||||
|   # Builds a node environment (a node_modules folder and a set of binaries) |  | ||||||
|   buildNodeDependencies = |  | ||||||
|     { name |  | ||||||
|     , packageName |  | ||||||
|     , version ? null |  | ||||||
|     , src |  | ||||||
|     , dependencies ? [] |  | ||||||
|     , buildInputs ? [] |  | ||||||
|     , production ? true |  | ||||||
|     , npmFlags ? "" |  | ||||||
|     , dontNpmInstall ? false |  | ||||||
|     , bypassCache ? false |  | ||||||
|     , reconstructLock ? false |  | ||||||
|     , dontStrip ? true |  | ||||||
|     , unpackPhase ? "true" |  | ||||||
|     , buildPhase ? "true" |  | ||||||
|     , ... }@args: |  | ||||||
|  |  | ||||||
|     let |  | ||||||
|       extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" ]; |  | ||||||
|     in |  | ||||||
|       stdenv.mkDerivation ({ |  | ||||||
|         name = "node-dependencies-${name}${if version == null then "" else "-${version}"}"; |  | ||||||
|  |  | ||||||
|         buildInputs = [ tarWrapper python nodejs ] |  | ||||||
|           ++ lib.optional (stdenv.isLinux) utillinux |  | ||||||
|           ++ lib.optional (stdenv.isDarwin) libtool |  | ||||||
|           ++ buildInputs; |  | ||||||
|  |  | ||||||
|         inherit dontStrip; # Stripping may fail a build for some package deployments |  | ||||||
|         inherit dontNpmInstall unpackPhase buildPhase; |  | ||||||
|  |  | ||||||
|         includeScript = includeDependencies { inherit dependencies; }; |  | ||||||
|         pinpointDependenciesScript = pinpointDependenciesOfPackage args; |  | ||||||
|  |  | ||||||
|         passAsFile = [ "includeScript" "pinpointDependenciesScript" ]; |  | ||||||
|  |  | ||||||
|         installPhase = '' |  | ||||||
|           source ${installPackage} |  | ||||||
|  |  | ||||||
|           mkdir -p $out/${packageName} |  | ||||||
|           cd $out/${packageName} |  | ||||||
|  |  | ||||||
|           source $includeScriptPath |  | ||||||
|  |  | ||||||
|           # Create fake package.json to make the npm commands work properly |  | ||||||
|           cp ${src}/package.json . |  | ||||||
|           chmod 644 package.json |  | ||||||
|           ${lib.optionalString bypassCache '' |  | ||||||
|             if [ -f ${src}/package-lock.json ] |  | ||||||
|             then |  | ||||||
|                 cp ${src}/package-lock.json . |  | ||||||
|                 chmod 644 package-lock.json |  | ||||||
|             fi |  | ||||||
|           ''} |  | ||||||
|  |  | ||||||
|           # Go to the parent folder to make sure that all packages are pinpointed |  | ||||||
|           cd .. |  | ||||||
|           ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} |  | ||||||
|  |  | ||||||
|           ${prepareAndInvokeNPM { inherit packageName bypassCache reconstructLock npmFlags production; }} |  | ||||||
|  |  | ||||||
|           # Expose the executables that were installed |  | ||||||
|           cd .. |  | ||||||
|           ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} |  | ||||||
|  |  | ||||||
|           mv ${packageName} lib |  | ||||||
|           ln -s $out/lib/node_modules/.bin $out/bin |  | ||||||
|         ''; |  | ||||||
|       } // extraArgs); |  | ||||||
|  |  | ||||||
|   # Builds a development shell |  | ||||||
|   buildNodeShell = |  | ||||||
|     { name |  | ||||||
|     , packageName |  | ||||||
|     , version ? null |  | ||||||
|     , src |  | ||||||
|     , dependencies ? [] |  | ||||||
|     , buildInputs ? [] |  | ||||||
|     , production ? true |  | ||||||
|     , npmFlags ? "" |  | ||||||
|     , dontNpmInstall ? false |  | ||||||
|     , bypassCache ? false |  | ||||||
|     , reconstructLock ? false |  | ||||||
|     , dontStrip ? true |  | ||||||
|     , unpackPhase ? "true" |  | ||||||
|     , buildPhase ? "true" |  | ||||||
|     , ... }@args: |  | ||||||
|  |  | ||||||
|     let |  | ||||||
|       nodeDependencies = buildNodeDependencies args; |  | ||||||
|       extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" "dontStrip" "dontNpmInstall" "unpackPhase" "buildPhase" ]; |  | ||||||
|     in |  | ||||||
|     stdenv.mkDerivation ({ |  | ||||||
|       name = "node-shell-${name}${if version == null then "" else "-${version}"}"; |  | ||||||
|  |  | ||||||
|       buildInputs = [ python nodejs ] ++ lib.optional (stdenv.isLinux) utillinux ++ buildInputs; |  | ||||||
|       buildCommand = '' |  | ||||||
|         mkdir -p $out/bin |  | ||||||
|         cat > $out/bin/shell <<EOF |  | ||||||
|         #! ${stdenv.shell} -e |  | ||||||
|         $shellHook |  | ||||||
|         exec ${stdenv.shell} |  | ||||||
|         EOF |  | ||||||
|         chmod +x $out/bin/shell |  | ||||||
|       ''; |  | ||||||
|  |  | ||||||
|       # Provide the dependencies in a development shell through the NODE_PATH environment variable |  | ||||||
|       inherit nodeDependencies; |  | ||||||
|       shellHook = lib.optionalString (dependencies != []) '' |  | ||||||
|         export NODE_PATH=${nodeDependencies}/lib/node_modules |  | ||||||
|         export PATH="${nodeDependencies}/bin:$PATH" |  | ||||||
|       ''; |  | ||||||
|     } // extraArgs); |  | ||||||
| in |  | ||||||
| { |  | ||||||
|   buildNodeSourceDist = lib.makeOverridable buildNodeSourceDist; |  | ||||||
|   buildNodePackage = lib.makeOverridable buildNodePackage; |  | ||||||
|   buildNodeDependencies = lib.makeOverridable buildNodeDependencies; |  | ||||||
|   buildNodeShell = lib.makeOverridable buildNodeShell; |  | ||||||
| } |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,43 +1,58 @@ | |||||||
| { lib | { lib | ||||||
| , callPackage | , buildNpmPackage | ||||||
| , fetchFromGitHub | , fetchFromGitHub | ||||||
| , python3 | , python3 | ||||||
| , beets | , beets | ||||||
|  | , wrapGAppsHook | ||||||
| }: | }: | ||||||
|  |  | ||||||
| let | let | ||||||
|   py = python3.pkgs; |   version = "0.5.6"; | ||||||
|  |  | ||||||
|   version = "0.4.0.ffe45c02"; |  | ||||||
|  |  | ||||||
|   src = fetchFromGitHub { |   src = fetchFromGitHub { | ||||||
|     owner = "xeals"; |     owner = "sentriz"; | ||||||
|     repo = "betanin"; |     repo = "betanin"; | ||||||
|     rev = "ffe45c028037fc1659f62a9cdc9e1413dc2f358d"; |     rev = "v${version}"; | ||||||
|     hash = "sha256-5d8Y7PDlhkdVRVX+KvpiQ2WYNRELwc+ya5s4Qi+YQpI="; |     hash = "sha256-8JzZfxXzey6vGwsnpXTea/gTMFwmeeavimn5njHIEg0="; | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   client = callPackage ./client { |   client = buildNpmPackage { | ||||||
|     inherit src version; |     pname = "betanin_client"; | ||||||
|   }; |  | ||||||
| in |  | ||||||
| py.buildPythonApplication { |  | ||||||
|   pname = "betanin"; |  | ||||||
|     inherit version src; |     inherit version src; | ||||||
|  |  | ||||||
|   clientDistDir = "${client}/lib/node_modules/betanin/dist/"; |     sourceRoot = "${src.name}/betanin_client"; | ||||||
|  |  | ||||||
|   doCheck = false; |     npmDepsHash = "sha256-VkCQKpkDCTDejv8eRAN2Zfbq8TlWLdtqVJU3fo9hQrI="; | ||||||
|  |     NODE_ENV = "production"; | ||||||
|  |     NODE_OPTIONS = "--openssl-legacy-provider"; | ||||||
|  |  | ||||||
|  |     npmInstallFlags = [ "--include=dev" ]; | ||||||
|  |     installPhase = '' | ||||||
|  |       cp -r dist $out | ||||||
|  |     ''; | ||||||
|  |   }; | ||||||
|  | in | ||||||
|  | python3.pkgs.buildPythonApplication { | ||||||
|  |   pname = "betanin"; | ||||||
|  |   inherit version src; | ||||||
|  |   format = "pyproject"; | ||||||
|  |  | ||||||
|   patches = [ ./paths.patch ]; |   patches = [ ./paths.patch ]; | ||||||
|   postPatch = '' |   postPatch = '' | ||||||
|  |     export clientDistDir="${client}" | ||||||
|     export libPrefix="${python3.libPrefix}" |     export libPrefix="${python3.libPrefix}" | ||||||
|     substituteAllInPlace betanin/paths.py |     substituteAllInPlace betanin/paths.py | ||||||
|  |  | ||||||
|  |     # pythonRelaxDepsHook doesn't work | ||||||
|  |     sed -i 's/Flask <3.0.0/Flask/' pyproject.toml | ||||||
|   ''; |   ''; | ||||||
|  |  | ||||||
|   propagatedBuildInputs = |   # required for apprise | ||||||
|     (builtins.attrValues { |   nativeBuildInputs = [ wrapGAppsHook ]; | ||||||
|       inherit (py) |  | ||||||
|  |   build-system = with python3.pkgs; [ setuptools ]; | ||||||
|  |  | ||||||
|  |   dependencies = (with python3.pkgs; [ | ||||||
|     apprise |     apprise | ||||||
|     alembic |     alembic | ||||||
|     click |     click | ||||||
| @@ -56,8 +71,8 @@ py.buildPythonApplication { | |||||||
|     python-socketio |     python-socketio | ||||||
|     sqlalchemy |     sqlalchemy | ||||||
|     sqlalchemy-utils |     sqlalchemy-utils | ||||||
|         toml; |     toml | ||||||
|     }) ++ [ |   ]) ++ [ | ||||||
|     beets |     beets | ||||||
|   ]; |   ]; | ||||||
|  |  | ||||||
| @@ -66,6 +81,6 @@ py.buildPythonApplication { | |||||||
|     description = "beets based mitm of your torrent client and music player"; |     description = "beets based mitm of your torrent client and music player"; | ||||||
|     license = lib.licenses.gpl3Only; |     license = lib.licenses.gpl3Only; | ||||||
|     maintainers = [ ]; |     maintainers = [ ]; | ||||||
|     platforms = python3.meta.platforms; |     platforms = lib.platforms.linux; | ||||||
|   }; |   }; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,62 +0,0 @@ | |||||||
| diff --git a/cardboard/meson.build b/cardboard/meson.build |  | ||||||
| index b236f71..a90f230 100644 |  | ||||||
| --- a/cardboard/meson.build |  | ||||||
| +++ b/cardboard/meson.build |  | ||||||
| @@ -4,24 +4,15 @@ xkbcommon = dependency('xkbcommon') |  | ||||||
|  xcb = dependency('xcb', required: get_option('xwayland')) |  | ||||||
|   |  | ||||||
|  wlroots_version = '>=0.10.0' |  | ||||||
| -wlroots_proj = subproject( |  | ||||||
| +wlroots = dependency( |  | ||||||
|    'wlroots', |  | ||||||
| -  default_options: ['examples=false'], |  | ||||||
|    required: true, |  | ||||||
|    version: wlroots_version, |  | ||||||
|  ) |  | ||||||
|   |  | ||||||
| -wlroots = wlroots_proj.get_variable('wlroots') |  | ||||||
| -wlroots_conf = wlroots_proj.get_variable('conf_data') |  | ||||||
| -wlroots_has_xwayland = wlroots_conf.get('WLR_HAS_XWAYLAND') == 1 |  | ||||||
| +have_xwayland = xcb.found() |  | ||||||
|   |  | ||||||
| -if get_option('xwayland').enabled() and not wlroots_has_xwayland |  | ||||||
| -    error('Cannot enable Xwayland support in cardboard: wlroots has been built without Xwayland support') |  | ||||||
| -endif |  | ||||||
| -have_xwayland = xcb.found() and wlroots_has_xwayland |  | ||||||
| - |  | ||||||
| -expected_proj = subproject('expected', required: true) |  | ||||||
| -expected = expected_proj.get_variable('expected_dep') |  | ||||||
| +expected = dependency('tl-expected', required: true, method: 'cmake', modules: ['tl::expected']) |  | ||||||
|   |  | ||||||
|  conf_data = configuration_data() |  | ||||||
|  conf_data.set10('HAVE_XWAYLAND', have_xwayland) |  | ||||||
| diff --git a/cutter/meson.build b/cutter/meson.build |  | ||||||
| index f1260a4..1485f37 100644 |  | ||||||
| --- a/cutter/meson.build |  | ||||||
| +++ b/cutter/meson.build |  | ||||||
| @@ -1,6 +1,5 @@ |  | ||||||
|  # SPDX-License-Identifier: GPL-3.0-only |  | ||||||
| -expected_proj = subproject('expected', required: true) |  | ||||||
| -expected = expected_proj.get_variable('expected_dep') |  | ||||||
| +expected = dependency('tl-expected', required: true, method: 'cmake', modules: ['tl::expected']) |  | ||||||
|   |  | ||||||
|  executable( |  | ||||||
|      'cutter', |  | ||||||
| diff --git a/libcardboard/meson.build b/libcardboard/meson.build |  | ||||||
| index 89698fe..3ac8115 100644 |  | ||||||
| --- a/libcardboard/meson.build |  | ||||||
| +++ b/libcardboard/meson.build |  | ||||||
| @@ -1,11 +1,9 @@ |  | ||||||
|  # SPDX-License-Identifier: GPL-3.0-only |  | ||||||
|  libcardboard_inc = include_directories('include') |  | ||||||
|   |  | ||||||
| -expected_proj = subproject('expected', required: true) |  | ||||||
| -expected = expected_proj.get_variable('expected_dep') |  | ||||||
| +expected = dependency('tl-expected', required: true, method: 'cmake', modules: ['tl::expected']) |  | ||||||
|   |  | ||||||
| -cereal_proj = subproject('cereal', required: true) |  | ||||||
| -cereal = cereal_proj.get_variable('cereal_dep') |  | ||||||
| +cereal = dependency('cereal', required: true, method: 'cmake') |  | ||||||
|   |  | ||||||
|  sources = files( |  | ||||||
|      'src/command_protocol.cpp', |  | ||||||
| @@ -1,68 +0,0 @@ | |||||||
| { stdenv |  | ||||||
| , lib |  | ||||||
| , fetchFromGitLab |  | ||||||
| , cereal |  | ||||||
| , cmake |  | ||||||
| , libGL |  | ||||||
| , libX11 |  | ||||||
| , libinput |  | ||||||
| , libxkbcommon |  | ||||||
| , meson |  | ||||||
| , ninja |  | ||||||
| , pixman |  | ||||||
| , pkg-config |  | ||||||
| , tl-expected |  | ||||||
| , wayland |  | ||||||
| , wayland-protocols |  | ||||||
| , wlroots |  | ||||||
| }: |  | ||||||
|  |  | ||||||
| stdenv.mkDerivation rec { |  | ||||||
|   pname = "cardboard"; |  | ||||||
|   version = "20210120.g7b15613"; |  | ||||||
|  |  | ||||||
|   src = fetchFromGitLab { |  | ||||||
|     owner = "cardboardwm"; |  | ||||||
|     repo = "cardboard"; |  | ||||||
|     rev = "7b15613e6e1222a6a83d69a2e5da2810dfb45522"; |  | ||||||
|     sha256 = "044sb0lv1gcywpdncvlv7npxvbsqcc1mwpk0f6i73dinchdz7gmq"; |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
|   patches = [ |  | ||||||
|     ./0001-use-system-dependencies.patch |  | ||||||
|   ]; |  | ||||||
|  |  | ||||||
|   # CMake likes to own the configurePhase, but we only need it for dependency |  | ||||||
|   # discovery. Remove it. |  | ||||||
|   configurePhase = "mesonConfigurePhase"; |  | ||||||
|  |  | ||||||
|   nativeBuildInputs = [ |  | ||||||
|     cmake |  | ||||||
|     meson |  | ||||||
|     ninja |  | ||||||
|     pkg-config |  | ||||||
|   ]; |  | ||||||
|  |  | ||||||
|   buildInputs = [ |  | ||||||
|     cereal |  | ||||||
|     libGL |  | ||||||
|     libX11 |  | ||||||
|     libinput |  | ||||||
|     libxkbcommon |  | ||||||
|     pixman |  | ||||||
|     tl-expected |  | ||||||
|     wayland |  | ||||||
|     wayland-protocols |  | ||||||
|     wlroots |  | ||||||
|   ]; |  | ||||||
|  |  | ||||||
|   passthru.providedSessions = [ "cardboard" ]; |  | ||||||
|  |  | ||||||
|   meta = with lib; { |  | ||||||
|     description = "Scrollable tiling Wayland compositor designed with laptops in mind"; |  | ||||||
|     homepage = "https://gitlab.com/cardboardwm/cardboard"; |  | ||||||
|     license = licenses.gpl3; |  | ||||||
|     platforms = wlroots.meta.platforms; |  | ||||||
|     broken = true; |  | ||||||
|   }; |  | ||||||
| } |  | ||||||
| @@ -9,14 +9,14 @@ | |||||||
|  |  | ||||||
| let | let | ||||||
|   pname = "cura5"; |   pname = "cura5"; | ||||||
|   version = "5.4.0"; |   version = "5.6.0"; | ||||||
|   name = "${pname}-${version}"; |   name = "${pname}-${version}"; | ||||||
|  |  | ||||||
|   cura5 = appimageTools.wrapType2 { |   cura5 = appimageTools.wrapType2 { | ||||||
|     inherit pname version; |     inherit pname version; | ||||||
|     src = fetchurl { |     src = fetchurl { | ||||||
|       url = "https://github.com/Ultimaker/Cura/releases/download/${version}/Ultimaker-Cura-${version}-linux-modern.AppImage"; |       url = "https://github.com/Ultimaker/Cura/releases/download/${version}/Ultimaker-Cura-${version}-linux-X64.AppImage"; | ||||||
|       hash = "sha256-QVv7Wkfo082PH6n6rpsB79st2xK2+Np9ivBg/PYZd74="; |       hash = "sha256-EHiWoNpLKHPzv6rZrtNgEr7y//iVcRYeV/TaCn8QpEA="; | ||||||
|     }; |     }; | ||||||
|     extraPkgs = _: [ ]; |     extraPkgs = _: [ ]; | ||||||
|   }; |   }; | ||||||
| @@ -33,7 +33,7 @@ let | |||||||
|       fi |       fi | ||||||
|       args+=("$a") |       args+=("$a") | ||||||
|     done |     done | ||||||
|     exec "${cura5}/bin/${name}" "''${args[@]}" |     QT_QPA_PLATFORM=xcb exec "${cura5}/bin/cura5" "''${args[@]}" | ||||||
|   ''; |   ''; | ||||||
| in | in | ||||||
| stdenv.mkDerivation rec { | stdenv.mkDerivation rec { | ||||||
|   | |||||||
							
								
								
									
										25
									
								
								pkgs/by-name/ko/koillection/koillection-dirs.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								pkgs/by-name/ko/koillection/koillection-dirs.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | *** a/src/Kernel.php | ||||||
|  | --- b/src/Kernel.php | ||||||
|  | @@ -8,6 +8,21 @@ class Kernel extends BaseKernel | ||||||
|  |  use Symfony\Component\HttpKernel\Kernel as BaseKernel; | ||||||
|  |   | ||||||
|  |  class Kernel extends BaseKernel | ||||||
|  |  { | ||||||
|  |      use MicroKernelTrait; | ||||||
|  | + | ||||||
|  | +    public function getDataDir(): string | ||||||
|  | +    { | ||||||
|  | +        return '@dataDir@'; | ||||||
|  | +    } | ||||||
|  | + | ||||||
|  | +    public function getCacheDir(): string | ||||||
|  | +    { | ||||||
|  | +        return $this->getDataDir() . '/var/cache/' . $this->getEnvironment(); | ||||||
|  | +    } | ||||||
|  | + | ||||||
|  | +    public function getLogDir(): string | ||||||
|  | +    { | ||||||
|  | +        return $this->getDataDir() . '/var/logs'; | ||||||
|  | +    } | ||||||
|  |  } | ||||||
|  |  | ||||||
							
								
								
									
										69
									
								
								pkgs/by-name/ko/koillection/package.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								pkgs/by-name/ko/koillection/package.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | |||||||
|  | { lib | ||||||
|  | , dataDir ? "/var/lib/koillection" | ||||||
|  |   # REVIEW: This supposed to be aliased by the caller, which means it shouldn't | ||||||
|  |   # go in by-name, I think. | ||||||
|  | , php83 | ||||||
|  | , fetchFromGitHub | ||||||
|  | , mkYarnPackage | ||||||
|  | , fetchYarnDeps | ||||||
|  | }: | ||||||
|  |  | ||||||
|  | php83.buildComposerProject (finalAttrs: { | ||||||
|  |   pname = "koillection"; | ||||||
|  |   version = "1.5.2"; | ||||||
|  |  | ||||||
|  |   src = fetchFromGitHub { | ||||||
|  |     owner = "benjaminjonard"; | ||||||
|  |     repo = "koillection"; | ||||||
|  |     rev = finalAttrs.version; | ||||||
|  |     hash = "sha256-r2rkHhp0F5QfwJuKeu4UdPoluDXxpyhYpie1zUk1h5c="; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   frontend = mkYarnPackage { | ||||||
|  |     inherit (finalAttrs) pname version; | ||||||
|  |  | ||||||
|  |     src = "${finalAttrs.src}/assets"; | ||||||
|  |  | ||||||
|  |     offlineCache = fetchYarnDeps { | ||||||
|  |       yarnLock = "${finalAttrs.src}/assets/yarn.lock"; | ||||||
|  |       hash = ""; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   patches = [ | ||||||
|  |     ./koillection-dirs.patch | ||||||
|  |   ]; | ||||||
|  |  | ||||||
|  |   postPatch = '' | ||||||
|  |     substituteInPlace src/Kernel.php \ | ||||||
|  |       --replace "@dataDir@" "${dataDir}" | ||||||
|  |   ''; | ||||||
|  |  | ||||||
|  |   # Lock file uses exact constraints, which Composer doesn't like. | ||||||
|  |   composerStrictValidation = false; | ||||||
|  |   # Actually installs plugins, i.e., Symfony. | ||||||
|  |   composerNoPlugins = false; | ||||||
|  |   vendorHash = "sha256-LU9ZN4qUNUpSBGH6AChw3qU4RjgsoPJmLL01FS7UKRQ="; | ||||||
|  |  | ||||||
|  |   postInstall = '' | ||||||
|  |     local koillection_out=$out/share/php/koillection | ||||||
|  |  | ||||||
|  |     rm -R $koillection_out/public/uploads | ||||||
|  |     ln -s ${dataDir}/.env $koillection_out/.env.local | ||||||
|  |     ln -s ${dataDir}/public/uploads $koillection_out/public/uploads | ||||||
|  |  | ||||||
|  |     cp -r ${finalAttrs.frontend} assets/ | ||||||
|  |   ''; | ||||||
|  |  | ||||||
|  |   passthru = { | ||||||
|  |     phpPackage = php83; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   meta = { | ||||||
|  |     description = "Self-hosted service allowing users to manage any kind of collections"; | ||||||
|  |     homepage = "https://github.com/benjaminjonard/koillection"; | ||||||
|  |     license = lib.licenses.mit; | ||||||
|  |     platforms = lib.platforms.unix; | ||||||
|  |     broken = true; # Blocked on NixOS/nixpkgs#254369 | ||||||
|  |   }; | ||||||
|  | }) | ||||||
							
								
								
									
										25
									
								
								pkgs/by-name/po/porkbun-ddns/package.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								pkgs/by-name/po/porkbun-ddns/package.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | { lib | ||||||
|  | , stdenv | ||||||
|  | , python3 | ||||||
|  | }: | ||||||
|  | let | ||||||
|  |   python = python3.withPackages (py: [ py.requests ]); | ||||||
|  | in | ||||||
|  | stdenv.mkDerivation { | ||||||
|  |   name = "porkbun-ddns"; | ||||||
|  |  | ||||||
|  |   src = ./.; | ||||||
|  |   inherit python; | ||||||
|  |  | ||||||
|  |   installPhase = '' | ||||||
|  |     mkdir -p $out/bin | ||||||
|  |     install -Dm0755 $src/porkbun-ddns.py $out/bin/porkbun-ddns | ||||||
|  |     substituteAllInPlace $out/bin/porkbun-ddns | ||||||
|  |   ''; | ||||||
|  |  | ||||||
|  |   meta = { | ||||||
|  |     description = "Porkbun dynamic DNS script"; | ||||||
|  |     license = lib.licenses.gpl3; | ||||||
|  |     platforms = python.meta.platforms; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										176
									
								
								pkgs/by-name/po/porkbun-ddns/porkbun-ddns.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								pkgs/by-name/po/porkbun-ddns/porkbun-ddns.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | |||||||
|  | #!@python@/bin/python | ||||||
|  |  | ||||||
|  | import argparse | ||||||
|  | import json | ||||||
|  | import os | ||||||
|  | import re | ||||||
|  | import requests | ||||||
|  | from dataclasses import dataclass, fields as datafields | ||||||
|  | from enum import Enum, unique | ||||||
|  | from typing import List, Optional | ||||||
|  |  | ||||||
|  | APIBASE = "https://api.porkbun.com/api/json/v3/dns" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def dataclass_from_dict(klass: object, d: dict): | ||||||
|  |     try: | ||||||
|  |         fieldtypes = {f.name: f.type for f in datafields(klass)} | ||||||
|  |         return klass(**{f: dataclass_from_dict(fieldtypes[f], d[f]) for f in d}) | ||||||
|  |     except: | ||||||
|  |         return d  # Not a dataclass field | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def remove_domain(domain: str, name: str): | ||||||
|  |     return re.sub(f"\\.?{domain}$", "", name) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @unique | ||||||
|  | class RecordType(Enum): | ||||||
|  |     a = "A" | ||||||
|  |     aaaa = "AAAA" | ||||||
|  |     cname = "CNAME" | ||||||
|  |     mx = "MX" | ||||||
|  |     srv = "SRV" | ||||||
|  |     txt = "TXT" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @dataclass | ||||||
|  | class Record: | ||||||
|  |     id: str | ||||||
|  |     name: str | ||||||
|  |     type: str | ||||||
|  |     content: str | ||||||
|  |     ttl: str | ||||||
|  |     prio: str = "" | ||||||
|  |     notes: str = "" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @dataclass | ||||||
|  | class Retrieval: | ||||||
|  |     status: str | ||||||
|  |     records: List[Record] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ApiError(Exception): | ||||||
|  |     pass | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ArgumentError(Exception): | ||||||
|  |     pass | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class PorkbunClient: | ||||||
|  |     def __init__(self, apikey: str, secretapikey: str): | ||||||
|  |         self.apikey = apikey | ||||||
|  |         self.secretapikey = secretapikey | ||||||
|  |  | ||||||
|  |     def _make_payload(self, **kwargs): | ||||||
|  |         return json.dumps( | ||||||
|  |             {"apikey": self.apikey, "secretapikey": self.secretapikey, **kwargs} | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |     def edit_record( | ||||||
|  |         self, | ||||||
|  |         domain: str, | ||||||
|  |         record: Record, | ||||||
|  |         name: Optional[str] = None, | ||||||
|  |         type: Optional[RecordType] = None, | ||||||
|  |         content: Optional[str] = None, | ||||||
|  |         ttl: Optional[int] = None, | ||||||
|  |         priority: Optional[str] = None, | ||||||
|  |     ) -> bool: | ||||||
|  |         return self.edit( | ||||||
|  |             domain, | ||||||
|  |             record.id, | ||||||
|  |             name=name or record.name, | ||||||
|  |             type=type or RecordType(record.type), | ||||||
|  |             content=content or record.content, | ||||||
|  |             ttl=ttl or record.ttl, | ||||||
|  |             priority=priority or record.prio, | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |     def edit( | ||||||
|  |         self, | ||||||
|  |         domain: str, | ||||||
|  |         id: str, | ||||||
|  |         name: str, | ||||||
|  |         type: RecordType, | ||||||
|  |         content: str, | ||||||
|  |         ttl: int = 300, | ||||||
|  |         priority: Optional[str] = None, | ||||||
|  |     ) -> bool: | ||||||
|  |         # API returns FQN name rather than the actual prefix, so scrub it | ||||||
|  |         name = remove_domain(domain, name) | ||||||
|  |         payload = self._make_payload( | ||||||
|  |             name=name, type=type.value, content=content, ttl=str(ttl), prio=priority | ||||||
|  |         ) | ||||||
|  |         res = requests.post(f"{APIBASE}/edit/{domain}/{id}", data=payload) | ||||||
|  |         body = res.json() | ||||||
|  |         if body["status"] != "SUCCESS": | ||||||
|  |             raise ApiError(body["message"]) | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     def delete(self, domain: str, id: str) -> bool: | ||||||
|  |         payload = self._make_payload() | ||||||
|  |         res = requests.post(f"{APIBASE}/delete/{domain}/{id}", data=payload) | ||||||
|  |         body = res.json() | ||||||
|  |         if body["status"] != "SUCCESS": | ||||||
|  |             raise ApiError(body["message"]) | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     def retrieve(self, domain: str) -> List[Retrieval]: | ||||||
|  |         payload = self._make_payload() | ||||||
|  |         res = requests.post(f"{APIBASE}/retrieve/{domain}", data=payload) | ||||||
|  |         body = res.json() | ||||||
|  |         if body["status"] != "SUCCESS": | ||||||
|  |             raise ApiError(body["message"]) | ||||||
|  |         return [dataclass_from_dict(Record, d) for d in body["records"]] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def current_ip() -> str: | ||||||
|  |     return requests.get("https://ifconfig.me").text | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def _load_key(key: Optional[str], keyfile: Optional[str]) -> str: | ||||||
|  |     if keyfile is not None: | ||||||
|  |         with open(keyfile) as f: | ||||||
|  |             return f.read().strip() | ||||||
|  |     if key is not None: | ||||||
|  |         return key | ||||||
|  |     raise ArgumentError("key or key file is required") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     parser = argparse.ArgumentParser(description="Wrapper around Porkbun DNS API") | ||||||
|  |     keyarg = parser.add_mutually_exclusive_group(required=True) | ||||||
|  |     keyarg.add_argument("-k", "--key", metavar="KEY", type=str, help="API key") | ||||||
|  |     keyarg.add_argument( | ||||||
|  |         "-K", "--key-file", metavar="FILE", type=str, help="API key file" | ||||||
|  |     ) | ||||||
|  |     secretarg = parser.add_mutually_exclusive_group(required=True) | ||||||
|  |     secretarg.add_argument( | ||||||
|  |         "-s", "--secret", metavar="SECRET", type=str, help="secret API key" | ||||||
|  |     ) | ||||||
|  |     secretarg.add_argument( | ||||||
|  |         "-S", "--secret-file", metavar="FILE", type=str, help="secret API key file" | ||||||
|  |     ) | ||||||
|  |     parser.add_argument("domains", type=str, nargs="+", help="domain(s) to update") | ||||||
|  |  | ||||||
|  |     args = parser.parse_args() | ||||||
|  |     try: | ||||||
|  |         apikey = _load_key(args.key, args.key_file) | ||||||
|  |         secretapikey = _load_key(args.secret, args.secret_file) | ||||||
|  |     except Exception as e: | ||||||
|  |         print("error: " + str(e)) | ||||||
|  |         parser.print_help() | ||||||
|  |         exit(1) | ||||||
|  |  | ||||||
|  |     current_ip = current_ip() | ||||||
|  |     client = PorkbunClient(apikey, secretapikey) | ||||||
|  |     for domain in args.domains: | ||||||
|  |         recs = client.retrieve(domain) | ||||||
|  |         arecs = [r for r in recs if r.type == RecordType.a.value] | ||||||
|  |         for arec in arecs: | ||||||
|  |             if arec.content != current_ip: | ||||||
|  |                 client.edit_record(domain, arec, content=current_ip) | ||||||
|  |                 print(f"Pointed '{arec.name}' to {current_ip}") | ||||||
| @@ -3,7 +3,7 @@ | |||||||
| , rustPlatform | , rustPlatform | ||||||
|  |  | ||||||
| , pkg-config | , pkg-config | ||||||
| , alsaLib | , alsa-lib | ||||||
| , dbus | , dbus | ||||||
| , openssl | , openssl | ||||||
|  |  | ||||||
| @@ -23,6 +23,7 @@ assert withGui -> gtk3.meta.available; | |||||||
| rustPlatform.buildRustPackage rec { | rustPlatform.buildRustPackage rec { | ||||||
|   pname = "psst"; |   pname = "psst"; | ||||||
|   version = "20221012.d70ed81"; |   version = "20221012.d70ed81"; | ||||||
|  |  | ||||||
|   src = fetchFromGitHub { |   src = fetchFromGitHub { | ||||||
|     owner = "jpochyla"; |     owner = "jpochyla"; | ||||||
|     repo = "psst"; |     repo = "psst"; | ||||||
| @@ -30,12 +31,12 @@ rustPlatform.buildRustPackage rec { | |||||||
|     hash = "sha256-ZKhHN0ruLb6ZVKkrKv/YawRsVop6SP1QF/nrtkmA8P8="; |     hash = "sha256-ZKhHN0ruLb6ZVKkrKv/YawRsVop6SP1QF/nrtkmA8P8="; | ||||||
|     fetchSubmodules = true; |     fetchSubmodules = true; | ||||||
|   }; |   }; | ||||||
|   cargoSha256 = "sha256-zH6+EV78FDVOYEFXk0f54pH2Su0QpK1I0bHqzIiMdBo="; |   cargoHash = "sha256-my15AXG9LLmdqZLqXdeZ81VLv+GbSMgNtuFAlYTEUvQ="; | ||||||
|  |  | ||||||
|   nativeBuildInputs = [ pkg-config ] |   nativeBuildInputs = [ pkg-config ] | ||||||
|     ++ optional withGui copyDesktopItems; |     ++ optional withGui copyDesktopItems; | ||||||
|  |  | ||||||
|   buildInputs = [ alsaLib dbus openssl ] |   buildInputs = [ alsa-lib dbus openssl ] | ||||||
|     ++ optional withGui gtk3; |     ++ optional withGui gtk3; | ||||||
|  |  | ||||||
|   cargoBuildFlags = optionals (!withGui) [ |   cargoBuildFlags = optionals (!withGui) [ | ||||||
|   | |||||||
| @@ -1,48 +0,0 @@ | |||||||
| { stdenv |  | ||||||
| , lib |  | ||||||
| , fetchFromGitHub |  | ||||||
| , curl |  | ||||||
| , gnumake |  | ||||||
| , gnutls |  | ||||||
| , gtk3 |  | ||||||
| , gtkmm3 |  | ||||||
| , pkg-config |  | ||||||
| , yajl |  | ||||||
| }: |  | ||||||
|  |  | ||||||
| stdenv.mkDerivation rec { |  | ||||||
|   pname = "SamRewritten"; |  | ||||||
|   version = "2.1"; |  | ||||||
|  |  | ||||||
|   src = fetchFromGitHub { |  | ||||||
|     owner = "PaulCombal"; |  | ||||||
|     repo = pname; |  | ||||||
|     rev = "202008"; |  | ||||||
|     sha256 = "ab7903b997675b0d4d7eede15430fc5ca2736e6c25c7f95a7c97e1ce25582a1c"; |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
|   nativeBuildInputs = [ gnumake pkg-config ]; |  | ||||||
|   buildInputs = [ |  | ||||||
|     curl |  | ||||||
|     gnutls |  | ||||||
|     gtk3 |  | ||||||
|     gtkmm3 |  | ||||||
|     yajl |  | ||||||
|   ]; |  | ||||||
|  |  | ||||||
|   NIX_CFLAGS_LINK = "-pthread"; |  | ||||||
|  |  | ||||||
|   makeFlags = [ "PREFIX=$(out)" ]; |  | ||||||
|  |  | ||||||
|   postFixup = '' |  | ||||||
|     substituteInPlace $out/share/applications/samrewritten.desktop \ |  | ||||||
|       --replace /usr/bin/samrewritten $out/bin/samrewritten |  | ||||||
|   ''; |  | ||||||
|  |  | ||||||
|   meta = with lib; { |  | ||||||
|     description = "Steam Achievement Manager For Linux"; |  | ||||||
|     homepage = "https://github.com/PaulCombal/SamRewritten"; |  | ||||||
|     license = licenses.gpl3; |  | ||||||
|     platforms = platforms.linux; |  | ||||||
|   }; |  | ||||||
| } |  | ||||||
| @@ -14,7 +14,7 @@ | |||||||
| , mp4Support ? false | , mp4Support ? false | ||||||
| , fdk-aac-encoder | , fdk-aac-encoder | ||||||
| , oggSupport ? false | , oggSupport ? false | ||||||
| , vorbisTools | , vorbis-tools | ||||||
| , opusSupport ? false | , opusSupport ? false | ||||||
| , opusTools | , opusTools | ||||||
| }: | }: | ||||||
| @@ -23,7 +23,7 @@ assert aacSupport -> faac.meta.available; | |||||||
| assert alacSupport -> libav.meta.available; | assert alacSupport -> libav.meta.available; | ||||||
| assert flacSupport -> flac.meta.available; | assert flacSupport -> flac.meta.available; | ||||||
| assert m4aSupport || mp4Support -> fdk-aac-encoder.meta.available; | assert m4aSupport || mp4Support -> fdk-aac-encoder.meta.available; | ||||||
| assert oggSupport -> vorbisTools.meta.available; | assert oggSupport -> vorbis-tools.meta.available; | ||||||
| assert opusSupport -> opusTools.meta.available; | assert opusSupport -> opusTools.meta.available; | ||||||
|  |  | ||||||
| python3Packages.buildPythonApplication rec { | python3Packages.buildPythonApplication rec { | ||||||
| @@ -51,10 +51,12 @@ python3Packages.buildPythonApplication rec { | |||||||
|     (if alacSupport then libav else null) |     (if alacSupport then libav else null) | ||||||
|     (if aacSupport then faac else null) |     (if aacSupport then faac else null) | ||||||
|     (if (m4aSupport || mp4Support) then fdk-aac-encoder else null) |     (if (m4aSupport || mp4Support) then fdk-aac-encoder else null) | ||||||
|     (if oggSupport then vorbisTools else null) |     (if oggSupport then vorbis-tools else null) | ||||||
|     (if opusSupport then opusTools else null) |     (if opusSupport then opusTools else null) | ||||||
|   ]; |   ]; | ||||||
|  |  | ||||||
|  |   format = "setuptools"; | ||||||
|  |  | ||||||
|   # Remove impure executables. |   # Remove impure executables. | ||||||
|   patches = [ ./fix-setup.patch ]; |   patches = [ ./fix-setup.patch ]; | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								pkgs/by-name/th/thor/nugetDeps.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								pkgs/by-name/th/thor/nugetDeps.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | # This file was automatically generated by passthru.fetch-deps. | ||||||
|  | # Please dont edit it manually, your changes might get overwritten! | ||||||
|  |  | ||||||
|  | { fetchNuGet }: [ | ||||||
|  |   (fetchNuGet { pname = "K4os.Compression.LZ4"; version = "1.3.5"; sha256 = "1nv9inhz0n25lhkw9xgp6g5xbqmcdccdhx6mwrli0pdp6hjmlh9k"; }) | ||||||
|  |   (fetchNuGet { pname = "K4os.Compression.LZ4.Streams"; version = "1.3.5"; sha256 = "09m0jxq6558r1v1l4rsc8c0n6nlacz2d8c03as6kvvvz2gr7h506"; }) | ||||||
|  |   (fetchNuGet { pname = "K4os.Hash.xxHash"; version = "1.0.8"; sha256 = "0vz1f81z4rh7a576fdzbc6wmj7p4gaca1rch3anvh1s5qd7xdd10"; }) | ||||||
|  |   (fetchNuGet { pname = "Serilog"; version = "3.0.0-dev-02022"; sha256 = "0c7gqhzkcdzmhycq60mzwqwcycl99ksk4q0pmwz140japasfhcqk"; }) | ||||||
|  |   (fetchNuGet { pname = "Serilog.Exceptions"; version = "8.4.0"; sha256 = "1v0rnhr616wj85gb6wvafj22kvnphp7m9vsyalcc25hwa1jvlryr"; }) | ||||||
|  |   (fetchNuGet { pname = "Serilog.Sinks.Console"; version = "4.1.1-dev-00910"; sha256 = "00h3sd0lxnx53jmgqh84pw73zk3d710dvlgkf4x135vfhax9bw7m"; }) | ||||||
|  |   (fetchNuGet { pname = "SharpCompress"; version = "0.33.0"; sha256 = "1j94hfjvkygpp97svv75jay0rmnx9ygg86d5syyahl9hayns4ig9"; }) | ||||||
|  |   (fetchNuGet { pname = "Spectre.Console"; version = "0.47.1-preview.0.8"; sha256 = "1r6v16lh7mqxxh3j9lqryif8skx3q9nkgf5gnp5xpc4im3a52wql"; }) | ||||||
|  |   (fetchNuGet { pname = "System.IO.Pipelines"; version = "6.0.3"; sha256 = "1jgdazpmwc21dd9naq3l9n5s8a1jnbwlvgkf1pnm0aji6jd4xqdz"; }) | ||||||
|  |   (fetchNuGet { pname = "System.Memory"; version = "4.5.5"; sha256 = "08jsfwimcarfzrhlyvjjid61j02irx6xsklf32rv57x2aaikvx0h"; }) | ||||||
|  |   (fetchNuGet { pname = "System.Reflection.TypeExtensions"; version = "4.7.0"; sha256 = "04qw9km34pmzr2alckb3mqdb4fpqwlvzk59lg8c7jfidghcl4jqq"; }) | ||||||
|  | ] | ||||||
							
								
								
									
										35
									
								
								pkgs/by-name/th/thor/package.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								pkgs/by-name/th/thor/package.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | { lib | ||||||
|  | , fetchFromGitHub | ||||||
|  | , buildDotnetModule | ||||||
|  | , dotnetCorePackages | ||||||
|  | }: | ||||||
|  |  | ||||||
|  | buildDotnetModule rec { | ||||||
|  |   pname = "thor"; | ||||||
|  |   version = "1.0.4"; | ||||||
|  |  | ||||||
|  |   src = fetchFromGitHub { | ||||||
|  |     owner = "Samsung-Loki"; | ||||||
|  |     repo = "Thor"; | ||||||
|  |     rev = version; | ||||||
|  |     hash = "sha256-tYzPpgbM9rCDdLW0ERZWmmxzMYpe1BNyFwmpaLQXRGQ="; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   dotnet-sdk = dotnetCorePackages.sdk_7_0; | ||||||
|  |   dotnet-runtime = dotnetCorePackages.runtime_7_0; | ||||||
|  |   nugetDeps = ./nugetDeps.nix; | ||||||
|  |   projectFile = "TheAirBlow.Thor.Shell/TheAirBlow.Thor.Shell.csproj"; | ||||||
|  |  | ||||||
|  |   postFixup = '' | ||||||
|  |     mv $out/bin/TheAirBlow.Thor.Shell $out/bin/thor | ||||||
|  |   ''; | ||||||
|  |  | ||||||
|  |   # dotnet7 is unsupported but it still runs fine; just don't build it in CI. | ||||||
|  |   # https://github.com/Samsung-Loki/Thor/issues/23 | ||||||
|  |   preferLocalBuild = true; | ||||||
|  |   meta = { | ||||||
|  |     homepage = "https://github.com/Samsung-Loki/Thor"; | ||||||
|  |     description = "An alternative to Heimdall"; | ||||||
|  |     license = lib.licenses.mpl20; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										27
									
								
								pkgs/by-name/wg/wg2nd/package.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								pkgs/by-name/wg/wg2nd/package.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | { lib | ||||||
|  | , stdenv | ||||||
|  | , fetchFromGitHub | ||||||
|  | , libcap | ||||||
|  | }: stdenv.mkDerivation { | ||||||
|  |   pname = "wg2nd"; | ||||||
|  |   version = "20240605.23a3710"; | ||||||
|  |   src = fetchFromGitHub { | ||||||
|  |     owner = "flu0r1ne"; | ||||||
|  |     repo = "wg2nd"; | ||||||
|  |     rev = "23a37100f121edd0c1291c4a78901662eae5d58b"; | ||||||
|  |     hash = "sha256-XY19Vicg8l/2stlWj1QqJt0pJOi/kueQpBufVlLJVxk="; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   buildInputs = [ libcap ]; | ||||||
|  |  | ||||||
|  |   installPhase = '' | ||||||
|  |     PREFIX=$out BINDIR=/bin make install | ||||||
|  |   ''; | ||||||
|  |  | ||||||
|  |   meta = { | ||||||
|  |     description = "WireGuard to systemd-networkd Configuration Converter"; | ||||||
|  |     homepage = "https://git.flu0r1ine.net/wg2nd/about"; | ||||||
|  |     license = [ lib.licenses.gpl2Only lib.licenses.mit ]; | ||||||
|  |     platforms = lib.platforms.linux; | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @@ -1,68 +0,0 @@ | |||||||
| { lib |  | ||||||
| , fetchFromGitHub |  | ||||||
| , buildGoModule |  | ||||||
| , makeWrapper |  | ||||||
|  |  | ||||||
| , go |  | ||||||
| , pkg-config |  | ||||||
| , qmake |  | ||||||
| , removeReferencesTo |  | ||||||
| }: |  | ||||||
|  |  | ||||||
| buildGoModule rec { |  | ||||||
|   pname = "go-qt"; |  | ||||||
|   version = "20200904.gc0c124a"; |  | ||||||
|  |  | ||||||
|   src = fetchFromGitHub { |  | ||||||
|     owner = "therecipe"; |  | ||||||
|     repo = "qt"; |  | ||||||
|     rev = "c0c124a5770d357908f16fa57e0aa0ec6ccd3f91"; |  | ||||||
|     sha256 = "197wdh2v0g5g2dpb1gcd5gp0g4wqzip34cawisvy6z7mygmsc8rd"; |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
|   # fails with `GOFLAGS=-vendor=mod -trimpath` |  | ||||||
|   allowGoReference = true; |  | ||||||
|   preFixup = '' |  | ||||||
|     find $out -type f -exec ${removeReferencesTo}/bin/remove-references-to -t ${go} '{}' + |  | ||||||
|   ''; |  | ||||||
|  |  | ||||||
|   vendorSha256 = "00wghn93xz240ddj47b8mkbx3cg7c0486igp6vv0x9r6ylhywsm6"; |  | ||||||
|   subPackages = [ "cmd/..." ]; |  | ||||||
|  |  | ||||||
|   nativeBuildInputs = [ makeWrapper ]; |  | ||||||
|  |  | ||||||
|   # Fixes inconsistent vendoring. |  | ||||||
|   postPatch = '' |  | ||||||
|     cat <<EOM >>go.mod |  | ||||||
|     require ( |  | ||||||
|       github.com/therecipe/env_darwin_amd64_513 v0.0.0-20190626001412-d8e92e8db4d0 |  | ||||||
|       github.com/therecipe/env_linux_amd64_513 v0.0.0-20190626000307-e137a3934da6 |  | ||||||
|       github.com/therecipe/env_windows_amd64_513 v0.0.0-20190626000028-79ec8bd06fb2 |  | ||||||
|       github.com/therecipe/env_windows_amd64_513/Tools v0.0.0-20190626000028-79ec8bd06fb2 |  | ||||||
|       github.com/therecipe/qt/internal/binding/files/docs/5.12.0 v0.0.0-20200904063919-c0c124a5770d |  | ||||||
|       github.com/therecipe/qt/internal/binding/files/docs/5.13.0 v0.0.0-20200904063919-c0c124a5770d |  | ||||||
|     ) |  | ||||||
|     EOM |  | ||||||
|   ''; |  | ||||||
|  |  | ||||||
|   doCheck = true; |  | ||||||
|   checkPhase = '' |  | ||||||
|     $GOPATH/bin/qtsetup test |  | ||||||
|   ''; |  | ||||||
|  |  | ||||||
|   postFixup = '' |  | ||||||
|     for bin in $out/bin/*; do |  | ||||||
|       wrapProgram $bin \ |  | ||||||
|         --set QT_PKG_CONFIG true \ |  | ||||||
|         --prefix PATH : ${pkg-config}/bin \ |  | ||||||
|         --prefix PATH : ${qmake}/bin |  | ||||||
|     done |  | ||||||
|   ''; |  | ||||||
|  |  | ||||||
|   meta = with lib; { |  | ||||||
|     homepage = "https://github.com/therecipe/qt"; |  | ||||||
|     description = "Qt bindings for Go"; |  | ||||||
|     license = licenses.lgpl3; |  | ||||||
|     broken = true; |  | ||||||
|   }; |  | ||||||
| } |  | ||||||
| @@ -1,111 +0,0 @@ | |||||||
| # file generated from go.mod using vgo2nix (https://github.com/adisbladis/vgo2nix) |  | ||||||
| [ |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/davecgh/go-spew"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/davecgh/go-spew"; |  | ||||||
|       rev = "v1.1.1"; |  | ||||||
|       sha256 = "0hka6hmyvp701adzag2g26cxdj47g21x6jz4sc6jjz1mn59d474y"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/gopherjs/gopherjs"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/gopherjs/gopherjs"; |  | ||||||
|       rev = "bd77b112433e"; |  | ||||||
|       sha256 = "0bsj69jb0glfvqhqld4c78840iagd0iy2b92878i5w4sgp40k7i1"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/konsorten/go-windows-terminal-sequences"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/konsorten/go-windows-terminal-sequences"; |  | ||||||
|       rev = "v1.0.2"; |  | ||||||
|       sha256 = "09mn209ika7ciy87xf2x31dq5fnqw39jidgaljvmqxwk7ff1hnx7"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/pmezard/go-difflib"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/pmezard/go-difflib"; |  | ||||||
|       rev = "v1.0.0"; |  | ||||||
|       sha256 = "0c1cn55m4rypmscgf0rrb88pn58j3ysvc2d0432dp3c6fqg6cnzw"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/sirupsen/logrus"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/sirupsen/logrus"; |  | ||||||
|       rev = "v1.4.1"; |  | ||||||
|       sha256 = "1m7ny9jkb98cxqhsp13xa5hnqh1s9f25x04q6arsala4zswsw33c"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/stretchr/objx"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/stretchr/objx"; |  | ||||||
|       rev = "v0.2.0"; |  | ||||||
|       sha256 = "0pcdvakxgddaiwcdj73ra4da05a3q4cgwbpm2w75ycq4kzv8ij8k"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "github.com/stretchr/testify"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/stretchr/testify"; |  | ||||||
|       rev = "v1.3.0"; |  | ||||||
|       sha256 = "0wjchp2c8xbgcbbq32w3kvblk6q6yn533g78nxl6iskq6y95lxsy"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "golang.org/x/crypto"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/golang/crypto"; |  | ||||||
|       rev = "df01cb2cc480549d72034218dd98bf97671450ac"; |  | ||||||
|       sha256 = "1fhz0rym06j0fds0wg8xf6i9mm37m6qgdv83qxfh3nh0mgzf19qs"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "golang.org/x/net"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/golang/net"; |  | ||||||
|       rev = "afa5a82059c6356159f699d81beff22a81842231"; |  | ||||||
|       sha256 = "1zhcr1m7n550m0lqjqg1rl2qrnghkl3a25vcm6cgpiqvk89f8lba"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "golang.org/x/sys"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/golang/sys"; |  | ||||||
|       rev = "e8e3143a4f4a00f1fafef0dd82ba78223281b01b"; |  | ||||||
|       sha256 = "02pdj4gr658r99kqwxy6v4lb8w2h0zaiqq1jyqrsxqiyapijhw87"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "golang.org/x/text"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/golang/text"; |  | ||||||
|       rev = "f4905fbd45b6790792202848439271c74074bbfd"; |  | ||||||
|       sha256 = "184d6ap2g92jvx0532lymdqbnx9vi9ips4dq5lnqbby0caccc6r1"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     goPackagePath = "golang.org/x/tools"; |  | ||||||
|     fetch = { |  | ||||||
|       type = "git"; |  | ||||||
|       url = "https://github.com/golang/tools"; |  | ||||||
|       rev = "aa740d4807891cb493e9f727901baf334b9fabce"; |  | ||||||
|       sha256 = "0431y2xw39dss0ldxhbmm7ip4d2cr2w9km2a5psgwan6v481kz0a"; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
| ] |  | ||||||
| @@ -12,6 +12,8 @@ buildPythonPackage rec { | |||||||
|     sha256 = "0wh2phg8h02a6vlpqd0widd6g8ng142vzmk8hpyx0bnwn2i45sjc"; |     sha256 = "0wh2phg8h02a6vlpqd0widd6g8ng142vzmk8hpyx0bnwn2i45sjc"; | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|  |   format = "setuptools"; | ||||||
|  |  | ||||||
|   doCheck = false; |   doCheck = false; | ||||||
|  |  | ||||||
|   meta = with lib; { |   meta = with lib; { | ||||||
|   | |||||||
| @@ -1,10 +1,6 @@ | |||||||
| { pkgs }: | { pkgs }: | ||||||
|  |  | ||||||
| rec { | rec { | ||||||
|   goModules = pkgs.recurseIntoAttrs rec { |  | ||||||
|     qt = pkgs.libsForQt5.callPackage ../development/go-modules/qt { }; |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
|   # A functional Jetbrains IDE-with-plugins package set. |   # A functional Jetbrains IDE-with-plugins package set. | ||||||
|   jetbrains = pkgs.dontRecurseIntoAttrs rec { |   jetbrains = pkgs.dontRecurseIntoAttrs rec { | ||||||
|     jetbrainsPluginsFor = variant: import ../top-level/jetbrains-plugins.nix { |     jetbrainsPluginsFor = variant: import ../top-level/jetbrains-plugins.nix { | ||||||
| @@ -29,33 +25,9 @@ rec { | |||||||
|     python3Packages = pkgs.python3Packages // python3Packages; |     python3Packages = pkgs.python3Packages // python3Packages; | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   picom-animations = pkgs.picom.overrideAttrs (_oldAttrs: { |  | ||||||
|     pname = "picom-animations"; |  | ||||||
|     src = pkgs.fetchFromGitHub { |  | ||||||
|       owner = "jonaburg"; |  | ||||||
|       repo = "picom"; |  | ||||||
|       rev = "d718c94"; |  | ||||||
|       sha256 = "165mc53ryyxn2ybkhikmk51ay3k18mvlsym3am3mgr8cpivmf2rm"; |  | ||||||
|     }; |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   polybar = pkgs.polybar.overrideAttrs (oldAttrs: { |  | ||||||
|     # Enables an extra button in formatting, indirectly allowing the use of |  | ||||||
|     # the mouse forward and backward buttons. |  | ||||||
|     patches = (oldAttrs.patches or [ ]) ++ [ ../applications/misc/polybar/9button.patch ]; |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   python3Packages = pkgs.recurseIntoAttrs { |   python3Packages = pkgs.recurseIntoAttrs { | ||||||
|     py-sonic = pkgs.python3.pkgs.callPackage ../development/python-modules/py-sonic { }; |     py-sonic = pkgs.python3.pkgs.callPackage ../development/python-modules/py-sonic { }; | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   # The one in Nixpkgs still extracts the pre-built Debian package instead |  | ||||||
|   # of building from source. |  | ||||||
|   protonmailBridgePackages = pkgs.libsForQt5.callPackage ../applications/networking/protonmail-bridge { |  | ||||||
|     inherit goModules; |  | ||||||
|   }; |  | ||||||
|   protonmail-bridge = protonmailBridgePackages.protonmail-bridge; |  | ||||||
|   protonmail-bridge-headless = protonmailBridgePackages.protonmail-bridge-headless; |  | ||||||
|  |  | ||||||
|   radeon-profile-daemon = pkgs.libsForQt5.callPackage ../tools/misc/radeon-profile-daemon { }; |   radeon-profile-daemon = pkgs.libsForQt5.callPackage ../tools/misc/radeon-profile-daemon { }; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user