Merge master into staging-next

authored by

github-actions[bot] and committed by
GitHub
85b57e44 bf6abede

+5971 -341
+5 -1
.github/CODEOWNERS
··· 94 94 /pkgs/applications/science/math/R @peti 95 95 /pkgs/development/r-modules @peti 96 96 97 + # Ruby 98 + /pkgs/development/interpreters/ruby @marsam 99 + /pkgs/development/ruby-modules @marsam 100 + 97 101 # Rust 98 102 /pkgs/development/compilers/rust @Mic92 @LnL7 @zowoq 99 103 /pkgs/build-support/rust @andir @danieldk @zowoq ··· 135 139 /pkgs/development/libraries/qt-5 @ttuegel 136 140 137 141 # PostgreSQL and related stuff 138 - /pkgs/servers/sql/postgresql @thoughtpolice 142 + /pkgs/servers/sql/postgresql @thoughtpolice @marsam 139 143 /nixos/modules/services/databases/postgresql.xml @thoughtpolice 140 144 /nixos/modules/services/databases/postgresql.nix @thoughtpolice 141 145 /nixos/tests/postgresql.nix @thoughtpolice
+10
nixos/doc/manual/release-notes/rl-2105.xml
··· 118 118 <xref linkend="opt-services.samba-wsdd.enable" /> Web Services Dynamic Discovery host daemon 119 119 </para> 120 120 </listitem> 121 + <listitem> 122 + <para> 123 + <link xlink:href="https://www.discourse.org/">Discourse</link>, a 124 + modern and open source discussion platform. 125 + </para> 126 + <para> 127 + See the <link linkend="module-services-discourse">Discourse 128 + section of the NixOS manual</link> for more information. 129 + </para> 130 + </listitem> 121 131 </itemizedlist> 122 132 123 133 </section>
+1
nixos/modules/module-list.nix
··· 897 897 ./services/web-apps/calibre-web.nix 898 898 ./services/web-apps/convos.nix 899 899 ./services/web-apps/cryptpad.nix 900 + ./services/web-apps/discourse.nix 900 901 ./services/web-apps/documize.nix 901 902 ./services/web-apps/dokuwiki.nix 902 903 ./services/web-apps/engelsystem.nix
+1 -1
nixos/modules/services/cluster/kubernetes/kubelet.nix
··· 266 266 gitMinimal 267 267 openssh 268 268 util-linux 269 - iproute 269 + iproute2 270 270 ethtool 271 271 thin-provisioning-tools 272 272 iptables
+11 -8
nixos/modules/services/misc/home-assistant.nix
··· 50 50 # List of components used in config 51 51 extraComponents = filter useComponent availableComponents; 52 52 53 - package = if (cfg.autoExtraComponents && cfg.config != null) 53 + testedPackage = if (cfg.autoExtraComponents && cfg.config != null) 54 54 then (cfg.package.override { inherit extraComponents; }) 55 55 else cfg.package; 56 + 57 + # overridePythonAttrs has to be applied after override 58 + package = testedPackage.overridePythonAttrs (oldAttrs: { 59 + doCheck = false; 60 + }); 56 61 57 62 # If you are changing this, please update the description in applyDefaultConfig 58 63 defaultConfig = { ··· 183 188 }; 184 189 185 190 package = mkOption { 186 - default = pkgs.home-assistant.overridePythonAttrs (oldAttrs: { 187 - doCheck = false; 188 - }); 191 + default = pkgs.home-assistant; 189 192 defaultText = literalExample '' 190 - pkgs.home-assistant.overridePythonAttrs (oldAttrs: { 191 - doCheck = false; 192 - }) 193 + pkgs.home-assistant 193 194 ''; 194 195 type = types.package; 195 196 example = literalExample '' ··· 198 199 } 199 200 ''; 200 201 description = '' 201 - Home Assistant package to use. By default the tests are disabled, as they take a considerable amout of time to complete. 202 + Home Assistant package to use. Tests are automatically disabled, as they take a considerable amout of time to complete. 202 203 Override <literal>extraPackages</literal> or <literal>extraComponents</literal> in order to add additional dependencies. 203 204 If you specify <option>config</option> and do not set <option>autoExtraComponents</option> 204 205 to <literal>false</literal>, overriding <literal>extraComponents</literal> will have no effect. 206 + Avoid <literal>home-assistant.overridePythonAttrs</literal> if you use 207 + <literal>autoExtraComponents</literal>. 205 208 ''; 206 209 }; 207 210
+1 -1
nixos/modules/services/networking/gvpe.nix
··· 27 27 text = '' 28 28 #! /bin/sh 29 29 30 - export PATH=$PATH:${pkgs.iproute}/sbin 30 + export PATH=$PATH:${pkgs.iproute2}/sbin 31 31 32 32 ip link set $IFNAME up 33 33 ip address add ${cfg.ipAddress} dev $IFNAME
+3 -3
nixos/modules/services/networking/libreswan.nix
··· 91 91 description = "Internet Key Exchange (IKE) Protocol Daemon for IPsec"; 92 92 path = [ 93 93 "${pkgs.libreswan}" 94 - "${pkgs.iproute}" 94 + "${pkgs.iproute2}" 95 95 "${pkgs.procps}" 96 96 "${pkgs.nssTools}" 97 97 "${pkgs.iptables}" ··· 115 115 ExecStart = "${libexec}/pluto --config ${configFile} --nofork \$PLUTO_OPTIONS"; 116 116 ExecStop = "${libexec}/whack --shutdown"; 117 117 ExecStopPost = [ 118 - "${pkgs.iproute}/bin/ip xfrm policy flush" 119 - "${pkgs.iproute}/bin/ip xfrm state flush" 118 + "${pkgs.iproute2}/bin/ip xfrm policy flush" 119 + "${pkgs.iproute2}/bin/ip xfrm state flush" 120 120 "${ipsec} --stopnflog" 121 121 ]; 122 122 ExecReload = "${libexec}/whack --listen";
+1 -1
nixos/modules/services/networking/mullvad-vpn.nix
··· 28 28 "systemd-resolved.service" 29 29 ]; 30 30 path = [ 31 - pkgs.iproute 31 + pkgs.iproute2 32 32 # Needed for ping 33 33 "/run/wrappers" 34 34 ];
+1 -1
nixos/modules/services/networking/nomad.nix
··· 119 119 path = cfg.extraPackages ++ (with pkgs; [ 120 120 # Client mode requires at least the following: 121 121 coreutils 122 - iproute 122 + iproute2 123 123 iptables 124 124 ]); 125 125
+1 -1
nixos/modules/services/networking/quagga.nix
··· 164 164 preStart = '' 165 165 install -m 0755 -o quagga -g quagga -d /run/quagga 166 166 167 - ${pkgs.iproute}/bin/ip route flush proto zebra 167 + ${pkgs.iproute2}/bin/ip route flush proto zebra 168 168 ''; 169 169 } 170 170 else
+2 -2
nixos/modules/services/networking/rxe.nix
··· 39 39 Type = "oneshot"; 40 40 RemainAfterExit = true; 41 41 ExecStart = map ( x: 42 - "${pkgs.iproute}/bin/rdma link add rxe_${x} type rxe netdev ${x}" 42 + "${pkgs.iproute2}/bin/rdma link add rxe_${x} type rxe netdev ${x}" 43 43 ) cfg.interfaces; 44 44 45 45 ExecStop = map ( x: 46 - "${pkgs.iproute}/bin/rdma link delete rxe_${x}" 46 + "${pkgs.iproute2}/bin/rdma link delete rxe_${x}" 47 47 ) cfg.interfaces; 48 48 }; 49 49 };
+4 -4
nixos/modules/services/networking/wg-quick.nix
··· 57 57 58 58 preUp = mkOption { 59 59 example = literalExample '' 60 - ${pkgs.iproute}/bin/ip netns add foo 60 + ${pkgs.iproute2}/bin/ip netns add foo 61 61 ''; 62 62 default = ""; 63 63 type = with types; coercedTo (listOf str) (concatStringsSep "\n") lines; ··· 68 68 69 69 preDown = mkOption { 70 70 example = literalExample '' 71 - ${pkgs.iproute}/bin/ip netns del foo 71 + ${pkgs.iproute2}/bin/ip netns del foo 72 72 ''; 73 73 default = ""; 74 74 type = with types; coercedTo (listOf str) (concatStringsSep "\n") lines; ··· 79 79 80 80 postUp = mkOption { 81 81 example = literalExample '' 82 - ${pkgs.iproute}/bin/ip netns add foo 82 + ${pkgs.iproute2}/bin/ip netns add foo 83 83 ''; 84 84 default = ""; 85 85 type = with types; coercedTo (listOf str) (concatStringsSep "\n") lines; ··· 90 90 91 91 postDown = mkOption { 92 92 example = literalExample '' 93 - ${pkgs.iproute}/bin/ip netns del foo 93 + ${pkgs.iproute2}/bin/ip netns del foo 94 94 ''; 95 95 default = ""; 96 96 type = with types; coercedTo (listOf str) (concatStringsSep "\n") lines;
+1 -1
nixos/modules/services/system/cloud-init.nix
··· 5 5 let cfg = config.services.cloud-init; 6 6 path = with pkgs; [ 7 7 cloud-init 8 - iproute 8 + iproute2 9 9 nettools 10 10 openssh 11 11 shadow
+1035
nixos/modules/services/web-apps/discourse.nix
··· 1 + { config, options, lib, pkgs, utils, ... }: 2 + 3 + let 4 + json = pkgs.formats.json {}; 5 + 6 + cfg = config.services.discourse; 7 + 8 + postgresqlPackage = if config.services.postgresql.enable then 9 + config.services.postgresql.package 10 + else 11 + pkgs.postgresql; 12 + 13 + # We only want to create a database if we're actually going to connect to it. 14 + databaseActuallyCreateLocally = cfg.database.createLocally && cfg.database.host == null; 15 + 16 + tlsEnabled = (cfg.enableACME 17 + || cfg.sslCertificate != null 18 + || cfg.sslCertificateKey != null); 19 + in 20 + { 21 + options = { 22 + services.discourse = { 23 + enable = lib.mkEnableOption "Discourse, an open source discussion platform"; 24 + 25 + package = lib.mkOption { 26 + type = lib.types.package; 27 + default = pkgs.discourse; 28 + defaultText = "pkgs.discourse"; 29 + description = '' 30 + The discourse package to use. 31 + ''; 32 + }; 33 + 34 + hostname = lib.mkOption { 35 + type = lib.types.str; 36 + default = if config.networking.domain != null then 37 + config.networking.fqdn 38 + else 39 + config.networking.hostName; 40 + defaultText = "config.networking.fqdn"; 41 + example = "discourse.example.com"; 42 + description = '' 43 + The hostname to serve Discourse on. 44 + ''; 45 + }; 46 + 47 + secretKeyBaseFile = lib.mkOption { 48 + type = with lib.types; nullOr path; 49 + default = null; 50 + example = "/run/keys/secret_key_base"; 51 + description = '' 52 + The path to a file containing the 53 + <literal>secret_key_base</literal> secret. 54 + 55 + Discourse uses <literal>secret_key_base</literal> to encrypt 56 + the cookie store, which contains session data, and to digest 57 + user auth tokens. 58 + 59 + Needs to be a 64 byte long string of hexadecimal 60 + characters. You can generate one by running 61 + 62 + <screen> 63 + <prompt>$ </prompt>openssl rand -hex 64 >/path/to/secret_key_base_file 64 + </screen> 65 + 66 + This should be a string, not a nix path, since nix paths are 67 + copied into the world-readable nix store. 68 + ''; 69 + }; 70 + 71 + sslCertificate = lib.mkOption { 72 + type = with lib.types; nullOr path; 73 + default = null; 74 + example = "/run/keys/ssl.cert"; 75 + description = '' 76 + The path to the server SSL certificate. Set this to enable 77 + SSL. 78 + ''; 79 + }; 80 + 81 + sslCertificateKey = lib.mkOption { 82 + type = with lib.types; nullOr path; 83 + default = null; 84 + example = "/run/keys/ssl.key"; 85 + description = '' 86 + The path to the server SSL certificate key. Set this to 87 + enable SSL. 88 + ''; 89 + }; 90 + 91 + enableACME = lib.mkOption { 92 + type = lib.types.bool; 93 + default = cfg.sslCertificate == null && cfg.sslCertificateKey == null; 94 + defaultText = "true, unless services.discourse.sslCertificate and services.discourse.sslCertificateKey are set."; 95 + description = '' 96 + Whether an ACME certificate should be used to secure 97 + connections to the server. 98 + ''; 99 + }; 100 + 101 + backendSettings = lib.mkOption { 102 + type = with lib.types; attrsOf (nullOr (oneOf [ str int bool float ])); 103 + default = {}; 104 + example = lib.literalExample '' 105 + { 106 + max_reqs_per_ip_per_minute = 300; 107 + max_reqs_per_ip_per_10_seconds = 60; 108 + max_asset_reqs_per_ip_per_10_seconds = 250; 109 + max_reqs_per_ip_mode = "warn+block"; 110 + }; 111 + ''; 112 + description = '' 113 + Additional settings to put in the 114 + <filename>discourse.conf</filename> file. 115 + 116 + Look in the 117 + <link xlink:href="https://github.com/discourse/discourse/blob/master/config/discourse_defaults.conf">discourse_defaults.conf</link> 118 + file in the upstream distribution to find available options. 119 + 120 + Setting an option to <literal>null</literal> means 121 + <quote>define variable, but leave right-hand side 122 + empty</quote>. 123 + ''; 124 + }; 125 + 126 + siteSettings = lib.mkOption { 127 + type = json.type; 128 + default = {}; 129 + example = lib.literalExample '' 130 + { 131 + required = { 132 + title = "My Cats"; 133 + site_description = "Discuss My Cats (and be nice plz)"; 134 + }; 135 + login = { 136 + enable_github_logins = true; 137 + github_client_id = "a2f6dfe838cb3206ce20"; 138 + github_client_secret._secret = /run/keys/discourse_github_client_secret; 139 + }; 140 + }; 141 + ''; 142 + description = '' 143 + Discourse site settings. These are the settings that can be 144 + changed from the UI. This only defines their default values: 145 + they can still be overridden from the UI. 146 + 147 + Available settings can be found by looking in the 148 + <link xlink:href="https://github.com/discourse/discourse/blob/master/config/site_settings.yml">site_settings.yml</link> 149 + file of the upstream distribution. To find a setting's path, 150 + you only need to care about the first two levels; i.e. its 151 + category and name. See the example. 152 + 153 + Settings containing secret data should be set to an 154 + attribute set containing the attribute 155 + <literal>_secret</literal> - a string pointing to a file 156 + containing the value the option should be set to. See the 157 + example to get a better picture of this: in the resulting 158 + <filename>config/nixos_site_settings.json</filename> file, 159 + the <literal>login.github_client_secret</literal> key will 160 + be set to the contents of the 161 + <filename>/run/keys/discourse_github_client_secret</filename> 162 + file. 163 + ''; 164 + }; 165 + 166 + admin = { 167 + email = lib.mkOption { 168 + type = lib.types.str; 169 + example = "admin@example.com"; 170 + description = '' 171 + The admin user email address. 172 + ''; 173 + }; 174 + 175 + username = lib.mkOption { 176 + type = lib.types.str; 177 + example = "admin"; 178 + description = '' 179 + The admin user username. 180 + ''; 181 + }; 182 + 183 + fullName = lib.mkOption { 184 + type = lib.types.str; 185 + description = '' 186 + The admin user's full name. 187 + ''; 188 + }; 189 + 190 + passwordFile = lib.mkOption { 191 + type = lib.types.path; 192 + description = '' 193 + A path to a file containing the admin user's password. 194 + 195 + This should be a string, not a nix path, since nix paths are 196 + copied into the world-readable nix store. 197 + ''; 198 + }; 199 + }; 200 + 201 + nginx.enable = lib.mkOption { 202 + type = lib.types.bool; 203 + default = true; 204 + description = '' 205 + Whether an <literal>nginx</literal> virtual host should be 206 + set up to serve Discourse. Only disable if you're planning 207 + to use a different web server, which is not recommended. 208 + ''; 209 + }; 210 + 211 + database = { 212 + pool = lib.mkOption { 213 + type = lib.types.int; 214 + default = 8; 215 + description = '' 216 + Database connection pool size. 217 + ''; 218 + }; 219 + 220 + host = lib.mkOption { 221 + type = with lib.types; nullOr str; 222 + default = null; 223 + description = '' 224 + Discourse database hostname. <literal>null</literal> means <quote>prefer 225 + local unix socket connection</quote>. 226 + ''; 227 + }; 228 + 229 + passwordFile = lib.mkOption { 230 + type = with lib.types; nullOr path; 231 + default = null; 232 + description = '' 233 + File containing the Discourse database user password. 234 + 235 + This should be a string, not a nix path, since nix paths are 236 + copied into the world-readable nix store. 237 + ''; 238 + }; 239 + 240 + createLocally = lib.mkOption { 241 + type = lib.types.bool; 242 + default = true; 243 + description = '' 244 + Whether a database should be automatically created on the 245 + local host. Set this to <literal>false</literal> if you plan 246 + on provisioning a local database yourself. This has no effect 247 + if <option>services.discourse.database.host</option> is customized. 248 + ''; 249 + }; 250 + 251 + name = lib.mkOption { 252 + type = lib.types.str; 253 + default = "discourse"; 254 + description = '' 255 + Discourse database name. 256 + ''; 257 + }; 258 + 259 + username = lib.mkOption { 260 + type = lib.types.str; 261 + default = "discourse"; 262 + description = '' 263 + Discourse database user. 264 + ''; 265 + }; 266 + }; 267 + 268 + redis = { 269 + host = lib.mkOption { 270 + type = lib.types.str; 271 + default = "localhost"; 272 + description = '' 273 + Redis server hostname. 274 + ''; 275 + }; 276 + 277 + passwordFile = lib.mkOption { 278 + type = with lib.types; nullOr path; 279 + default = null; 280 + description = '' 281 + File containing the Redis password. 282 + 283 + This should be a string, not a nix path, since nix paths are 284 + copied into the world-readable nix store. 285 + ''; 286 + }; 287 + 288 + dbNumber = lib.mkOption { 289 + type = lib.types.int; 290 + default = 0; 291 + description = '' 292 + Redis database number. 293 + ''; 294 + }; 295 + 296 + useSSL = lib.mkOption { 297 + type = lib.types.bool; 298 + default = cfg.redis.host != "localhost"; 299 + description = '' 300 + Connect to Redis with SSL. 301 + ''; 302 + }; 303 + }; 304 + 305 + mail = { 306 + notificationEmailAddress = lib.mkOption { 307 + type = lib.types.str; 308 + default = "${if cfg.mail.incoming.enable then "notifications" else "noreply"}@${cfg.hostname}"; 309 + defaultText = '' 310 + "notifications@`config.services.discourse.hostname`" if 311 + config.services.discourse.mail.incoming.enable is "true", 312 + otherwise "noreply`config.services.discourse.hostname`" 313 + ''; 314 + description = '' 315 + The <literal>from:</literal> email address used when 316 + sending all essential system emails. The domain specified 317 + here must have SPF, DKIM and reverse PTR records set 318 + correctly for email to arrive. 319 + ''; 320 + }; 321 + 322 + contactEmailAddress = lib.mkOption { 323 + type = lib.types.str; 324 + default = ""; 325 + description = '' 326 + Email address of key contact responsible for this 327 + site. Used for critical notifications, as well as on the 328 + <literal>/about</literal> contact form for urgent matters. 329 + ''; 330 + }; 331 + 332 + outgoing = { 333 + serverAddress = lib.mkOption { 334 + type = lib.types.str; 335 + default = "localhost"; 336 + description = '' 337 + The address of the SMTP server Discourse should use to 338 + send email. 339 + ''; 340 + }; 341 + 342 + port = lib.mkOption { 343 + type = lib.types.int; 344 + default = 25; 345 + description = '' 346 + The port of the SMTP server Discourse should use to 347 + send email. 348 + ''; 349 + }; 350 + 351 + username = lib.mkOption { 352 + type = with lib.types; nullOr str; 353 + default = null; 354 + description = '' 355 + The username of the SMTP server. 356 + ''; 357 + }; 358 + 359 + passwordFile = lib.mkOption { 360 + type = lib.types.nullOr lib.types.path; 361 + default = null; 362 + description = '' 363 + A file containing the password of the SMTP server account. 364 + 365 + This should be a string, not a nix path, since nix paths 366 + are copied into the world-readable nix store. 367 + ''; 368 + }; 369 + 370 + domain = lib.mkOption { 371 + type = lib.types.str; 372 + default = cfg.hostname; 373 + description = '' 374 + HELO domain to use for outgoing mail. 375 + ''; 376 + }; 377 + 378 + authentication = lib.mkOption { 379 + type = with lib.types; nullOr (enum ["plain" "login" "cram_md5"]); 380 + default = null; 381 + description = '' 382 + Authentication type to use, see http://api.rubyonrails.org/classes/ActionMailer/Base.html 383 + ''; 384 + }; 385 + 386 + enableStartTLSAuto = lib.mkOption { 387 + type = lib.types.bool; 388 + default = true; 389 + description = '' 390 + Whether to try to use StartTLS. 391 + ''; 392 + }; 393 + 394 + opensslVerifyMode = lib.mkOption { 395 + type = lib.types.str; 396 + default = "peer"; 397 + description = '' 398 + How OpenSSL checks the certificate, see http://api.rubyonrails.org/classes/ActionMailer/Base.html 399 + ''; 400 + }; 401 + }; 402 + 403 + incoming = { 404 + enable = lib.mkOption { 405 + type = lib.types.bool; 406 + default = false; 407 + description = '' 408 + Whether to set up Postfix to receive incoming mail. 409 + ''; 410 + }; 411 + 412 + replyEmailAddress = lib.mkOption { 413 + type = lib.types.str; 414 + default = "%{reply_key}@${cfg.hostname}"; 415 + defaultText = "%{reply_key}@`config.services.discourse.hostname`"; 416 + description = '' 417 + Template for reply by email incoming email address, for 418 + example: %{reply_key}@reply.example.com or 419 + replies+%{reply_key}@example.com 420 + ''; 421 + }; 422 + 423 + mailReceiverPackage = lib.mkOption { 424 + type = lib.types.package; 425 + default = pkgs.discourse-mail-receiver; 426 + defaultText = "pkgs.discourse-mail-receiver"; 427 + description = '' 428 + The discourse-mail-receiver package to use. 429 + ''; 430 + }; 431 + 432 + apiKeyFile = lib.mkOption { 433 + type = lib.types.nullOr lib.types.path; 434 + default = null; 435 + description = '' 436 + A file containing the Discourse API key used to add 437 + posts and messages from mail. If left at its default 438 + value <literal>null</literal>, one will be automatically 439 + generated. 440 + 441 + This should be a string, not a nix path, since nix paths 442 + are copied into the world-readable nix store. 443 + ''; 444 + }; 445 + }; 446 + }; 447 + 448 + plugins = lib.mkOption { 449 + type = lib.types.listOf lib.types.package; 450 + default = []; 451 + example = '' 452 + [ 453 + (pkgs.fetchFromGitHub { 454 + owner = "discourse"; 455 + repo = "discourse-spoiler-alert"; 456 + rev = "e200cfa571d252cab63f3d30d619b370986e4cee"; 457 + sha256 = "0ya69ix5g77wz4c9x9gmng6l25ghb5xxlx3icr6jam16q14dzc33"; 458 + }) 459 + ]; 460 + ''; 461 + description = '' 462 + <productname>Discourse</productname> plugins to install as a 463 + list of derivations. As long as a plugin supports the 464 + standard install method, packaging it should only require 465 + fetching its source with an appropriate fetcher. 466 + ''; 467 + }; 468 + 469 + sidekiqProcesses = lib.mkOption { 470 + type = lib.types.int; 471 + default = 1; 472 + description = '' 473 + How many Sidekiq processes should be spawned. 474 + ''; 475 + }; 476 + 477 + unicornTimeout = lib.mkOption { 478 + type = lib.types.int; 479 + default = 30; 480 + description = '' 481 + Time in seconds before a request to Unicorn times out. 482 + 483 + This can be raised if the system Discourse is running on is 484 + too slow to handle many requests within 30 seconds. 485 + ''; 486 + }; 487 + }; 488 + }; 489 + 490 + config = lib.mkIf cfg.enable { 491 + assertions = [ 492 + { 493 + assertion = (cfg.database.host != null) -> (cfg.database.passwordFile != null); 494 + message = "When services.gitlab.database.host is customized, services.discourse.database.passwordFile must be set!"; 495 + } 496 + { 497 + assertion = cfg.hostname != ""; 498 + message = "Could not automatically determine hostname, set service.discourse.hostname manually."; 499 + } 500 + ]; 501 + 502 + 503 + # Default config values are from `config/discourse_defaults.conf` 504 + # upstream. 505 + services.discourse.backendSettings = lib.mapAttrs (_: lib.mkDefault) { 506 + db_pool = cfg.database.pool; 507 + db_timeout = 5000; 508 + db_connect_timeout = 5; 509 + db_socket = null; 510 + db_host = cfg.database.host; 511 + db_backup_host = null; 512 + db_port = null; 513 + db_backup_port = 5432; 514 + db_name = cfg.database.name; 515 + db_username = if databaseActuallyCreateLocally then "discourse" else cfg.database.username; 516 + db_password = cfg.database.passwordFile; 517 + db_prepared_statements = false; 518 + db_replica_host = null; 519 + db_replica_port = null; 520 + db_advisory_locks = true; 521 + 522 + inherit (cfg) hostname; 523 + backup_hostname = null; 524 + 525 + smtp_address = cfg.mail.outgoing.serverAddress; 526 + smtp_port = cfg.mail.outgoing.port; 527 + smtp_domain = cfg.mail.outgoing.domain; 528 + smtp_user_name = cfg.mail.outgoing.username; 529 + smtp_password = cfg.mail.outgoing.passwordFile; 530 + smtp_authentication = cfg.mail.outgoing.authentication; 531 + smtp_enable_start_tls = cfg.mail.outgoing.enableStartTLSAuto; 532 + smtp_openssl_verify_mode = cfg.mail.outgoing.opensslVerifyMode; 533 + 534 + load_mini_profiler = true; 535 + mini_profiler_snapshots_period = 0; 536 + mini_profiler_snapshots_transport_url = null; 537 + mini_profiler_snapshots_transport_auth_key = null; 538 + 539 + cdn_url = null; 540 + cdn_origin_hostname = null; 541 + developer_emails = null; 542 + 543 + redis_host = cfg.redis.host; 544 + redis_port = 6379; 545 + redis_slave_host = null; 546 + redis_slave_port = 6379; 547 + redis_db = cfg.redis.dbNumber; 548 + redis_password = cfg.redis.passwordFile; 549 + redis_skip_client_commands = false; 550 + redis_use_ssl = cfg.redis.useSSL; 551 + 552 + message_bus_redis_enabled = false; 553 + message_bus_redis_host = "localhost"; 554 + message_bus_redis_port = 6379; 555 + message_bus_redis_slave_host = null; 556 + message_bus_redis_slave_port = 6379; 557 + message_bus_redis_db = 0; 558 + message_bus_redis_password = null; 559 + message_bus_redis_skip_client_commands = false; 560 + 561 + enable_cors = false; 562 + cors_origin = ""; 563 + serve_static_assets = false; 564 + sidekiq_workers = 5; 565 + rtl_css = false; 566 + connection_reaper_age = 30; 567 + connection_reaper_interval = 30; 568 + relative_url_root = null; 569 + message_bus_max_backlog_size = 100; 570 + secret_key_base = cfg.secretKeyBaseFile; 571 + fallback_assets_path = null; 572 + 573 + s3_bucket = null; 574 + s3_region = null; 575 + s3_access_key_id = null; 576 + s3_secret_access_key = null; 577 + s3_use_iam_profile = null; 578 + s3_cdn_url = null; 579 + s3_endpoint = null; 580 + s3_http_continue_timeout = null; 581 + s3_install_cors_rule = null; 582 + 583 + max_user_api_reqs_per_minute = 20; 584 + max_user_api_reqs_per_day = 2880; 585 + max_admin_api_reqs_per_key_per_minute = 60; 586 + max_reqs_per_ip_per_minute = 200; 587 + max_reqs_per_ip_per_10_seconds = 50; 588 + max_asset_reqs_per_ip_per_10_seconds = 200; 589 + max_reqs_per_ip_mode = "block"; 590 + max_reqs_rate_limit_on_private = false; 591 + force_anonymous_min_queue_seconds = 1; 592 + force_anonymous_min_per_10_seconds = 3; 593 + background_requests_max_queue_length = 0.5; 594 + reject_message_bus_queue_seconds = 0.1; 595 + disable_search_queue_threshold = 1; 596 + max_old_rebakes_per_15_minutes = 300; 597 + max_logster_logs = 1000; 598 + refresh_maxmind_db_during_precompile_days = 2; 599 + maxmind_backup_path = null; 600 + maxmind_license_key = null; 601 + enable_performance_http_headers = false; 602 + enable_js_error_reporting = true; 603 + mini_scheduler_workers = 5; 604 + compress_anon_cache = false; 605 + anon_cache_store_threshold = 2; 606 + allowed_theme_repos = null; 607 + enable_email_sync_demon = false; 608 + max_digests_enqueued_per_30_mins_per_site = 10000; 609 + }; 610 + 611 + services.redis.enable = lib.mkDefault (cfg.redis.host == "localhost"); 612 + 613 + services.postgresql = lib.mkIf databaseActuallyCreateLocally { 614 + enable = true; 615 + ensureUsers = [{ name = "discourse"; }]; 616 + }; 617 + 618 + # The postgresql module doesn't currently support concepts like 619 + # objects owners and extensions; for now we tack on what's needed 620 + # here. 621 + systemd.services.discourse-postgresql = 622 + let 623 + pgsql = config.services.postgresql; 624 + in 625 + lib.mkIf databaseActuallyCreateLocally { 626 + after = [ "postgresql.service" ]; 627 + bindsTo = [ "postgresql.service" ]; 628 + wantedBy = [ "discourse.service" ]; 629 + partOf = [ "discourse.service" ]; 630 + path = [ 631 + pgsql.package 632 + ]; 633 + script = '' 634 + set -o errexit -o pipefail -o nounset -o errtrace 635 + shopt -s inherit_errexit 636 + 637 + psql -tAc "SELECT 1 FROM pg_database WHERE datname = 'discourse'" | grep -q 1 || psql -tAc 'CREATE DATABASE "discourse" OWNER "discourse"' 638 + psql '${cfg.database.name}' -tAc "CREATE EXTENSION IF NOT EXISTS pg_trgm" 639 + psql '${cfg.database.name}' -tAc "CREATE EXTENSION IF NOT EXISTS hstore" 640 + ''; 641 + 642 + serviceConfig = { 643 + User = pgsql.superUser; 644 + Type = "oneshot"; 645 + RemainAfterExit = true; 646 + }; 647 + }; 648 + 649 + systemd.services.discourse = { 650 + wantedBy = [ "multi-user.target" ]; 651 + after = [ 652 + "redis.service" 653 + "postgresql.service" 654 + "discourse-postgresql.service" 655 + ]; 656 + bindsTo = [ 657 + "redis.service" 658 + ] ++ lib.optionals (cfg.database.host == null) [ 659 + "postgresql.service" 660 + "discourse-postgresql.service" 661 + ]; 662 + path = cfg.package.runtimeDeps ++ [ 663 + postgresqlPackage 664 + pkgs.replace 665 + cfg.package.rake 666 + ]; 667 + environment = cfg.package.runtimeEnv // { 668 + UNICORN_TIMEOUT = builtins.toString cfg.unicornTimeout; 669 + UNICORN_SIDEKIQS = builtins.toString cfg.sidekiqProcesses; 670 + }; 671 + 672 + preStart = 673 + let 674 + discourseKeyValue = lib.generators.toKeyValue { 675 + mkKeyValue = lib.flip lib.generators.mkKeyValueDefault " = " { 676 + mkValueString = v: with builtins; 677 + if isInt v then toString v 678 + else if isString v then ''"${v}"'' 679 + else if true == v then "true" 680 + else if false == v then "false" 681 + else if null == v then "" 682 + else if isFloat v then lib.strings.floatToString v 683 + else throw "unsupported type ${typeOf v}: ${(lib.generators.toPretty {}) v}"; 684 + }; 685 + }; 686 + 687 + discourseConf = pkgs.writeText "discourse.conf" (discourseKeyValue cfg.backendSettings); 688 + 689 + mkSecretReplacement = file: 690 + lib.optionalString (file != null) '' 691 + ( 692 + password=$(<'${file}') 693 + replace-literal -fe '${file}' "$password" /run/discourse/config/discourse.conf 694 + ) 695 + ''; 696 + in '' 697 + set -o errexit -o pipefail -o nounset -o errtrace 698 + shopt -s inherit_errexit 699 + 700 + umask u=rwx,g=rx,o= 701 + 702 + cp -r ${cfg.package}/share/discourse/config.dist/* /run/discourse/config/ 703 + cp -r ${cfg.package}/share/discourse/public.dist/* /run/discourse/public/ 704 + cp -r ${cfg.package}/share/discourse/plugins.dist/* /run/discourse/plugins/ 705 + ${lib.concatMapStrings (p: "ln -sf ${p} /run/discourse/plugins/") cfg.plugins} 706 + ln -sf /var/lib/discourse/uploads /run/discourse/public/uploads 707 + ln -sf /var/lib/discourse/backups /run/discourse/public/backups 708 + 709 + ( 710 + umask u=rwx,g=,o= 711 + 712 + ${utils.genJqSecretsReplacementSnippet 713 + cfg.siteSettings 714 + "/run/discourse/config/nixos_site_settings.json" 715 + } 716 + install -T -m 0400 -o discourse ${discourseConf} /run/discourse/config/discourse.conf 717 + ${mkSecretReplacement cfg.database.passwordFile} 718 + ${mkSecretReplacement cfg.mail.outgoing.passwordFile} 719 + ${mkSecretReplacement cfg.redis.passwordFile} 720 + ${mkSecretReplacement cfg.secretKeyBaseFile} 721 + ) 722 + 723 + discourse-rake db:migrate >>/var/log/discourse/db_migration.log 724 + chmod -R u+w /run/discourse/tmp/ 725 + 726 + export ADMIN_EMAIL="${cfg.admin.email}" 727 + export ADMIN_NAME="${cfg.admin.fullName}" 728 + export ADMIN_USERNAME="${cfg.admin.username}" 729 + export ADMIN_PASSWORD="$(<${cfg.admin.passwordFile})" 730 + discourse-rake admin:create_noninteractively 731 + 732 + discourse-rake themes:update 733 + discourse-rake uploads:regenerate_missing_optimized 734 + ''; 735 + 736 + serviceConfig = { 737 + Type = "simple"; 738 + User = "discourse"; 739 + Group = "discourse"; 740 + RuntimeDirectory = map (p: "discourse/" + p) [ 741 + "config" 742 + "home" 743 + "tmp" 744 + "assets/javascripts/plugins" 745 + "public" 746 + "plugins" 747 + "sockets" 748 + ]; 749 + RuntimeDirectoryMode = 0750; 750 + StateDirectory = map (p: "discourse/" + p) [ 751 + "uploads" 752 + "backups" 753 + ]; 754 + StateDirectoryMode = 0750; 755 + LogsDirectory = "discourse"; 756 + TimeoutSec = "infinity"; 757 + Restart = "on-failure"; 758 + WorkingDirectory = "${cfg.package}/share/discourse"; 759 + 760 + RemoveIPC = true; 761 + PrivateTmp = true; 762 + NoNewPrivileges = true; 763 + RestrictSUIDSGID = true; 764 + ProtectSystem = "strict"; 765 + ProtectHome = "read-only"; 766 + 767 + ExecStart = "${cfg.package.rubyEnv}/bin/bundle exec config/unicorn_launcher -E production -c config/unicorn.conf.rb"; 768 + }; 769 + }; 770 + 771 + services.nginx = lib.mkIf cfg.nginx.enable { 772 + enable = true; 773 + additionalModules = [ pkgs.nginxModules.brotli ]; 774 + 775 + recommendedTlsSettings = true; 776 + recommendedOptimisation = true; 777 + recommendedGzipSettings = true; 778 + recommendedProxySettings = true; 779 + 780 + upstreams.discourse.servers."unix:/run/discourse/sockets/unicorn.sock" = {}; 781 + 782 + appendHttpConfig = '' 783 + # inactive means we keep stuff around for 1440m minutes regardless of last access (1 week) 784 + # levels means it is a 2 deep heirarchy cause we can have lots of files 785 + # max_size limits the size of the cache 786 + proxy_cache_path /var/cache/nginx inactive=1440m levels=1:2 keys_zone=discourse:10m max_size=600m; 787 + 788 + # see: https://meta.discourse.org/t/x/74060 789 + proxy_buffer_size 8k; 790 + ''; 791 + 792 + virtualHosts.${cfg.hostname} = { 793 + inherit (cfg) sslCertificate sslCertificateKey enableACME; 794 + forceSSL = lib.mkDefault tlsEnabled; 795 + 796 + root = "/run/discourse/public"; 797 + 798 + locations = 799 + let 800 + proxy = { extraConfig ? "" }: { 801 + proxyPass = "http://discourse"; 802 + extraConfig = extraConfig + '' 803 + proxy_set_header X-Request-Start "t=''${msec}"; 804 + ''; 805 + }; 806 + cache = time: '' 807 + expires ${time}; 808 + add_header Cache-Control public,immutable; 809 + ''; 810 + cache_1y = cache "1y"; 811 + cache_1d = cache "1d"; 812 + in 813 + { 814 + "/".tryFiles = "$uri @discourse"; 815 + "@discourse" = proxy {}; 816 + "^~ /backups/".extraConfig = '' 817 + internal; 818 + ''; 819 + "/favicon.ico" = { 820 + return = "204"; 821 + extraConfig = '' 822 + access_log off; 823 + log_not_found off; 824 + ''; 825 + }; 826 + "~ ^/uploads/short-url/" = proxy {}; 827 + "~ ^/secure-media-uploads/" = proxy {}; 828 + "~* (fonts|assets|plugins|uploads)/.*\.(eot|ttf|woff|woff2|ico|otf)$".extraConfig = cache_1y + '' 829 + add_header Access-Control-Allow-Origin *; 830 + ''; 831 + "/srv/status" = proxy { 832 + extraConfig = '' 833 + access_log off; 834 + log_not_found off; 835 + ''; 836 + }; 837 + "~ ^/javascripts/".extraConfig = cache_1d; 838 + "~ ^/assets/(?<asset_path>.+)$".extraConfig = cache_1y + '' 839 + # asset pipeline enables this 840 + brotli_static on; 841 + gzip_static on; 842 + ''; 843 + "~ ^/plugins/".extraConfig = cache_1y; 844 + "~ /images/emoji/".extraConfig = cache_1y; 845 + "~ ^/uploads/" = proxy { 846 + extraConfig = cache_1y + '' 847 + proxy_set_header X-Sendfile-Type X-Accel-Redirect; 848 + proxy_set_header X-Accel-Mapping /run/discourse/public/=/downloads/; 849 + 850 + # custom CSS 851 + location ~ /stylesheet-cache/ { 852 + try_files $uri =404; 853 + } 854 + # this allows us to bypass rails 855 + location ~* \.(gif|png|jpg|jpeg|bmp|tif|tiff|ico|webp)$ { 856 + try_files $uri =404; 857 + } 858 + # SVG needs an extra header attached 859 + location ~* \.(svg)$ { 860 + } 861 + # thumbnails & optimized images 862 + location ~ /_?optimized/ { 863 + try_files $uri =404; 864 + } 865 + ''; 866 + }; 867 + "~ ^/admin/backups/" = proxy { 868 + extraConfig = '' 869 + proxy_set_header X-Sendfile-Type X-Accel-Redirect; 870 + proxy_set_header X-Accel-Mapping /run/discourse/public/=/downloads/; 871 + ''; 872 + }; 873 + "~ ^/(svg-sprite/|letter_avatar/|letter_avatar_proxy/|user_avatar|highlight-js|stylesheets|theme-javascripts|favicon/proxied|service-worker)" = proxy { 874 + extraConfig = '' 875 + # if Set-Cookie is in the response nothing gets cached 876 + # this is double bad cause we are not passing last modified in 877 + proxy_ignore_headers "Set-Cookie"; 878 + proxy_hide_header "Set-Cookie"; 879 + proxy_hide_header "X-Discourse-Username"; 880 + proxy_hide_header "X-Runtime"; 881 + 882 + # note x-accel-redirect can not be used with proxy_cache 883 + proxy_cache discourse; 884 + proxy_cache_key "$scheme,$host,$request_uri"; 885 + proxy_cache_valid 200 301 302 7d; 886 + proxy_cache_valid any 1m; 887 + ''; 888 + }; 889 + "/message-bus/" = proxy { 890 + extraConfig = '' 891 + proxy_http_version 1.1; 892 + proxy_buffering off; 893 + ''; 894 + }; 895 + "/downloads/".extraConfig = '' 896 + internal; 897 + alias /run/discourse/public/; 898 + ''; 899 + }; 900 + }; 901 + }; 902 + 903 + systemd.services.discourse-mail-receiver-setup = lib.mkIf cfg.mail.incoming.enable ( 904 + let 905 + mail-receiver-environment = { 906 + MAIL_DOMAIN = cfg.hostname; 907 + DISCOURSE_BASE_URL = "http${lib.optionalString tlsEnabled "s"}://${cfg.hostname}"; 908 + DISCOURSE_API_KEY = "@api-key@"; 909 + DISCOURSE_API_USERNAME = "system"; 910 + }; 911 + mail-receiver-json = json.generate "mail-receiver.json" mail-receiver-environment; 912 + in 913 + { 914 + before = [ "postfix.service" ]; 915 + after = [ "discourse.service" ]; 916 + wantedBy = [ "discourse.service" ]; 917 + partOf = [ "discourse.service" ]; 918 + path = [ 919 + cfg.package.rake 920 + pkgs.jq 921 + ]; 922 + preStart = lib.optionalString (cfg.mail.incoming.apiKeyFile == null) '' 923 + set -o errexit -o pipefail -o nounset -o errtrace 924 + shopt -s inherit_errexit 925 + 926 + if [[ ! -e /var/lib/discourse-mail-receiver/api_key ]]; then 927 + discourse-rake api_key:create_master[email-receiver] >/var/lib/discourse-mail-receiver/api_key 928 + fi 929 + ''; 930 + script = 931 + let 932 + apiKeyPath = 933 + if cfg.mail.incoming.apiKeyFile == null then 934 + "/var/lib/discourse-mail-receiver/api_key" 935 + else 936 + cfg.mail.incoming.apiKeyFile; 937 + in '' 938 + set -o errexit -o pipefail -o nounset -o errtrace 939 + shopt -s inherit_errexit 940 + 941 + export api_key=$(<'${apiKeyPath}') 942 + 943 + jq <${mail-receiver-json} \ 944 + '.DISCOURSE_API_KEY = $ENV.api_key' \ 945 + >'/run/discourse-mail-receiver/mail-receiver-environment.json' 946 + ''; 947 + 948 + serviceConfig = { 949 + Type = "oneshot"; 950 + RemainAfterExit = true; 951 + RuntimeDirectory = "discourse-mail-receiver"; 952 + RuntimeDirectoryMode = "0700"; 953 + StateDirectory = "discourse-mail-receiver"; 954 + User = "discourse"; 955 + Group = "discourse"; 956 + }; 957 + }); 958 + 959 + services.discourse.siteSettings = { 960 + required = { 961 + notification_email = cfg.mail.notificationEmailAddress; 962 + contact_email = cfg.mail.contactEmailAddress; 963 + }; 964 + email = { 965 + manual_polling_enabled = cfg.mail.incoming.enable; 966 + reply_by_email_enabled = cfg.mail.incoming.enable; 967 + reply_by_email_address = cfg.mail.incoming.replyEmailAddress; 968 + }; 969 + }; 970 + 971 + services.postfix = lib.mkIf cfg.mail.incoming.enable { 972 + enable = true; 973 + sslCert = if cfg.sslCertificate != null then cfg.sslCertificate else ""; 974 + sslKey = if cfg.sslCertificateKey != null then cfg.sslCertificateKey else ""; 975 + 976 + origin = cfg.hostname; 977 + relayDomains = [ cfg.hostname ]; 978 + config = { 979 + smtpd_recipient_restrictions = "check_policy_service unix:private/discourse-policy"; 980 + append_dot_mydomain = lib.mkDefault false; 981 + compatibility_level = "2"; 982 + smtputf8_enable = false; 983 + smtpd_banner = lib.mkDefault "ESMTP server"; 984 + myhostname = lib.mkDefault cfg.hostname; 985 + mydestination = lib.mkDefault "localhost"; 986 + }; 987 + transport = '' 988 + ${cfg.hostname} discourse-mail-receiver: 989 + ''; 990 + masterConfig = { 991 + "discourse-mail-receiver" = { 992 + type = "unix"; 993 + privileged = true; 994 + chroot = false; 995 + command = "pipe"; 996 + args = [ 997 + "user=discourse" 998 + "argv=${cfg.mail.incoming.mailReceiverPackage}/bin/receive-mail" 999 + "\${recipient}" 1000 + ]; 1001 + }; 1002 + "discourse-policy" = { 1003 + type = "unix"; 1004 + privileged = true; 1005 + chroot = false; 1006 + command = "spawn"; 1007 + args = [ 1008 + "user=discourse" 1009 + "argv=${cfg.mail.incoming.mailReceiverPackage}/bin/discourse-smtp-fast-rejection" 1010 + ]; 1011 + }; 1012 + }; 1013 + }; 1014 + 1015 + users.users = { 1016 + discourse = { 1017 + group = "discourse"; 1018 + isSystemUser = true; 1019 + }; 1020 + } // (lib.optionalAttrs cfg.nginx.enable { 1021 + ${config.services.nginx.user}.extraGroups = [ "discourse" ]; 1022 + }); 1023 + 1024 + users.groups = { 1025 + discourse = {}; 1026 + }; 1027 + 1028 + environment.systemPackages = [ 1029 + cfg.package.rake 1030 + ]; 1031 + }; 1032 + 1033 + meta.doc = ./discourse.xml; 1034 + meta.maintainers = [ lib.maintainers.talyz ]; 1035 + }
+323
nixos/modules/services/web-apps/discourse.xml
··· 1 + <chapter xmlns="http://docbook.org/ns/docbook" 2 + xmlns:xlink="http://www.w3.org/1999/xlink" 3 + xmlns:xi="http://www.w3.org/2001/XInclude" 4 + version="5.0" 5 + xml:id="module-services-discourse"> 6 + <title>Discourse</title> 7 + <para> 8 + <link xlink:href="https://www.discourse.org/">Discourse</link> is a 9 + modern and open source discussion platform. 10 + </para> 11 + 12 + <section xml:id="module-services-discourse-basic-usage"> 13 + <title>Basic usage</title> 14 + <para> 15 + A minimal configuration using Let's Encrypt for TLS certificates looks like this: 16 + <programlisting> 17 + services.discourse = { 18 + <link linkend="opt-services.discourse.enable">enable</link> = true; 19 + <link linkend="opt-services.discourse.hostname">hostname</link> = "discourse.example.com"; 20 + admin = { 21 + <link linkend="opt-services.discourse.admin.email">email</link> = "admin@example.com"; 22 + <link linkend="opt-services.discourse.admin.username">username</link> = "admin"; 23 + <link linkend="opt-services.discourse.admin.fullName">fullName</link> = "Administrator"; 24 + <link linkend="opt-services.discourse.admin.passwordFile">passwordFile</link> = "/path/to/password_file"; 25 + }; 26 + <link linkend="opt-services.discourse.secretKeyBaseFile">secretKeyBaseFile</link> = "/path/to/secret_key_base_file"; 27 + }; 28 + <link linkend="opt-security.acme.email">security.acme.email</link> = "me@example.com"; 29 + <link linkend="opt-security.acme.acceptTerms">security.acme.acceptTerms</link> = true; 30 + </programlisting> 31 + </para> 32 + 33 + <para> 34 + Provided a proper DNS setup, you'll be able to connect to the 35 + instance at <literal>discourse.example.com</literal> and log in 36 + using the credentials provided in 37 + <literal>services.discourse.admin</literal>. 38 + </para> 39 + </section> 40 + 41 + <section xml:id="module-services-discourse-tls"> 42 + <title>Using a regular TLS certificate</title> 43 + <para> 44 + To set up TLS using a regular certificate and key on file, use 45 + the <xref linkend="opt-services.discourse.sslCertificate" /> 46 + and <xref linkend="opt-services.discourse.sslCertificateKey" /> 47 + options: 48 + 49 + <programlisting> 50 + services.discourse = { 51 + <link linkend="opt-services.discourse.enable">enable</link> = true; 52 + <link linkend="opt-services.discourse.hostname">hostname</link> = "discourse.example.com"; 53 + <link linkend="opt-services.discourse.sslCertificate">sslCertificate</link> = "/path/to/ssl_certificate"; 54 + <link linkend="opt-services.discourse.sslCertificateKey">sslCertificateKey</link> = "/path/to/ssl_certificate_key"; 55 + admin = { 56 + <link linkend="opt-services.discourse.admin.email">email</link> = "admin@example.com"; 57 + <link linkend="opt-services.discourse.admin.username">username</link> = "admin"; 58 + <link linkend="opt-services.discourse.admin.fullName">fullName</link> = "Administrator"; 59 + <link linkend="opt-services.discourse.admin.passwordFile">passwordFile</link> = "/path/to/password_file"; 60 + }; 61 + <link linkend="opt-services.discourse.secretKeyBaseFile">secretKeyBaseFile</link> = "/path/to/secret_key_base_file"; 62 + }; 63 + </programlisting> 64 + 65 + </para> 66 + </section> 67 + 68 + <section xml:id="module-services-discourse-database"> 69 + <title>Database access</title> 70 + <para> 71 + <productname>Discourse</productname> uses 72 + <productname>PostgreSQL</productname> to store most of its 73 + data. A database will automatically be enabled and a database 74 + and role created unless <xref 75 + linkend="opt-services.discourse.database.host" /> is changed from 76 + its default of <literal>null</literal> or <xref 77 + linkend="opt-services.discourse.database.createLocally" /> is set 78 + to <literal>false</literal>. 79 + </para> 80 + 81 + <para> 82 + External database access can also be configured by setting 83 + <xref linkend="opt-services.discourse.database.host" />, <xref 84 + linkend="opt-services.discourse.database.username" /> and <xref 85 + linkend="opt-services.discourse.database.passwordFile" /> as 86 + appropriate. Note that you need to manually create a database 87 + called <literal>discourse</literal> (or the name you chose in 88 + <xref linkend="opt-services.discourse.database.name" />) and 89 + allow the configured database user full access to it. 90 + </para> 91 + </section> 92 + 93 + <section xml:id="module-services-discourse-mail"> 94 + <title>Email</title> 95 + <para> 96 + In addition to the basic setup, you'll want to configure an SMTP 97 + server <productname>Discourse</productname> can use to send user 98 + registration and password reset emails, among others. You can 99 + also optionally let <productname>Discourse</productname> receive 100 + email, which enables people to reply to threads and conversations 101 + via email. 102 + </para> 103 + 104 + <para> 105 + A basic setup which assumes you want to use your configured <link 106 + linkend="opt-services.discourse.hostname">hostname</link> as 107 + email domain can be done like this: 108 + 109 + <programlisting> 110 + services.discourse = { 111 + <link linkend="opt-services.discourse.enable">enable</link> = true; 112 + <link linkend="opt-services.discourse.hostname">hostname</link> = "discourse.example.com"; 113 + <link linkend="opt-services.discourse.sslCertificate">sslCertificate</link> = "/path/to/ssl_certificate"; 114 + <link linkend="opt-services.discourse.sslCertificateKey">sslCertificateKey</link> = "/path/to/ssl_certificate_key"; 115 + admin = { 116 + <link linkend="opt-services.discourse.admin.email">email</link> = "admin@example.com"; 117 + <link linkend="opt-services.discourse.admin.username">username</link> = "admin"; 118 + <link linkend="opt-services.discourse.admin.fullName">fullName</link> = "Administrator"; 119 + <link linkend="opt-services.discourse.admin.passwordFile">passwordFile</link> = "/path/to/password_file"; 120 + }; 121 + mail.outgoing = { 122 + <link linkend="opt-services.discourse.mail.outgoing.serverAddress">serverAddress</link> = "smtp.emailprovider.com"; 123 + <link linkend="opt-services.discourse.mail.outgoing.port">port</link> = 587; 124 + <link linkend="opt-services.discourse.mail.outgoing.username">username</link> = "user@emailprovider.com"; 125 + <link linkend="opt-services.discourse.mail.outgoing.passwordFile">passwordFile</link> = "/path/to/smtp_password_file"; 126 + }; 127 + <link linkend="opt-services.discourse.mail.incoming.enable">mail.incoming.enable</link> = true; 128 + <link linkend="opt-services.discourse.secretKeyBaseFile">secretKeyBaseFile</link> = "/path/to/secret_key_base_file"; 129 + }; 130 + </programlisting> 131 + 132 + This assumes you have set up an MX record for the address you've 133 + set in <link linkend="opt-services.discourse.hostname">hostname</link> and 134 + requires proper SPF, DKIM and DMARC configuration to be done for 135 + the domain you're sending from, in order for email to be reliably delivered. 136 + </para> 137 + 138 + <para> 139 + If you want to use a different domain for your outgoing email 140 + (for example <literal>example.com</literal> instead of 141 + <literal>discourse.example.com</literal>) you should set 142 + <xref linkend="opt-services.discourse.mail.notificationEmailAddress" /> and 143 + <xref linkend="opt-services.discourse.mail.contactEmailAddress" /> manually. 144 + </para> 145 + 146 + <note> 147 + <para> 148 + Setup of TLS for incoming email is currently only configured 149 + automatically when a regular TLS certificate is used, i.e. when 150 + <xref linkend="opt-services.discourse.sslCertificate" /> and 151 + <xref linkend="opt-services.discourse.sslCertificateKey" /> are 152 + set. 153 + </para> 154 + </note> 155 + 156 + </section> 157 + 158 + <section xml:id="module-services-discourse-settings"> 159 + <title>Additional settings</title> 160 + <para> 161 + Additional site settings and backend settings, for which no 162 + explicit <productname>NixOS</productname> options are provided, 163 + can be set in <xref linkend="opt-services.discourse.siteSettings" /> and 164 + <xref linkend="opt-services.discourse.backendSettings" /> respectively. 165 + </para> 166 + 167 + <section xml:id="module-services-discourse-site-settings"> 168 + <title>Site settings</title> 169 + <para> 170 + <quote>Site settings</quote> are the settings that can be 171 + changed through the <productname>Discourse</productname> 172 + UI. Their <emphasis>default</emphasis> values can be set using 173 + <xref linkend="opt-services.discourse.siteSettings" />. 174 + </para> 175 + 176 + <para> 177 + Settings are expressed as a Nix attribute set which matches the 178 + structure of the configuration in 179 + <link xlink:href="https://github.com/discourse/discourse/blob/master/config/site_settings.yml">config/site_settings.yml</link>. 180 + To find a setting's path, you only need to care about the first 181 + two levels; i.e. its category (e.g. <literal>login</literal>) 182 + and name (e.g. <literal>invite_only</literal>). 183 + </para> 184 + 185 + <para> 186 + Settings containing secret data should be set to an attribute 187 + set containing the attribute <literal>_secret</literal> - a 188 + string pointing to a file containing the value the option 189 + should be set to. See the example. 190 + </para> 191 + </section> 192 + 193 + <section xml:id="module-services-discourse-backend-settings"> 194 + <title>Backend settings</title> 195 + <para> 196 + Settings are expressed as a Nix attribute set which matches the 197 + structure of the configuration in 198 + <link xlink:href="https://github.com/discourse/discourse/blob/stable/config/discourse_defaults.conf">config/discourse.conf</link>. 199 + Empty parameters can be defined by setting them to 200 + <literal>null</literal>. 201 + </para> 202 + </section> 203 + 204 + <section xml:id="module-services-discourse-settings-example"> 205 + <title>Example</title> 206 + <para> 207 + The following example sets the title and description of the 208 + <productname>Discourse</productname> instance and enables 209 + <productname>GitHub</productname> login in the site settings, 210 + and changes a few request limits in the backend settings: 211 + <programlisting> 212 + services.discourse = { 213 + <link linkend="opt-services.discourse.enable">enable</link> = true; 214 + <link linkend="opt-services.discourse.hostname">hostname</link> = "discourse.example.com"; 215 + <link linkend="opt-services.discourse.sslCertificate">sslCertificate</link> = "/path/to/ssl_certificate"; 216 + <link linkend="opt-services.discourse.sslCertificateKey">sslCertificateKey</link> = "/path/to/ssl_certificate_key"; 217 + admin = { 218 + <link linkend="opt-services.discourse.admin.email">email</link> = "admin@example.com"; 219 + <link linkend="opt-services.discourse.admin.username">username</link> = "admin"; 220 + <link linkend="opt-services.discourse.admin.fullName">fullName</link> = "Administrator"; 221 + <link linkend="opt-services.discourse.admin.passwordFile">passwordFile</link> = "/path/to/password_file"; 222 + }; 223 + mail.outgoing = { 224 + <link linkend="opt-services.discourse.mail.outgoing.serverAddress">serverAddress</link> = "smtp.emailprovider.com"; 225 + <link linkend="opt-services.discourse.mail.outgoing.port">port</link> = 587; 226 + <link linkend="opt-services.discourse.mail.outgoing.username">username</link> = "user@emailprovider.com"; 227 + <link linkend="opt-services.discourse.mail.outgoing.passwordFile">passwordFile</link> = "/path/to/smtp_password_file"; 228 + }; 229 + <link linkend="opt-services.discourse.mail.incoming.enable">mail.incoming.enable</link> = true; 230 + <link linkend="opt-services.discourse.siteSettings">siteSettings</link> = { 231 + required = { 232 + title = "My Cats"; 233 + site_description = "Discuss My Cats (and be nice plz)"; 234 + }; 235 + login = { 236 + enable_github_logins = true; 237 + github_client_id = "a2f6dfe838cb3206ce20"; 238 + github_client_secret._secret = /run/keys/discourse_github_client_secret; 239 + }; 240 + }; 241 + <link linkend="opt-services.discourse.backendSettings">backendSettings</link> = { 242 + max_reqs_per_ip_per_minute = 300; 243 + max_reqs_per_ip_per_10_seconds = 60; 244 + max_asset_reqs_per_ip_per_10_seconds = 250; 245 + max_reqs_per_ip_mode = "warn+block"; 246 + }; 247 + <link linkend="opt-services.discourse.secretKeyBaseFile">secretKeyBaseFile</link> = "/path/to/secret_key_base_file"; 248 + }; 249 + </programlisting> 250 + </para> 251 + <para> 252 + In the resulting site settings file, the 253 + <literal>login.github_client_secret</literal> key will be set 254 + to the contents of the 255 + <filename>/run/keys/discourse_github_client_secret</filename> 256 + file. 257 + </para> 258 + </section> 259 + </section> 260 + <section xml:id="module-services-discourse-plugins"> 261 + <title>Plugins</title> 262 + <para> 263 + You can install <productname>Discourse</productname> plugins 264 + using the <xref linkend="opt-services.discourse.plugins" /> 265 + option. As long as a plugin supports the standard install 266 + method, packaging it should only require fetching its source 267 + with an appropriate fetcher. 268 + </para> 269 + 270 + <para> 271 + Some plugins provide <link 272 + linkend="module-services-discourse-site-settings">site 273 + settings</link>. Their defaults can be configured using <xref 274 + linkend="opt-services.discourse.siteSettings" />, just like 275 + regular site settings. To find the names of these settings, look 276 + in the <literal>config/settings.yml</literal> file of the plugin 277 + repo. 278 + </para> 279 + 280 + <para> 281 + For example, to add the <link 282 + xlink:href="https://github.com/discourse/discourse-spoiler-alert">discourse-spoiler-alert</link> 283 + plugin and disable it by default: 284 + 285 + <programlisting> 286 + services.discourse = { 287 + <link linkend="opt-services.discourse.enable">enable</link> = true; 288 + <link linkend="opt-services.discourse.hostname">hostname</link> = "discourse.example.com"; 289 + <link linkend="opt-services.discourse.sslCertificate">sslCertificate</link> = "/path/to/ssl_certificate"; 290 + <link linkend="opt-services.discourse.sslCertificateKey">sslCertificateKey</link> = "/path/to/ssl_certificate_key"; 291 + admin = { 292 + <link linkend="opt-services.discourse.admin.email">email</link> = "admin@example.com"; 293 + <link linkend="opt-services.discourse.admin.username">username</link> = "admin"; 294 + <link linkend="opt-services.discourse.admin.fullName">fullName</link> = "Administrator"; 295 + <link linkend="opt-services.discourse.admin.passwordFile">passwordFile</link> = "/path/to/password_file"; 296 + }; 297 + mail.outgoing = { 298 + <link linkend="opt-services.discourse.mail.outgoing.serverAddress">serverAddress</link> = "smtp.emailprovider.com"; 299 + <link linkend="opt-services.discourse.mail.outgoing.port">port</link> = 587; 300 + <link linkend="opt-services.discourse.mail.outgoing.username">username</link> = "user@emailprovider.com"; 301 + <link linkend="opt-services.discourse.mail.outgoing.passwordFile">passwordFile</link> = "/path/to/smtp_password_file"; 302 + }; 303 + <link linkend="opt-services.discourse.mail.incoming.enable">mail.incoming.enable</link> = true; 304 + <link linkend="opt-services.discourse.mail.incoming.enable">plugins</link> = [ 305 + (pkgs.fetchFromGitHub { 306 + owner = "discourse"; 307 + repo = "discourse-spoiler-alert"; 308 + rev = "e200cfa571d252cab63f3d30d619b370986e4cee"; 309 + sha256 = "0ya69ix5g77wz4c9x9gmng6l25ghb5xxlx3icr6jam16q14dzc33"; 310 + }) 311 + ]; 312 + <link linkend="opt-services.discourse.siteSettings">siteSettings</link> = { 313 + plugins = { 314 + spoiler_enabled = false; 315 + }; 316 + }; 317 + <link linkend="opt-services.discourse.secretKeyBaseFile">secretKeyBaseFile</link> = "/path/to/secret_key_base_file"; 318 + }; 319 + </programlisting> 320 + 321 + </para> 322 + </section> 323 + </chapter>
+14
nixos/modules/services/web-servers/nginx/default.nix
··· 397 397 default = pkgs.nginxStable; 398 398 defaultText = "pkgs.nginxStable"; 399 399 type = types.package; 400 + apply = p: p.override { 401 + modules = p.modules ++ cfg.additionalModules; 402 + }; 400 403 description = " 401 404 Nginx package to use. This defaults to the stable version. Note 402 405 that the nginx team recommends to use the mainline version which 403 406 available in nixpkgs as <literal>nginxMainline</literal>. 404 407 "; 408 + }; 409 + 410 + additionalModules = mkOption { 411 + default = []; 412 + type = types.listOf (types.attrsOf types.anything); 413 + example = literalExample "[ pkgs.nginxModules.brotli ]"; 414 + description = '' 415 + Additional <link xlink:href="https://www.nginx.com/resources/wiki/modules/">third-party nginx modules</link> 416 + to install. Packaged modules are available in 417 + <literal>pkgs.nginxModules</literal>. 418 + ''; 405 419 }; 406 420 407 421 logError = mkOption {
+1 -1
nixos/modules/system/boot/initrd-openvpn.nix
··· 55 55 # The shared libraries are required for DNS resolution 56 56 boot.initrd.extraUtilsCommands = '' 57 57 copy_bin_and_libs ${pkgs.openvpn}/bin/openvpn 58 - copy_bin_and_libs ${pkgs.iproute}/bin/ip 58 + copy_bin_and_libs ${pkgs.iproute2}/bin/ip 59 59 60 60 cp -pv ${pkgs.glibc}/lib/libresolv.so.2 $out/lib 61 61 cp -pv ${pkgs.glibc}/lib/libnss_dns.so.2 $out/lib
+1 -1
nixos/modules/tasks/network-interfaces.nix
··· 1144 1144 1145 1145 environment.systemPackages = 1146 1146 [ pkgs.host 1147 - pkgs.iproute 1147 + pkgs.iproute2 1148 1148 pkgs.iputils 1149 1149 pkgs.nettools 1150 1150 ]
+2 -3
nixos/tests/all-tests.nix
··· 88 88 croc = handleTest ./croc.nix {}; 89 89 deluge = handleTest ./deluge.nix {}; 90 90 dhparams = handleTest ./dhparams.nix {}; 91 + discourse = handleTest ./discourse.nix {}; 91 92 dnscrypt-proxy2 = handleTestOn ["x86_64-linux"] ./dnscrypt-proxy2.nix {}; 92 93 dnscrypt-wrapper = handleTestOn ["x86_64-linux"] ./dnscrypt-wrapper {}; 93 94 doas = handleTest ./doas.nix {}; ··· 193 194 keepalived = handleTest ./keepalived.nix {}; 194 195 keepassxc = handleTest ./keepassxc.nix {}; 195 196 kerberos = handleTest ./kerberos/default.nix {}; 196 - kernel-latest = handleTest ./kernel-latest.nix {}; 197 - kernel-lts = handleTest ./kernel-lts.nix {}; 198 - kernel-testing = handleTest ./kernel-testing.nix {}; 197 + kernel-generic = handleTest ./kernel-generic.nix {}; 199 198 kernel-latest-ath-user-regd = handleTest ./kernel-latest-ath-user-regd.nix {}; 200 199 keycloak = discoverTests (import ./keycloak.nix); 201 200 keymap = handleTest ./keymap.nix {};
+197
nixos/tests/discourse.nix
··· 1 + # This tests Discourse by: 2 + # 1. logging in as the admin user 3 + # 2. sending a private message to the admin user through the API 4 + # 3. replying to that message via email. 5 + 6 + import ./make-test-python.nix ( 7 + { pkgs, lib, ... }: 8 + let 9 + certs = import ./common/acme/server/snakeoil-certs.nix; 10 + clientDomain = "client.fake.domain"; 11 + discourseDomain = certs.domain; 12 + adminPassword = "eYAX85qmMJ5GZIHLaXGDAoszD7HSZp5d"; 13 + secretKeyBase = "381f4ac6d8f5e49d804dae72aa9c046431d2f34c656a705c41cd52fed9b4f6f76f51549f0b55db3b8b0dded7a00d6a381ebe9a4367d2d44f5e743af6628b4d42"; 14 + admin = { 15 + email = "alice@${clientDomain}"; 16 + username = "alice"; 17 + fullName = "Alice Admin"; 18 + passwordFile = "${pkgs.writeText "admin-pass" adminPassword}"; 19 + }; 20 + in 21 + { 22 + name = "discourse"; 23 + meta = with pkgs.lib.maintainers; { 24 + maintainers = [ talyz ]; 25 + }; 26 + 27 + nodes.discourse = 28 + { nodes, ... }: 29 + { 30 + virtualisation.memorySize = 2048; 31 + 32 + imports = [ common/user-account.nix ]; 33 + 34 + security.pki.certificateFiles = [ 35 + certs.ca.cert 36 + ]; 37 + 38 + networking.extraHosts = '' 39 + 127.0.0.1 ${discourseDomain} 40 + ${nodes.client.config.networking.primaryIPAddress} ${clientDomain} 41 + ''; 42 + 43 + services.postfix = { 44 + enableSubmission = true; 45 + enableSubmissions = true; 46 + submissionsOptions = { 47 + smtpd_sasl_auth_enable = "yes"; 48 + smtpd_client_restrictions = "permit"; 49 + }; 50 + }; 51 + 52 + environment.systemPackages = [ pkgs.jq ]; 53 + 54 + services.discourse = { 55 + enable = true; 56 + inherit admin; 57 + hostname = discourseDomain; 58 + sslCertificate = "${certs.${discourseDomain}.cert}"; 59 + sslCertificateKey = "${certs.${discourseDomain}.key}"; 60 + secretKeyBaseFile = "${pkgs.writeText "secret-key-base" secretKeyBase}"; 61 + enableACME = false; 62 + mail.outgoing.serverAddress = clientDomain; 63 + mail.incoming.enable = true; 64 + siteSettings = { 65 + posting = { 66 + min_post_length = 5; 67 + min_first_post_length = 5; 68 + min_personal_message_post_length = 5; 69 + }; 70 + }; 71 + unicornTimeout = 900; 72 + }; 73 + 74 + networking.firewall.allowedTCPPorts = [ 25 465 ]; 75 + }; 76 + 77 + nodes.client = 78 + { nodes, ... }: 79 + { 80 + imports = [ common/user-account.nix ]; 81 + 82 + security.pki.certificateFiles = [ 83 + certs.ca.cert 84 + ]; 85 + 86 + networking.extraHosts = '' 87 + 127.0.0.1 ${clientDomain} 88 + ${nodes.discourse.config.networking.primaryIPAddress} ${discourseDomain} 89 + ''; 90 + 91 + services.dovecot2 = { 92 + enable = true; 93 + protocols = [ "imap" ]; 94 + modules = [ pkgs.dovecot_pigeonhole ]; 95 + }; 96 + 97 + services.postfix = { 98 + enable = true; 99 + origin = clientDomain; 100 + relayDomains = [ clientDomain ]; 101 + config = { 102 + compatibility_level = "2"; 103 + smtpd_banner = "ESMTP server"; 104 + myhostname = clientDomain; 105 + mydestination = clientDomain; 106 + }; 107 + }; 108 + 109 + environment.systemPackages = 110 + let 111 + replyToEmail = pkgs.writeScriptBin "reply-to-email" '' 112 + #!${pkgs.python3.interpreter} 113 + import imaplib 114 + import smtplib 115 + import ssl 116 + import email.header 117 + from email import message_from_bytes 118 + from email.message import EmailMessage 119 + 120 + with imaplib.IMAP4('localhost') as imap: 121 + imap.login('alice', 'foobar') 122 + imap.select() 123 + status, data = imap.search(None, 'ALL') 124 + assert status == 'OK' 125 + 126 + nums = data[0].split() 127 + assert len(nums) == 1 128 + 129 + status, msg_data = imap.fetch(nums[0], '(RFC822)') 130 + assert status == 'OK' 131 + 132 + msg = email.message_from_bytes(msg_data[0][1]) 133 + subject = str(email.header.make_header(email.header.decode_header(msg['Subject']))) 134 + reply_to = email.header.decode_header(msg['Reply-To'])[0][0] 135 + message_id = email.header.decode_header(msg['Message-ID'])[0][0] 136 + date = email.header.decode_header(msg['Date'])[0][0] 137 + 138 + ctx = ssl.create_default_context() 139 + with smtplib.SMTP_SSL(host='${discourseDomain}', context=ctx) as smtp: 140 + reply = EmailMessage() 141 + reply['Subject'] = 'Re: ' + subject 142 + reply['To'] = reply_to 143 + reply['From'] = 'alice@${clientDomain}' 144 + reply['In-Reply-To'] = message_id 145 + reply['References'] = message_id 146 + reply['Date'] = date 147 + reply.set_content("Test reply.") 148 + 149 + smtp.send_message(reply) 150 + smtp.quit() 151 + ''; 152 + in 153 + [ replyToEmail ]; 154 + 155 + networking.firewall.allowedTCPPorts = [ 25 ]; 156 + }; 157 + 158 + 159 + testScript = { nodes }: 160 + let 161 + request = builtins.toJSON { 162 + title = "Private message"; 163 + raw = "This is a test message."; 164 + target_usernames = admin.username; 165 + archetype = "private_message"; 166 + }; 167 + in '' 168 + discourse.start() 169 + client.start() 170 + 171 + discourse.wait_for_unit("discourse.service") 172 + discourse.wait_for_file("/run/discourse/sockets/unicorn.sock") 173 + discourse.wait_until_succeeds("curl -sS -f https://${discourseDomain}") 174 + discourse.succeed( 175 + "curl -sS -f https://${discourseDomain}/session/csrf -c cookie -b cookie -H 'Accept: application/json' | jq -r '\"X-CSRF-Token: \" + .csrf' > csrf_token", 176 + "curl -sS -f https://${discourseDomain}/session -c cookie -b cookie -H @csrf_token -H 'Accept: application/json' -d 'login=${nodes.discourse.config.services.discourse.admin.username}' -d \"password=${adminPassword}\" | jq -e '.user.username == \"${nodes.discourse.config.services.discourse.admin.username}\"'", 177 + "curl -sS -f https://${discourseDomain}/login -v -H 'Accept: application/json' -c cookie -b cookie 2>&1 | grep ${nodes.discourse.config.services.discourse.admin.username}", 178 + ) 179 + 180 + client.wait_for_unit("postfix.service") 181 + client.wait_for_unit("dovecot2.service") 182 + 183 + discourse.succeed( 184 + "sudo -u discourse discourse-rake api_key:create_master[master] >api_key", 185 + 'curl -sS -f https://${discourseDomain}/posts -X POST -H "Content-Type: application/json" -H "Api-Key: $(<api_key)" -H "Api-Username: system" -d \'${request}\' ', 186 + ) 187 + 188 + client.wait_until_succeeds("reply-to-email") 189 + 190 + discourse.wait_until_succeeds( 191 + 'curl -sS -f https://${discourseDomain}/topics/private-messages/system -H "Accept: application/json" -H "Api-Key: $(<api_key)" -H "Api-Username: system" | jq -e \'if .topic_list.topics[0].id != null then .topic_list.topics[0].id else null end\' >topic_id' 192 + ) 193 + discourse.succeed( 194 + 'curl -sS -f https://${discourseDomain}/t/$(<topic_id) -H "Accept: application/json" -H "Api-Key: $(<api_key)" -H "Api-Username: system" | jq -e \'if .post_stream.posts[1].cooked == "<p>Test reply.</p>" then true else null end\' ' 195 + ) 196 + ''; 197 + })
+37
nixos/tests/kernel-generic.nix
··· 1 + { system ? builtins.currentSystem 2 + , config ? { } 3 + , pkgs ? import ../.. { inherit system config; } 4 + }: 5 + 6 + with pkgs.lib; 7 + 8 + let 9 + makeKernelTest = version: linuxPackages: (import ./make-test-python.nix ({ pkgs, ... }: { 10 + name = "kernel-${version}"; 11 + meta = with pkgs.lib.maintainers; { 12 + maintainers = [ nequissimus ]; 13 + }; 14 + 15 + machine = { ... }: 16 + { 17 + boot.kernelPackages = linuxPackages; 18 + }; 19 + 20 + testScript = 21 + '' 22 + assert "Linux" in machine.succeed("uname -s") 23 + assert "${linuxPackages.kernel.modDirVersion}" in machine.succeed("uname -a") 24 + ''; 25 + })); 26 + in 27 + with pkgs; { 28 + linux_4_4 = makeKernelTest "4.4" linuxPackages_4_4; 29 + linux_4_9 = makeKernelTest "4.9" linuxPackages_4_9; 30 + linux_4_14 = makeKernelTest "4.14" linuxPackages_4_14; 31 + linux_4_19 = makeKernelTest "4.19" linuxPackages_4_19; 32 + linux_5_4 = makeKernelTest "5.4" linuxPackages_5_4; 33 + linux_5_10 = makeKernelTest "5.10" linuxPackages_5_10; 34 + linux_5_11 = makeKernelTest "5.11" linuxPackages_5_11; 35 + 36 + linux_testing = makeKernelTest "testing" linuxPackages_testing; 37 + }
-17
nixos/tests/kernel-latest.nix
··· 1 - import ./make-test-python.nix ({ pkgs, ...} : { 2 - name = "kernel-latest"; 3 - meta = with pkgs.lib.maintainers; { 4 - maintainers = [ nequissimus ]; 5 - }; 6 - 7 - machine = { pkgs, ... }: 8 - { 9 - boot.kernelPackages = pkgs.linuxPackages_latest; 10 - }; 11 - 12 - testScript = 13 - '' 14 - assert "Linux" in machine.succeed("uname -s") 15 - assert "${pkgs.linuxPackages_latest.kernel.version}" in machine.succeed("uname -a") 16 - ''; 17 - })
-17
nixos/tests/kernel-lts.nix
··· 1 - import ./make-test-python.nix ({ pkgs, ...} : { 2 - name = "kernel-lts"; 3 - meta = with pkgs.lib.maintainers; { 4 - maintainers = [ nequissimus ]; 5 - }; 6 - 7 - machine = { pkgs, ... }: 8 - { 9 - boot.kernelPackages = pkgs.linuxPackages; 10 - }; 11 - 12 - testScript = 13 - '' 14 - assert "Linux" in machine.succeed("uname -s") 15 - assert "${pkgs.linuxPackages.kernel.version}" in machine.succeed("uname -a") 16 - ''; 17 - })
-17
nixos/tests/kernel-testing.nix
··· 1 - import ./make-test-python.nix ({ pkgs, ...} : { 2 - name = "kernel-testing"; 3 - meta = with pkgs.lib.maintainers; { 4 - maintainers = [ nequissimus ]; 5 - }; 6 - 7 - machine = { pkgs, ... }: 8 - { 9 - boot.kernelPackages = pkgs.linuxPackages_testing; 10 - }; 11 - 12 - testScript = 13 - '' 14 - assert "Linux" in machine.succeed("uname -s") 15 - assert "${pkgs.linuxPackages_testing.kernel.modDirVersion}" in machine.succeed("uname -a") 16 - ''; 17 - })
+1 -1
nixos/tests/systemd-networkd-ipv6-prefix-delegation.nix
··· 43 43 # Everyone on the "isp" machine will be able to add routes to the kernel. 44 44 security.wrappers.add-dhcpd-lease = { 45 45 source = pkgs.writeShellScript "add-dhcpd-lease" '' 46 - exec ${pkgs.iproute}/bin/ip -6 route replace "$1" via "$2" 46 + exec ${pkgs.iproute2}/bin/ip -6 route replace "$1" via "$2" 47 47 ''; 48 48 capabilities = "cap_net_admin+ep"; 49 49 };
+32
pkgs/applications/misc/blucontrol/wrapper.nix
··· 1 + { stdenv, lib, makeWrapper, ghcWithPackages, packages ? (_:[]) }: 2 + let 3 + blucontrolEnv = ghcWithPackages (self: [ self.blucontrol ] ++ packages self); 4 + in 5 + stdenv.mkDerivation { 6 + pname = "blucontrol-with-packages"; 7 + version = blucontrolEnv.version; 8 + 9 + nativeBuildInputs = [ makeWrapper ]; 10 + 11 + buildCommand = '' 12 + makeWrapper ${blucontrolEnv}/bin/blucontrol $out/bin/blucontrol \ 13 + --prefix PATH : ${lib.makeBinPath [ blucontrolEnv ]} 14 + ''; 15 + 16 + # trivial derivation 17 + preferLocalBuild = true; 18 + allowSubstitues = false; 19 + 20 + meta = with lib; { 21 + description = "Configurable blue light filter"; 22 + longDescription = '' 23 + This application is a blue light filter, with the main focus on configurability. 24 + Configuration is done in Haskell in the style of xmonad. 25 + Blucontrol makes use of monad transformers and allows monadic calculation of gamma values and recoloring. The user chooses, what will be captured in the monadic state. 26 + ''; 27 + license = licenses.bsd3; 28 + homepage = "https://github.com/jumper149/blucontrol"; 29 + platforms = platforms.unix; 30 + maintainers = with maintainers; [ jumper149 ]; 31 + }; 32 + }
+26 -1
pkgs/applications/misc/free42/default.nix
··· 1 1 { lib 2 2 , stdenv 3 3 , fetchFromGitHub 4 + , makeDesktopItem 5 + , copyDesktopItems 4 6 , pkg-config 5 7 , gtk3 6 8 , alsaLib ··· 17 19 sha256 = "sha256-Htk2NHgYVL622URx67BUtounAUopLTahaSqfAqd3+ZI="; 18 20 }; 19 21 20 - nativeBuildInputs = [ pkg-config ]; 22 + nativeBuildInputs = [ copyDesktopItems pkg-config ]; 21 23 buildInputs = [ gtk3 alsaLib ]; 22 24 23 25 postPatch = '' ··· 54 56 install -m644 skins/* $out/share/${pname}/skins 55 57 runHook postInstall 56 58 ''; 59 + 60 + desktopItems = [ 61 + (makeDesktopItem { 62 + name = "com.thomasokken.free42bin"; 63 + desktopName = "Free42Bin"; 64 + genericName = "Calculator"; 65 + exec = "free42bin"; 66 + type = "Application"; 67 + comment = meta.description; 68 + categories = "Utility;Calculator;"; 69 + terminal = "false"; 70 + }) 71 + (makeDesktopItem { 72 + name = "com.thomasokken.free42dec"; 73 + desktopName = "Free42Dec"; 74 + genericName = "Calculator"; 75 + exec = "free42dec"; 76 + type = "Application"; 77 + comment = meta.description; 78 + categories = "Utility;Calculator;"; 79 + terminal = "false"; 80 + }) 81 + ]; 57 82 58 83 meta = with lib; { 59 84 homepage = "https://github.com/thomasokken/free42";
+2 -2
pkgs/applications/misc/metadata-cleaner/default.nix
··· 17 17 18 18 python3.pkgs.buildPythonApplication rec { 19 19 pname = "metadata-cleaner"; 20 - version = "1.0.3"; 20 + version = "1.0.4"; 21 21 22 22 format = "other"; 23 23 ··· 25 25 owner = "rmnvgr"; 26 26 repo = "metadata-cleaner"; 27 27 rev = "v${version}"; 28 - sha256 = "06dzfcnjb1xd8lk0r7bi4i784gfj8r7habbjbk2c4vn2847v71lf"; 28 + sha256 = "sha256-F/xh4dFX7W50kFzpWpGKyMUhxOlDO3WDXBzXVsDViY8="; 29 29 }; 30 30 31 31 nativeBuildInputs = [
+3 -3
pkgs/applications/networking/browsers/chromium/upstream-info.json
··· 18 18 } 19 19 }, 20 20 "beta": { 21 - "version": "90.0.4430.51", 22 - "sha256": "1k87fw0pv0d2zlxm0il9b5p60gdz6l44jssmsns4zy2fmd9316wr", 23 - "sha256bin64": "0q5yx7bc266azs3nl29ksz4yafvy2nmzn09ifcgr69fjkvsr1qh7", 21 + "version": "90.0.4430.61", 22 + "sha256": "01vssy3q64pv9rw4cdxv5rdg7yrxmhyc03a5r75fhxc95fj66iac", 23 + "sha256bin64": "07l8dzyv0hav1gls3xw91q9ay2l8xxmsf7yagg940cya9ncl0lhi", 24 24 "deps": { 25 25 "gn": { 26 26 "version": "2021-02-09",
+2 -2
pkgs/applications/networking/browsers/palemoon/default.nix
··· 16 16 17 17 in stdenv.mkDerivation rec { 18 18 pname = "palemoon"; 19 - version = "29.1.0"; 19 + version = "29.1.1"; 20 20 21 21 src = fetchFromGitHub { 22 22 githubBase = "repo.palemoon.org"; 23 23 owner = "MoonchildProductions"; 24 24 repo = "Pale-Moon"; 25 25 rev = "${version}_Release"; 26 - sha256 = "02blhk3v7gpnicd7s5l5fpqvdvj2279g3rq8xyhcd4sw6qnms8m6"; 26 + sha256 = "1ppdmj816zwccb0l0mgpq14ckdwg785wmqz41wran0nl63fg6i1x"; 27 27 fetchSubmodules = true; 28 28 }; 29 29
+6 -4
pkgs/applications/search/recoll/default.nix
··· 46 46 ++ lib.optionals (!withGui) [ "--disable-qtgui" "--disable-x11mon" ] 47 47 ++ (if stdenv.isLinux then [ "--with-inotify" ] else [ "--without-inotify" ]); 48 48 49 - nativeBuildInputs = [ pkg-config ]; 49 + nativeBuildInputs = [ 50 + file pkg-config python3Packages.setuptools which 51 + ]; 50 52 51 - buildInputs = with python3Packages; [ 52 - bison chmlib file python setuptools which xapian zlib 53 + buildInputs = [ 54 + bison chmlib python3Packages.python xapian zlib 53 55 ] ++ lib.optional withGui qtbase 54 56 ++ lib.optional stdenv.isDarwin libiconv; 55 57 ··· 98 100 homepage = "https://www.lesbonscomptes.com/recoll/"; 99 101 license = licenses.gpl2; 100 102 platforms = platforms.unix; 101 - maintainers = [ maintainers.jcumming ]; 103 + maintainers = with maintainers; [ jcumming kiyengar ]; 102 104 }; 103 105 }
+20 -1
pkgs/applications/window-managers/dwl/default.nix
··· 12 12 , patches ? [ ] 13 13 , conf ? null 14 14 , writeText 15 + , fetchpatch 15 16 }: 17 + 18 + let 19 + # Add two patches to fix compile errors with wlroots 0.13: 20 + totalPatches = patches ++ [ 21 + # Fix the renamed constant WLR_KEY_PRESSED => WL_KEYBOARD_KEY_STATE_PRESSED 22 + # https://github.com/djpohly/dwl/pull/66 23 + (fetchpatch { 24 + url = "https://github.com/djpohly/dwl/commit/a42613db9d9f6debfa4fb2363d75af9457d238ed.patch"; 25 + sha256 = "0h76hx1fhazi07gqg7sljh13f91v6bvjy7m9qqmimhvqgfwdcc0j"; 26 + }) 27 + # Use the new signature for wlr_backend_autocreate, which removes an argument: 28 + # https://github.com/djpohly/dwl/pull/76 29 + (fetchpatch { 30 + url = "https://github.com/djpohly/dwl/commit/0ff13cf216056a36a261f4eed53c6a864989a9fb.patch"; 31 + sha256 = "18clpdb4il1vxf1b0cx0qrwild68s9dism8ab66zpmvxs5qag2dm"; 32 + }) 33 + ]; 34 + in 16 35 17 36 stdenv.mkDerivation rec { 18 37 pname = "dwl"; ··· 39 58 ]; 40 59 41 60 # Allow users to set their own list of patches 42 - inherit patches; 61 + patches = totalPatches; 43 62 44 63 # Last line of config.mk enables XWayland 45 64 prePatch = lib.optionalString enable-xwayland ''
+7 -5
pkgs/applications/window-managers/labwc/default.nix
··· 8 8 , glib 9 9 , libinput 10 10 , libxml2 11 - , pandoc 12 11 , pango 13 12 , wayland 14 13 , wayland-protocols ··· 16 15 , libxcb 17 16 , libxkbcommon 18 17 , xwayland 18 + , libdrm 19 + , scdoc 19 20 }: 20 21 21 22 stdenv.mkDerivation rec { 22 23 pname = "labwc"; 23 - version = "unstable-2021-02-06"; 24 + version = "unstable-2021-03-15"; 24 25 25 26 src = fetchFromGitHub { 26 27 owner = "johanmalm"; 27 28 repo = pname; 28 - rev = "4a8fcf5c6d0b730b1e2e17e544ce7d7d3c72cd13"; 29 - sha256 = "g1ba8dchUN393eis0VAu1bIjQfthDGLaSijSavz4lfU="; 29 + rev = "fddeb74527e5b860d9c1a91a237d390041c758b6"; 30 + sha256 = "0rhniv5j4bypqxxj0nbpa3hclmn8znal9rldv0mrgbizn3wsbs54"; 30 31 }; 31 32 32 - nativeBuildInputs = [ pkg-config meson ninja pandoc ]; 33 + nativeBuildInputs = [ pkg-config meson ninja scdoc ]; 33 34 buildInputs = [ 34 35 cairo 35 36 glib ··· 42 43 libxcb 43 44 libxkbcommon 44 45 xwayland 46 + libdrm 45 47 ]; 46 48 47 49 mesonFlags = [ "-Dxwayland=enabled" ];
+5 -4
pkgs/applications/window-managers/sway/default.nix
··· 2 2 , meson, ninja, pkg-config, wayland, scdoc 3 3 , libxkbcommon, pcre, json_c, dbus, libevdev 4 4 , pango, cairo, libinput, libcap, pam, gdk-pixbuf, librsvg 5 - , wlroots, wayland-protocols 5 + , wlroots, wayland-protocols, libdrm 6 6 }: 7 7 8 8 stdenv.mkDerivation rec { 9 9 pname = "sway-unwrapped"; 10 - version = "1.5.1"; 10 + version = "1.6"; 11 11 12 12 src = fetchFromGitHub { 13 13 owner = "swaywm"; 14 14 repo = "sway"; 15 15 rev = version; 16 - sha256 = "1xsa3h8zhf29p0mi90baxpr76jkd9pd1gr97ky8cnjbcs4isj9j0"; 16 + sha256 = "0vnplva11yafhbijrk68wy7pw0psn9jm0caaymswq1s951xsn1c8"; 17 17 }; 18 18 19 19 patches = [ ··· 33 33 buildInputs = [ 34 34 wayland libxkbcommon pcre json_c dbus libevdev 35 35 pango cairo libinput libcap pam gdk-pixbuf librsvg 36 - wlroots wayland-protocols 36 + wlroots wayland-protocols libdrm 37 37 ]; 38 38 39 39 mesonFlags = [ 40 40 "-Ddefault-wallpaper=false" 41 + "-Dsd-bus-provider=libsystemd" 41 42 ]; 42 43 43 44 meta = with lib; {
+22 -16
pkgs/applications/window-managers/sway/load-configuration-from-etc.patch
··· 1 - From 26f9c65ef037892977a824f0d7d7111066856b53 Mon Sep 17 00:00:00 2001 2 - From: Michael Weiss <dev.primeos@gmail.com> 3 - Date: Sat, 27 Apr 2019 14:26:16 +0200 1 + From 92283df3acbffa5c1bb21f23cdd686113d905114 Mon Sep 17 00:00:00 2001 2 + From: Patrick Hilhorst <git@hilhorst.be> 3 + Date: Wed, 31 Mar 2021 21:14:13 +0200 4 4 Subject: [PATCH] Load configs from /etc but fallback to /nix/store 5 5 6 6 This change will load all configuration files from /etc, to make it easy 7 7 to override them, but fallback to /nix/store/.../etc/sway/config to make 8 8 Sway work out-of-the-box with the default configuration on non NixOS 9 9 systems. 10 + 11 + Original patch by Michael Weiss, updated for Sway 1.6 by Patrick Hilhorst 12 + 13 + Co-authored-by: Michael Weiss <dev.primeos@gmail.com> 10 14 --- 11 15 meson.build | 3 ++- 12 - sway/config.c | 1 + 13 - 2 files changed, 3 insertions(+), 1 deletion(-) 16 + sway/config.c | 3 ++- 17 + 2 files changed, 4 insertions(+), 2 deletions(-) 14 18 15 19 diff --git a/meson.build b/meson.build 16 - index 02b5d606..c03a9c0f 100644 20 + index b7a29660..8ae8ceb3 100644 17 21 --- a/meson.build 18 22 +++ b/meson.build 19 - @@ -129,7 +129,8 @@ if scdoc.found() 23 + @@ -164,7 +164,8 @@ if scdoc.found() 20 24 endforeach 21 25 endif 22 26 ··· 25 29 +add_project_arguments('-DNIX_SYSCONFDIR="/@0@"'.format(join_paths(prefix, sysconfdir)), language : 'c') 26 30 27 31 version = '"@0@"'.format(meson.project_version()) 28 - if git.found() 32 + git = find_program('git', native: true, required: false) 29 33 diff --git a/sway/config.c b/sway/config.c 30 - index 4cd21bbc..dd855753 100644 34 + index 76b9ec08..fb5b51aa 100644 31 35 --- a/sway/config.c 32 36 +++ b/sway/config.c 33 - @@ -317,6 +317,7 @@ static char *get_config_path(void) { 34 - "$XDG_CONFIG_HOME/i3/config", 35 - SYSCONFDIR "/sway/config", 36 - SYSCONFDIR "/i3/config", 37 - + NIX_SYSCONFDIR "/sway/config", 37 + @@ -374,7 +374,8 @@ static char *get_config_path(void) { 38 + { .prefix = home, .config_folder = ".i3"}, 39 + { .prefix = config_home, .config_folder = "i3"}, 40 + { .prefix = SYSCONFDIR, .config_folder = "sway"}, 41 + - { .prefix = SYSCONFDIR, .config_folder = "i3"} 42 + + { .prefix = SYSCONFDIR, .config_folder = "i3"}, 43 + + { .prefix = NIX_SYSCONFDIR, .config_folder = "sway"}, 38 44 }; 39 45 40 - char *config_home = getenv("XDG_CONFIG_HOME"); 46 + size_t num_config_paths = sizeof(config_paths)/sizeof(config_paths[0]); 41 47 -- 42 - 2.19.2 48 + 2.30.1
+13 -16
pkgs/applications/window-managers/wayfire/applications.nix
··· 1 - { newScope, wayfirePlugins }: 1 + { lib, newScope, wayfirePlugins }: 2 2 3 - let 4 - self = with self; { 5 - inherit wayfirePlugins; 3 + lib.makeExtensible (self: with self; { 4 + inherit wayfirePlugins; 6 5 7 - callPackage = newScope self; 6 + callPackage = newScope self; 8 7 9 - wayfire = callPackage ./. { }; 8 + wayfire = callPackage ./. { }; 10 9 11 - wcm = callPackage ./wcm.nix { 12 - inherit (wayfirePlugins) wf-shell; 13 - }; 10 + wcm = callPackage ./wcm.nix { 11 + inherit (wayfirePlugins) wf-shell; 12 + }; 14 13 15 - wrapWayfireApplication = callPackage ./wrapper.nix { }; 14 + wrapWayfireApplication = callPackage ./wrapper.nix { }; 16 15 17 - withPlugins = selector: self // { 18 - wayfire = wrapWayfireApplication wayfire selector; 19 - wcm = wrapWayfireApplication wcm selector; 20 - }; 16 + withPlugins = selector: self // { 17 + wayfire = wrapWayfireApplication wayfire selector; 18 + wcm = wrapWayfireApplication wcm selector; 21 19 }; 22 - in 23 - self 20 + })
+1 -1
pkgs/development/compilers/llvm/12/clang/default.nix
··· 8 8 pname = "clang"; 9 9 inherit version; 10 10 11 - src = fetch "clang" "11ay72f81ffygil5ficq7mzplck4gffm77p0yj4ib3dgiqbb1qbw"; 11 + src = fetch "clang" "185r9rr254v75ja33nmm53j85lcnkj7bzsl18wvnd37jmz2nfxa5"; 12 12 inherit clang-tools-extra_src; 13 13 14 14 unpackPhase = ''
+1 -1
pkgs/development/compilers/llvm/12/compiler-rt.nix
··· 11 11 stdenv.mkDerivation rec { 12 12 pname = "compiler-rt"; 13 13 inherit version; 14 - src = fetch pname "01dvir3858qkjmqhw2h6jjagq0la0kasnwzqbyv91yixnwx8369z"; 14 + src = fetch pname "1x0z875nbdpzhr4qb7linm6r9swvdf6dvwqy1s22pbn4wdcw0cvf"; 15 15 16 16 nativeBuildInputs = [ cmake python3 llvm ]; 17 17 buildInputs = lib.optional stdenv.hostPlatform.isDarwin libcxxabi;
+2 -2
pkgs/development/compilers/llvm/12/default.nix
··· 8 8 9 9 let 10 10 release_version = "12.0.0"; 11 - candidate = "rc4"; # empty or "rcN" 11 + candidate = "rc5"; # empty or "rcN" 12 12 dash-candidate = lib.optionalString (candidate != "") "-${candidate}"; 13 13 version = "${release_version}${dash-candidate}"; # differentiating these (variables) is important for RCs 14 14 targetConfig = stdenv.targetPlatform.config; ··· 18 18 inherit sha256; 19 19 }; 20 20 21 - clang-tools-extra_src = fetch "clang-tools-extra" "1m1qga8m967bzqkxwx9xqkw1lkxi9dhlrn6km2k7g2yqyb6k14ag"; 21 + clang-tools-extra_src = fetch "clang-tools-extra" "1hga9k5m60ywmr7m69jf1v6vj1ra1n6ybv1abzlz94f5q22i1a02"; 22 22 23 23 tools = lib.makeExtensible (tools: let 24 24 callPackage = newScope (tools // { inherit stdenv cmake libxml2 python3 isl release_version version fetch; });
+1 -1
pkgs/development/compilers/llvm/12/libc++/default.nix
··· 6 6 pname = "libc++"; 7 7 inherit version; 8 8 9 - src = fetch "libcxx" "0ai91zls1738502c3b2frhawmjpi73rm3m677hh540wrjp3xv0ql"; 9 + src = fetch "libcxx" "01abh553dvjgk5cjzzp0ghmg00laqbr4ar4frdhyhpbwhhmwc880"; 10 10 11 11 postUnpack = '' 12 12 unpackFile ${libcxxabi.src}
+1 -1
pkgs/development/compilers/llvm/12/libc++abi.nix
··· 6 6 pname = "libc++abi"; 7 7 inherit version; 8 8 9 - src = fetch "libcxxabi" "02qp6ndagq7n48p53z93d1rrx0v0v4rsahd4vkv5frid0vm4ah9h"; 9 + src = fetch "libcxxabi" "0mjj4f63ix4j1b72bgzpcki7mzf3qszrq7snqhiq0c5s73skkwx0"; 10 10 11 11 nativeBuildInputs = [ cmake python3 ]; 12 12 buildInputs = lib.optional (!stdenv.isDarwin && !stdenv.isFreeBSD && !stdenv.hostPlatform.isWasm) libunwind;
+1 -1
pkgs/development/compilers/llvm/12/libunwind.nix
··· 6 6 pname = "libunwind"; 7 7 inherit version; 8 8 9 - src = fetch pname "1a5db1lxw98a430b8mnaclc0w98y6cc8k587kgjhn0nghl40l40i"; 9 + src = fetch pname "0kaq75ygzv9dqfsx27pi5a0clipdjq6a9vghhb89d8k1rf20lslh"; 10 10 11 11 postUnpack = '' 12 12 unpackFile ${libcxx.src}
+1 -1
pkgs/development/compilers/llvm/12/lld.nix
··· 11 11 pname = "lld"; 12 12 inherit version; 13 13 14 - src = fetch pname "0r9pxhvinipirv9s5k8fnsnqd30zfniwqjkvw5sac3lq29rn2lp1"; 14 + src = fetch pname "044lv1d9am2xmbc3pvssxkkiyxyv72n2xkgk8z3p9k72h3ay00q3"; 15 15 16 16 nativeBuildInputs = [ cmake ]; 17 17 buildInputs = [ llvm libxml2 ];
+1 -1
pkgs/development/compilers/llvm/12/lldb.nix
··· 25 25 pname = "lldb"; 26 26 inherit version; 27 27 28 - src = fetch pname "0943gan83mldizwbhksd07w4h90z4djjpv5f8v49caz8y9113svg"; 28 + src = fetch pname "0q4p4s5ws1zszs3i4da5w5fnxkpny0q3fr1s1sh7jp9wcwxbxiqq"; 29 29 30 30 patches = [ ./lldb-procfs.patch ]; 31 31
+2 -2
pkgs/development/compilers/llvm/12/llvm.nix
··· 32 32 pname = "llvm"; 33 33 inherit version; 34 34 35 - src = fetch pname "1jif65i165h41cfcsfvfjy5k1yrnikg61assj5vs0f25pv1vbyvf"; 36 - polly_src = fetch "polly" "0hk6j6rsal3zsp1f9fla71yzbwmzz9007m63x22hy7qfiwyplvf2"; 35 + src = fetch pname "088dyv7hppidl3rqfsjdibvn4d3a74896fg2sz4dwaxlg19way93"; 36 + polly_src = fetch "polly" "1qj7gkfr1yrsrz6j086l9p6d2kyyln15fmfiab4isn96g1dhsfb5"; 37 37 38 38 unpackPhase = '' 39 39 unpackFile $src
+1 -1
pkgs/development/compilers/llvm/12/openmp.nix
··· 11 11 pname = "openmp"; 12 12 inherit version; 13 13 14 - src = fetch pname "07g2rsfhli3szv3chzy6y37p2176ywdb6w3k2fv9g2r416cpxjdz"; 14 + src = fetch pname "1d16r5whjb2n4n28rg8wn2g9krlc92q6nb0qmnnbzhqhx0rbkjfb"; 15 15 16 16 nativeBuildInputs = [ cmake perl ]; 17 17 buildInputs = [ llvm ];
+24 -27
pkgs/development/libraries/openzwave/default.nix
··· 1 - { lib, stdenv, fetchFromGitHub 1 + { lib, stdenv, fetchFromGitHub, fetchpatch 2 2 , doxygen, fontconfig, graphviz-nox, libxml2, pkg-config, which 3 3 , systemd }: 4 4 5 - let 6 - version = "2019-12-08"; 7 - 8 - in stdenv.mkDerivation { 5 + stdenv.mkDerivation rec { 9 6 pname = "openzwave"; 10 - inherit version; 7 + version = "1.6"; 11 8 12 - # Use fork by Home Assistant because this package is mainly used for python.pkgs.homeassistant-pyozw. 13 - # See https://github.com/OpenZWave/open-zwave/compare/master...home-assistant:hass for the difference. 14 9 src = fetchFromGitHub { 15 - owner = "home-assistant"; 10 + owner = "OpenZWave"; 16 11 repo = "open-zwave"; 17 - rev = "2cd2137025c529835e4893a7b87c3d56605b2681"; 18 - sha256 = "04g8fb4f4ihakvvsmzcnncgfdd2ikmki7s22i9c6layzdwavbwf1"; 12 + rev = "v${version}"; 13 + sha256 = "0xgs4mmr0480c269wx9xkk67ikjzxkh8xcssrdx0f5xcl1lyd333"; 19 14 }; 20 15 16 + patches = [ 17 + (fetchpatch { 18 + name = "fix-strncat-build-failure.patch"; 19 + url = "https://github.com/OpenZWave/open-zwave/commit/601e5fb16232a7984885e67fdddaf5b9c9dd8105.patch"; 20 + sha256 = "1n1k5arwk1dyc12xz6xl4n8yw28vghzhv27j65z1nca4zqsxgza1"; 21 + }) 22 + (fetchpatch { 23 + name = "fix-text-uninitialized.patch"; 24 + url = "https://github.com/OpenZWave/open-zwave/commit/3b029a467e83bc7f0054e4dbba1e77e6eac7bc7f.patch"; 25 + sha256 = "183mrzjh1zx2b2wzkj4jisiw8br7g7bbs167afls4li0fm01d638"; 26 + }) 27 + ]; 28 + 29 + outputs = [ "out" "doc" ]; 30 + 21 31 nativeBuildInputs = [ doxygen fontconfig graphviz-nox libxml2 pkg-config which ]; 22 32 23 33 buildInputs = [ systemd ]; ··· 26 36 27 37 enableParallelBuilding = true; 28 38 29 - installPhase = '' 30 - runHook preInstall 31 - 32 - DESTDIR=$out PREFIX= pkgconfigdir=lib/pkgconfig make install $installFlags 33 - 34 - runHook postInstall 35 - ''; 39 + makeFlags = [ 40 + "PREFIX=${placeholder "out"}" 41 + ]; 36 42 37 43 FONTCONFIG_FILE="${fontconfig.out}/etc/fonts/fonts.conf"; 38 44 FONTCONFIG_PATH="${fontconfig.out}/etc/fonts/"; ··· 40 46 postPatch = '' 41 47 substituteInPlace cpp/src/Options.cpp \ 42 48 --replace /etc/openzwave $out/etc/openzwave 43 - ''; 44 - 45 - fixupPhase = '' 46 - substituteInPlace $out/lib/pkgconfig/libopenzwave.pc \ 47 - --replace prefix= prefix=$out \ 48 - --replace dir= dir=$out 49 - 50 - substituteInPlace $out/bin/ozw_config \ 51 - --replace pcfile=${pkg-config} pcfile=$out 52 49 ''; 53 50 54 51 meta = with lib; {
+8 -2
pkgs/development/libraries/tracker/default.nix
··· 27 27 , substituteAll 28 28 }: 29 29 30 - stdenv.mkDerivation rec { 30 + stdenv.mkDerivation (rec { 31 31 pname = "tracker"; 32 32 version = "3.0.3"; 33 33 ··· 82 82 "-Ddocs=true" 83 83 ]; 84 84 85 - doCheck = true; 85 + # https://gitlab.gnome.org/GNOME/tracker/-/issues/292#note_1075369 86 + doCheck = !stdenv.isi686; 86 87 87 88 postPatch = '' 88 89 patchShebangs utils/g-ir-merge/g-ir-merge ··· 133 134 platforms = platforms.linux; 134 135 }; 135 136 } 137 + // lib.optionalAttrs stdenv.isi686 { 138 + # TMP: fatal error: libtracker-sparql/tracker-sparql-enum-types.h: No such file or directory 139 + enableParallelBuilding = false; 140 + } 141 + )
+17 -17
pkgs/development/libraries/v8/default.nix
··· 11 11 deps = { 12 12 "base/trace_event/common" = fetchgit { 13 13 url = "${git_url}/chromium/src/base/trace_event/common.git"; 14 - rev = "936ba8a963284a6b3737cf2f0474a7131073abee"; 15 - sha256 = "14nr22fqdpxma1kzjflj6a865vr3hfnnm2gs4vcixyq4kmfzfcy2"; 14 + rev = "dab187b372fc17e51f5b9fad8201813d0aed5129"; 15 + sha256 = "0dmpj9hj4xv3xb0fl1kb9hm4bhpbs2s5csx3z8cgjd5vwvhdzig4"; 16 16 }; 17 17 build = fetchgit { 18 18 url = "${git_url}/chromium/src/build.git"; 19 - rev = "325e95d6dae64f35b160b3dc7d73218cee5ec079"; 20 - sha256 = "0dddyxa76p2xpjhmxif05v63i5ar6h5v684fdl667sg84f5bhhxf"; 19 + rev = "26e9d485d01d6e0eb9dadd21df767a63494c8fea"; 20 + sha256 = "1jjvsgj0cs97d26i3ba531ic1f9gqan8x7z4aya8yl8jx02l342q"; 21 21 }; 22 22 "third_party/googletest/src" = fetchgit { 23 23 url = "${git_url}/external/github.com/google/googletest.git"; 24 - rev = "5ec7f0c4a113e2f18ac2c6cc7df51ad6afc24081"; 25 - sha256 = "0gmr10042c0xybxnn6g7ndj1na1mmd3l9w7449qlcv4s8gmfs7k6"; 24 + rev = "e3f0319d89f4cbf32993de595d984183b1a9fc57"; 25 + sha256 = "18xz71l2xjrqsc0q317whgw4xi1i5db24zcj7v04f5g6r1hyf1a5"; 26 26 }; 27 27 "third_party/icu" = fetchgit { 28 28 url = "${git_url}/chromium/deps/icu.git"; 29 - rev = "960f195aa87acaec46e6104ec93a596da7ae0843"; 30 - sha256 = "073kh6gpcairgjxf3hlhpqljc13gwl2aj8fz91fv220xibwqs834"; 29 + rev = "f2223961702f00a8833874b0560d615a2cc42738"; 30 + sha256 = "0z5p53kbrjfkjn0i12dpk55cp8976j2zk7a4wk88423s2c5w87zl"; 31 31 }; 32 32 "third_party/jinja2" = fetchgit { 33 33 url = "${git_url}/chromium/src/third_party/jinja2.git"; ··· 39 39 rev = "8f45f5cfa0009d2a70589bcda0349b8cb2b72783"; 40 40 sha256 = "168ppjmicfdh4i1l0l25s86mdbrz9fgxmiq1rx33x79mph41scfz"; 41 41 }; 42 + "third_party/zlib" = fetchgit { 43 + url = "${git_url}/chromium/src/third_party/zlib.git"; 44 + rev = "156be8c52f80cde343088b4a69a80579101b6e67"; 45 + sha256 = "0hxbkkzmlv714fjq2jlp5dd2jc339xyh6gkjx1sz3srwv33mlk92"; 46 + }; 42 47 }; 43 48 44 49 in 45 50 46 51 stdenv.mkDerivation rec { 47 52 pname = "v8"; 48 - version = "7.4.255"; 53 + version = "8.4.255"; 49 54 50 55 doCheck = true; 51 56 52 57 patches = [ 53 - (fetchpatch { 54 - url = "https://raw.githubusercontent.com/RPi-Distro/chromium-browser/master/debian/patches/revert-Xclang-instcombine-lower-dbg-declare.patch"; 55 - sha256 = "02hczcg43m36q8j1kv5j3hq9czj9niiil9w13w22vzv2f3c67dvn"; 56 - }) 57 58 ./darwin.patch 59 + ./gcc_arm.patch # Fix building zlib with gcc on aarch64, from https://gist.github.com/Adenilson/d973b6fd96c7709d33ddf08cf1dcb149 58 60 ]; 59 61 60 62 src = fetchFromGitHub { 61 63 owner = "v8"; 62 64 repo = "v8"; 63 65 rev = version; 64 - sha256 = "14i0c71hmffzqnq9n73dh9dnabdxhbjhzkhqpk5yv9y90bwrzi2n"; 66 + sha256 = "07ymw4kqbz7kv311gpk5bs5q90wj73n2q7jkyfhqk4hvhs1q5bw7"; 65 67 }; 66 68 67 69 postUnpack = '' ··· 97 99 ''v8_snapshot_toolchain="//build/toolchain/linux/unbundle:default"'' 98 100 ] ++ lib.optional stdenv.cc.isClang ''clang_base_path="${stdenv.cc}"''; 99 101 100 - # with gcc8, -Wclass-memaccess became part of -Wall and causes logging limit 101 - # to be exceeded 102 - NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isGNU "-Wno-class-memaccess"; 102 + NIX_CFLAGS_COMPILE = "-O2"; 103 103 104 104 nativeBuildInputs = [ gn ninja pkg-config python ] 105 105 ++ lib.optionals stdenv.isDarwin [ xcbuild darwin.DarwinTools ];
+31
pkgs/development/libraries/v8/gcc_arm.patch
··· 1 + diff --git a/third_party/zlib/contrib/optimizations/insert_string.h b/third_party/zlib/contrib/optimizations/insert_string.h 2 + index 1826601..d123305 100644 3 + --- a/third_party/zlib/contrib/optimizations/insert_string.h 4 + +++ b/third_party/zlib/contrib/optimizations/insert_string.h 5 + @@ -26,15 +26,23 @@ 6 + #define _cpu_crc32_u32 _mm_crc32_u32 7 + 8 + #elif defined(CRC32_ARMV8_CRC32) 9 + - #if defined(__clang__) 10 + + #if defined(__GNUC__) || defined(__clang__) 11 + #undef TARGET_CPU_WITH_CRC 12 + - #define __crc32cw __builtin_arm_crc32cw 13 + + #if defined(__clang__) 14 + + #define __crc32cw __builtin_arm_crc32cw 15 + + #elif defined(__GNUC__) 16 + + #define __crc32cw __builtin_aarch64_crc32cw 17 + + #endif 18 + #endif 19 + 20 + #define _cpu_crc32_u32 __crc32cw 21 + 22 + #if defined(__aarch64__) 23 + - #define TARGET_CPU_WITH_CRC __attribute__((target("crc"))) 24 + + #if defined(__clang__) 25 + + #define TARGET_CPU_WITH_CRC __attribute__((target("crc"))) 26 + + #elif defined(__GNUC__) 27 + + #define TARGET_CPU_WITH_CRC __attribute__((target("+crc"))) 28 + + #endif 29 + #else // !defined(__aarch64__) 30 + #define TARGET_CPU_WITH_CRC __attribute__((target("armv8-a,crc"))) 31 + #endif // defined(__aarch64__)
+57
pkgs/development/libraries/wlroots/0.12.nix
··· 1 + { lib, stdenv, fetchFromGitHub, meson, ninja, pkg-config, wayland 2 + , libGL, wayland-protocols, libinput, libxkbcommon, pixman 3 + , xcbutilwm, libX11, libcap, xcbutilimage, xcbutilerrors, mesa 4 + , libpng, ffmpeg 5 + }: 6 + 7 + # Fixed version derivation. 8 + # nixpkgs-update: no auto update 9 + stdenv.mkDerivation rec { 10 + pname = "wlroots"; 11 + version = "0.12.0"; 12 + 13 + src = fetchFromGitHub { 14 + owner = "swaywm"; 15 + repo = "wlroots"; 16 + rev = version; 17 + sha256 = "01j38lmgs2c6fq68v8b75pkilia2wsgzgp46ivfbi9hhx47kgcfn"; 18 + }; 19 + 20 + # $out for the library and $examples for the example programs (in examples): 21 + outputs = [ "out" "examples" ]; 22 + 23 + nativeBuildInputs = [ meson ninja pkg-config wayland ]; 24 + 25 + buildInputs = [ 26 + libGL wayland wayland-protocols libinput libxkbcommon pixman 27 + xcbutilwm libX11 libcap xcbutilimage xcbutilerrors mesa 28 + libpng ffmpeg 29 + ]; 30 + 31 + mesonFlags = [ "-Dlogind-provider=systemd" "-Dlibseat=disabled" ]; 32 + 33 + postFixup = '' 34 + # Install ALL example programs to $examples: 35 + # screencopy dmabuf-capture input-inhibitor layer-shell idle-inhibit idle 36 + # screenshot output-layout multi-pointer rotation tablet touch pointer 37 + # simple 38 + mkdir -p $examples/bin 39 + cd ./examples 40 + for binary in $(find . -executable -type f -printf '%P\n' | grep -vE '\.so'); do 41 + cp "$binary" "$examples/bin/wlroots-$binary" 42 + done 43 + ''; 44 + 45 + meta = with lib; { 46 + description = "A modular Wayland compositor library"; 47 + longDescription = '' 48 + Pluggable, composable, unopinionated modules for building a Wayland 49 + compositor; or about 50,000 lines of code you were going to write anyway. 50 + ''; 51 + inherit (src.meta) homepage; 52 + changelog = "https://github.com/swaywm/wlroots/releases/tag/${version}"; 53 + license = licenses.mit; 54 + platforms = platforms.linux; 55 + maintainers = with maintainers; [ primeos synthetica ]; 56 + }; 57 + }
+5 -5
pkgs/development/libraries/wlroots/default.nix
··· 1 1 { lib, stdenv, fetchFromGitHub, meson, ninja, pkg-config, wayland 2 2 , libGL, wayland-protocols, libinput, libxkbcommon, pixman 3 3 , xcbutilwm, libX11, libcap, xcbutilimage, xcbutilerrors, mesa 4 - , libpng, ffmpeg 4 + , libpng, ffmpeg, libuuid, xcbutilrenderutil, xwayland 5 5 }: 6 6 7 7 stdenv.mkDerivation rec { 8 8 pname = "wlroots"; 9 - version = "0.12.0"; 9 + version = "0.13.0"; 10 10 11 11 src = fetchFromGitHub { 12 12 owner = "swaywm"; 13 13 repo = "wlroots"; 14 14 rev = version; 15 - sha256 = "01j38lmgs2c6fq68v8b75pkilia2wsgzgp46ivfbi9hhx47kgcfn"; 15 + sha256 = "01plhbnsp5yg18arz0v8fr0pr9l4w4pdzwkg9px486qdvb3s1vgy"; 16 16 }; 17 17 18 18 # $out for the library and $examples for the example programs (in examples): ··· 23 23 buildInputs = [ 24 24 libGL wayland wayland-protocols libinput libxkbcommon pixman 25 25 xcbutilwm libX11 libcap xcbutilimage xcbutilerrors mesa 26 - libpng ffmpeg 26 + libpng ffmpeg libuuid xcbutilrenderutil xwayland 27 27 ]; 28 28 29 29 mesonFlags = [ "-Dlogind-provider=systemd" "-Dlibseat=disabled" ]; ··· 50 50 changelog = "https://github.com/swaywm/wlroots/releases/tag/${version}"; 51 51 license = licenses.mit; 52 52 platforms = platforms.linux; 53 - maintainers = with maintainers; [ primeos ]; 53 + maintainers = with maintainers; [ primeos synthetica ]; 54 54 }; 55 55 }
+2 -10
pkgs/development/python-modules/aiodiscover/default.nix
··· 10 10 11 11 buildPythonPackage rec { 12 12 pname = "aiodiscover"; 13 - version = "1.3.2"; 13 + version = "1.3.3"; 14 14 disabled = pythonOlder "3.7"; 15 15 16 16 src = fetchFromGitHub { 17 17 owner = "bdraco"; 18 18 repo = pname; 19 19 rev = "v${version}"; 20 - sha256 = "0qg2wm6ddsfai788chylr5ynrvakwg91q3dszz7dxzbkfdcxixj3"; 20 + sha256 = "186agrjx818vn00d3pqlka5ir48rgpbfyn1cifkn9ylsxg9cz3ph"; 21 21 }; 22 - 23 - patches = [ 24 - (fetchpatch { 25 - name = "remove-entry_point.patch"; 26 - url = "https://github.com/bdraco/aiodiscover/commit/4c497fb7d4c8685a78209c710e92e0bd17f46bb2.patch"; 27 - sha256 = "0py9alhg6qdncbn6a04mrnjhs4j19kg759dv69knpqzryikcfa63"; 28 - }) 29 - ]; 30 22 31 23 propagatedBuildInputs = [ 32 24 async-dns
+50
pkgs/development/python-modules/asyncio-nats-client/default.nix
··· 1 + { lib 2 + , buildPythonPackage 3 + , ed25519 4 + , fetchFromGitHub 5 + , nats-server 6 + , pytestCheckHook 7 + , pythonOlder 8 + }: 9 + 10 + buildPythonPackage rec { 11 + pname = "asyncio-nats-client"; 12 + version = "0.11.4"; 13 + disabled = pythonOlder "3.6"; 14 + 15 + src = fetchFromGitHub { 16 + owner = "nats-io"; 17 + repo = "nats.py"; 18 + rev = "v${version}"; 19 + sha256 = "1aj57xi2rj1xswq8air13xdsll1ybpi0nmz5f6jq01azm0zy9xyd"; 20 + }; 21 + 22 + propagatedBuildInputs = [ 23 + ed25519 24 + ]; 25 + 26 + checkInputs = [ 27 + nats-server 28 + pytestCheckHook 29 + ]; 30 + 31 + postPatch = '' 32 + substituteInPlace setup.cfg \ 33 + --replace "--cov=nats --cov-report html" "" 34 + ''; 35 + 36 + disabledTests = [ 37 + # RuntimeError: Event loop is closed 38 + "test_subscribe_no_echo" 39 + "test_reconnect_to_new_server_with_auth" 40 + ]; 41 + 42 + pythonImportsCheck = [ "nats.aio" ]; 43 + 44 + meta = with lib; { 45 + description = "Python client for NATS.io"; 46 + homepage = "https://github.com/nats-io/nats.py"; 47 + license = with licenses; [ asl20 ]; 48 + maintainers = with maintainers; [ fab ]; 49 + }; 50 + }
+15 -2
pkgs/development/python-modules/homeassistant-pyozw/default.nix
··· 1 - { python_openzwave, fetchPypi }: 1 + { python_openzwave, fetchPypi, openzwave, fetchFromGitHub }: 2 + 3 + (python_openzwave.override { 4 + openzwave = openzwave.overrideAttrs (oldAttrs: { 5 + version = "unstable-2020-03-24"; 6 + 7 + src = fetchFromGitHub { 8 + owner = "home-assistant"; 9 + repo = "open-zwave"; 10 + rev = "94267fa298c1882f0dc73c0fd08f1f755ba83e83"; 11 + sha256 = "0p2869fwidz1wcqzfm52cwm9ab96pmwkna3d4yvvh21nh09cvmwk"; 12 + }; 2 13 3 - python_openzwave.overridePythonAttrs (oldAttrs: rec { 14 + patches = [ ]; 15 + }); 16 + }).overridePythonAttrs (oldAttrs: rec { 4 17 pname = "homeassistant_pyozw"; 5 18 version = "0.1.10"; 6 19
+46
pkgs/development/python-modules/nats-python/default.nix
··· 1 + { lib 2 + , buildPythonPackage 3 + , fetchFromGitHub 4 + , fetchpatch 5 + , poetry-core 6 + , pythonOlder 7 + }: 8 + 9 + buildPythonPackage rec { 10 + pname = "nats-python"; 11 + version = "0.8.0"; 12 + disabled = pythonOlder "3.6"; 13 + format = "pyproject"; 14 + 15 + src = fetchFromGitHub { 16 + owner = "Gr1N"; 17 + repo = "nats-python"; 18 + rev = version; 19 + sha256 = "1j7skyxldir3mphvnsyhjxmf3cimv4h7n5v58jl2gff4yd0hdw7g"; 20 + }; 21 + 22 + nativeBuildInputs = [ 23 + poetry-core 24 + ]; 25 + 26 + patches = [ 27 + # Switch to poetry-core, https://github.com/Gr1N/nats-python/pull/19 28 + (fetchpatch { 29 + name = "use-poetry-core.patch"; 30 + url = "https://github.com/Gr1N/nats-python/commit/71b25b324212dccd7fc06ba3914491adba22e83f.patch"; 31 + sha256 = "1fip1qpzk2ka7qgkrdpdr6vnrnb1p8cwapa51xp0h26nm7yis1gl"; 32 + }) 33 + ]; 34 + 35 + # Tests require a running NATS server 36 + doCheck = false; 37 + 38 + pythonImportsCheck = [ "pynats" ]; 39 + 40 + meta = with lib; { 41 + description = "Python client for NATS messaging system"; 42 + homepage = "https://github.com/Gr1N/nats-python"; 43 + license = with licenses; [ mit ]; 44 + maintainers = with maintainers; [ fab ]; 45 + }; 46 + }
+10 -4
pkgs/development/python-modules/smartypants/default.nix
··· 1 1 { lib 2 2 , buildPythonPackage 3 - , fetchhg 3 + , fetchFromGitHub 4 4 , isPyPy 5 5 }: 6 6 ··· 9 9 pname = "smartypants"; 10 10 disabled = isPyPy; 11 11 12 - src = fetchhg { 13 - url = "https://bitbucket.org/livibetter/smartypants.py"; 12 + src = fetchFromGitHub { 13 + owner = "leohemsted"; 14 + repo = "smartypants.py"; 14 15 rev = "v${version}"; 15 16 sha256 = "1cmzz44d2hm6y8jj2xcq1wfr26760gi7iq92ha8xbhb1axzd7nq6"; 17 + # remove this file and the name on the next version update 18 + extraPostFetch = '' 19 + cp ${./hgtags} "$out"/.hgtags 20 + ''; 21 + name = "hg-archive"; 16 22 }; 17 23 18 24 meta = with lib; { 19 25 description = "Python with the SmartyPants"; 20 - homepage = "https://bitbucket.org/livibetter/smartypants.py"; 26 + homepage = "https://github.com/leohemsted/smartypants.py"; 21 27 license = licenses.bsd3; 22 28 maintainers = with maintainers; [ ]; 23 29 };
+17
pkgs/development/python-modules/smartypants/hgtags
··· 1 + 47e996532eff9d3bb2c7048aca37d5fd1028e706 v1.5_1.2 2 + 4ff48eba1d3d37d708005e465cf701b63eb68fd3 v1.5_1.1 3 + 6ba7f3a14ff77e4e9bf9918413b1710c33deae4d v1.5_1.3.1 4 + 71006a014216defb21e4db6e03434d289564ea60 v1.5_1.6 5 + 90950ff693122f80710974abc0f2be64d4105e84 v1.5_1.3 6 + a6ecae6541d64f5b12c7b788c65362b0c012278d v1.5_1.0 7 + eed4a8a16f116f98e8280dc79128845020bbe766 v1.5_1.5 8 + f9a62f541f19ead9be4c3be896b64d1caa0b524c v1.5_1.4 9 + fc0bee49a07daf05f034560cfef81a8a8d034d1f v1.5_1.7 10 + 096ed5f806b6dbc473fae1848643cf45005b9bf1 v1.7.0 11 + aaeb8099a24ad7db3f36ebe71ef326d6377730aa v1.7.1 12 + fd8ccc937af7280db4e581b2eb1354245f4672ab v1.8.0 13 + 7839b0eab3e9daf5b346edfa5c54f3cc46fc202a v1.8.1 14 + 6140b78317beabb6e49cd91b35a779ccb0af7327 v1.8.2 15 + c3b1c83c5ddada685b421b8f82f7e92c794bf2f6 v1.8.3 16 + 460c1add9b9f89831e1ab965f1e1c31325f6e72d v1.8.4 17 + 78165f4976299c37d6e3dd5463adcd61f9cb2b75 v1.8.5
+2 -2
pkgs/development/python-modules/ytmusicapi/default.nix
··· 7 7 8 8 buildPythonPackage rec { 9 9 pname = "ytmusicapi"; 10 - version = "0.15.0"; 10 + version = "0.15.1"; 11 11 12 12 disabled = isPy27; 13 13 14 14 src = fetchPypi { 15 15 inherit pname version; 16 - sha256 = "sha256-pVQqoMvuuFc/1QNG5z/AspGlgIGPi9aqjZ3/3eVNhis="; 16 + sha256 = "sha256-W/eZubJ/SNLBya1S6wLUwTwZCUD+wCQ5FAuNcSpl+9Y="; 17 17 }; 18 18 19 19 propagatedBuildInputs = [
+1 -1
pkgs/development/ruby-modules/bundix/default.nix
··· 38 38 ''; 39 39 homepage = "https://github.com/manveru/bundix"; 40 40 license = "MIT"; 41 - maintainers = with lib.maintainers; [ manveru zimbatm ]; 41 + maintainers = with lib.maintainers; [ manveru marsam zimbatm ]; 42 42 platforms = lib.platforms.all; 43 43 }; 44 44 }
+6 -11
pkgs/development/tools/analysis/radare2/default.nix
··· 13 13 , file 14 14 , libzip 15 15 , xxHash 16 - , gtk2 ? null 17 - , vte ? null 18 - , gtkdialog ? null 19 - , python3 ? null 20 - , ruby ? null 21 - , lua ? null 16 + , gtk2 17 + , vte 18 + , gtkdialog 19 + , python3 20 + , ruby 21 + , lua 22 22 , useX11 ? false 23 23 , rubyBindings ? false 24 24 , pythonBindings ? false 25 25 , luaBindings ? false 26 26 }: 27 - 28 - assert useX11 -> (gtk2 != null && vte != null && gtkdialog != null); 29 - assert rubyBindings -> ruby != null; 30 - assert pythonBindings -> python3 != null; 31 - 32 27 33 28 let 34 29 inherit (lib) optional;
-2
pkgs/development/tools/analysis/rizin/cutter.nix
··· 35 35 qtWrapperArgs+=(--prefix PYTHONPATH : "$PYTHONPATH") 36 36 ''; 37 37 38 - enableParallelBuilding = true; 39 - 40 38 meta = with lib; { 41 39 description = "Free and Open Source Reverse Engineering Platform powered by rizin"; 42 40 homepage = src.meta.homepage;
-2
pkgs/development/tools/analysis/rizin/default.nix
··· 40 40 "-Duse_sys_tree_sitter=true" 41 41 ]; 42 42 43 - enableParallelBuilding = true; 44 - 45 43 nativeBuildInputs = [ pkg-config meson ninja cmake ]; 46 44 47 45 buildInputs = [
+3 -3
pkgs/development/tools/rust/cargo-deny/default.nix
··· 7 7 8 8 rustPlatform.buildRustPackage rec { 9 9 pname = "cargo-deny"; 10 - version = "0.8.9"; 10 + version = "0.9.0"; 11 11 12 12 src = fetchFromGitHub { 13 13 owner = "EmbarkStudios"; 14 14 repo = pname; 15 15 rev = version; 16 - sha256 = "sha256-K8lNo2XmHzgbaVCMNvwDwr86hrXBPws9v3HD8ku+D6w="; 16 + sha256 = "sha256-ZjXAZN93ij42WVYSOgvKAzFZ/cZ2RTFKT2sr44j7TVc="; 17 17 }; 18 18 19 - cargoSha256 = "sha256-spTy9vzldzqu66904wRVwAeH1rNOQ3WeC6miJkRiAGg="; 19 + cargoSha256 = "sha256-eQv9pFegHTjjjFURiD/yN/srtONAwAH3vwfrSY/LM/Q="; 20 20 21 21 doCheck = false; 22 22
+6
pkgs/os-specific/darwin/macfuse/default.nix
··· 56 56 lgpl2Plus # libfuse 57 57 ]; 58 58 }; 59 + 60 + passthru.warning = '' 61 + macFUSE is required for this package to work on macOS. To install macFUSE, 62 + use the installer from the <link xlink:href="https://osxfuse.github.io/"> 63 + project website</link>. 64 + ''; 59 65 }
+3 -2
pkgs/os-specific/linux/kernel/generic.nix
··· 55 55 , autoModules ? stdenv.hostPlatform.linux-kernel.autoModules 56 56 , preferBuiltin ? stdenv.hostPlatform.linux-kernel.preferBuiltin or false 57 57 , kernelArch ? stdenv.hostPlatform.linuxArch 58 - 58 + , kernelTests ? [] 59 59 , ... 60 60 }: 61 61 ··· 178 178 179 179 passthru = { 180 180 features = kernelFeatures; 181 - inherit commonStructuredConfig isXen isZen isHardened isLibre; 181 + inherit commonStructuredConfig isXen isZen isHardened isLibre modDirVersion; 182 182 kernelOlder = lib.versionOlder version; 183 183 kernelAtLeast = lib.versionAtLeast version; 184 184 passthru = kernel.passthru // (removeAttrs passthru [ "passthru" ]); 185 + tests = kernelTests; 185 186 }; 186 187 187 188 in lib.extendDerivation true passthru kernel
+3 -1
pkgs/os-specific/linux/kernel/linux-4.14.nix
··· 1 - { lib, buildPackages, fetchurl, perl, buildLinux, modDirVersionArg ? null, ... } @ args: 1 + { lib, buildPackages, fetchurl, perl, buildLinux, nixosTests, modDirVersionArg ? null, ... } @ args: 2 2 3 3 with lib; 4 4 ··· 15 15 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz"; 16 16 sha256 = "0nw1jf6x5a990n69aw2da4s4lc1c7mnwiwcda40bl2rkmd24s1qm"; 17 17 }; 18 + 19 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_4_14 ]; 18 20 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-4.19.nix
··· 1 - { lib, buildPackages, fetchurl, perl, buildLinux, modDirVersionArg ? null, ... } @ args: 1 + { lib, buildPackages, fetchurl, perl, buildLinux, nixosTests, modDirVersionArg ? null, ... } @ args: 2 2 3 3 with lib; 4 4 ··· 15 15 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz"; 16 16 sha256 = "0z5pgal8775rf7pvpxq47dnghr42al2k9py0s9jl3js2wamgdyix"; 17 17 }; 18 + 19 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_4_19 ]; 18 20 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-4.4.nix
··· 1 - { buildPackages, fetchurl, perl, buildLinux, ... } @ args: 1 + { buildPackages, fetchurl, perl, buildLinux, nixosTests, ... } @ args: 2 2 3 3 buildLinux (args // rec { 4 4 version = "4.4.264"; ··· 8 8 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz"; 9 9 sha256 = "1b0d735qnk0bcqn9gdsjqxhk8pkb3597ya9f34lv1vjfaqkkxk7l"; 10 10 }; 11 + 12 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_4_4 ]; 11 13 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-4.9.nix
··· 1 - { buildPackages, fetchurl, perl, buildLinux, ... } @ args: 1 + { buildPackages, fetchurl, perl, buildLinux, nixosTests, ... } @ args: 2 2 3 3 buildLinux (args // rec { 4 4 version = "4.9.264"; ··· 8 8 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz"; 9 9 sha256 = "1df2dv26c9z6zsdlqzbcc60f2pszh0hx1n94v65jswlb72a2mipc"; 10 10 }; 11 + 12 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_4_9 ]; 11 13 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-5.10.nix
··· 1 - { lib, buildPackages, fetchurl, perl, buildLinux, modDirVersionArg ? null, ... } @ args: 1 + { lib, buildPackages, fetchurl, perl, buildLinux, nixosTests, modDirVersionArg ? null, ... } @ args: 2 2 3 3 with lib; 4 4 ··· 15 15 url = "mirror://kernel/linux/kernel/v5.x/linux-${version}.tar.xz"; 16 16 sha256 = "1nb95ll66kxiz702gs903n3gy5ialz8cin58l19rqaai55kck7fr"; 17 17 }; 18 + 19 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_5_10 ]; 18 20 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-5.11.nix
··· 1 - { lib, buildPackages, fetchurl, perl, buildLinux, modDirVersionArg ? null, ... } @ args: 1 + { lib, buildPackages, fetchurl, perl, buildLinux, nixosTests, modDirVersionArg ? null, ... } @ args: 2 2 3 3 with lib; 4 4 ··· 15 15 url = "mirror://kernel/linux/kernel/v5.x/linux-${version}.tar.xz"; 16 16 sha256 = "1fc3yl4srzla3cbihgnry0pqmgcc17zv0zlkk9zpx99371hpay0a"; 17 17 }; 18 + 19 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_5_11 ]; 18 20 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-5.4.nix
··· 1 - { lib, buildPackages, fetchurl, perl, buildLinux, modDirVersionArg ? null, ... } @ args: 1 + { lib, buildPackages, fetchurl, perl, buildLinux, nixosTests, modDirVersionArg ? null, ... } @ args: 2 2 3 3 with lib; 4 4 ··· 15 15 url = "mirror://kernel/linux/kernel/v5.x/linux-${version}.tar.xz"; 16 16 sha256 = "1vmpc6yrr2zm4m3naflwik5111jr8hy0mnyddwk31l0p4xbg8smc"; 17 17 }; 18 + 19 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_5_4 ]; 18 20 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-testing.nix
··· 1 - { lib, buildPackages, fetchurl, perl, buildLinux, modDirVersionArg ? null, ... } @ args: 1 + { lib, buildPackages, fetchurl, perl, buildLinux, nixosTests, modDirVersionArg ? null, ... } @ args: 2 2 3 3 with lib; 4 4 ··· 13 13 url = "https://git.kernel.org/torvalds/t/linux-${version}.tar.gz"; 14 14 sha256 = "0w0zk2byimdbcvn8myqaq0ab6lyd43493fnkv9a1407dimpxb03d"; 15 15 }; 16 + 17 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_testing ]; 16 18 17 19 # Should the testing kernels ever be built on Hydra? 18 20 extraMeta.hydraPlatforms = [];
+12 -9
pkgs/servers/home-assistant/component-packages.nix
··· 2 2 # Do not edit! 3 3 4 4 { 5 - version = "2021.3.4"; 5 + version = "2021.4.0"; 6 6 components = { 7 7 "abode" = ps: with ps; [ abodepy ]; 8 8 "accuweather" = ps: with ps; [ accuweather ]; ··· 31 31 "ambient_station" = ps: with ps; [ aioambient ]; 32 32 "amcrest" = ps: with ps; [ amcrest ha-ffmpeg ]; 33 33 "ampio" = ps: with ps; [ ]; # missing inputs: asmog 34 + "analytics" = ps: with ps; [ aiohttp-cors ]; 34 35 "android_ip_webcam" = ps: with ps; [ ]; # missing inputs: pydroid-ipcam 35 36 "androidtv" = ps: with ps; [ adb-shell androidtv pure-python-adb ]; 36 37 "anel_pwrctrl" = ps: with ps; [ ]; # missing inputs: anel_pwrctrl-homeassistant ··· 57 58 "atag" = ps: with ps; [ ]; # missing inputs: pyatag 58 59 "aten_pe" = ps: with ps; [ atenpdu ]; 59 60 "atome" = ps: with ps; [ ]; # missing inputs: pyatome 60 - "august" = ps: with ps; [ ]; # missing inputs: py-august 61 + "august" = ps: with ps; [ yalexs ]; 61 62 "aurora" = ps: with ps; [ auroranoaa ]; 62 63 "aurora_abb_powerone" = ps: with ps; [ ]; # missing inputs: aurorapy 63 64 "auth" = ps: with ps; [ aiohttp-cors ]; ··· 154 155 "deconz" = ps: with ps; [ pydeconz ]; 155 156 "decora" = ps: with ps; [ bluepy ]; # missing inputs: decora 156 157 "decora_wifi" = ps: with ps; [ ]; # missing inputs: decora_wifi 157 - "default_config" = ps: with ps; [ pynacl aiohttp-cors async-upnp-client defusedxml distro emoji hass-nabucasa netdisco pillow scapy sqlalchemy zeroconf ]; 158 + "default_config" = ps: with ps; [ pynacl aiodiscover aiohttp-cors async-upnp-client defusedxml distro emoji hass-nabucasa netdisco pillow scapy sqlalchemy zeroconf ]; 158 159 "delijn" = ps: with ps; [ ]; # missing inputs: pydelijn 159 160 "deluge" = ps: with ps; [ deluge-client ]; 160 161 "demo" = ps: with ps; [ aiohttp-cors ]; ··· 167 168 "device_tracker" = ps: with ps; [ ]; 168 169 "devolo_home_control" = ps: with ps; [ aiohttp-cors devolo-home-control-api zeroconf ]; 169 170 "dexcom" = ps: with ps; [ pydexcom ]; 170 - "dhcp" = ps: with ps; [ scapy ]; 171 + "dhcp" = ps: with ps; [ aiodiscover scapy ]; 171 172 "dht" = ps: with ps; [ ]; # missing inputs: Adafruit-DHT 172 173 "dialogflow" = ps: with ps; [ aiohttp-cors ]; 173 174 "digital_ocean" = ps: with ps; [ digital-ocean ]; ··· 277 278 "foscam" = ps: with ps; [ ]; # missing inputs: libpyfoscam 278 279 "foursquare" = ps: with ps; [ aiohttp-cors ]; 279 280 "free_mobile" = ps: with ps; [ ]; # missing inputs: freesms 280 - "freebox" = ps: with ps; [ aiohttp-cors freebox-api netdisco zeroconf ]; 281 + "freebox" = ps: with ps; [ freebox-api ]; 281 282 "freedns" = ps: with ps; [ ]; 282 283 "fritz" = ps: with ps; [ fritzconnection ]; 283 284 "fritzbox" = ps: with ps; [ pyfritzhome ]; ··· 326 327 "gree" = ps: with ps; [ ]; # missing inputs: greeclimate 327 328 "greeneye_monitor" = ps: with ps; [ ]; # missing inputs: greeneye_monitor 328 329 "greenwave" = ps: with ps; [ ]; # missing inputs: greenwavereality 329 - "griddy" = ps: with ps; [ ]; # missing inputs: griddypower 330 330 "group" = ps: with ps; [ ]; 331 331 "growatt_server" = ps: with ps; [ ]; # missing inputs: growattServer 332 332 "gstreamer" = ps: with ps; [ ]; # missing inputs: gstreamer-player ··· 352 352 "hive" = ps: with ps; [ ]; # missing inputs: pyhiveapi 353 353 "hlk_sw16" = ps: with ps; [ ]; # missing inputs: hlk-sw16 354 354 "home_connect" = ps: with ps; [ aiohttp-cors ]; # missing inputs: homeconnect 355 + "home_plus_control" = ps: with ps; [ aiohttp-cors homepluscontrol ]; 355 356 "homeassistant" = ps: with ps; [ ]; 356 357 "homekit" = ps: with ps; [ HAP-python pyqrcode pyturbojpeg aiohttp-cors base36 fnvhash ha-ffmpeg zeroconf ]; 357 358 "homekit_controller" = ps: with ps; [ aiohomekit aiohttp-cors zeroconf ]; ··· 448 449 "linux_battery" = ps: with ps; [ batinfo ]; 449 450 "lirc" = ps: with ps; [ ]; # missing inputs: python-lirc 450 451 "litejet" = ps: with ps; [ ]; # missing inputs: pylitejet 451 - "litterrobot" = ps: with ps; [ ]; # missing inputs: pylitterbot 452 + "litterrobot" = ps: with ps; [ pylitterbot ]; 452 453 "llamalab_automate" = ps: with ps; [ ]; 453 454 "local_file" = ps: with ps; [ ]; 454 455 "local_ip" = ps: with ps; [ ]; ··· 715 716 "scene" = ps: with ps; [ ]; 716 717 "schluter" = ps: with ps; [ ]; # missing inputs: py-schluter 717 718 "scrape" = ps: with ps; [ beautifulsoup4 jsonpath xmltodict ]; 719 + "screenlogic" = ps: with ps; [ screenlogicpy ]; 718 720 "script" = ps: with ps; [ ]; 719 721 "scsgate" = ps: with ps; [ ]; # missing inputs: scsgate 720 722 "search" = ps: with ps; [ aiohttp-cors ]; ··· 864 866 "tplink" = ps: with ps; [ pyhs100 ]; 865 867 "tplink_lte" = ps: with ps; [ ]; # missing inputs: tp-connected 866 868 "traccar" = ps: with ps; [ aiohttp-cors stringcase ]; # missing inputs: pytraccar 869 + "trace" = ps: with ps; [ ]; 867 870 "trackr" = ps: with ps; [ ]; # missing inputs: pytrackr 868 871 "tradfri" = ps: with ps; [ ]; # missing inputs: pytradfri[async] 869 872 "trafikverket_train" = ps: with ps; [ pytrafikverket ]; ··· 906 909 "velux" = ps: with ps; [ pyvlx ]; 907 910 "venstar" = ps: with ps; [ venstarcolortouch ]; 908 911 "vera" = ps: with ps; [ pyvera ]; 909 - "verisure" = ps: with ps; [ jsonpath vsure ]; 912 + "verisure" = ps: with ps; [ vsure ]; 910 913 "versasense" = ps: with ps; [ ]; # missing inputs: pyversasense 911 914 "version" = ps: with ps; [ pyhaversion ]; 912 915 "vesync" = ps: with ps; [ pyvesync ]; ··· 974 977 "zeroconf" = ps: with ps; [ aiohttp-cors zeroconf ]; 975 978 "zerproc" = ps: with ps; [ pyzerproc ]; 976 979 "zestimate" = ps: with ps; [ xmltodict ]; 977 - "zha" = ps: with ps; [ bellows pyserial-asyncio pyserial zha-quirks zigpy-cc zigpy-deconz zigpy-xbee zigpy-zigate zigpy-znp zigpy ]; 980 + "zha" = ps: with ps; [ aiohttp-cors bellows pyserial-asyncio pyserial zeroconf zha-quirks zigpy-cc zigpy-deconz zigpy-xbee zigpy-zigate zigpy-znp zigpy ]; 978 981 "zhong_hong" = ps: with ps; [ ]; # missing inputs: zhong_hong_hvac 979 982 "ziggo_mediabox_xl" = ps: with ps; [ ]; # missing inputs: ziggo-mediabox-xl 980 983 "zodiac" = ps: with ps; [ ];
+32 -17
pkgs/servers/home-assistant/default.nix
··· 1 1 { stdenv 2 2 , lib 3 3 , fetchFromGitHub 4 - , fetchpatch 5 4 , python3 6 5 , nixosTests 7 6 ··· 43 42 }); 44 43 }) 45 44 45 + # Pinned due to API changes in pylilterbot>=2021.3.0 46 + (self: super: { 47 + pylitterbot = super.pylitterbot.overridePythonAttrs (oldAttrs: rec { 48 + version = "2021.2.8"; 49 + src = fetchFromGitHub { 50 + owner = "natekspencer"; 51 + repo = "pylitterbot"; 52 + rev = version; 53 + sha256 = "142lhijm51v11cd0lhcfdnjdd143jxi2hjsrqdq0rrbbnmj6mymp"; 54 + }; 55 + # had no tests before 2021.3.0 56 + doCheck = false; 57 + }); 58 + }) 59 + 46 60 # Pinned due to bug in ring-doorbell 0.7.0 47 61 # https://github.com/tchellomello/python-ring-doorbell/issues/240 48 62 (mkOverride "ring-doorbell" "0.6.2" ··· 81 95 extraBuildInputs = extraPackages py.pkgs; 82 96 83 97 # Don't forget to run parse-requirements.py after updating 84 - hassVersion = "2021.3.4"; 98 + hassVersion = "2021.4.0"; 85 99 86 100 in with py.pkgs; buildPythonApplication rec { 87 101 pname = "homeassistant"; ··· 100 114 owner = "home-assistant"; 101 115 repo = "core"; 102 116 rev = version; 103 - sha256 = "110pvin39lr40zd3lhb8zvh2wafl0k0dy3nbmc483yafy31xa4kw"; 117 + sha256 = "1gkbkyxqsw3isdyskzi0ib07fgqvirnr20jkhrz86vl0k9ix8hwf"; 104 118 }; 105 119 106 120 # leave this in, so users don't have to constantly update their downstream patch handling 107 121 patches = [ 108 - (fetchpatch { 109 - # Fix I-frame interval in stream test video 110 - # https://github.com/home-assistant/core/pull/47638 111 - url = "https://github.com/home-assistant/core/commit/d9bf63103fde44ddd38fb6b9a510d82609802b36.patch"; 112 - sha256 = "1y34cmw9zqb2lxyzm0q7vxlm05wwz76mhysgnh1jn39484fn9f9m"; 113 - }) 114 122 ]; 115 123 116 124 postPatch = '' 117 125 substituteInPlace setup.py \ 118 - --replace "aiohttp==3.7.4" "aiohttp>=3.7.3" \ 119 - --replace "attrs==19.3.0" "attrs>=19.3.0" \ 120 - --replace "awesomeversion==21.2.3" "awesomeversion>=21.2.3" \ 121 - --replace "bcrypt==3.1.7" "bcrypt>=3.1.7" \ 126 + --replace "awesomeversion==21.2.3" "awesomeversion" \ 127 + --replace "bcrypt==3.1.7" "bcrypt" \ 122 128 --replace "cryptography==3.3.2" "cryptography" \ 123 - --replace "httpx==0.16.1" "httpx>=0.16.1" \ 124 - --replace "jinja2>=2.11.3" "jinja2>=2.11.2" \ 125 129 --replace "pip>=8.0.3,<20.3" "pip" \ 126 - --replace "pytz>=2021.1" "pytz>=2020.5" \ 130 + --replace "pytz>=2021.1" "pytz" \ 127 131 --replace "pyyaml==5.4.1" "pyyaml" \ 128 - --replace "ruamel.yaml==0.15.100" "ruamel.yaml>=0.15.100" 132 + --replace "ruamel.yaml==0.15.100" "ruamel.yaml" 129 133 substituteInPlace tests/test_config.py --replace '"/usr"' '"/build/media"' 130 134 ''; 131 135 ··· 179 183 componentTests = [ 180 184 "accuweather" 181 185 "airly" 186 + "analytics" 182 187 "alert" 183 188 "api" 184 189 "auth" ··· 231 236 "hddtemp" 232 237 "history" 233 238 "history_stats" 239 + "home_plus_control" 234 240 "homekit" 235 241 "homekit_controller" 236 242 "homeassistant" ··· 253 259 "ipp" 254 260 "kmtronic" 255 261 "light" 262 + "litterrobot" 256 263 "local_file" 257 264 "local_ip" 258 265 "lock" ··· 298 305 "rss_feed_template" 299 306 "safe_mode" 300 307 "scene" 308 + "screenlogic" 301 309 "script" 302 310 "search" 303 311 "shell_command" ··· 328 336 "time_date" 329 337 "timer" 330 338 "tod" 339 + "trace" 331 340 "tts" 332 341 "universal" 333 342 "updater" ··· 357 366 "--dist loadfile" 358 367 # tests are located in tests/ 359 368 "tests" 369 + # screenlogic/test_config_flow.py: Tries to send out UDP broadcasts 370 + "--deselect tests/components/screenlogic/test_config_flow.py::test_form_cannot_connect" 360 371 # dynamically add packages required for component tests 361 372 ] ++ map (component: "tests/components/" + component) componentTests; 362 373 ··· 379 390 # generic/test_camera.py: AssertionError: 500 == 200 380 391 "test_fetching_without_verify_ssl" 381 392 "test_fetching_url_with_verify_ssl" 393 + # util/test_package.py: AssertionError on package.is_installed('homeassistant>=999.999.999') 394 + "test_check_package_version_does_not_match" 382 395 ]; 383 396 384 397 preCheck = '' 398 + export HOME="$TEMPDIR" 399 + 385 400 # the tests require the existance of a media dir 386 401 mkdir /build/media 387 402
+2 -2
pkgs/servers/home-assistant/frontend.nix
··· 4 4 # the frontend version corresponding to a specific home-assistant version can be found here 5 5 # https://github.com/home-assistant/home-assistant/blob/master/homeassistant/components/frontend/manifest.json 6 6 pname = "home-assistant-frontend"; 7 - version = "20210302.6"; 7 + version = "20210407.1"; 8 8 9 9 src = fetchPypi { 10 10 inherit pname version; 11 - sha256 = "sha256-h3jCqfAPg+z6vsdLm5Pdr+7PCEWW58GCG9viIz3Mi64="; 11 + sha256 = "sha256-7kgL6Ixlc1OZ+3sUAuvJd7vgY6FBgPFEKi6xhq7fiBc="; 12 12 }; 13 13 14 14 # there is nothing to strip in this package
+12
pkgs/servers/web-apps/discourse/action_mailer_ca_cert.patch
··· 1 + diff --git a/config/environments/production.rb b/config/environments/production.rb 2 + index 75c3a69512..7fc374cd9d 100644 3 + --- a/config/environments/production.rb 4 + +++ b/config/environments/production.rb 5 + @@ -32,6 +32,7 @@ Discourse::Application.configure do 6 + user_name: GlobalSetting.smtp_user_name, 7 + password: GlobalSetting.smtp_password, 8 + authentication: GlobalSetting.smtp_authentication, 9 + + ca_file: "/etc/ssl/certs/ca-certificates.crt", 10 + enable_starttls_auto: GlobalSetting.smtp_enable_start_tls 11 + } 12 +
+48
pkgs/servers/web-apps/discourse/admin_create.patch
··· 1 + diff --git a/lib/tasks/admin.rake b/lib/tasks/admin.rake 2 + index 80c403616d..cba01202ac 100644 3 + --- a/lib/tasks/admin.rake 4 + +++ b/lib/tasks/admin.rake 5 + @@ -107,3 +107,43 @@ task "admin:create" => :environment do 6 + end 7 + 8 + end 9 + + 10 + +desc "Creates a forum administrator noninteractively" 11 + +task "admin:create_noninteractively" => :environment do 12 + + email = ENV["ADMIN_EMAIL"] 13 + + existing_user = User.find_by_email(email) 14 + + 15 + + # check if user account already exixts 16 + + if existing_user 17 + + admin = existing_user 18 + + else 19 + + # create new user 20 + + admin = User.new 21 + + end 22 + + 23 + + admin.email = email 24 + + admin.name = ENV["ADMIN_NAME"] 25 + + admin.username = ENV["ADMIN_USERNAME"] 26 + + 27 + + password = ENV["ADMIN_PASSWORD"] 28 + + unless admin.confirm_password?(password) 29 + + admin.password = password 30 + + puts "Admin password set!" 31 + + end 32 + + 33 + + admin.active = true 34 + + 35 + + # save/update user account 36 + + saved = admin.save 37 + + raise admin.errors.full_messages.join("\n") unless saved 38 + + 39 + + puts "Account created successfully with username #{admin.username}" unless existing_user 40 + + 41 + + # grant admin privileges 42 + + admin.grant_admin! 43 + + if admin.trust_level < 1 44 + + admin.change_trust_level!(1) 45 + + end 46 + + admin.email_tokens.update_all confirmed: true 47 + + admin.activate 48 + +end
+234
pkgs/servers/web-apps/discourse/default.nix
··· 1 + { stdenv, makeWrapper, runCommandNoCC, lib, nixosTests 2 + , fetchFromGitHub, bundlerEnv, ruby, replace, gzip, gnutar, git 3 + , util-linux, gawk, imagemagick, optipng, pngquant, libjpeg, jpegoptim 4 + , gifsicle, libpsl, redis, postgresql, which, brotli, procps 5 + , nodePackages, v8 6 + }: 7 + 8 + let 9 + version = "2.6.3"; 10 + 11 + src = fetchFromGitHub { 12 + owner = "discourse"; 13 + repo = "discourse"; 14 + rev = "v${version}"; 15 + sha256 = "sha256-lAIhVxvmjxEiru1KNxbFV+eDMLUGza/Dma3WU0ex0xs="; 16 + }; 17 + 18 + runtimeDeps = [ 19 + # For backups, themes and assets 20 + rubyEnv.wrappedRuby 21 + gzip 22 + gnutar 23 + git 24 + brotli 25 + 26 + # Misc required system utils 27 + which 28 + procps # For ps and kill 29 + util-linux # For renice 30 + gawk 31 + 32 + # Image optimization 33 + imagemagick 34 + optipng 35 + pngquant 36 + libjpeg 37 + jpegoptim 38 + gifsicle 39 + nodePackages.svgo 40 + ]; 41 + 42 + runtimeEnv = { 43 + HOME = "/run/discourse/home"; 44 + RAILS_ENV = "production"; 45 + UNICORN_LISTENER = "/run/discourse/sockets/unicorn.sock"; 46 + }; 47 + 48 + rake = runCommandNoCC "discourse-rake" { 49 + nativeBuildInputs = [ makeWrapper ]; 50 + } '' 51 + mkdir -p $out/bin 52 + makeWrapper ${rubyEnv}/bin/rake $out/bin/discourse-rake \ 53 + ${lib.concatStrings (lib.mapAttrsToList (name: value: "--set ${name} '${value}' ") runtimeEnv)} \ 54 + --prefix PATH : ${lib.makeBinPath runtimeDeps} \ 55 + --set RAKEOPT '-f ${discourse}/share/discourse/Rakefile' \ 56 + --run 'cd ${discourse}/share/discourse' 57 + ''; 58 + 59 + rubyEnv = bundlerEnv { 60 + name = "discourse-ruby-env-${version}"; 61 + inherit version ruby; 62 + gemdir = ./rubyEnv; 63 + gemset = 64 + let 65 + gems = import ./rubyEnv/gemset.nix; 66 + in 67 + gems // { 68 + mini_racer = gems.mini_racer // { 69 + buildInputs = [ v8 ]; 70 + dontBuild = false; 71 + # The Ruby extension makefile generator assumes the source 72 + # is C, when it's actually C++ ¯\_(ツ)_/¯ 73 + postPatch = '' 74 + substituteInPlace ext/mini_racer_extension/extconf.rb \ 75 + --replace '" -std=c++0x"' \ 76 + '" -x c++ -std=c++0x"' 77 + ''; 78 + }; 79 + mini_suffix = gems.mini_suffix // { 80 + propagatedBuildInputs = [ libpsl ]; 81 + dontBuild = false; 82 + # Use our libpsl instead of the vendored one, which isn't 83 + # available for aarch64 84 + postPatch = '' 85 + cp $(readlink -f ${libpsl}/lib/libpsl.so) vendor/libpsl.so 86 + ''; 87 + }; 88 + }; 89 + 90 + groups = [ 91 + "default" "assets" "development" "test" 92 + ]; 93 + }; 94 + 95 + assets = stdenv.mkDerivation { 96 + pname = "discourse-assets"; 97 + inherit version src; 98 + 99 + nativeBuildInputs = [ 100 + rubyEnv.wrappedRuby 101 + postgresql 102 + redis 103 + which 104 + brotli 105 + procps 106 + nodePackages.uglify-js 107 + ]; 108 + 109 + # We have to set up an environment that is close enough to 110 + # production ready or the assets:precompile task refuses to 111 + # run. This means that Redis and PostgreSQL has to be running and 112 + # database migrations performed. 113 + preBuild = '' 114 + redis-server >/dev/null & 115 + 116 + initdb -A trust $NIX_BUILD_TOP/postgres >/dev/null 117 + postgres -D $NIX_BUILD_TOP/postgres -k $NIX_BUILD_TOP >/dev/null & 118 + export PGHOST=$NIX_BUILD_TOP 119 + 120 + echo "Waiting for Redis and PostgreSQL to be ready.." 121 + while ! redis-cli --scan >/dev/null || ! psql -l >/dev/null; do 122 + sleep 0.1 123 + done 124 + 125 + psql -d postgres -tAc 'CREATE USER "discourse"' 126 + psql -d postgres -tAc 'CREATE DATABASE "discourse" OWNER "discourse"' 127 + psql 'discourse' -tAc "CREATE EXTENSION IF NOT EXISTS pg_trgm" 128 + psql 'discourse' -tAc "CREATE EXTENSION IF NOT EXISTS hstore" 129 + 130 + # Create a temporary home dir to stop bundler from complaining 131 + mkdir $NIX_BUILD_TOP/tmp_home 132 + export HOME=$NIX_BUILD_TOP/tmp_home 133 + 134 + export RAILS_ENV=production 135 + 136 + bundle exec rake db:migrate >/dev/null 137 + rm -r tmp/* 138 + ''; 139 + 140 + buildPhase = '' 141 + runHook preBuild 142 + 143 + bundle exec rake assets:precompile 144 + 145 + runHook postBuild 146 + ''; 147 + 148 + installPhase = '' 149 + runHook preInstall 150 + 151 + mv public/assets $out 152 + 153 + runHook postInstall 154 + ''; 155 + }; 156 + 157 + discourse = stdenv.mkDerivation { 158 + pname = "discourse"; 159 + inherit version src; 160 + 161 + buildInputs = [ 162 + rubyEnv rubyEnv.wrappedRuby rubyEnv.bundler 163 + ]; 164 + 165 + patches = [ 166 + # Load a separate NixOS site settings file 167 + ./nixos_defaults.patch 168 + 169 + # Add a noninteractive admin creation task 170 + ./admin_create.patch 171 + 172 + # Disable jhead, which is currently marked as vulnerable 173 + ./disable_jhead.patch 174 + 175 + # Add the path to the CA cert bundle to make TLS work 176 + ./action_mailer_ca_cert.patch 177 + 178 + # Log Unicorn messages to the journal and make request timeout 179 + # configurable 180 + ./unicorn_logging_and_timeout.patch 181 + ]; 182 + 183 + postPatch = '' 184 + # Always require lib-files and application.rb through their store 185 + # path, not their relative state directory path. This gets rid of 186 + # warnings and means we don't have to link back to lib from the 187 + # state directory. 188 + find config -type f -execdir sed -Ei "s,(\.\./)+(lib|app)/,$out/share/discourse/\2/," {} \; 189 + 190 + ${replace}/bin/replace-literal -f -r -e 'File.rename(temp_destination, destination)' "FileUtils.mv(temp_destination, destination)" . 191 + ''; 192 + 193 + buildPhase = '' 194 + runHook preBuild 195 + 196 + mv config config.dist 197 + mv public public.dist 198 + mv plugins plugins.dist 199 + 200 + runHook postBuild 201 + ''; 202 + 203 + installPhase = '' 204 + runHook preInstall 205 + 206 + mkdir -p $out/share 207 + cp -r . $out/share/discourse 208 + rm -r $out/share/discourse/log 209 + ln -sf /var/log/discourse $out/share/discourse/log 210 + ln -sf /run/discourse/tmp $out/share/discourse/tmp 211 + ln -sf /run/discourse/config $out/share/discourse/config 212 + ln -sf /run/discourse/assets/javascripts/plugins $out/share/discourse/app/assets/javascripts/plugins 213 + ln -sf /run/discourse/public $out/share/discourse/public 214 + ln -sf /run/discourse/plugins $out/share/discourse/plugins 215 + ln -sf ${assets} $out/share/discourse/public.dist/assets 216 + 217 + runHook postInstall 218 + ''; 219 + 220 + meta = with lib; { 221 + homepage = "https://www.discourse.org/"; 222 + platforms = platforms.linux; 223 + maintainers = with maintainers; [ talyz ]; 224 + license = licenses.gpl2Plus; 225 + description = "Discourse is an open source discussion platform"; 226 + }; 227 + 228 + passthru = { 229 + inherit rubyEnv runtimeEnv runtimeDeps rake; 230 + ruby = rubyEnv.wrappedRuby; 231 + tests = nixosTests.discourse; 232 + }; 233 + }; 234 + in discourse
+12
pkgs/servers/web-apps/discourse/disable_jhead.patch
··· 1 + diff --git a/lib/file_helper.rb b/lib/file_helper.rb 2 + index 162de9a40b..9ac8807e9d 100644 3 + --- a/lib/file_helper.rb 4 + +++ b/lib/file_helper.rb 5 + @@ -124,6 +124,7 @@ class FileHelper 6 + jpegoptim: { strip: strip_image_metadata ? "all" : "none" }, 7 + jpegtran: false, 8 + jpegrecompress: false, 9 + + jhead: false, 10 + ) 11 + end 12 + end
+39
pkgs/servers/web-apps/discourse/mail_receiver/default.nix
··· 1 + { stdenv, lib, fetchFromGitHub, ruby, makeWrapper, replace }: 2 + 3 + stdenv.mkDerivation rec { 4 + pname = "discourse-mail-receiver"; 5 + version = "4.0.7"; 6 + 7 + src = fetchFromGitHub { 8 + owner = "discourse"; 9 + repo = "mail-receiver"; 10 + rev = "v${version}"; 11 + sha256 = "0grifm5qyqazq63va3w26xjqnxwmfixhx0fx0zy7kd39378wwa6i"; 12 + }; 13 + 14 + nativeBuildInputs = [ replace ]; 15 + buildInputs = [ ruby makeWrapper ]; 16 + 17 + dontBuild = true; 18 + 19 + installPhase = '' 20 + mkdir -p $out/bin 21 + 22 + replace-literal -f -r -e /etc/postfix /run/discourse-mail-receiver . 23 + 24 + cp -r receive-mail discourse-smtp-fast-rejection $out/bin/ 25 + cp -r lib $out/ 26 + 27 + wrapProgram $out/bin/receive-mail --set RUBYLIB $out/lib 28 + wrapProgram $out/bin/discourse-smtp-fast-rejection --set RUBYLIB $out/lib 29 + ''; 30 + 31 + meta = with lib; { 32 + homepage = "https://www.discourse.org/"; 33 + platforms = platforms.linux; 34 + maintainers = with maintainers; [ talyz ]; 35 + license = licenses.mit; 36 + description = "A helper program which receives incoming mail for Discourse"; 37 + }; 38 + 39 + }
+13
pkgs/servers/web-apps/discourse/nixos_defaults.patch
··· 1 + diff --git a/app/models/site_setting.rb b/app/models/site_setting.rb 2 + index 89a5e923fc..b60754f50a 100644 3 + --- a/app/models/site_setting.rb 4 + +++ b/app/models/site_setting.rb 5 + @@ -26,6 +26,8 @@ class SiteSetting < ActiveRecord::Base 6 + end 7 + end 8 + 9 + + load_settings(File.join(Rails.root, 'config', 'nixos_site_settings.json')) 10 + + 11 + setup_deprecated_methods 12 + client_settings << :available_locales 13 +
+248
pkgs/servers/web-apps/discourse/rubyEnv/Gemfile
··· 1 + # frozen_string_literal: true 2 + 3 + source 'https://rubygems.org' 4 + # if there is a super emergency and rubygems is playing up, try 5 + #source 'http://production.cf.rubygems.org' 6 + 7 + gem 'bootsnap', require: false, platform: :mri 8 + 9 + def rails_master? 10 + ENV["RAILS_MASTER"] == '1' 11 + end 12 + 13 + if rails_master? 14 + gem 'arel', git: 'https://github.com/rails/arel.git' 15 + gem 'rails', git: 'https://github.com/rails/rails.git' 16 + else 17 + # NOTE: Until rubygems gives us optional dependencies we are stuck with this needing to be explicit 18 + # this allows us to include the bits of rails we use without pieces we do not. 19 + # 20 + # To issue a rails update bump the version number here 21 + gem 'actionmailer', '6.0.3.3' 22 + gem 'actionpack', '6.0.3.3' 23 + gem 'actionview', '6.0.3.3' 24 + gem 'activemodel', '6.0.3.3' 25 + gem 'activerecord', '6.0.3.3' 26 + gem 'activesupport', '6.0.3.3' 27 + gem 'railties', '6.0.3.3' 28 + gem 'sprockets-rails' 29 + end 30 + 31 + gem 'json' 32 + 33 + # TODO: At the moment Discourse does not work with Sprockets 4, we would need to correct internals 34 + # This is a desired upgrade we should get to. 35 + gem 'sprockets', '3.7.2' 36 + 37 + # this will eventually be added to rails, 38 + # allows us to precompile all our templates in the unicorn master 39 + gem 'actionview_precompiler', require: false 40 + 41 + gem 'seed-fu' 42 + 43 + gem 'mail', require: false 44 + gem 'mini_mime' 45 + gem 'mini_suffix' 46 + 47 + gem 'redis' 48 + 49 + # This is explicitly used by Sidekiq and is an optional dependency. 50 + # We tell Sidekiq to use the namespace "sidekiq" which triggers this 51 + # gem to be used. There is no explicit dependency in sidekiq cause 52 + # redis namespace support is optional 53 + # We already namespace stuff in DiscourseRedis, so we should consider 54 + # just using a single implementation in core vs having 2 namespace implementations 55 + gem 'redis-namespace' 56 + 57 + # NOTE: AM serializer gets a lot slower with recent updates 58 + # we used an old branch which is the fastest one out there 59 + # are long term goal here is to fork this gem so we have a 60 + # better maintained living fork 61 + gem 'active_model_serializers', '~> 0.8.3' 62 + 63 + gem 'onebox' 64 + 65 + gem 'http_accept_language', require: false 66 + 67 + # Ember related gems need to be pinned cause they control client side 68 + # behavior, we will push these versions up when upgrading ember 69 + gem 'discourse-ember-rails', '0.18.6', require: 'ember-rails' 70 + gem 'discourse-ember-source', '~> 3.12.2' 71 + gem 'ember-handlebars-template', '0.8.0' 72 + gem 'discourse-fonts' 73 + 74 + gem 'barber' 75 + 76 + gem 'message_bus' 77 + 78 + gem 'rails_multisite' 79 + 80 + gem 'fast_xs', platform: :ruby 81 + 82 + gem 'xorcist' 83 + 84 + gem 'fastimage' 85 + 86 + gem 'aws-sdk-s3', require: false 87 + gem 'aws-sdk-sns', require: false 88 + gem 'excon', require: false 89 + gem 'unf', require: false 90 + 91 + gem 'email_reply_trimmer' 92 + 93 + # Forked until https://github.com/toy/image_optim/pull/162 is merged 94 + # https://github.com/discourse/image_optim 95 + gem 'discourse_image_optim', require: 'image_optim' 96 + gem 'multi_json' 97 + gem 'mustache' 98 + gem 'nokogiri' 99 + gem 'css_parser', require: false 100 + 101 + gem 'omniauth' 102 + gem 'omniauth-facebook' 103 + gem 'omniauth-twitter' 104 + gem 'omniauth-github' 105 + 106 + gem 'omniauth-oauth2', require: false 107 + 108 + gem 'omniauth-google-oauth2' 109 + 110 + gem 'oj' 111 + gem 'pg' 112 + gem 'mini_sql' 113 + gem 'pry-rails', require: false 114 + gem 'pry-byebug', require: false 115 + gem 'r2', require: false 116 + gem 'rake' 117 + 118 + gem 'thor', require: false 119 + gem 'diffy', require: false 120 + gem 'rinku' 121 + gem 'sidekiq' 122 + gem 'mini_scheduler' 123 + 124 + gem 'execjs', require: false 125 + gem 'mini_racer' 126 + 127 + gem 'highline', require: false 128 + 129 + gem 'rack' 130 + 131 + gem 'rack-protection' # security 132 + gem 'cbor', require: false 133 + gem 'cose', require: false 134 + gem 'addressable' 135 + 136 + # Gems used only for assets and not required in production environments by default. 137 + # Allow everywhere for now cause we are allowing asset debugging in production 138 + group :assets do 139 + gem 'uglifier' 140 + gem 'rtlit', require: false # for css rtling 141 + end 142 + 143 + group :test do 144 + gem 'webmock', require: false 145 + gem 'fakeweb', require: false 146 + gem 'minitest', require: false 147 + gem 'simplecov', require: false 148 + gem "test-prof" 149 + end 150 + 151 + group :test, :development do 152 + gem 'rspec' 153 + gem 'mock_redis' 154 + gem 'listen', require: false 155 + gem 'certified', require: false 156 + gem 'fabrication', require: false 157 + gem 'mocha', require: false 158 + 159 + gem 'rb-fsevent', require: RUBY_PLATFORM =~ /darwin/i ? 'rb-fsevent' : false 160 + 161 + gem 'rspec-rails' 162 + 163 + gem 'shoulda-matchers', require: false 164 + gem 'rspec-html-matchers' 165 + gem 'byebug', require: ENV['RM_INFO'].nil?, platform: :mri 166 + gem "rubocop-discourse", require: false 167 + gem 'parallel_tests' 168 + 169 + gem 'rswag-specs' 170 + end 171 + 172 + group :development do 173 + gem 'ruby-prof', require: false, platform: :mri 174 + gem 'bullet', require: !!ENV['BULLET'] 175 + gem 'better_errors', platform: :mri, require: !!ENV['BETTER_ERRORS'] 176 + gem 'binding_of_caller' 177 + gem 'yaml-lint' 178 + gem 'annotate' 179 + end 180 + 181 + # this is an optional gem, it provides a high performance replacement 182 + # to String#blank? a method that is called quite frequently in current 183 + # ActiveRecord, this may change in the future 184 + gem 'fast_blank', platform: :ruby 185 + 186 + # this provides a very efficient lru cache 187 + gem 'lru_redux' 188 + 189 + gem 'htmlentities', require: false 190 + 191 + # IMPORTANT: mini profiler monkey patches, so it better be required last 192 + # If you want to amend mini profiler to do the monkey patches in the railties 193 + # we are open to it. by deferring require to the initializer we can configure discourse installs without it 194 + 195 + gem 'flamegraph', require: false 196 + gem 'rack-mini-profiler', require: ['enable_rails_patches'] 197 + 198 + gem 'unicorn', require: false, platform: :ruby 199 + gem 'puma', require: false 200 + gem 'rbtrace', require: false, platform: :mri 201 + gem 'gc_tracer', require: false, platform: :mri 202 + 203 + # required for feed importing and embedding 204 + gem 'ruby-readability', require: false 205 + 206 + gem 'stackprof', require: false, platform: :mri 207 + gem 'memory_profiler', require: false, platform: :mri 208 + 209 + gem 'cppjieba_rb', require: false 210 + 211 + gem 'lograge', require: false 212 + gem 'logstash-event', require: false 213 + gem 'logstash-logger', require: false 214 + gem 'logster' 215 + 216 + # NOTE: later versions of sassc are causing a segfault, possibly dependent on processer architecture 217 + # and until resolved should be locked at 2.0.1 218 + gem 'sassc', '2.0.1', require: false 219 + gem "sassc-rails" 220 + 221 + gem 'rotp', require: false 222 + 223 + gem 'rqrcode' 224 + 225 + gem 'rubyzip', require: false 226 + 227 + gem 'sshkey', require: false 228 + 229 + gem 'rchardet', require: false 230 + gem 'lz4-ruby', require: false, platform: :ruby 231 + 232 + if ENV["IMPORT"] == "1" 233 + gem 'mysql2' 234 + gem 'redcarpet' 235 + 236 + # NOTE: in import mode the version of sqlite can matter a lot, so we stick it to a specific one 237 + gem 'sqlite3', '~> 1.3', '>= 1.3.13' 238 + gem 'ruby-bbcode-to-md', git: 'https://github.com/nlalonde/ruby-bbcode-to-md' 239 + gem 'reverse_markdown' 240 + gem 'tiny_tds' 241 + gem 'csv' 242 + end 243 + 244 + gem 'webpush', require: false 245 + gem 'colored2', require: false 246 + gem 'maxminddb' 247 + 248 + gem 'rails_failover', require: false
+561
pkgs/servers/web-apps/discourse/rubyEnv/Gemfile.lock
··· 1 + GEM 2 + remote: https://rubygems.org/ 3 + specs: 4 + actionmailer (6.0.3.3) 5 + actionpack (= 6.0.3.3) 6 + actionview (= 6.0.3.3) 7 + activejob (= 6.0.3.3) 8 + mail (~> 2.5, >= 2.5.4) 9 + rails-dom-testing (~> 2.0) 10 + actionpack (6.0.3.3) 11 + actionview (= 6.0.3.3) 12 + activesupport (= 6.0.3.3) 13 + rack (~> 2.0, >= 2.0.8) 14 + rack-test (>= 0.6.3) 15 + rails-dom-testing (~> 2.0) 16 + rails-html-sanitizer (~> 1.0, >= 1.2.0) 17 + actionview (6.0.3.3) 18 + activesupport (= 6.0.3.3) 19 + builder (~> 3.1) 20 + erubi (~> 1.4) 21 + rails-dom-testing (~> 2.0) 22 + rails-html-sanitizer (~> 1.1, >= 1.2.0) 23 + actionview_precompiler (0.2.3) 24 + actionview (>= 6.0.a) 25 + active_model_serializers (0.8.4) 26 + activemodel (>= 3.0) 27 + activejob (6.0.3.3) 28 + activesupport (= 6.0.3.3) 29 + globalid (>= 0.3.6) 30 + activemodel (6.0.3.3) 31 + activesupport (= 6.0.3.3) 32 + activerecord (6.0.3.3) 33 + activemodel (= 6.0.3.3) 34 + activesupport (= 6.0.3.3) 35 + activesupport (6.0.3.3) 36 + concurrent-ruby (~> 1.0, >= 1.0.2) 37 + i18n (>= 0.7, < 2) 38 + minitest (~> 5.1) 39 + tzinfo (~> 1.1) 40 + zeitwerk (~> 2.2, >= 2.2.2) 41 + addressable (2.7.0) 42 + public_suffix (>= 2.0.2, < 5.0) 43 + annotate (3.1.1) 44 + activerecord (>= 3.2, < 7.0) 45 + rake (>= 10.4, < 14.0) 46 + ast (2.4.1) 47 + aws-eventstream (1.1.0) 48 + aws-partitions (1.390.0) 49 + aws-sdk-core (3.109.2) 50 + aws-eventstream (~> 1, >= 1.0.2) 51 + aws-partitions (~> 1, >= 1.239.0) 52 + aws-sigv4 (~> 1.1) 53 + jmespath (~> 1.0) 54 + aws-sdk-kms (1.39.0) 55 + aws-sdk-core (~> 3, >= 3.109.0) 56 + aws-sigv4 (~> 1.1) 57 + aws-sdk-s3 (1.83.2) 58 + aws-sdk-core (~> 3, >= 3.109.0) 59 + aws-sdk-kms (~> 1) 60 + aws-sigv4 (~> 1.1) 61 + aws-sdk-sns (1.35.0) 62 + aws-sdk-core (~> 3, >= 3.109.0) 63 + aws-sigv4 (~> 1.1) 64 + aws-sigv4 (1.2.2) 65 + aws-eventstream (~> 1, >= 1.0.2) 66 + barber (0.12.2) 67 + ember-source (>= 1.0, < 3.1) 68 + execjs (>= 1.2, < 3) 69 + better_errors (2.9.1) 70 + coderay (>= 1.0.0) 71 + erubi (>= 1.0.0) 72 + rack (>= 0.9.0) 73 + binding_of_caller (0.8.0) 74 + debug_inspector (>= 0.0.1) 75 + bootsnap (1.5.1) 76 + msgpack (~> 1.0) 77 + builder (3.2.4) 78 + bullet (6.1.0) 79 + activesupport (>= 3.0.0) 80 + uniform_notifier (~> 1.11) 81 + byebug (11.1.3) 82 + cbor (0.5.9.6) 83 + certified (1.0.0) 84 + chunky_png (1.3.14) 85 + coderay (1.1.3) 86 + colored2 (3.1.2) 87 + concurrent-ruby (1.1.7) 88 + connection_pool (2.2.3) 89 + cose (1.2.0) 90 + cbor (~> 0.5.9) 91 + openssl-signature_algorithm (~> 1.0) 92 + cppjieba_rb (0.3.3) 93 + crack (0.4.4) 94 + crass (1.0.6) 95 + css_parser (1.7.1) 96 + addressable 97 + debug_inspector (0.0.3) 98 + diff-lcs (1.4.4) 99 + diffy (3.4.0) 100 + discourse-ember-rails (0.18.6) 101 + active_model_serializers 102 + ember-data-source (>= 1.0.0.beta.5) 103 + ember-handlebars-template (>= 0.1.1, < 1.0) 104 + ember-source (>= 1.1.0) 105 + jquery-rails (>= 1.0.17) 106 + railties (>= 3.1) 107 + discourse-ember-source (3.12.2.2) 108 + discourse-fonts (0.0.5) 109 + discourse_image_optim (0.26.2) 110 + exifr (~> 1.2, >= 1.2.2) 111 + fspath (~> 3.0) 112 + image_size (~> 1.5) 113 + in_threads (~> 1.3) 114 + progress (~> 3.0, >= 3.0.1) 115 + docile (1.3.2) 116 + email_reply_trimmer (0.1.13) 117 + ember-data-source (3.0.2) 118 + ember-source (>= 2, < 3.0) 119 + ember-handlebars-template (0.8.0) 120 + barber (>= 0.11.0) 121 + sprockets (>= 3.3, < 4.1) 122 + ember-source (2.18.2) 123 + erubi (1.10.0) 124 + excon (0.78.0) 125 + execjs (2.7.0) 126 + exifr (1.3.9) 127 + fabrication (2.21.1) 128 + fakeweb (1.3.0) 129 + faraday (1.1.0) 130 + multipart-post (>= 1.2, < 3) 131 + ruby2_keywords 132 + fast_blank (1.0.0) 133 + fast_xs (0.8.0) 134 + fastimage (2.2.0) 135 + ffi (1.13.1) 136 + flamegraph (0.9.5) 137 + fspath (3.1.2) 138 + gc_tracer (1.5.1) 139 + globalid (0.4.2) 140 + activesupport (>= 4.2.0) 141 + guess_html_encoding (0.0.11) 142 + hashdiff (1.0.1) 143 + hashie (4.1.0) 144 + highline (2.0.3) 145 + hkdf (0.3.0) 146 + htmlentities (4.3.4) 147 + http_accept_language (2.1.1) 148 + i18n (1.8.5) 149 + concurrent-ruby (~> 1.0) 150 + image_size (1.5.0) 151 + in_threads (1.5.4) 152 + jmespath (1.4.0) 153 + jquery-rails (4.4.0) 154 + rails-dom-testing (>= 1, < 3) 155 + railties (>= 4.2.0) 156 + thor (>= 0.14, < 2.0) 157 + json (2.3.1) 158 + json-schema (2.8.1) 159 + addressable (>= 2.4) 160 + jwt (2.2.2) 161 + kgio (2.11.3) 162 + libv8 (8.4.255.0) 163 + listen (3.3.1) 164 + rb-fsevent (~> 0.10, >= 0.10.3) 165 + rb-inotify (~> 0.9, >= 0.9.10) 166 + lograge (0.11.2) 167 + actionpack (>= 4) 168 + activesupport (>= 4) 169 + railties (>= 4) 170 + request_store (~> 1.0) 171 + logstash-event (1.2.02) 172 + logstash-logger (0.26.1) 173 + logstash-event (~> 1.2) 174 + logster (2.9.4) 175 + loofah (2.8.0) 176 + crass (~> 1.0.2) 177 + nokogiri (>= 1.5.9) 178 + lru_redux (1.1.0) 179 + lz4-ruby (0.3.3) 180 + mail (2.7.1) 181 + mini_mime (>= 0.1.1) 182 + maxminddb (0.1.22) 183 + memory_profiler (0.9.14) 184 + message_bus (3.3.4) 185 + rack (>= 1.1.3) 186 + method_source (1.0.0) 187 + mini_mime (1.0.2) 188 + mini_portile2 (2.4.0) 189 + mini_racer (0.3.1) 190 + libv8 (~> 8.4.255) 191 + mini_scheduler (0.12.3) 192 + sidekiq 193 + mini_sql (0.3) 194 + mini_suffix (0.3.0) 195 + ffi (~> 1.9) 196 + minitest (5.14.2) 197 + mocha (1.11.2) 198 + mock_redis (0.26.0) 199 + msgpack (1.3.3) 200 + multi_json (1.15.0) 201 + multi_xml (0.6.0) 202 + multipart-post (2.1.1) 203 + mustache (1.1.1) 204 + nio4r (2.5.4) 205 + nokogiri (1.10.10) 206 + mini_portile2 (~> 2.4.0) 207 + nokogumbo (2.0.2) 208 + nokogiri (~> 1.8, >= 1.8.4) 209 + oauth (0.5.4) 210 + oauth2 (1.4.4) 211 + faraday (>= 0.8, < 2.0) 212 + jwt (>= 1.0, < 3.0) 213 + multi_json (~> 1.3) 214 + multi_xml (~> 0.5) 215 + rack (>= 1.2, < 3) 216 + oj (3.10.16) 217 + omniauth (1.9.1) 218 + hashie (>= 3.4.6) 219 + rack (>= 1.6.2, < 3) 220 + omniauth-facebook (8.0.0) 221 + omniauth-oauth2 (~> 1.2) 222 + omniauth-github (1.4.0) 223 + omniauth (~> 1.5) 224 + omniauth-oauth2 (>= 1.4.0, < 2.0) 225 + omniauth-google-oauth2 (0.8.0) 226 + jwt (>= 2.0) 227 + omniauth (>= 1.1.1) 228 + omniauth-oauth2 (>= 1.6) 229 + omniauth-oauth (1.1.0) 230 + oauth 231 + omniauth (~> 1.0) 232 + omniauth-oauth2 (1.7.0) 233 + oauth2 (~> 1.4) 234 + omniauth (~> 1.9) 235 + omniauth-twitter (1.4.0) 236 + omniauth-oauth (~> 1.1) 237 + rack 238 + onebox (2.2.1) 239 + addressable (~> 2.7.0) 240 + htmlentities (~> 4.3) 241 + multi_json (~> 1.11) 242 + mustache 243 + nokogiri (~> 1.7) 244 + sanitize 245 + openssl-signature_algorithm (1.0.0) 246 + optimist (3.0.1) 247 + parallel (1.20.1) 248 + parallel_tests (3.4.0) 249 + parallel 250 + parser (2.7.2.0) 251 + ast (~> 2.4.1) 252 + pg (1.2.3) 253 + progress (3.5.2) 254 + pry (0.13.1) 255 + coderay (~> 1.1) 256 + method_source (~> 1.0) 257 + pry-byebug (3.9.0) 258 + byebug (~> 11.0) 259 + pry (~> 0.13.0) 260 + pry-rails (0.3.9) 261 + pry (>= 0.10.4) 262 + public_suffix (4.0.6) 263 + puma (5.0.4) 264 + nio4r (~> 2.0) 265 + r2 (0.2.7) 266 + rack (2.2.3) 267 + rack-mini-profiler (2.2.0) 268 + rack (>= 1.2.0) 269 + rack-protection (2.1.0) 270 + rack 271 + rack-test (1.1.0) 272 + rack (>= 1.0, < 3) 273 + rails-dom-testing (2.0.3) 274 + activesupport (>= 4.2.0) 275 + nokogiri (>= 1.6) 276 + rails-html-sanitizer (1.3.0) 277 + loofah (~> 2.3) 278 + rails_failover (0.6.2) 279 + activerecord (~> 6.0) 280 + concurrent-ruby 281 + railties (~> 6.0) 282 + rails_multisite (2.5.0) 283 + activerecord (> 5.0, < 7) 284 + railties (> 5.0, < 7) 285 + railties (6.0.3.3) 286 + actionpack (= 6.0.3.3) 287 + activesupport (= 6.0.3.3) 288 + method_source 289 + rake (>= 0.8.7) 290 + thor (>= 0.20.3, < 2.0) 291 + rainbow (3.0.0) 292 + raindrops (0.19.1) 293 + rake (13.0.1) 294 + rb-fsevent (0.10.4) 295 + rb-inotify (0.10.1) 296 + ffi (~> 1.0) 297 + rbtrace (0.4.14) 298 + ffi (>= 1.0.6) 299 + msgpack (>= 0.4.3) 300 + optimist (>= 3.0.0) 301 + rchardet (1.8.0) 302 + redis (4.2.5) 303 + redis-namespace (1.8.0) 304 + redis (>= 3.0.4) 305 + regexp_parser (2.0.0) 306 + request_store (1.5.0) 307 + rack (>= 1.4) 308 + rexml (3.2.4) 309 + rinku (2.0.6) 310 + rotp (6.2.0) 311 + rqrcode (1.1.2) 312 + chunky_png (~> 1.0) 313 + rqrcode_core (~> 0.1) 314 + rqrcode_core (0.1.2) 315 + rspec (3.10.0) 316 + rspec-core (~> 3.10.0) 317 + rspec-expectations (~> 3.10.0) 318 + rspec-mocks (~> 3.10.0) 319 + rspec-core (3.10.0) 320 + rspec-support (~> 3.10.0) 321 + rspec-expectations (3.10.0) 322 + diff-lcs (>= 1.2.0, < 2.0) 323 + rspec-support (~> 3.10.0) 324 + rspec-html-matchers (0.9.4) 325 + nokogiri (~> 1) 326 + rspec (>= 3.0.0.a, < 4) 327 + rspec-mocks (3.10.0) 328 + diff-lcs (>= 1.2.0, < 2.0) 329 + rspec-support (~> 3.10.0) 330 + rspec-rails (4.0.1) 331 + actionpack (>= 4.2) 332 + activesupport (>= 4.2) 333 + railties (>= 4.2) 334 + rspec-core (~> 3.9) 335 + rspec-expectations (~> 3.9) 336 + rspec-mocks (~> 3.9) 337 + rspec-support (~> 3.9) 338 + rspec-support (3.10.0) 339 + rswag-specs (2.3.1) 340 + activesupport (>= 3.1, < 7.0) 341 + json-schema (~> 2.2) 342 + railties (>= 3.1, < 7.0) 343 + rtlit (0.0.5) 344 + rubocop (1.4.2) 345 + parallel (~> 1.10) 346 + parser (>= 2.7.1.5) 347 + rainbow (>= 2.2.2, < 4.0) 348 + regexp_parser (>= 1.8) 349 + rexml 350 + rubocop-ast (>= 1.1.1) 351 + ruby-progressbar (~> 1.7) 352 + unicode-display_width (>= 1.4.0, < 2.0) 353 + rubocop-ast (1.2.0) 354 + parser (>= 2.7.1.5) 355 + rubocop-discourse (2.4.1) 356 + rubocop (>= 1.1.0) 357 + rubocop-rspec (>= 2.0.0) 358 + rubocop-rspec (2.0.0) 359 + rubocop (~> 1.0) 360 + rubocop-ast (>= 1.1.0) 361 + ruby-prof (1.4.2) 362 + ruby-progressbar (1.10.1) 363 + ruby-readability (0.7.0) 364 + guess_html_encoding (>= 0.0.4) 365 + nokogiri (>= 1.6.0) 366 + ruby2_keywords (0.0.2) 367 + rubyzip (2.3.0) 368 + sanitize (5.2.1) 369 + crass (~> 1.0.2) 370 + nokogiri (>= 1.8.0) 371 + nokogumbo (~> 2.0) 372 + sassc (2.0.1) 373 + ffi (~> 1.9) 374 + rake 375 + sassc-rails (2.1.2) 376 + railties (>= 4.0.0) 377 + sassc (>= 2.0) 378 + sprockets (> 3.0) 379 + sprockets-rails 380 + tilt 381 + seed-fu (2.3.9) 382 + activerecord (>= 3.1) 383 + activesupport (>= 3.1) 384 + shoulda-matchers (4.4.1) 385 + activesupport (>= 4.2.0) 386 + sidekiq (6.1.2) 387 + connection_pool (>= 2.2.2) 388 + rack (~> 2.0) 389 + redis (>= 4.2.0) 390 + simplecov (0.20.0) 391 + docile (~> 1.1) 392 + simplecov-html (~> 0.11) 393 + simplecov_json_formatter (~> 0.1) 394 + simplecov-html (0.12.3) 395 + simplecov_json_formatter (0.1.2) 396 + sprockets (3.7.2) 397 + concurrent-ruby (~> 1.0) 398 + rack (> 1, < 3) 399 + sprockets-rails (3.2.2) 400 + actionpack (>= 4.0) 401 + activesupport (>= 4.0) 402 + sprockets (>= 3.0.0) 403 + sshkey (2.0.0) 404 + stackprof (0.2.16) 405 + test-prof (0.12.2) 406 + thor (1.0.1) 407 + thread_safe (0.3.6) 408 + tilt (2.0.10) 409 + tzinfo (1.2.8) 410 + thread_safe (~> 0.1) 411 + uglifier (4.2.0) 412 + execjs (>= 0.3.0, < 3) 413 + unf (0.1.4) 414 + unf_ext 415 + unf_ext (0.0.7.7) 416 + unicode-display_width (1.7.0) 417 + unicorn (5.7.0) 418 + kgio (~> 2.6) 419 + raindrops (~> 0.7) 420 + uniform_notifier (1.13.0) 421 + webmock (3.10.0) 422 + addressable (>= 2.3.6) 423 + crack (>= 0.3.2) 424 + hashdiff (>= 0.4.0, < 2.0.0) 425 + webpush (1.1.0) 426 + hkdf (~> 0.2) 427 + jwt (~> 2.0) 428 + xorcist (1.1.2) 429 + yaml-lint (0.0.10) 430 + zeitwerk (2.4.1) 431 + 432 + PLATFORMS 433 + ruby 434 + 435 + DEPENDENCIES 436 + actionmailer (= 6.0.3.3) 437 + actionpack (= 6.0.3.3) 438 + actionview (= 6.0.3.3) 439 + actionview_precompiler 440 + active_model_serializers (~> 0.8.3) 441 + activemodel (= 6.0.3.3) 442 + activerecord (= 6.0.3.3) 443 + activesupport (= 6.0.3.3) 444 + addressable 445 + annotate 446 + aws-sdk-s3 447 + aws-sdk-sns 448 + barber 449 + better_errors 450 + binding_of_caller 451 + bootsnap 452 + bullet 453 + byebug 454 + cbor 455 + certified 456 + colored2 457 + cose 458 + cppjieba_rb 459 + css_parser 460 + diffy 461 + discourse-ember-rails (= 0.18.6) 462 + discourse-ember-source (~> 3.12.2) 463 + discourse-fonts 464 + discourse_image_optim 465 + email_reply_trimmer 466 + ember-handlebars-template (= 0.8.0) 467 + excon 468 + execjs 469 + fabrication 470 + fakeweb 471 + fast_blank 472 + fast_xs 473 + fastimage 474 + flamegraph 475 + gc_tracer 476 + highline 477 + htmlentities 478 + http_accept_language 479 + json 480 + listen 481 + lograge 482 + logstash-event 483 + logstash-logger 484 + logster 485 + lru_redux 486 + lz4-ruby 487 + mail 488 + maxminddb 489 + memory_profiler 490 + message_bus 491 + mini_mime 492 + mini_racer 493 + mini_scheduler 494 + mini_sql 495 + mini_suffix 496 + minitest 497 + mocha 498 + mock_redis 499 + multi_json 500 + mustache 501 + nokogiri 502 + oj 503 + omniauth 504 + omniauth-facebook 505 + omniauth-github 506 + omniauth-google-oauth2 507 + omniauth-oauth2 508 + omniauth-twitter 509 + onebox 510 + parallel_tests 511 + pg 512 + pry-byebug 513 + pry-rails 514 + puma 515 + r2 516 + rack 517 + rack-mini-profiler 518 + rack-protection 519 + rails_failover 520 + rails_multisite 521 + railties (= 6.0.3.3) 522 + rake 523 + rb-fsevent 524 + rbtrace 525 + rchardet 526 + redis 527 + redis-namespace 528 + rinku 529 + rotp 530 + rqrcode 531 + rspec 532 + rspec-html-matchers 533 + rspec-rails 534 + rswag-specs 535 + rtlit 536 + rubocop-discourse 537 + ruby-prof 538 + ruby-readability 539 + rubyzip 540 + sassc (= 2.0.1) 541 + sassc-rails 542 + seed-fu 543 + shoulda-matchers 544 + sidekiq 545 + simplecov 546 + sprockets (= 3.7.2) 547 + sprockets-rails 548 + sshkey 549 + stackprof 550 + test-prof 551 + thor 552 + uglifier 553 + unf 554 + unicorn 555 + webmock 556 + webpush 557 + xorcist 558 + yaml-lint 559 + 560 + BUNDLED WITH 561 + 2.1.4
+2272
pkgs/servers/web-apps/discourse/rubyEnv/gemset.nix
··· 1 + { 2 + actionmailer = { 3 + dependencies = ["actionpack" "actionview" "activejob" "mail" "rails-dom-testing"]; 4 + groups = ["default"]; 5 + platforms = []; 6 + source = { 7 + remotes = ["https://rubygems.org"]; 8 + sha256 = "1spq0dbfn0qkqg9sq0rsjn360b4j36zly8hawaivkrwr3rsvyz75"; 9 + type = "gem"; 10 + }; 11 + version = "6.0.3.3"; 12 + }; 13 + actionpack = { 14 + dependencies = ["actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer"]; 15 + groups = ["default" "development" "test"]; 16 + platforms = []; 17 + source = { 18 + remotes = ["https://rubygems.org"]; 19 + sha256 = "1p873nqwmpsvmkb5n86d70wndx1qhy15pc9mbcd1mc8sj174578b"; 20 + type = "gem"; 21 + }; 22 + version = "6.0.3.3"; 23 + }; 24 + actionview = { 25 + dependencies = ["activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer"]; 26 + groups = ["default" "development" "test"]; 27 + platforms = []; 28 + source = { 29 + remotes = ["https://rubygems.org"]; 30 + sha256 = "08pvmjddlw01q5r9zdfgddwp4csndpf5i2w47677z5r36jznz36q"; 31 + type = "gem"; 32 + }; 33 + version = "6.0.3.3"; 34 + }; 35 + actionview_precompiler = { 36 + dependencies = ["actionview"]; 37 + groups = ["default"]; 38 + platforms = []; 39 + source = { 40 + remotes = ["https://rubygems.org"]; 41 + sha256 = "07dx8vkwig8han4zccs0chahcf9ibd4abzx9n56qah8zak5cyrhd"; 42 + type = "gem"; 43 + }; 44 + version = "0.2.3"; 45 + }; 46 + active_model_serializers = { 47 + dependencies = ["activemodel"]; 48 + groups = ["default"]; 49 + platforms = []; 50 + source = { 51 + remotes = ["https://rubygems.org"]; 52 + sha256 = "0k3mgia2ahh7mbk30hjq9pzqbk0kh281s91kq2z6p555nv9y6l3k"; 53 + type = "gem"; 54 + }; 55 + version = "0.8.4"; 56 + }; 57 + activejob = { 58 + dependencies = ["activesupport" "globalid"]; 59 + groups = ["default"]; 60 + platforms = []; 61 + source = { 62 + remotes = ["https://rubygems.org"]; 63 + sha256 = "0w54ckvc229iaax879hkhyc93j7z8p0v7acp6mk3h8xjfvmwy5jp"; 64 + type = "gem"; 65 + }; 66 + version = "6.0.3.3"; 67 + }; 68 + activemodel = { 69 + dependencies = ["activesupport"]; 70 + groups = ["default" "development"]; 71 + platforms = []; 72 + source = { 73 + remotes = ["https://rubygems.org"]; 74 + sha256 = "166jlx6kbby01vr37srh081a9fykgsz873yg5i9gl2ar3vw9gs56"; 75 + type = "gem"; 76 + }; 77 + version = "6.0.3.3"; 78 + }; 79 + activerecord = { 80 + dependencies = ["activemodel" "activesupport"]; 81 + groups = ["default" "development"]; 82 + platforms = []; 83 + source = { 84 + remotes = ["https://rubygems.org"]; 85 + sha256 = "0y2a4ss6ld6yrhpcbcb3kjn5gj6zk9qklp2aq5rl1awl8vbdbdb7"; 86 + type = "gem"; 87 + }; 88 + version = "6.0.3.3"; 89 + }; 90 + activesupport = { 91 + dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo" "zeitwerk"]; 92 + groups = ["default" "development" "test"]; 93 + platforms = []; 94 + source = { 95 + remotes = ["https://rubygems.org"]; 96 + sha256 = "1dmkqbvndbz011a1byg6f990936vfadbnwjwjw9vjzr4kd8bxk96"; 97 + type = "gem"; 98 + }; 99 + version = "6.0.3.3"; 100 + }; 101 + addressable = { 102 + dependencies = ["public_suffix"]; 103 + groups = ["default" "development" "test"]; 104 + platforms = []; 105 + source = { 106 + remotes = ["https://rubygems.org"]; 107 + sha256 = "1fvchp2rhp2rmigx7qglf69xvjqvzq7x0g49naliw29r2bz656sy"; 108 + type = "gem"; 109 + }; 110 + version = "2.7.0"; 111 + }; 112 + annotate = { 113 + dependencies = ["activerecord" "rake"]; 114 + groups = ["development"]; 115 + platforms = []; 116 + source = { 117 + remotes = ["https://rubygems.org"]; 118 + sha256 = "1dxrfppwfg13vqmambbs56xjj8qsdgcy58r2yc44vvy3z1g5yflw"; 119 + type = "gem"; 120 + }; 121 + version = "3.1.1"; 122 + }; 123 + ast = { 124 + groups = ["default" "development" "test"]; 125 + platforms = []; 126 + source = { 127 + remotes = ["https://rubygems.org"]; 128 + sha256 = "1l3468czzjmxl93ap40hp7z94yxp4nbag0bxqs789bm30md90m2a"; 129 + type = "gem"; 130 + }; 131 + version = "2.4.1"; 132 + }; 133 + aws-eventstream = { 134 + groups = ["default"]; 135 + platforms = []; 136 + source = { 137 + remotes = ["https://rubygems.org"]; 138 + sha256 = "0r0pn66yqrdkrfdin7qdim0yj2x75miyg4wp6mijckhzhrjb7cv5"; 139 + type = "gem"; 140 + }; 141 + version = "1.1.0"; 142 + }; 143 + aws-partitions = { 144 + groups = ["default"]; 145 + platforms = []; 146 + source = { 147 + remotes = ["https://rubygems.org"]; 148 + sha256 = "17xranmng1mg6238zdmnfvaig82r2ymp2apra9yh5d8rhvn8hkwm"; 149 + type = "gem"; 150 + }; 151 + version = "1.390.0"; 152 + }; 153 + aws-sdk-core = { 154 + dependencies = ["aws-eventstream" "aws-partitions" "aws-sigv4" "jmespath"]; 155 + groups = ["default"]; 156 + platforms = []; 157 + source = { 158 + remotes = ["https://rubygems.org"]; 159 + sha256 = "05dq7jfv5qf1y00ib96nqsipf08hflw8n8fwkyjw4qav84wjqaq4"; 160 + type = "gem"; 161 + }; 162 + version = "3.109.2"; 163 + }; 164 + aws-sdk-kms = { 165 + dependencies = ["aws-sdk-core" "aws-sigv4"]; 166 + groups = ["default"]; 167 + platforms = []; 168 + source = { 169 + remotes = ["https://rubygems.org"]; 170 + sha256 = "0ly1m631qm2ciif7sysbzrgczjvz95ga3g6w6vrzvfdv31jjnl9a"; 171 + type = "gem"; 172 + }; 173 + version = "1.39.0"; 174 + }; 175 + aws-sdk-s3 = { 176 + dependencies = ["aws-sdk-core" "aws-sdk-kms" "aws-sigv4"]; 177 + groups = ["default"]; 178 + platforms = []; 179 + source = { 180 + remotes = ["https://rubygems.org"]; 181 + sha256 = "1mld0yh6q6i2nbb143g5xc6gm70sqpvpwxfknlihrd8jmw3xc0bs"; 182 + type = "gem"; 183 + }; 184 + version = "1.83.2"; 185 + }; 186 + aws-sdk-sns = { 187 + dependencies = ["aws-sdk-core" "aws-sigv4"]; 188 + groups = ["default"]; 189 + platforms = []; 190 + source = { 191 + remotes = ["https://rubygems.org"]; 192 + sha256 = "1dw80ldqhb1mny5irgi2jh36hykcmyd07xalv21xncxqzmf8aiag"; 193 + type = "gem"; 194 + }; 195 + version = "1.35.0"; 196 + }; 197 + aws-sigv4 = { 198 + dependencies = ["aws-eventstream"]; 199 + groups = ["default"]; 200 + platforms = []; 201 + source = { 202 + remotes = ["https://rubygems.org"]; 203 + sha256 = "1ll9382c1x2hp750cilh01h1cycgyhdr4cmmgx23k94hyyb8chv5"; 204 + type = "gem"; 205 + }; 206 + version = "1.2.2"; 207 + }; 208 + barber = { 209 + dependencies = ["ember-source" "execjs"]; 210 + groups = ["default"]; 211 + platforms = []; 212 + source = { 213 + remotes = ["https://rubygems.org"]; 214 + sha256 = "07rnlbh7kgamcbnl1sqlcdrjj8src4qc687klqq4a3vqq2slnscx"; 215 + type = "gem"; 216 + }; 217 + version = "0.12.2"; 218 + }; 219 + better_errors = { 220 + dependencies = ["coderay" "erubi" "rack"]; 221 + groups = ["development"]; 222 + platforms = [{ 223 + engine = "maglev"; 224 + } { 225 + engine = "ruby"; 226 + }]; 227 + source = { 228 + remotes = ["https://rubygems.org"]; 229 + sha256 = "11220lfzhsyf5fcril3qd689kgg46qlpiiaj00hc9mh4mcbc3vrr"; 230 + type = "gem"; 231 + }; 232 + version = "2.9.1"; 233 + }; 234 + binding_of_caller = { 235 + dependencies = ["debug_inspector"]; 236 + groups = ["development"]; 237 + platforms = []; 238 + source = { 239 + remotes = ["https://rubygems.org"]; 240 + sha256 = "05syqlks7463zsy1jdfbbdravdhj9hpj5pv2m74blqpv8bq4vv5g"; 241 + type = "gem"; 242 + }; 243 + version = "0.8.0"; 244 + }; 245 + bootsnap = { 246 + dependencies = ["msgpack"]; 247 + groups = ["default"]; 248 + platforms = [{ 249 + engine = "maglev"; 250 + } { 251 + engine = "ruby"; 252 + }]; 253 + source = { 254 + remotes = ["https://rubygems.org"]; 255 + sha256 = "1qx1f729bgh391agsqb4ngzn22wdn4cc6mkp0cipf0d5hsg9cpaq"; 256 + type = "gem"; 257 + }; 258 + version = "1.5.1"; 259 + }; 260 + builder = { 261 + groups = ["default" "development" "test"]; 262 + platforms = []; 263 + source = { 264 + remotes = ["https://rubygems.org"]; 265 + sha256 = "045wzckxpwcqzrjr353cxnyaxgf0qg22jh00dcx7z38cys5g1jlr"; 266 + type = "gem"; 267 + }; 268 + version = "3.2.4"; 269 + }; 270 + bullet = { 271 + dependencies = ["activesupport" "uniform_notifier"]; 272 + groups = ["development"]; 273 + platforms = []; 274 + source = { 275 + remotes = ["https://rubygems.org"]; 276 + sha256 = "18ifwnvn13755qkfigapyj5bflpby3phxzbb7x5336d0kzv5k7d9"; 277 + type = "gem"; 278 + }; 279 + version = "6.1.0"; 280 + }; 281 + byebug = { 282 + groups = ["development" "test"]; 283 + platforms = [{ 284 + engine = "maglev"; 285 + } { 286 + engine = "ruby"; 287 + }]; 288 + source = { 289 + remotes = ["https://rubygems.org"]; 290 + sha256 = "0nx3yjf4xzdgb8jkmk2344081gqr22pgjqnmjg2q64mj5d6r9194"; 291 + type = "gem"; 292 + }; 293 + version = "11.1.3"; 294 + }; 295 + cbor = { 296 + groups = ["default"]; 297 + platforms = []; 298 + source = { 299 + remotes = ["https://rubygems.org"]; 300 + sha256 = "0511idr8xps9625nh3kxr68sdy6l3xy2kcz7r57g47fxb1v18jj3"; 301 + type = "gem"; 302 + }; 303 + version = "0.5.9.6"; 304 + }; 305 + certified = { 306 + groups = ["development" "test"]; 307 + platforms = []; 308 + source = { 309 + remotes = ["https://rubygems.org"]; 310 + sha256 = "1706p6p0a8adyvd943af2a3093xakvislgffw3v9dvp7j07dyk5a"; 311 + type = "gem"; 312 + }; 313 + version = "1.0.0"; 314 + }; 315 + chunky_png = { 316 + groups = ["default"]; 317 + platforms = []; 318 + source = { 319 + remotes = ["https://rubygems.org"]; 320 + sha256 = "1v52ndgx9r4jybq8yzr8anzfbnjk4y2hvz97nm9924wi4bad3xkf"; 321 + type = "gem"; 322 + }; 323 + version = "1.3.14"; 324 + }; 325 + coderay = { 326 + groups = ["default" "development"]; 327 + platforms = [{ 328 + engine = "maglev"; 329 + } { 330 + engine = "ruby"; 331 + }]; 332 + source = { 333 + remotes = ["https://rubygems.org"]; 334 + sha256 = "0jvxqxzply1lwp7ysn94zjhh57vc14mcshw1ygw14ib8lhc00lyw"; 335 + type = "gem"; 336 + }; 337 + version = "1.1.3"; 338 + }; 339 + colored2 = { 340 + groups = ["default"]; 341 + platforms = []; 342 + source = { 343 + remotes = ["https://rubygems.org"]; 344 + sha256 = "0jlbqa9q4mvrm73aw9mxh23ygzbjiqwisl32d8szfb5fxvbjng5i"; 345 + type = "gem"; 346 + }; 347 + version = "3.1.2"; 348 + }; 349 + concurrent-ruby = { 350 + groups = ["default" "development" "test"]; 351 + platforms = []; 352 + source = { 353 + remotes = ["https://rubygems.org"]; 354 + sha256 = "1vnxrbhi7cq3p4y2v9iwd10v1c7l15is4var14hwnb2jip4fyjzz"; 355 + type = "gem"; 356 + }; 357 + version = "1.1.7"; 358 + }; 359 + connection_pool = { 360 + groups = ["default"]; 361 + platforms = []; 362 + source = { 363 + remotes = ["https://rubygems.org"]; 364 + sha256 = "1qikl4av1z8kqnk5ba18136dpqzw8wjawc2w9b4zb5psdd5z8nwf"; 365 + type = "gem"; 366 + }; 367 + version = "2.2.3"; 368 + }; 369 + cose = { 370 + dependencies = ["cbor" "openssl-signature_algorithm"]; 371 + groups = ["default"]; 372 + platforms = []; 373 + source = { 374 + remotes = ["https://rubygems.org"]; 375 + sha256 = "1gx239d2fracq9az74wfdwmp5zm7zpzkcgchwnv2ng33d8r33p3m"; 376 + type = "gem"; 377 + }; 378 + version = "1.2.0"; 379 + }; 380 + cppjieba_rb = { 381 + groups = ["default"]; 382 + platforms = []; 383 + source = { 384 + remotes = ["https://rubygems.org"]; 385 + sha256 = "1sslff7yy8jvp4rcn1b6jn9v0d3iibb68i79shgd94rs2yq8k117"; 386 + type = "gem"; 387 + }; 388 + version = "0.3.3"; 389 + }; 390 + crack = { 391 + groups = ["default" "test"]; 392 + platforms = []; 393 + source = { 394 + remotes = ["https://rubygems.org"]; 395 + sha256 = "1awi8jy4jn0f7vxpdvz3xvn1zzjbjh33n28lfkijh77dla5zb7lc"; 396 + type = "gem"; 397 + }; 398 + version = "0.4.4"; 399 + }; 400 + crass = { 401 + groups = ["default" "development" "test"]; 402 + platforms = []; 403 + source = { 404 + remotes = ["https://rubygems.org"]; 405 + sha256 = "0pfl5c0pyqaparxaqxi6s4gfl21bdldwiawrc0aknyvflli60lfw"; 406 + type = "gem"; 407 + }; 408 + version = "1.0.6"; 409 + }; 410 + css_parser = { 411 + dependencies = ["addressable"]; 412 + groups = ["default"]; 413 + platforms = []; 414 + source = { 415 + remotes = ["https://rubygems.org"]; 416 + sha256 = "04c4dl8cm5rjr50k9qa6yl9r05fk9zcb1zxh0y0cdahxlsgcydfw"; 417 + type = "gem"; 418 + }; 419 + version = "1.7.1"; 420 + }; 421 + debug_inspector = { 422 + groups = ["default" "development"]; 423 + platforms = []; 424 + source = { 425 + remotes = ["https://rubygems.org"]; 426 + sha256 = "0vxr0xa1mfbkfcrn71n7c4f2dj7la5hvphn904vh20j3x4j5lrx0"; 427 + type = "gem"; 428 + }; 429 + version = "0.0.3"; 430 + }; 431 + diff-lcs = { 432 + groups = ["default" "development" "test"]; 433 + platforms = []; 434 + source = { 435 + remotes = ["https://rubygems.org"]; 436 + sha256 = "0m925b8xc6kbpnif9dldna24q1szg4mk0fvszrki837pfn46afmz"; 437 + type = "gem"; 438 + }; 439 + version = "1.4.4"; 440 + }; 441 + diffy = { 442 + groups = ["default"]; 443 + platforms = []; 444 + source = { 445 + remotes = ["https://rubygems.org"]; 446 + sha256 = "0nrg7kpgz6cn1gv2saj2fa5sfiykamvd7vn9lw2v625k7pjwf31l"; 447 + type = "gem"; 448 + }; 449 + version = "3.4.0"; 450 + }; 451 + discourse-ember-rails = { 452 + dependencies = ["active_model_serializers" "ember-data-source" "ember-handlebars-template" "ember-source" "jquery-rails" "railties"]; 453 + groups = ["default"]; 454 + platforms = []; 455 + source = { 456 + remotes = ["https://rubygems.org"]; 457 + sha256 = "0ax5x2d6q6hkm7r58ai9p0sahlg842aqlm7dpv6svrfpnjlaz7sf"; 458 + type = "gem"; 459 + }; 460 + version = "0.18.6"; 461 + }; 462 + discourse-ember-source = { 463 + groups = ["default"]; 464 + platforms = []; 465 + source = { 466 + remotes = ["https://rubygems.org"]; 467 + sha256 = "0mqkwiqb5n64lc5jdjnmpgb9apq08ywkz9yk8mj1sx2lqcsw11pc"; 468 + type = "gem"; 469 + }; 470 + version = "3.12.2.2"; 471 + }; 472 + discourse-fonts = { 473 + groups = ["default"]; 474 + platforms = []; 475 + source = { 476 + remotes = ["https://rubygems.org"]; 477 + sha256 = "0xhwgqclh3jncjr55m0hyq3w3iw8jw2r7ickzq1zn1282pc3n2i7"; 478 + type = "gem"; 479 + }; 480 + version = "0.0.5"; 481 + }; 482 + discourse_image_optim = { 483 + dependencies = ["exifr" "fspath" "image_size" "in_threads" "progress"]; 484 + groups = ["default"]; 485 + platforms = []; 486 + source = { 487 + remotes = ["https://rubygems.org"]; 488 + sha256 = "11nqmga5ygxyhjmsc07gsa0fwwyhdpwi20yyr4fnh263xs1xylvv"; 489 + type = "gem"; 490 + }; 491 + version = "0.26.2"; 492 + }; 493 + docile = { 494 + groups = ["default" "test"]; 495 + platforms = []; 496 + source = { 497 + remotes = ["https://rubygems.org"]; 498 + sha256 = "0qrwiyagxzl8zlx3dafb0ay8l14ib7imb2rsmx70i5cp420v8gif"; 499 + type = "gem"; 500 + }; 501 + version = "1.3.2"; 502 + }; 503 + email_reply_trimmer = { 504 + groups = ["default"]; 505 + platforms = []; 506 + source = { 507 + remotes = ["https://rubygems.org"]; 508 + sha256 = "1jgcxifm48xq5dz9k47q43pqm5bfnf14l62l3bqhmv8f6z8dw4ki"; 509 + type = "gem"; 510 + }; 511 + version = "0.1.13"; 512 + }; 513 + ember-data-source = { 514 + dependencies = ["ember-source"]; 515 + groups = ["default"]; 516 + platforms = []; 517 + source = { 518 + remotes = ["https://rubygems.org"]; 519 + sha256 = "1803nh3knvwl12h63jd48qvbbrp42yy291wcb35960daklip0fd8"; 520 + type = "gem"; 521 + }; 522 + version = "3.0.2"; 523 + }; 524 + ember-handlebars-template = { 525 + dependencies = ["barber" "sprockets"]; 526 + groups = ["default"]; 527 + platforms = []; 528 + source = { 529 + remotes = ["https://rubygems.org"]; 530 + sha256 = "1wxj3vi4xs3vjxrdbzi4j4w6vv45r5dkz2rg2ldid3p8dp3irlf4"; 531 + type = "gem"; 532 + }; 533 + version = "0.8.0"; 534 + }; 535 + ember-source = { 536 + groups = ["default"]; 537 + platforms = []; 538 + source = { 539 + remotes = ["https://rubygems.org"]; 540 + sha256 = "0sixy30ym9j2slhlr0lfq943g958w8arlb0lsizh59iv1w5gmxxy"; 541 + type = "gem"; 542 + }; 543 + version = "2.18.2"; 544 + }; 545 + erubi = { 546 + groups = ["default" "development" "test"]; 547 + platforms = [{ 548 + engine = "maglev"; 549 + } { 550 + engine = "ruby"; 551 + }]; 552 + source = { 553 + remotes = ["https://rubygems.org"]; 554 + sha256 = "09l8lz3j00m898li0yfsnb6ihc63rdvhw3k5xczna5zrjk104f2l"; 555 + type = "gem"; 556 + }; 557 + version = "1.10.0"; 558 + }; 559 + excon = { 560 + groups = ["default"]; 561 + platforms = []; 562 + source = { 563 + remotes = ["https://rubygems.org"]; 564 + sha256 = "1hi89v53pm2abfv9j8lgqdd7hgkr7fr0gwrczr940iwbb3xv7rrs"; 565 + type = "gem"; 566 + }; 567 + version = "0.78.0"; 568 + }; 569 + execjs = { 570 + groups = ["assets" "default"]; 571 + platforms = []; 572 + source = { 573 + remotes = ["https://rubygems.org"]; 574 + sha256 = "1yz55sf2nd3l666ms6xr18sm2aggcvmb8qr3v53lr4rir32y1yp1"; 575 + type = "gem"; 576 + }; 577 + version = "2.7.0"; 578 + }; 579 + exifr = { 580 + groups = ["default"]; 581 + platforms = []; 582 + source = { 583 + remotes = ["https://rubygems.org"]; 584 + sha256 = "0mylhwmh6n4xihxr9s3zj0lc286f5maxbqd4dgk3paqnd7afz88s"; 585 + type = "gem"; 586 + }; 587 + version = "1.3.9"; 588 + }; 589 + fabrication = { 590 + groups = ["development" "test"]; 591 + platforms = []; 592 + source = { 593 + remotes = ["https://rubygems.org"]; 594 + sha256 = "1pdrl55xf76pbc5kjzp7diawxxvgbk2cm38532in6df823431n6z"; 595 + type = "gem"; 596 + }; 597 + version = "2.21.1"; 598 + }; 599 + fakeweb = { 600 + groups = ["test"]; 601 + platforms = []; 602 + source = { 603 + remotes = ["https://rubygems.org"]; 604 + sha256 = "1a09z9nb369bvwpghncgd5y4f95lh28w0q258srh02h22fz9dj8y"; 605 + type = "gem"; 606 + }; 607 + version = "1.3.0"; 608 + }; 609 + faraday = { 610 + dependencies = ["multipart-post" "ruby2_keywords"]; 611 + groups = ["default"]; 612 + platforms = []; 613 + source = { 614 + remotes = ["https://rubygems.org"]; 615 + sha256 = "16dapwi5pivrl25r4lkr1mxjrzkznj4wlcb08fzkmxnj4g5c6y35"; 616 + type = "gem"; 617 + }; 618 + version = "1.1.0"; 619 + }; 620 + fast_blank = { 621 + groups = ["default"]; 622 + platforms = [{ 623 + engine = "maglev"; 624 + } { 625 + engine = "rbx"; 626 + } { 627 + engine = "ruby"; 628 + }]; 629 + source = { 630 + remotes = ["https://rubygems.org"]; 631 + sha256 = "16s1ilyvwzmkcgmklbrn0c2pch5n02vf921njx0bld4crgdr6z56"; 632 + type = "gem"; 633 + }; 634 + version = "1.0.0"; 635 + }; 636 + fast_xs = { 637 + groups = ["default"]; 638 + platforms = [{ 639 + engine = "maglev"; 640 + } { 641 + engine = "rbx"; 642 + } { 643 + engine = "ruby"; 644 + }]; 645 + source = { 646 + remotes = ["https://rubygems.org"]; 647 + sha256 = "1iydzaqmvqq7ncxkr182aybkk6xap0cb2w9amr73vbdxi2qf3wjz"; 648 + type = "gem"; 649 + }; 650 + version = "0.8.0"; 651 + }; 652 + fastimage = { 653 + groups = ["default"]; 654 + platforms = []; 655 + source = { 656 + remotes = ["https://rubygems.org"]; 657 + sha256 = "11ny2pj0j6pljszrf1w3iqdv2pcl2iwwghjbgcjlizy424zbh0hb"; 658 + type = "gem"; 659 + }; 660 + version = "2.2.0"; 661 + }; 662 + ffi = { 663 + groups = ["default" "development" "test"]; 664 + platforms = [{ 665 + engine = "maglev"; 666 + } { 667 + engine = "ruby"; 668 + }]; 669 + source = { 670 + remotes = ["https://rubygems.org"]; 671 + sha256 = "12lpwaw82bb0rm9f52v1498bpba8aj2l2q359mkwbxsswhpga5af"; 672 + type = "gem"; 673 + }; 674 + version = "1.13.1"; 675 + }; 676 + flamegraph = { 677 + groups = ["default"]; 678 + platforms = []; 679 + source = { 680 + remotes = ["https://rubygems.org"]; 681 + sha256 = "1p785nmhdzbwj0qpxn5fzrmr4kgimcds83v4f95f387z6w3050x6"; 682 + type = "gem"; 683 + }; 684 + version = "0.9.5"; 685 + }; 686 + fspath = { 687 + groups = ["default"]; 688 + platforms = []; 689 + source = { 690 + remotes = ["https://rubygems.org"]; 691 + sha256 = "0xcxikkrjv8ws328nn5ax5pyfjs8pn7djg1hks7qyb3yp6prpb5m"; 692 + type = "gem"; 693 + }; 694 + version = "3.1.2"; 695 + }; 696 + gc_tracer = { 697 + groups = ["default"]; 698 + platforms = [{ 699 + engine = "maglev"; 700 + } { 701 + engine = "ruby"; 702 + }]; 703 + source = { 704 + remotes = ["https://rubygems.org"]; 705 + sha256 = "1yv3mp8lx74lfzs04fd5h4g89209iwhzpc407y35p7cmzgx6a4kv"; 706 + type = "gem"; 707 + }; 708 + version = "1.5.1"; 709 + }; 710 + globalid = { 711 + dependencies = ["activesupport"]; 712 + groups = ["default"]; 713 + platforms = []; 714 + source = { 715 + remotes = ["https://rubygems.org"]; 716 + sha256 = "1zkxndvck72bfw235bd9nl2ii0lvs5z88q14706cmn702ww2mxv1"; 717 + type = "gem"; 718 + }; 719 + version = "0.4.2"; 720 + }; 721 + guess_html_encoding = { 722 + groups = ["default"]; 723 + platforms = []; 724 + source = { 725 + remotes = ["https://rubygems.org"]; 726 + sha256 = "16700fk6kmif3q3kpc1ldhy3nsc9pkxlgl8sqhznff2zjj5lddna"; 727 + type = "gem"; 728 + }; 729 + version = "0.0.11"; 730 + }; 731 + hashdiff = { 732 + groups = ["default" "test"]; 733 + platforms = []; 734 + source = { 735 + remotes = ["https://rubygems.org"]; 736 + sha256 = "1nynpl0xbj0nphqx1qlmyggq58ms1phf5i03hk64wcc0a17x1m1c"; 737 + type = "gem"; 738 + }; 739 + version = "1.0.1"; 740 + }; 741 + hashie = { 742 + groups = ["default"]; 743 + platforms = []; 744 + source = { 745 + remotes = ["https://rubygems.org"]; 746 + sha256 = "02bsx12ihl78x0vdm37byp78jjw2ff6035y7rrmbd90qxjwxr43q"; 747 + type = "gem"; 748 + }; 749 + version = "4.1.0"; 750 + }; 751 + highline = { 752 + groups = ["default"]; 753 + platforms = []; 754 + source = { 755 + remotes = ["https://rubygems.org"]; 756 + sha256 = "0yclf57n2j3cw8144ania99h1zinf8q3f5zrhqa754j6gl95rp9d"; 757 + type = "gem"; 758 + }; 759 + version = "2.0.3"; 760 + }; 761 + hkdf = { 762 + groups = ["default"]; 763 + platforms = []; 764 + source = { 765 + remotes = ["https://rubygems.org"]; 766 + sha256 = "04fixg0a51n4vy0j6c1hvisa2yl33m3jrrpxpb5sq6j511vjriil"; 767 + type = "gem"; 768 + }; 769 + version = "0.3.0"; 770 + }; 771 + htmlentities = { 772 + groups = ["default"]; 773 + platforms = []; 774 + source = { 775 + remotes = ["https://rubygems.org"]; 776 + sha256 = "1nkklqsn8ir8wizzlakncfv42i32wc0w9hxp00hvdlgjr7376nhj"; 777 + type = "gem"; 778 + }; 779 + version = "4.3.4"; 780 + }; 781 + http_accept_language = { 782 + groups = ["default"]; 783 + platforms = []; 784 + source = { 785 + remotes = ["https://rubygems.org"]; 786 + sha256 = "0d0nlfz9vm4jr1l6q0chx4rp2hrnrfbx3gadc1dz930lbbaz0hq0"; 787 + type = "gem"; 788 + }; 789 + version = "2.1.1"; 790 + }; 791 + i18n = { 792 + dependencies = ["concurrent-ruby"]; 793 + groups = ["default" "development" "test"]; 794 + platforms = []; 795 + source = { 796 + remotes = ["https://rubygems.org"]; 797 + sha256 = "153sx77p16vawrs4qpkv7qlzf9v5fks4g7xqcj1dwk40i6g7rfzk"; 798 + type = "gem"; 799 + }; 800 + version = "1.8.5"; 801 + }; 802 + image_size = { 803 + groups = ["default"]; 804 + platforms = []; 805 + source = { 806 + remotes = ["https://rubygems.org"]; 807 + sha256 = "0zrn2mqaf1kk548wn1y35i1a6kwh3320q62m929kn9m8sqpy4fk7"; 808 + type = "gem"; 809 + }; 810 + version = "1.5.0"; 811 + }; 812 + in_threads = { 813 + groups = ["default"]; 814 + platforms = []; 815 + source = { 816 + remotes = ["https://rubygems.org"]; 817 + sha256 = "0m71806p1gm4kxiz4gvkyr8qip16hifn2kdf926jz44jj6kc6bbs"; 818 + type = "gem"; 819 + }; 820 + version = "1.5.4"; 821 + }; 822 + jmespath = { 823 + groups = ["default"]; 824 + platforms = []; 825 + source = { 826 + remotes = ["https://rubygems.org"]; 827 + sha256 = "1d4wac0dcd1jf6kc57891glih9w57552zgqswgy74d1xhgnk0ngf"; 828 + type = "gem"; 829 + }; 830 + version = "1.4.0"; 831 + }; 832 + jquery-rails = { 833 + dependencies = ["rails-dom-testing" "railties" "thor"]; 834 + groups = ["default"]; 835 + platforms = []; 836 + source = { 837 + remotes = ["https://rubygems.org"]; 838 + sha256 = "0dkhm8lan1vnyl3ll0ks2q06576pdils8a1dr354vfc1y5dqw15i"; 839 + type = "gem"; 840 + }; 841 + version = "4.4.0"; 842 + }; 843 + json = { 844 + groups = ["default"]; 845 + platforms = []; 846 + source = { 847 + remotes = ["https://rubygems.org"]; 848 + sha256 = "158fawfwmv2sq4whqqaksfykkiad2xxrrj0nmpnc6vnlzi1bp7iz"; 849 + type = "gem"; 850 + }; 851 + version = "2.3.1"; 852 + }; 853 + json-schema = { 854 + dependencies = ["addressable"]; 855 + groups = ["default" "development" "test"]; 856 + platforms = []; 857 + source = { 858 + remotes = ["https://rubygems.org"]; 859 + sha256 = "1yv5lfmr2nzd14af498xqd5p89f3g080q8wk0klr3vxgypsikkb5"; 860 + type = "gem"; 861 + }; 862 + version = "2.8.1"; 863 + }; 864 + jwt = { 865 + groups = ["default"]; 866 + platforms = []; 867 + source = { 868 + remotes = ["https://rubygems.org"]; 869 + sha256 = "14ynyq1q483spj20ffl4xayfqx1a8qr761mqjfxczf8lwlap392n"; 870 + type = "gem"; 871 + }; 872 + version = "2.2.2"; 873 + }; 874 + kgio = { 875 + groups = ["default"]; 876 + platforms = [{ 877 + engine = "maglev"; 878 + } { 879 + engine = "rbx"; 880 + } { 881 + engine = "ruby"; 882 + }]; 883 + source = { 884 + remotes = ["https://rubygems.org"]; 885 + sha256 = "0ai6bzlvxbzpdl466p1qi4dlhx8ri2wcrp6x1l19y3yfs3a29rng"; 886 + type = "gem"; 887 + }; 888 + version = "2.11.3"; 889 + }; 890 + libv8 = { 891 + groups = ["default"]; 892 + platforms = []; 893 + source = { 894 + remotes = ["https://rubygems.org"]; 895 + sha256 = "0317sr3nrl51sp844bps71smkrwim3fjn47wdfpbycixnbxspivm"; 896 + type = "gem"; 897 + }; 898 + version = "8.4.255.0"; 899 + }; 900 + listen = { 901 + dependencies = ["rb-fsevent" "rb-inotify"]; 902 + groups = ["development" "test"]; 903 + platforms = []; 904 + source = { 905 + remotes = ["https://rubygems.org"]; 906 + sha256 = "0028p1fss6pvw4mlpjqdmxfzsm8ww79irsadbibrr7f23qfn8ykr"; 907 + type = "gem"; 908 + }; 909 + version = "3.3.1"; 910 + }; 911 + lograge = { 912 + dependencies = ["actionpack" "activesupport" "railties" "request_store"]; 913 + groups = ["default"]; 914 + platforms = []; 915 + source = { 916 + remotes = ["https://rubygems.org"]; 917 + sha256 = "1vrjm4yqn5l6q5gsl72fmk95fl6j9z1a05gzbrwmsm3gp1a1bgac"; 918 + type = "gem"; 919 + }; 920 + version = "0.11.2"; 921 + }; 922 + logstash-event = { 923 + groups = ["default"]; 924 + platforms = []; 925 + source = { 926 + remotes = ["https://rubygems.org"]; 927 + sha256 = "1bk7fhhryjxp1klr3hq6i6srrc21wl4p980bysjp0w66z9hdr9w9"; 928 + type = "gem"; 929 + }; 930 + version = "1.2.02"; 931 + }; 932 + logstash-logger = { 933 + dependencies = ["logstash-event"]; 934 + groups = ["default"]; 935 + platforms = []; 936 + source = { 937 + remotes = ["https://rubygems.org"]; 938 + sha256 = "1nh0jgz4rl46axqb9l0fa866kh34wb7yf11qc3j30xhprdqb8yjp"; 939 + type = "gem"; 940 + }; 941 + version = "0.26.1"; 942 + }; 943 + logster = { 944 + groups = ["default"]; 945 + platforms = []; 946 + source = { 947 + remotes = ["https://rubygems.org"]; 948 + sha256 = "1ldikj3p0bakxg57didaw05pldjn0i5r20zawhqa34knlsqm66r6"; 949 + type = "gem"; 950 + }; 951 + version = "2.9.4"; 952 + }; 953 + loofah = { 954 + dependencies = ["crass" "nokogiri"]; 955 + groups = ["default" "development" "test"]; 956 + platforms = []; 957 + source = { 958 + remotes = ["https://rubygems.org"]; 959 + sha256 = "0ndimir6k3kfrh8qrb7ir1j836l4r3qlwyclwjh88b86clblhszh"; 960 + type = "gem"; 961 + }; 962 + version = "2.8.0"; 963 + }; 964 + lru_redux = { 965 + groups = ["default"]; 966 + platforms = []; 967 + source = { 968 + remotes = ["https://rubygems.org"]; 969 + sha256 = "1yxghzg7476sivz8yyr9nkak2dlbls0b89vc2kg52k0nmg6d0wgf"; 970 + type = "gem"; 971 + }; 972 + version = "1.1.0"; 973 + }; 974 + lz4-ruby = { 975 + groups = ["default"]; 976 + platforms = [{ 977 + engine = "maglev"; 978 + } { 979 + engine = "rbx"; 980 + } { 981 + engine = "ruby"; 982 + }]; 983 + source = { 984 + remotes = ["https://rubygems.org"]; 985 + sha256 = "12fymsvcb9kw6ycyfzc8b9svriq0afqf1qnl121xrz8c4gpfa6q1"; 986 + type = "gem"; 987 + }; 988 + version = "0.3.3"; 989 + }; 990 + mail = { 991 + dependencies = ["mini_mime"]; 992 + groups = ["default"]; 993 + platforms = []; 994 + source = { 995 + remotes = ["https://rubygems.org"]; 996 + sha256 = "00wwz6ys0502dpk8xprwcqfwyf3hmnx6lgxaiq6vj43mkx43sapc"; 997 + type = "gem"; 998 + }; 999 + version = "2.7.1"; 1000 + }; 1001 + maxminddb = { 1002 + groups = ["default"]; 1003 + platforms = []; 1004 + source = { 1005 + remotes = ["https://rubygems.org"]; 1006 + sha256 = "0zlhqilyggiryywgswfi624bv10qnkm66hggmg79vvgv73j3p4sh"; 1007 + type = "gem"; 1008 + }; 1009 + version = "0.1.22"; 1010 + }; 1011 + memory_profiler = { 1012 + groups = ["default"]; 1013 + platforms = [{ 1014 + engine = "maglev"; 1015 + } { 1016 + engine = "ruby"; 1017 + }]; 1018 + source = { 1019 + remotes = ["https://rubygems.org"]; 1020 + sha256 = "04ivhv1bilwqm33jv28gar2vwzsichb5nipaq395d3axabv8qmfy"; 1021 + type = "gem"; 1022 + }; 1023 + version = "0.9.14"; 1024 + }; 1025 + message_bus = { 1026 + dependencies = ["rack"]; 1027 + groups = ["default"]; 1028 + platforms = []; 1029 + source = { 1030 + remotes = ["https://rubygems.org"]; 1031 + sha256 = "0hckijk9aa628nx66vr7axfsk7zfdkskaxj1mdzikk019q3h54fr"; 1032 + type = "gem"; 1033 + }; 1034 + version = "3.3.4"; 1035 + }; 1036 + method_source = { 1037 + groups = ["default" "development" "test"]; 1038 + platforms = []; 1039 + source = { 1040 + remotes = ["https://rubygems.org"]; 1041 + sha256 = "1pnyh44qycnf9mzi1j6fywd5fkskv3x7nmsqrrws0rjn5dd4ayfp"; 1042 + type = "gem"; 1043 + }; 1044 + version = "1.0.0"; 1045 + }; 1046 + mini_mime = { 1047 + groups = ["default"]; 1048 + platforms = []; 1049 + source = { 1050 + remotes = ["https://rubygems.org"]; 1051 + sha256 = "1axm0rxyx3ss93wbmfkm78a6x03l8y4qy60rhkkiq0aza0vwq3ha"; 1052 + type = "gem"; 1053 + }; 1054 + version = "1.0.2"; 1055 + }; 1056 + mini_portile2 = { 1057 + groups = ["default" "development" "test"]; 1058 + platforms = []; 1059 + source = { 1060 + remotes = ["https://rubygems.org"]; 1061 + sha256 = "15zplpfw3knqifj9bpf604rb3wc1vhq6363pd6lvhayng8wql5vy"; 1062 + type = "gem"; 1063 + }; 1064 + version = "2.4.0"; 1065 + }; 1066 + mini_racer = { 1067 + dependencies = ["libv8"]; 1068 + groups = ["default"]; 1069 + platforms = []; 1070 + source = { 1071 + remotes = ["https://rubygems.org"]; 1072 + sha256 = "0r7j241mvhyyc017bqgp0pvf3jyrwbcqvz2pzm0r8zn2r85ks1jl"; 1073 + type = "gem"; 1074 + }; 1075 + version = "0.3.1"; 1076 + }; 1077 + mini_scheduler = { 1078 + dependencies = ["sidekiq"]; 1079 + groups = ["default"]; 1080 + platforms = []; 1081 + source = { 1082 + remotes = ["https://rubygems.org"]; 1083 + sha256 = "0vigv7f1q5bkcb55ab2lyhq15yqfkg5mq61p7m7mw9b3jac7qjz1"; 1084 + type = "gem"; 1085 + }; 1086 + version = "0.12.3"; 1087 + }; 1088 + mini_sql = { 1089 + groups = ["default"]; 1090 + platforms = []; 1091 + source = { 1092 + remotes = ["https://rubygems.org"]; 1093 + sha256 = "0qi4bj5jkh3673ybsxvsf7y485znyxb72vxg84gk9x65mf0y0m6h"; 1094 + type = "gem"; 1095 + }; 1096 + version = "0.3"; 1097 + }; 1098 + mini_suffix = { 1099 + dependencies = ["ffi"]; 1100 + groups = ["default"]; 1101 + platforms = []; 1102 + source = { 1103 + remotes = ["https://rubygems.org"]; 1104 + sha256 = "0bxd1fgzb20gvfvhbkrxym9fr7skm5x6fzvqfg4a0jijb34ww50h"; 1105 + type = "gem"; 1106 + }; 1107 + version = "0.3.0"; 1108 + }; 1109 + minitest = { 1110 + groups = ["default" "development" "test"]; 1111 + platforms = []; 1112 + source = { 1113 + remotes = ["https://rubygems.org"]; 1114 + sha256 = "170y2cvx51gm3cm3nhdf7j36sxnkh6vv8ls36p90ric7w8w16h4v"; 1115 + type = "gem"; 1116 + }; 1117 + version = "5.14.2"; 1118 + }; 1119 + mocha = { 1120 + groups = ["development" "test"]; 1121 + platforms = []; 1122 + source = { 1123 + remotes = ["https://rubygems.org"]; 1124 + sha256 = "0hxmkm8qxd04vwj8mqnpyrf2dwy7g1k9zipdfhl4y71cw7ijm9n4"; 1125 + type = "gem"; 1126 + }; 1127 + version = "1.11.2"; 1128 + }; 1129 + mock_redis = { 1130 + groups = ["development" "test"]; 1131 + platforms = []; 1132 + source = { 1133 + remotes = ["https://rubygems.org"]; 1134 + sha256 = "06yj6j9x4zjckah4ixiwhy3hb6xzjp7yk7lmmcvcb8hpd0z0x95q"; 1135 + type = "gem"; 1136 + }; 1137 + version = "0.26.0"; 1138 + }; 1139 + msgpack = { 1140 + groups = ["default"]; 1141 + platforms = [{ 1142 + engine = "maglev"; 1143 + } { 1144 + engine = "ruby"; 1145 + }]; 1146 + source = { 1147 + remotes = ["https://rubygems.org"]; 1148 + sha256 = "1lva6bkvb4mfa0m3bqn4lm4s4gi81c40jvdcsrxr6vng49q9daih"; 1149 + type = "gem"; 1150 + }; 1151 + version = "1.3.3"; 1152 + }; 1153 + multi_json = { 1154 + groups = ["default"]; 1155 + platforms = []; 1156 + source = { 1157 + remotes = ["https://rubygems.org"]; 1158 + sha256 = "0pb1g1y3dsiahavspyzkdy39j4q377009f6ix0bh1ag4nqw43l0z"; 1159 + type = "gem"; 1160 + }; 1161 + version = "1.15.0"; 1162 + }; 1163 + multi_xml = { 1164 + groups = ["default"]; 1165 + platforms = []; 1166 + source = { 1167 + remotes = ["https://rubygems.org"]; 1168 + sha256 = "0lmd4f401mvravi1i1yq7b2qjjli0yq7dfc4p1nj5nwajp7r6hyj"; 1169 + type = "gem"; 1170 + }; 1171 + version = "0.6.0"; 1172 + }; 1173 + multipart-post = { 1174 + groups = ["default"]; 1175 + platforms = []; 1176 + source = { 1177 + remotes = ["https://rubygems.org"]; 1178 + sha256 = "1zgw9zlwh2a6i1yvhhc4a84ry1hv824d6g2iw2chs3k5aylpmpfj"; 1179 + type = "gem"; 1180 + }; 1181 + version = "2.1.1"; 1182 + }; 1183 + mustache = { 1184 + groups = ["default"]; 1185 + platforms = []; 1186 + source = { 1187 + remotes = ["https://rubygems.org"]; 1188 + sha256 = "1l0p4wx15mi3wnamfv92ipkia4nsx8qi132c6g51jfdma3fiz2ch"; 1189 + type = "gem"; 1190 + }; 1191 + version = "1.1.1"; 1192 + }; 1193 + nio4r = { 1194 + groups = ["default"]; 1195 + platforms = []; 1196 + source = { 1197 + remotes = ["https://rubygems.org"]; 1198 + sha256 = "1cbwp1kbv6b2qfxv8sarv0d0ilb257jihlvdqj8f5pdm0ksq1sgk"; 1199 + type = "gem"; 1200 + }; 1201 + version = "2.5.4"; 1202 + }; 1203 + nokogiri = { 1204 + dependencies = ["mini_portile2"]; 1205 + groups = ["default" "development" "test"]; 1206 + platforms = []; 1207 + source = { 1208 + remotes = ["https://rubygems.org"]; 1209 + sha256 = "0xmf60nj5kg9vaj5bysy308687sgmkasgx06vbbnf94p52ih7si2"; 1210 + type = "gem"; 1211 + }; 1212 + version = "1.10.10"; 1213 + }; 1214 + nokogumbo = { 1215 + dependencies = ["nokogiri"]; 1216 + groups = ["default"]; 1217 + platforms = []; 1218 + source = { 1219 + remotes = ["https://rubygems.org"]; 1220 + sha256 = "0sxjnpjvrn10gdmfw2dimhch861lz00f28hvkkz0b1gc2rb65k9s"; 1221 + type = "gem"; 1222 + }; 1223 + version = "2.0.2"; 1224 + }; 1225 + oauth = { 1226 + groups = ["default"]; 1227 + platforms = []; 1228 + source = { 1229 + remotes = ["https://rubygems.org"]; 1230 + sha256 = "1zszdg8q1b135z7l7crjj234k4j0m347hywp5kj6zsq7q78pw09y"; 1231 + type = "gem"; 1232 + }; 1233 + version = "0.5.4"; 1234 + }; 1235 + oauth2 = { 1236 + dependencies = ["faraday" "jwt" "multi_json" "multi_xml" "rack"]; 1237 + groups = ["default"]; 1238 + platforms = []; 1239 + source = { 1240 + remotes = ["https://rubygems.org"]; 1241 + sha256 = "1bhakjh30vi8scqwnhd1c9qkac9r8hh2lr0dbs5ynwmrc5djxknm"; 1242 + type = "gem"; 1243 + }; 1244 + version = "1.4.4"; 1245 + }; 1246 + oj = { 1247 + groups = ["default"]; 1248 + platforms = []; 1249 + source = { 1250 + remotes = ["https://rubygems.org"]; 1251 + sha256 = "1xqmzqldi9a0wpilwx87yh61xd7647gg8ffammg4ava0bsx375g2"; 1252 + type = "gem"; 1253 + }; 1254 + version = "3.10.16"; 1255 + }; 1256 + omniauth = { 1257 + dependencies = ["hashie" "rack"]; 1258 + groups = ["default"]; 1259 + platforms = []; 1260 + source = { 1261 + remotes = ["https://rubygems.org"]; 1262 + sha256 = "002vi9gwamkmhf0dsj2im1d47xw2n1jfhnzl18shxf3ampkqfmyz"; 1263 + type = "gem"; 1264 + }; 1265 + version = "1.9.1"; 1266 + }; 1267 + omniauth-facebook = { 1268 + dependencies = ["omniauth-oauth2"]; 1269 + groups = ["default"]; 1270 + platforms = []; 1271 + source = { 1272 + remotes = ["https://rubygems.org"]; 1273 + sha256 = "1z0f5sr2ddnvfva0jrfd4926nlv4528rfj7z595288n39304r092"; 1274 + type = "gem"; 1275 + }; 1276 + version = "8.0.0"; 1277 + }; 1278 + omniauth-github = { 1279 + dependencies = ["omniauth" "omniauth-oauth2"]; 1280 + groups = ["default"]; 1281 + platforms = []; 1282 + source = { 1283 + remotes = ["https://rubygems.org"]; 1284 + sha256 = "0xbk0dbxqfpyfb33ghz6vrlz3m6442rp18ryf13gwzlnifcawhlb"; 1285 + type = "gem"; 1286 + }; 1287 + version = "1.4.0"; 1288 + }; 1289 + omniauth-google-oauth2 = { 1290 + dependencies = ["jwt" "omniauth" "omniauth-oauth2"]; 1291 + groups = ["default"]; 1292 + platforms = []; 1293 + source = { 1294 + remotes = ["https://rubygems.org"]; 1295 + sha256 = "17pgqasl048irs2c6w6g57zvk0ygb5ml1krwir4qi4b6y53zyr55"; 1296 + type = "gem"; 1297 + }; 1298 + version = "0.8.0"; 1299 + }; 1300 + omniauth-oauth = { 1301 + dependencies = ["oauth" "omniauth"]; 1302 + groups = ["default"]; 1303 + platforms = []; 1304 + source = { 1305 + remotes = ["https://rubygems.org"]; 1306 + sha256 = "1n5vk4by7hkyc09d9blrw2argry5awpw4gbw1l4n2s9b3j4qz037"; 1307 + type = "gem"; 1308 + }; 1309 + version = "1.1.0"; 1310 + }; 1311 + omniauth-oauth2 = { 1312 + dependencies = ["oauth2" "omniauth"]; 1313 + groups = ["default"]; 1314 + platforms = []; 1315 + source = { 1316 + remotes = ["https://rubygems.org"]; 1317 + sha256 = "0v6rw7sd223k7qw0l13wikgfcqbvbk81r53a9i2z0k7jl5vd97w5"; 1318 + type = "gem"; 1319 + }; 1320 + version = "1.7.0"; 1321 + }; 1322 + omniauth-twitter = { 1323 + dependencies = ["omniauth-oauth" "rack"]; 1324 + groups = ["default"]; 1325 + platforms = []; 1326 + source = { 1327 + remotes = ["https://rubygems.org"]; 1328 + sha256 = "0r5j65hkpgzhvvbs90id3nfsjgsad6ymzggbm7zlaxvnrmvnrk65"; 1329 + type = "gem"; 1330 + }; 1331 + version = "1.4.0"; 1332 + }; 1333 + onebox = { 1334 + dependencies = ["addressable" "htmlentities" "multi_json" "mustache" "nokogiri" "sanitize"]; 1335 + groups = ["default"]; 1336 + platforms = []; 1337 + source = { 1338 + remotes = ["https://rubygems.org"]; 1339 + sha256 = "0b2aih0d5cva9bris36gh1mk3ym61wgxlpwvzjd6qphdrjfzqx8v"; 1340 + type = "gem"; 1341 + }; 1342 + version = "2.2.1"; 1343 + }; 1344 + openssl-signature_algorithm = { 1345 + groups = ["default"]; 1346 + platforms = []; 1347 + source = { 1348 + remotes = ["https://rubygems.org"]; 1349 + sha256 = "0h1pfx49j8d9vbdbi8jyj0mr63l7rhflgvgc0nhfygm1v77d7nkn"; 1350 + type = "gem"; 1351 + }; 1352 + version = "1.0.0"; 1353 + }; 1354 + optimist = { 1355 + groups = ["default"]; 1356 + platforms = [{ 1357 + engine = "maglev"; 1358 + } { 1359 + engine = "ruby"; 1360 + }]; 1361 + source = { 1362 + remotes = ["https://rubygems.org"]; 1363 + sha256 = "1vg2chy1cfmdj6c1gryl8zvjhhmb3plwgyh1jfnpq4fnfqv7asrk"; 1364 + type = "gem"; 1365 + }; 1366 + version = "3.0.1"; 1367 + }; 1368 + parallel = { 1369 + groups = ["default" "development" "test"]; 1370 + platforms = []; 1371 + source = { 1372 + remotes = ["https://rubygems.org"]; 1373 + sha256 = "0055br0mibnqz0j8wvy20zry548dhkakws681bhj3ycb972awkzd"; 1374 + type = "gem"; 1375 + }; 1376 + version = "1.20.1"; 1377 + }; 1378 + parallel_tests = { 1379 + dependencies = ["parallel"]; 1380 + groups = ["development" "test"]; 1381 + platforms = []; 1382 + source = { 1383 + remotes = ["https://rubygems.org"]; 1384 + sha256 = "1mvdk8vgzqjv2pvadxwc8w2vf8dmiw145rjf47c36nn6l5hh02j6"; 1385 + type = "gem"; 1386 + }; 1387 + version = "3.4.0"; 1388 + }; 1389 + parser = { 1390 + dependencies = ["ast"]; 1391 + groups = ["default" "development" "test"]; 1392 + platforms = []; 1393 + source = { 1394 + remotes = ["https://rubygems.org"]; 1395 + sha256 = "1f7gmm60yla325wlnd3qkxs59qm2y0aan8ljpg6k18rwzrrfil6z"; 1396 + type = "gem"; 1397 + }; 1398 + version = "2.7.2.0"; 1399 + }; 1400 + pg = { 1401 + groups = ["default"]; 1402 + platforms = []; 1403 + source = { 1404 + remotes = ["https://rubygems.org"]; 1405 + sha256 = "13mfrysrdrh8cka1d96zm0lnfs59i5x2g6ps49r2kz5p3q81xrzj"; 1406 + type = "gem"; 1407 + }; 1408 + version = "1.2.3"; 1409 + }; 1410 + progress = { 1411 + groups = ["default"]; 1412 + platforms = []; 1413 + source = { 1414 + remotes = ["https://rubygems.org"]; 1415 + sha256 = "1pm3bv5n8c8j0vfm7wghd7xf6yq4m068cksxjldmna11qi0h0s8s"; 1416 + type = "gem"; 1417 + }; 1418 + version = "3.5.2"; 1419 + }; 1420 + pry = { 1421 + dependencies = ["coderay" "method_source"]; 1422 + groups = ["default"]; 1423 + platforms = []; 1424 + source = { 1425 + remotes = ["https://rubygems.org"]; 1426 + sha256 = "0iyw4q4an2wmk8v5rn2ghfy2jaz9vmw2nk8415nnpx2s866934qk"; 1427 + type = "gem"; 1428 + }; 1429 + version = "0.13.1"; 1430 + }; 1431 + pry-byebug = { 1432 + dependencies = ["byebug" "pry"]; 1433 + groups = ["default"]; 1434 + platforms = []; 1435 + source = { 1436 + remotes = ["https://rubygems.org"]; 1437 + sha256 = "096y5vmzpyy4x9h4ky4cs4y7d19vdq9vbwwrqafbh5gagzwhifiv"; 1438 + type = "gem"; 1439 + }; 1440 + version = "3.9.0"; 1441 + }; 1442 + pry-rails = { 1443 + dependencies = ["pry"]; 1444 + groups = ["default"]; 1445 + platforms = []; 1446 + source = { 1447 + remotes = ["https://rubygems.org"]; 1448 + sha256 = "1cf4ii53w2hdh7fn8vhqpzkymmchjbwij4l3m7s6fsxvb9bn51j6"; 1449 + type = "gem"; 1450 + }; 1451 + version = "0.3.9"; 1452 + }; 1453 + public_suffix = { 1454 + groups = ["default" "development" "test"]; 1455 + platforms = []; 1456 + source = { 1457 + remotes = ["https://rubygems.org"]; 1458 + sha256 = "1xqcgkl7bwws1qrlnmxgh8g4g9m10vg60bhlw40fplninb3ng6d9"; 1459 + type = "gem"; 1460 + }; 1461 + version = "4.0.6"; 1462 + }; 1463 + puma = { 1464 + dependencies = ["nio4r"]; 1465 + groups = ["default"]; 1466 + platforms = []; 1467 + source = { 1468 + remotes = ["https://rubygems.org"]; 1469 + sha256 = "0mkmfbf4qyiknwi9bb5432cpbbz06r855gknxb8grn24gmgs4d9i"; 1470 + type = "gem"; 1471 + }; 1472 + version = "5.0.4"; 1473 + }; 1474 + r2 = { 1475 + groups = ["default"]; 1476 + platforms = []; 1477 + source = { 1478 + remotes = ["https://rubygems.org"]; 1479 + sha256 = "0wk0p55zp3l96xy5ps28b33dn5z0jwsjl74bwfdn6z81pzjs5sfk"; 1480 + type = "gem"; 1481 + }; 1482 + version = "0.2.7"; 1483 + }; 1484 + rack = { 1485 + groups = ["default" "development" "test"]; 1486 + platforms = [{ 1487 + engine = "maglev"; 1488 + } { 1489 + engine = "ruby"; 1490 + }]; 1491 + source = { 1492 + remotes = ["https://rubygems.org"]; 1493 + sha256 = "0i5vs0dph9i5jn8dfc6aqd6njcafmb20rwqngrf759c9cvmyff16"; 1494 + type = "gem"; 1495 + }; 1496 + version = "2.2.3"; 1497 + }; 1498 + rack-mini-profiler = { 1499 + dependencies = ["rack"]; 1500 + groups = ["default"]; 1501 + platforms = []; 1502 + source = { 1503 + remotes = ["https://rubygems.org"]; 1504 + sha256 = "05s7y56ayn56bn7y5ah3krm5d53vsj7apmcxlwc2qp7ik0xlypvq"; 1505 + type = "gem"; 1506 + }; 1507 + version = "2.2.0"; 1508 + }; 1509 + rack-protection = { 1510 + dependencies = ["rack"]; 1511 + groups = ["default"]; 1512 + platforms = []; 1513 + source = { 1514 + remotes = ["https://rubygems.org"]; 1515 + sha256 = "159a4j4kragqh0z0z8vrpilpmaisnlz3n7kgiyf16bxkwlb3qlhz"; 1516 + type = "gem"; 1517 + }; 1518 + version = "2.1.0"; 1519 + }; 1520 + rack-test = { 1521 + dependencies = ["rack"]; 1522 + groups = ["default" "development" "test"]; 1523 + platforms = []; 1524 + source = { 1525 + remotes = ["https://rubygems.org"]; 1526 + sha256 = "0rh8h376mx71ci5yklnpqqn118z3bl67nnv5k801qaqn1zs62h8m"; 1527 + type = "gem"; 1528 + }; 1529 + version = "1.1.0"; 1530 + }; 1531 + rails-dom-testing = { 1532 + dependencies = ["activesupport" "nokogiri"]; 1533 + groups = ["default" "development" "test"]; 1534 + platforms = []; 1535 + source = { 1536 + remotes = ["https://rubygems.org"]; 1537 + sha256 = "1lfq2a7kp2x64dzzi5p4cjcbiv62vxh9lyqk2f0rqq3fkzrw8h5i"; 1538 + type = "gem"; 1539 + }; 1540 + version = "2.0.3"; 1541 + }; 1542 + rails-html-sanitizer = { 1543 + dependencies = ["loofah"]; 1544 + groups = ["default" "development" "test"]; 1545 + platforms = []; 1546 + source = { 1547 + remotes = ["https://rubygems.org"]; 1548 + sha256 = "1icpqmxbppl4ynzmn6dx7wdil5hhq6fz707m9ya6d86c7ys8sd4f"; 1549 + type = "gem"; 1550 + }; 1551 + version = "1.3.0"; 1552 + }; 1553 + rails_failover = { 1554 + dependencies = ["activerecord" "concurrent-ruby" "railties"]; 1555 + groups = ["default"]; 1556 + platforms = []; 1557 + source = { 1558 + remotes = ["https://rubygems.org"]; 1559 + sha256 = "0ibxn7lk6rqk7q76cd9ir3xnh19p2pqr9mzam46n3h37f12yyax5"; 1560 + type = "gem"; 1561 + }; 1562 + version = "0.6.2"; 1563 + }; 1564 + rails_multisite = { 1565 + dependencies = ["activerecord" "railties"]; 1566 + groups = ["default"]; 1567 + platforms = []; 1568 + source = { 1569 + remotes = ["https://rubygems.org"]; 1570 + sha256 = "0p7g9gkcmw030zfqlw3k933i40j31wf3jh4bj1niihzk7slha97y"; 1571 + type = "gem"; 1572 + }; 1573 + version = "2.5.0"; 1574 + }; 1575 + railties = { 1576 + dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor"]; 1577 + groups = ["default" "development" "test"]; 1578 + platforms = []; 1579 + source = { 1580 + remotes = ["https://rubygems.org"]; 1581 + sha256 = "05b79r0ms8jrs91zml1190qfxmnmks90g0sd820ks9msyr8xdp7j"; 1582 + type = "gem"; 1583 + }; 1584 + version = "6.0.3.3"; 1585 + }; 1586 + rainbow = { 1587 + groups = ["default" "development" "test"]; 1588 + platforms = []; 1589 + source = { 1590 + remotes = ["https://rubygems.org"]; 1591 + sha256 = "0bb2fpjspydr6x0s8pn1pqkzmxszvkfapv0p4627mywl7ky4zkhk"; 1592 + type = "gem"; 1593 + }; 1594 + version = "3.0.0"; 1595 + }; 1596 + raindrops = { 1597 + groups = ["default"]; 1598 + platforms = [{ 1599 + engine = "maglev"; 1600 + } { 1601 + engine = "rbx"; 1602 + } { 1603 + engine = "ruby"; 1604 + }]; 1605 + source = { 1606 + remotes = ["https://rubygems.org"]; 1607 + sha256 = "0zjja00mzgx2lddb7qrn14k7qrnwhf4bpmnlqj78m1pfxh7svync"; 1608 + type = "gem"; 1609 + }; 1610 + version = "0.19.1"; 1611 + }; 1612 + rake = { 1613 + groups = ["default" "development" "test"]; 1614 + platforms = []; 1615 + source = { 1616 + remotes = ["https://rubygems.org"]; 1617 + sha256 = "0w6qza25bq1s825faaglkx1k6d59aiyjjk3yw3ip5sb463mhhai9"; 1618 + type = "gem"; 1619 + }; 1620 + version = "13.0.1"; 1621 + }; 1622 + rb-fsevent = { 1623 + groups = ["development" "test"]; 1624 + platforms = []; 1625 + source = { 1626 + remotes = ["https://rubygems.org"]; 1627 + sha256 = "1k9bsj7ni0g2fd7scyyy1sk9dy2pg9akniahab0iznvjmhn54h87"; 1628 + type = "gem"; 1629 + }; 1630 + version = "0.10.4"; 1631 + }; 1632 + rb-inotify = { 1633 + dependencies = ["ffi"]; 1634 + groups = ["default" "development" "test"]; 1635 + platforms = []; 1636 + source = { 1637 + remotes = ["https://rubygems.org"]; 1638 + sha256 = "1jm76h8f8hji38z3ggf4bzi8vps6p7sagxn3ab57qc0xyga64005"; 1639 + type = "gem"; 1640 + }; 1641 + version = "0.10.1"; 1642 + }; 1643 + rbtrace = { 1644 + dependencies = ["ffi" "msgpack" "optimist"]; 1645 + groups = ["default"]; 1646 + platforms = [{ 1647 + engine = "maglev"; 1648 + } { 1649 + engine = "ruby"; 1650 + }]; 1651 + source = { 1652 + remotes = ["https://rubygems.org"]; 1653 + sha256 = "0s8prj0klfgpmpfcpdzbf149qrrsdxgnb6w6kkqc9gyars4vyaqn"; 1654 + type = "gem"; 1655 + }; 1656 + version = "0.4.14"; 1657 + }; 1658 + rchardet = { 1659 + groups = ["default"]; 1660 + platforms = []; 1661 + source = { 1662 + remotes = ["https://rubygems.org"]; 1663 + sha256 = "1isj1b3ywgg2m1vdlnr41lpvpm3dbyarf1lla4dfibfmad9csfk9"; 1664 + type = "gem"; 1665 + }; 1666 + version = "1.8.0"; 1667 + }; 1668 + redis = { 1669 + groups = ["default"]; 1670 + platforms = []; 1671 + source = { 1672 + remotes = ["https://rubygems.org"]; 1673 + sha256 = "15x2sr6h094rjbvg8pkq6m3lcd5abpyx93aifvfdz3wv6x55xa48"; 1674 + type = "gem"; 1675 + }; 1676 + version = "4.2.5"; 1677 + }; 1678 + redis-namespace = { 1679 + dependencies = ["redis"]; 1680 + groups = ["default"]; 1681 + platforms = []; 1682 + source = { 1683 + remotes = ["https://rubygems.org"]; 1684 + sha256 = "05i6s898z5w31z385cba1683pgg5nnmj4m686cbravg7j4pgbcgv"; 1685 + type = "gem"; 1686 + }; 1687 + version = "1.8.0"; 1688 + }; 1689 + regexp_parser = { 1690 + groups = ["default" "development" "test"]; 1691 + platforms = []; 1692 + source = { 1693 + remotes = ["https://rubygems.org"]; 1694 + sha256 = "1racz3w9s4w0ls32bvjypfifk4a7qxngm2cv1rh16jyz0c1wjd70"; 1695 + type = "gem"; 1696 + }; 1697 + version = "2.0.0"; 1698 + }; 1699 + request_store = { 1700 + dependencies = ["rack"]; 1701 + groups = ["default"]; 1702 + platforms = []; 1703 + source = { 1704 + remotes = ["https://rubygems.org"]; 1705 + sha256 = "0cx74kispmnw3ljwb239j65a2j14n8jlsygy372hrsa8mxc71hxi"; 1706 + type = "gem"; 1707 + }; 1708 + version = "1.5.0"; 1709 + }; 1710 + rexml = { 1711 + groups = ["default" "development" "test"]; 1712 + platforms = []; 1713 + source = { 1714 + remotes = ["https://rubygems.org"]; 1715 + sha256 = "1mkvkcw9fhpaizrhca0pdgjcrbns48rlz4g6lavl5gjjq3rk2sq3"; 1716 + type = "gem"; 1717 + }; 1718 + version = "3.2.4"; 1719 + }; 1720 + rinku = { 1721 + groups = ["default"]; 1722 + platforms = []; 1723 + source = { 1724 + remotes = ["https://rubygems.org"]; 1725 + sha256 = "0zcdha17s1wzxyc5814j6319wqg33jbn58pg6wmxpws36476fq4b"; 1726 + type = "gem"; 1727 + }; 1728 + version = "2.0.6"; 1729 + }; 1730 + rotp = { 1731 + groups = ["default"]; 1732 + platforms = []; 1733 + source = { 1734 + remotes = ["https://rubygems.org"]; 1735 + sha256 = "11q7rkjx40yi6lpylgl2jkpy162mjw7mswrcgcax86vgpbpjx6i3"; 1736 + type = "gem"; 1737 + }; 1738 + version = "6.2.0"; 1739 + }; 1740 + rqrcode = { 1741 + dependencies = ["chunky_png" "rqrcode_core"]; 1742 + groups = ["default"]; 1743 + platforms = []; 1744 + source = { 1745 + remotes = ["https://rubygems.org"]; 1746 + sha256 = "06lw8b6wfshxd61xw98xyp1a0zsz6av4nls2c9fwb7q59wb05sci"; 1747 + type = "gem"; 1748 + }; 1749 + version = "1.1.2"; 1750 + }; 1751 + rqrcode_core = { 1752 + groups = ["default"]; 1753 + platforms = []; 1754 + source = { 1755 + remotes = ["https://rubygems.org"]; 1756 + sha256 = "071jqmhk3hf0grsvi0jx5sl449pf82p40ls5b3likbq4q516zc0j"; 1757 + type = "gem"; 1758 + }; 1759 + version = "0.1.2"; 1760 + }; 1761 + rspec = { 1762 + dependencies = ["rspec-core" "rspec-expectations" "rspec-mocks"]; 1763 + groups = ["development" "test"]; 1764 + platforms = []; 1765 + source = { 1766 + remotes = ["https://rubygems.org"]; 1767 + sha256 = "1dwai7jnwmdmd7ajbi2q0k0lx1dh88knv5wl7c34wjmf94yv8w5q"; 1768 + type = "gem"; 1769 + }; 1770 + version = "3.10.0"; 1771 + }; 1772 + rspec-core = { 1773 + dependencies = ["rspec-support"]; 1774 + groups = ["default" "development" "test"]; 1775 + platforms = []; 1776 + source = { 1777 + remotes = ["https://rubygems.org"]; 1778 + sha256 = "0n2rdv8f26yw8c6asymc0mgddyr5d2b5n6mfvpd3n6lnpf1jdyv2"; 1779 + type = "gem"; 1780 + }; 1781 + version = "3.10.0"; 1782 + }; 1783 + rspec-expectations = { 1784 + dependencies = ["diff-lcs" "rspec-support"]; 1785 + groups = ["default" "development" "test"]; 1786 + platforms = []; 1787 + source = { 1788 + remotes = ["https://rubygems.org"]; 1789 + sha256 = "0j37dvnvfbjwj8dqx27yfvz0frl7f2jc1abqg99h0ppriz9za6dc"; 1790 + type = "gem"; 1791 + }; 1792 + version = "3.10.0"; 1793 + }; 1794 + rspec-html-matchers = { 1795 + dependencies = ["nokogiri" "rspec"]; 1796 + groups = ["development" "test"]; 1797 + platforms = []; 1798 + source = { 1799 + remotes = ["https://rubygems.org"]; 1800 + sha256 = "0883rqv77n2wawnk5lp3la48l7pckyz8l013qddngzmksi5p1v3f"; 1801 + type = "gem"; 1802 + }; 1803 + version = "0.9.4"; 1804 + }; 1805 + rspec-mocks = { 1806 + dependencies = ["diff-lcs" "rspec-support"]; 1807 + groups = ["default" "development" "test"]; 1808 + platforms = []; 1809 + source = { 1810 + remotes = ["https://rubygems.org"]; 1811 + sha256 = "1pz89y1522i6f8wzrg72ykmch3318ih87nlpl0y1ghsrs5hqymw3"; 1812 + type = "gem"; 1813 + }; 1814 + version = "3.10.0"; 1815 + }; 1816 + rspec-rails = { 1817 + dependencies = ["actionpack" "activesupport" "railties" "rspec-core" "rspec-expectations" "rspec-mocks" "rspec-support"]; 1818 + groups = ["development" "test"]; 1819 + platforms = []; 1820 + source = { 1821 + remotes = ["https://rubygems.org"]; 1822 + sha256 = "0lzik01ziaskgpdpy8knffpw0fsy9151f5lfigyhb89wq4q45hfs"; 1823 + type = "gem"; 1824 + }; 1825 + version = "4.0.1"; 1826 + }; 1827 + rspec-support = { 1828 + groups = ["default" "development" "test"]; 1829 + platforms = []; 1830 + source = { 1831 + remotes = ["https://rubygems.org"]; 1832 + sha256 = "0j0n28i6zci5j7gg370bdy87dy43hlwx6dw428d9kamf5a0i2klz"; 1833 + type = "gem"; 1834 + }; 1835 + version = "3.10.0"; 1836 + }; 1837 + rswag-specs = { 1838 + dependencies = ["activesupport" "json-schema" "railties"]; 1839 + groups = ["development" "test"]; 1840 + platforms = []; 1841 + source = { 1842 + remotes = ["https://rubygems.org"]; 1843 + sha256 = "0lyp2m76p960bvgy4xcz0dilp4w5lq2cwh8md5z7cwxdg8qsbr83"; 1844 + type = "gem"; 1845 + }; 1846 + version = "2.3.1"; 1847 + }; 1848 + rtlit = { 1849 + groups = ["assets"]; 1850 + platforms = []; 1851 + source = { 1852 + remotes = ["https://rubygems.org"]; 1853 + sha256 = "0srfh7cl95srjiwbyc9pmn3w739zlvyj89hyj0bm7g92zrsd27qm"; 1854 + type = "gem"; 1855 + }; 1856 + version = "0.0.5"; 1857 + }; 1858 + rubocop = { 1859 + dependencies = ["parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width"]; 1860 + groups = ["default" "development" "test"]; 1861 + platforms = []; 1862 + source = { 1863 + remotes = ["https://rubygems.org"]; 1864 + sha256 = "1kvzhzhzcdd5bqwjilb0fpp51sqjniww2b0g713n0cvhnlgchn2y"; 1865 + type = "gem"; 1866 + }; 1867 + version = "1.4.2"; 1868 + }; 1869 + rubocop-ast = { 1870 + dependencies = ["parser"]; 1871 + groups = ["default" "development" "test"]; 1872 + platforms = []; 1873 + source = { 1874 + remotes = ["https://rubygems.org"]; 1875 + sha256 = "0q0kdi89ad7dd1xmzrdf5ikk32bllzr68hf4x8fd7azcv5jnch2l"; 1876 + type = "gem"; 1877 + }; 1878 + version = "1.2.0"; 1879 + }; 1880 + rubocop-discourse = { 1881 + dependencies = ["rubocop" "rubocop-rspec"]; 1882 + groups = ["development" "test"]; 1883 + platforms = []; 1884 + source = { 1885 + remotes = ["https://rubygems.org"]; 1886 + sha256 = "1z1h8spsjnsqz6c25n9ib1yimkwr7a76bas8w1k9c404hcqhlahv"; 1887 + type = "gem"; 1888 + }; 1889 + version = "2.4.1"; 1890 + }; 1891 + rubocop-rspec = { 1892 + dependencies = ["rubocop" "rubocop-ast"]; 1893 + groups = ["default" "development" "test"]; 1894 + platforms = []; 1895 + source = { 1896 + remotes = ["https://rubygems.org"]; 1897 + sha256 = "1gl7hdd9lq0si4gb510g33dbysmk3iydas2b0sbl5pwfkhv0k4g1"; 1898 + type = "gem"; 1899 + }; 1900 + version = "2.0.0"; 1901 + }; 1902 + ruby-prof = { 1903 + groups = ["development"]; 1904 + platforms = [{ 1905 + engine = "maglev"; 1906 + } { 1907 + engine = "ruby"; 1908 + }]; 1909 + source = { 1910 + remotes = ["https://rubygems.org"]; 1911 + sha256 = "1lm3wdxc6gjldkb5pdwwipapf84lgrvxck4h5kg8jdfd8arrpyis"; 1912 + type = "gem"; 1913 + }; 1914 + version = "1.4.2"; 1915 + }; 1916 + ruby-progressbar = { 1917 + groups = ["default" "development" "test"]; 1918 + platforms = []; 1919 + source = { 1920 + remotes = ["https://rubygems.org"]; 1921 + sha256 = "1k77i0d4wsn23ggdd2msrcwfy0i376cglfqypkk2q77r2l3408zf"; 1922 + type = "gem"; 1923 + }; 1924 + version = "1.10.1"; 1925 + }; 1926 + ruby-readability = { 1927 + dependencies = ["guess_html_encoding" "nokogiri"]; 1928 + groups = ["default"]; 1929 + platforms = []; 1930 + source = { 1931 + remotes = ["https://rubygems.org"]; 1932 + sha256 = "15ivhbry7hf82lww1bzcrwfyjymijfb3rb0wdd32g2z0942wdspa"; 1933 + type = "gem"; 1934 + }; 1935 + version = "0.7.0"; 1936 + }; 1937 + ruby2_keywords = { 1938 + groups = ["default"]; 1939 + platforms = []; 1940 + source = { 1941 + remotes = ["https://rubygems.org"]; 1942 + sha256 = "17pcc0wgvh3ikrkr7bm3nx0qhyiqwidd13ij0fa50k7gsbnr2p0l"; 1943 + type = "gem"; 1944 + }; 1945 + version = "0.0.2"; 1946 + }; 1947 + rubyzip = { 1948 + groups = ["default"]; 1949 + platforms = []; 1950 + source = { 1951 + remotes = ["https://rubygems.org"]; 1952 + sha256 = "0590m2pr9i209pp5z4mx0nb1961ishdiqb28995hw1nln1d1b5ji"; 1953 + type = "gem"; 1954 + }; 1955 + version = "2.3.0"; 1956 + }; 1957 + sanitize = { 1958 + dependencies = ["crass" "nokogiri" "nokogumbo"]; 1959 + groups = ["default"]; 1960 + platforms = []; 1961 + source = { 1962 + remotes = ["https://rubygems.org"]; 1963 + sha256 = "18m3zcf207gcrmghx288w3n2kpphc22lbmbc1wdx1nzcn8g2yddh"; 1964 + type = "gem"; 1965 + }; 1966 + version = "5.2.1"; 1967 + }; 1968 + sassc = { 1969 + dependencies = ["ffi" "rake"]; 1970 + groups = ["default"]; 1971 + platforms = []; 1972 + source = { 1973 + remotes = ["https://rubygems.org"]; 1974 + sha256 = "1sr4825rlwsrl7xrsm0sgalcpf5zgp4i56dbi3qxfa9lhs8r6zh4"; 1975 + type = "gem"; 1976 + }; 1977 + version = "2.0.1"; 1978 + }; 1979 + sassc-rails = { 1980 + dependencies = ["railties" "sassc" "sprockets" "sprockets-rails" "tilt"]; 1981 + groups = ["default"]; 1982 + platforms = []; 1983 + source = { 1984 + remotes = ["https://rubygems.org"]; 1985 + sha256 = "1d9djmwn36a5m8a83bpycs48g8kh1n2xkyvghn7dr6zwh4wdyksz"; 1986 + type = "gem"; 1987 + }; 1988 + version = "2.1.2"; 1989 + }; 1990 + seed-fu = { 1991 + dependencies = ["activerecord" "activesupport"]; 1992 + groups = ["default"]; 1993 + platforms = []; 1994 + source = { 1995 + remotes = ["https://rubygems.org"]; 1996 + sha256 = "0y7lzcshsq6i20qn1p8zczir4fivr6nbl1km91ns320vvh92v43d"; 1997 + type = "gem"; 1998 + }; 1999 + version = "2.3.9"; 2000 + }; 2001 + shoulda-matchers = { 2002 + dependencies = ["activesupport"]; 2003 + groups = ["development" "test"]; 2004 + platforms = []; 2005 + source = { 2006 + remotes = ["https://rubygems.org"]; 2007 + sha256 = "1wd1bblxr4dfmrnh3j83kvfds6a7nak4ifq37ab0pg1kdi6iiw7l"; 2008 + type = "gem"; 2009 + }; 2010 + version = "4.4.1"; 2011 + }; 2012 + sidekiq = { 2013 + dependencies = ["connection_pool" "rack" "redis"]; 2014 + groups = ["default"]; 2015 + platforms = []; 2016 + source = { 2017 + remotes = ["https://rubygems.org"]; 2018 + sha256 = "0mjxrxppv08a1hwqi8gpg6n168cxqhp7c2r2jwc4rbz9j5k41vcw"; 2019 + type = "gem"; 2020 + }; 2021 + version = "6.1.2"; 2022 + }; 2023 + simplecov = { 2024 + dependencies = ["docile" "simplecov-html" "simplecov_json_formatter"]; 2025 + groups = ["test"]; 2026 + platforms = []; 2027 + source = { 2028 + remotes = ["https://rubygems.org"]; 2029 + sha256 = "1mm20dvd64w46l5k11il9z5sjgdpp0bknml76glcngvl2w03k3cb"; 2030 + type = "gem"; 2031 + }; 2032 + version = "0.20.0"; 2033 + }; 2034 + simplecov-html = { 2035 + groups = ["default" "test"]; 2036 + platforms = []; 2037 + source = { 2038 + remotes = ["https://rubygems.org"]; 2039 + sha256 = "0yx01bxa8pbf9ip4hagqkp5m0mqfnwnw2xk8kjraiywz4lrss6jb"; 2040 + type = "gem"; 2041 + }; 2042 + version = "0.12.3"; 2043 + }; 2044 + simplecov_json_formatter = { 2045 + groups = ["default" "test"]; 2046 + platforms = []; 2047 + source = { 2048 + remotes = ["https://rubygems.org"]; 2049 + sha256 = "0cl3j7p3b5q7sxsx1va63c8imc5x6g99xablz08qrmqhpi0d6g6j"; 2050 + type = "gem"; 2051 + }; 2052 + version = "0.1.2"; 2053 + }; 2054 + sprockets = { 2055 + dependencies = ["concurrent-ruby" "rack"]; 2056 + groups = ["default"]; 2057 + platforms = []; 2058 + source = { 2059 + remotes = ["https://rubygems.org"]; 2060 + sha256 = "182jw5a0fbqah5w9jancvfmjbk88h8bxdbwnl4d3q809rpxdg8ay"; 2061 + type = "gem"; 2062 + }; 2063 + version = "3.7.2"; 2064 + }; 2065 + sprockets-rails = { 2066 + dependencies = ["actionpack" "activesupport" "sprockets"]; 2067 + groups = ["default"]; 2068 + platforms = []; 2069 + source = { 2070 + remotes = ["https://rubygems.org"]; 2071 + sha256 = "0mwmz36265646xqfyczgr1mhkm1hfxgxxvgdgr4xfcbf2g72p1k2"; 2072 + type = "gem"; 2073 + }; 2074 + version = "3.2.2"; 2075 + }; 2076 + sshkey = { 2077 + groups = ["default"]; 2078 + platforms = []; 2079 + source = { 2080 + remotes = ["https://rubygems.org"]; 2081 + sha256 = "03bkn55qsng484iqwz2lmm6rkimj01vsvhwk661s3lnmpkl65lbp"; 2082 + type = "gem"; 2083 + }; 2084 + version = "2.0.0"; 2085 + }; 2086 + stackprof = { 2087 + groups = ["default"]; 2088 + platforms = [{ 2089 + engine = "maglev"; 2090 + } { 2091 + engine = "ruby"; 2092 + }]; 2093 + source = { 2094 + remotes = ["https://rubygems.org"]; 2095 + sha256 = "147rb66p3n062vc433afqhkd99iazvkrqnghxgh871r62yhha93f"; 2096 + type = "gem"; 2097 + }; 2098 + version = "0.2.16"; 2099 + }; 2100 + test-prof = { 2101 + groups = ["test"]; 2102 + platforms = []; 2103 + source = { 2104 + remotes = ["https://rubygems.org"]; 2105 + sha256 = "1jfq8ylxpxanc3f0i6qb3nchawx9hj6qcqj6ccfyixrnvzswwjvi"; 2106 + type = "gem"; 2107 + }; 2108 + version = "0.12.2"; 2109 + }; 2110 + thor = { 2111 + groups = ["default" "development" "test"]; 2112 + platforms = []; 2113 + source = { 2114 + remotes = ["https://rubygems.org"]; 2115 + sha256 = "1xbhkmyhlxwzshaqa7swy2bx6vd64mm0wrr8g3jywvxy7hg0cwkm"; 2116 + type = "gem"; 2117 + }; 2118 + version = "1.0.1"; 2119 + }; 2120 + thread_safe = { 2121 + groups = ["default" "development" "test"]; 2122 + platforms = []; 2123 + source = { 2124 + remotes = ["https://rubygems.org"]; 2125 + sha256 = "0nmhcgq6cgz44srylra07bmaw99f5271l0dpsvl5f75m44l0gmwy"; 2126 + type = "gem"; 2127 + }; 2128 + version = "0.3.6"; 2129 + }; 2130 + tilt = { 2131 + groups = ["default"]; 2132 + platforms = []; 2133 + source = { 2134 + remotes = ["https://rubygems.org"]; 2135 + sha256 = "0rn8z8hda4h41a64l0zhkiwz2vxw9b1nb70gl37h1dg2k874yrlv"; 2136 + type = "gem"; 2137 + }; 2138 + version = "2.0.10"; 2139 + }; 2140 + tzinfo = { 2141 + dependencies = ["thread_safe"]; 2142 + groups = ["default" "development" "test"]; 2143 + platforms = []; 2144 + source = { 2145 + remotes = ["https://rubygems.org"]; 2146 + sha256 = "0skr6ih9cr3pwp8l84f0z7fy3q9kiq8hw0sg3zqw0hpbbyj05743"; 2147 + type = "gem"; 2148 + }; 2149 + version = "1.2.8"; 2150 + }; 2151 + uglifier = { 2152 + dependencies = ["execjs"]; 2153 + groups = ["assets"]; 2154 + platforms = []; 2155 + source = { 2156 + remotes = ["https://rubygems.org"]; 2157 + sha256 = "0wgh7bzy68vhv9v68061519dd8samcy8sazzz0w3k8kqpy3g4s5f"; 2158 + type = "gem"; 2159 + }; 2160 + version = "4.2.0"; 2161 + }; 2162 + unf = { 2163 + dependencies = ["unf_ext"]; 2164 + groups = ["default"]; 2165 + platforms = []; 2166 + source = { 2167 + remotes = ["https://rubygems.org"]; 2168 + sha256 = "0bh2cf73i2ffh4fcpdn9ir4mhq8zi50ik0zqa1braahzadx536a9"; 2169 + type = "gem"; 2170 + }; 2171 + version = "0.1.4"; 2172 + }; 2173 + unf_ext = { 2174 + groups = ["default"]; 2175 + platforms = []; 2176 + source = { 2177 + remotes = ["https://rubygems.org"]; 2178 + sha256 = "0wc47r23h063l8ysws8sy24gzh74mks81cak3lkzlrw4qkqb3sg4"; 2179 + type = "gem"; 2180 + }; 2181 + version = "0.0.7.7"; 2182 + }; 2183 + unicode-display_width = { 2184 + groups = ["default" "development" "test"]; 2185 + platforms = []; 2186 + source = { 2187 + remotes = ["https://rubygems.org"]; 2188 + sha256 = "06i3id27s60141x6fdnjn5rar1cywdwy64ilc59cz937303q3mna"; 2189 + type = "gem"; 2190 + }; 2191 + version = "1.7.0"; 2192 + }; 2193 + unicorn = { 2194 + dependencies = ["kgio" "raindrops"]; 2195 + groups = ["default"]; 2196 + platforms = [{ 2197 + engine = "maglev"; 2198 + } { 2199 + engine = "rbx"; 2200 + } { 2201 + engine = "ruby"; 2202 + }]; 2203 + source = { 2204 + remotes = ["https://rubygems.org"]; 2205 + sha256 = "1qzdhbmab2w034wpdj5ippnyyvgqm8gpx9wbchb4zgs4i1mswzhv"; 2206 + type = "gem"; 2207 + }; 2208 + version = "5.7.0"; 2209 + }; 2210 + uniform_notifier = { 2211 + groups = ["default" "development"]; 2212 + platforms = []; 2213 + source = { 2214 + remotes = ["https://rubygems.org"]; 2215 + sha256 = "0vm4aix8jmv42s1x58m3lj3xwkbxyn9qn6lzhhig0d1j8fv6j30c"; 2216 + type = "gem"; 2217 + }; 2218 + version = "1.13.0"; 2219 + }; 2220 + webmock = { 2221 + dependencies = ["addressable" "crack" "hashdiff"]; 2222 + groups = ["test"]; 2223 + platforms = []; 2224 + source = { 2225 + remotes = ["https://rubygems.org"]; 2226 + sha256 = "0wbdjagk2qpr76k3zw2gmkfp5aqlrc1a4qrpjv7sq1q39qbn8xax"; 2227 + type = "gem"; 2228 + }; 2229 + version = "3.10.0"; 2230 + }; 2231 + webpush = { 2232 + dependencies = ["hkdf" "jwt"]; 2233 + groups = ["default"]; 2234 + platforms = []; 2235 + source = { 2236 + remotes = ["https://rubygems.org"]; 2237 + sha256 = "1z9ma580q80czw46gi1bvsr2iwxr63aiyr7i9gilav6hbhg3sxv3"; 2238 + type = "gem"; 2239 + }; 2240 + version = "1.1.0"; 2241 + }; 2242 + xorcist = { 2243 + groups = ["default"]; 2244 + platforms = []; 2245 + source = { 2246 + remotes = ["https://rubygems.org"]; 2247 + sha256 = "1q7hr3qyn1hczv9fglqc2cbaax0fb37gjjr0y24x19mmp817csdn"; 2248 + type = "gem"; 2249 + }; 2250 + version = "1.1.2"; 2251 + }; 2252 + yaml-lint = { 2253 + groups = ["development"]; 2254 + platforms = []; 2255 + source = { 2256 + remotes = ["https://rubygems.org"]; 2257 + sha256 = "1m9n4sg7i0334yac7dcrhnhv5rzvrccgnh687n9x77ba3awk4yx1"; 2258 + type = "gem"; 2259 + }; 2260 + version = "0.0.10"; 2261 + }; 2262 + zeitwerk = { 2263 + groups = ["default" "development" "test"]; 2264 + platforms = []; 2265 + source = { 2266 + remotes = ["https://rubygems.org"]; 2267 + sha256 = "12n0hiawqayzchi0yga5n19hi63b2snd49fv3n23n2i4pp05jzrp"; 2268 + type = "gem"; 2269 + }; 2270 + version = "2.4.1"; 2271 + }; 2272 + }
+25
pkgs/servers/web-apps/discourse/unicorn_logging_and_timeout.patch
··· 1 + diff --git a/config/unicorn.conf.rb b/config/unicorn.conf.rb 2 + index 373e235b3f..57d4d7a55b 100644 3 + --- a/config/unicorn.conf.rb 4 + +++ b/config/unicorn.conf.rb 5 + @@ -27,18 +27,10 @@ pid (ENV["UNICORN_PID_PATH"] || "#{discourse_path}/tmp/pids/unicorn.pid") 6 + 7 + if ENV["RAILS_ENV"] == "development" || !ENV["RAILS_ENV"] 8 + logger Logger.new($stdout) 9 + - # we want a longer timeout in dev cause first request can be really slow 10 + - timeout (ENV["UNICORN_TIMEOUT"] && ENV["UNICORN_TIMEOUT"].to_i || 60) 11 + -else 12 + - # By default, the Unicorn logger will write to stderr. 13 + - # Additionally, some applications/frameworks log to stderr or stdout, 14 + - # so prevent them from going to /dev/null when daemonized here: 15 + - stderr_path "#{discourse_path}/log/unicorn.stderr.log" 16 + - stdout_path "#{discourse_path}/log/unicorn.stdout.log" 17 + - # nuke workers after 30 seconds instead of 60 seconds (the default) 18 + - timeout 30 19 + end 20 + 21 + +timeout (ENV["UNICORN_TIMEOUT"] && ENV["UNICORN_TIMEOUT"].to_i || 60) 22 + + 23 + # important for Ruby 2.0 24 + preload_app true 25 +
+164
pkgs/servers/web-apps/discourse/update.py
··· 1 + #!/usr/bin/env nix-shell 2 + #! nix-shell -i python3 -p bundix bundler nix-update python3 python3Packages.requests python3Packages.click python3Packages.click-log 3 + 4 + import click 5 + import click_log 6 + import shutil 7 + import tempfile 8 + import re 9 + import logging 10 + import subprocess 11 + import pathlib 12 + from distutils.version import LooseVersion 13 + from typing import Iterable 14 + 15 + import requests 16 + 17 + logger = logging.getLogger(__name__) 18 + 19 + 20 + class DiscourseRepo: 21 + version_regex = re.compile(r'^v\d+\.\d+\.\d+$') 22 + def __init__(self, owner: str = 'discourse', repo: str = 'discourse'): 23 + self.owner = owner 24 + self.repo = repo 25 + 26 + @property 27 + def tags(self) -> Iterable[str]: 28 + r = requests.get(f'https://api.github.com/repos/{self.owner}/{self.repo}/git/refs/tags').json() 29 + tags = [x['ref'].replace('refs/tags/', '') for x in r] 30 + 31 + # filter out versions not matching version_regex 32 + versions = list(filter(self.version_regex.match, tags)) 33 + 34 + # sort, but ignore v for sorting comparisons 35 + versions.sort(key=lambda x: LooseVersion(x.replace('v', '')), reverse=True) 36 + return versions 37 + 38 + @staticmethod 39 + def rev2version(tag: str) -> str: 40 + """ 41 + normalize a tag to a version number. 42 + This obviously isn't very smart if we don't pass something that looks like a tag 43 + :param tag: the tag to normalize 44 + :return: a normalized version number 45 + """ 46 + # strip v prefix 47 + return re.sub(r'^v', '', tag) 48 + 49 + def get_file(self, filepath, rev): 50 + """returns file contents at a given rev :param filepath: the path to 51 + the file, relative to the repo root :param rev: the rev to 52 + fetch at :return: 53 + 54 + """ 55 + return requests.get(f'https://raw.githubusercontent.com/{self.owner}/{self.repo}/{rev}/{filepath}').text 56 + 57 + 58 + def _call_nix_update(pkg, version): 59 + """calls nix-update from nixpkgs root dir""" 60 + nixpkgs_path = pathlib.Path(__file__).parent / '../../../../' 61 + return subprocess.check_output(['nix-update', pkg, '--version', version], cwd=nixpkgs_path) 62 + 63 + 64 + def _get_current_package_version(pkg: str): 65 + nixpkgs_path = pathlib.Path(__file__).parent / '../../../../' 66 + return subprocess.check_output(['nix', 'eval', '--raw', f'nixpkgs.{pkg}.version'], text=True) 67 + 68 + 69 + def _diff_file(filepath: str, old_version: str, new_version: str): 70 + repo = DiscourseRepo() 71 + 72 + current_dir = pathlib.Path(__file__).parent 73 + 74 + old = repo.get_file(filepath, 'v' + old_version) 75 + new = repo.get_file(filepath, 'v' + new_version) 76 + 77 + if old == new: 78 + click.secho(f'{filepath} is unchanged', fg='green') 79 + return 80 + 81 + with tempfile.NamedTemporaryFile(mode='w') as o, tempfile.NamedTemporaryFile(mode='w') as n: 82 + o.write(old), n.write(new) 83 + width = shutil.get_terminal_size((80, 20)).columns 84 + diff_proc = subprocess.run( 85 + ['diff', '--color=always', f'--width={width}', '-y', o.name, n.name], 86 + stdout=subprocess.PIPE, 87 + cwd=current_dir, 88 + text=True 89 + ) 90 + 91 + click.secho(f'Diff for {filepath} ({old_version} -> {new_version}):', fg='bright_blue', bold=True) 92 + click.echo(diff_proc.stdout + '\n') 93 + return 94 + 95 + 96 + @click_log.simple_verbosity_option(logger) 97 + 98 + 99 + @click.group() 100 + def cli(): 101 + pass 102 + 103 + 104 + @cli.command() 105 + @click.argument('rev', default='latest') 106 + @click.option('--reverse/--no-reverse', default=False, help='Print diffs from REV to current.') 107 + def print_diffs(rev, reverse): 108 + """Print out diffs for files used as templates for the NixOS module. 109 + 110 + The current package version found in the nixpkgs worktree the 111 + script is run from will be used to download the "from" file and 112 + REV used to download the "to" file for the diff, unless the 113 + '--reverse' flag is specified. 114 + 115 + REV should be the git rev to find changes in ('vX.Y.Z') or 116 + 'latest'; defaults to 'latest'. 117 + 118 + """ 119 + if rev == 'latest': 120 + repo = DiscourseRepo() 121 + rev = repo.tags[0] 122 + 123 + old_version = _get_current_package_version('discourse') 124 + new_version = DiscourseRepo.rev2version(rev) 125 + 126 + if reverse: 127 + old_version, new_version = new_version, old_version 128 + 129 + for f in ['config/nginx.sample.conf', 'config/discourse_defaults.conf']: 130 + _diff_file(f, old_version, new_version) 131 + 132 + 133 + @cli.command() 134 + @click.argument('rev', default='latest') 135 + def update(rev): 136 + """Update gem files and version. 137 + 138 + REV should be the git rev to update to ('vX.Y.Z') or 'latest'; 139 + defaults to 'latest'. 140 + 141 + """ 142 + repo = DiscourseRepo() 143 + 144 + if rev == 'latest': 145 + rev = repo.tags[0] 146 + logger.debug(f"Using rev {rev}") 147 + 148 + version = repo.rev2version(rev) 149 + logger.debug(f"Using version {version}") 150 + 151 + rubyenv_dir = pathlib.Path(__file__).parent / "rubyEnv" 152 + 153 + for fn in ['Gemfile.lock', 'Gemfile']: 154 + with open(rubyenv_dir / fn, 'w') as f: 155 + f.write(repo.get_file(fn, rev)) 156 + 157 + subprocess.check_output(['bundle', 'lock'], cwd=rubyenv_dir) 158 + subprocess.check_output(['bundix'], cwd=rubyenv_dir) 159 + 160 + _call_nix_update('discourse', repo.rev2version(rev)) 161 + 162 + 163 + if __name__ == '__main__': 164 + cli()
+61
pkgs/tools/filesystems/sshfs-fuse/common.nix
··· 1 + { version, sha256, platforms, patches ? [ ] }: 2 + 3 + { lib, stdenv, fetchFromGitHub 4 + , meson, pkg-config, ninja, docutils, makeWrapper 5 + , fuse3, macfuse-stubs, glib 6 + , which, python3Packages 7 + , openssh 8 + }: 9 + 10 + let 11 + fuse = if stdenv.isDarwin then macfuse-stubs else fuse3; 12 + in stdenv.mkDerivation rec { 13 + pname = "sshfs-fuse"; 14 + inherit version; 15 + 16 + src = fetchFromGitHub { 17 + owner = "libfuse"; 18 + repo = "sshfs"; 19 + rev = "sshfs-${version}"; 20 + inherit sha256; 21 + }; 22 + 23 + inherit patches; 24 + 25 + nativeBuildInputs = [ meson pkg-config ninja docutils makeWrapper ]; 26 + buildInputs = [ fuse glib ]; 27 + checkInputs = [ which python3Packages.pytest ]; 28 + 29 + NIX_CFLAGS_COMPILE = lib.optionalString 30 + (stdenv.hostPlatform.system == "i686-linux") 31 + "-D_FILE_OFFSET_BITS=64"; 32 + 33 + postInstall = '' 34 + mkdir -p $out/sbin 35 + ln -sf $out/bin/sshfs $out/sbin/mount.sshfs 36 + '' + lib.optionalString (!stdenv.isDarwin) '' 37 + wrapProgram $out/bin/sshfs --prefix PATH : "${openssh}/bin" 38 + ''; 39 + 40 + # doCheck = true; 41 + checkPhase = lib.optionalString (!stdenv.isDarwin) '' 42 + # The tests need fusermount: 43 + mkdir bin 44 + cp ${fuse}/bin/fusermount3 bin/fusermount 45 + export PATH=bin:$PATH 46 + # Can't access /dev/fuse within the sandbox: "FUSE kernel module does not seem to be loaded" 47 + substituteInPlace test/util.py --replace "/dev/fuse" "/dev/null" 48 + # TODO: "fusermount executable not setuid, and we are not root" 49 + # We should probably use a VM test instead 50 + ${python3Packages.python.interpreter} -m pytest test/ 51 + ''; 52 + 53 + meta = with lib; { 54 + inherit platforms; 55 + description = "FUSE-based filesystem that allows remote filesystems to be mounted over SSH"; 56 + longDescription = macfuse-stubs.warning; 57 + homepage = "https://github.com/libfuse/sshfs"; 58 + license = licenses.gpl2Plus; 59 + maintainers = with maintainers; [ primeos ]; 60 + }; 61 + }
+25 -49
pkgs/tools/filesystems/sshfs-fuse/default.nix
··· 1 - { lib, stdenv, fetchFromGitHub 2 - , meson, pkg-config, ninja, docutils, makeWrapper 3 - , fuse3, glib 4 - , which, python3Packages 5 - , openssh 6 - }: 1 + { lib, stdenv, callPackage, fetchpatch }: 7 2 8 - stdenv.mkDerivation rec { 9 - version = "3.7.1"; 10 - pname = "sshfs-fuse"; 3 + let mkSSHFS = args: callPackage (import ./common.nix args) { }; 4 + in if stdenv.isDarwin then 5 + mkSSHFS { 6 + version = "2.10"; # macFUSE isn't yet compatible with libfuse 3.x 7 + sha256 = "1dmw4kx6vyawcywiv8drrajnam0m29mxfswcp4209qafzx3mjlp1"; 8 + patches = [ 9 + # remove reference to fuse_darwin.h which doens't exist on recent macFUSE 10 + ./fix-fuse-darwin-h.patch 11 11 12 - src = fetchFromGitHub { 13 - owner = "libfuse"; 14 - repo = "sshfs"; 15 - rev = "sshfs-${version}"; 12 + # From https://github.com/libfuse/sshfs/pull/185: 13 + # > With this patch, setting I/O size to a reasonable large value, will 14 + # > result in much improved performance, e.g.: -o iosize=1048576 15 + (fetchpatch { 16 + name = "fix-configurable-blksize.patch"; 17 + url = "https://github.com/libfuse/sshfs/commit/667cf34622e2e873db776791df275c7a582d6295.patch"; 18 + sha256 = "0d65lawd2g2aisk1rw2vl65dgxywf4vqgv765n9zj9zysyya8a54"; 19 + }) 20 + ]; 21 + platforms = lib.platforms.darwin; 22 + } 23 + else 24 + mkSSHFS { 25 + version = "3.7.1"; 16 26 sha256 = "088mgcsqv9f2vly4xn6lvvkmqkgr9jjmjs9qp8938hl7j6rrgd17"; 17 - }; 18 - 19 - nativeBuildInputs = [ meson pkg-config ninja docutils makeWrapper ]; 20 - buildInputs = [ fuse3 glib ]; 21 - checkInputs = [ which python3Packages.pytest ]; 22 - 23 - NIX_CFLAGS_COMPILE = lib.optionalString 24 - (stdenv.hostPlatform.system == "i686-linux") 25 - "-D_FILE_OFFSET_BITS=64"; 26 - 27 - postInstall = '' 28 - mkdir -p $out/sbin 29 - ln -sf $out/bin/sshfs $out/sbin/mount.sshfs 30 - wrapProgram $out/bin/sshfs --prefix PATH : "${openssh}/bin" 31 - ''; 32 - 33 - #doCheck = true; 34 - checkPhase = '' 35 - # The tests need fusermount: 36 - mkdir bin && cp ${fuse3}/bin/fusermount3 bin/fusermount 37 - export PATH=bin:$PATH 38 - # Can't access /dev/fuse within the sandbox: "FUSE kernel module does not seem to be loaded" 39 - substituteInPlace test/util.py --replace "/dev/fuse" "/dev/null" 40 - # TODO: "fusermount executable not setuid, and we are not root" 41 - # We should probably use a VM test instead 42 - python3 -m pytest test/ 43 - ''; 44 - 45 - meta = with lib; { 46 - inherit (src.meta) homepage; 47 - description = "FUSE-based filesystem that allows remote filesystems to be mounted over SSH"; 48 - platforms = platforms.linux; 49 - license = licenses.gpl2; 50 - maintainers = with maintainers; [ primeos ]; 51 - }; 52 - } 27 + platforms = lib.platforms.linux; 28 + }
+14
pkgs/tools/filesystems/sshfs-fuse/fix-fuse-darwin-h.patch
··· 1 + diff --git a/sshfs.c b/sshfs.c 2 + index 97eaf06..d442577 100644 3 + --- a/sshfs.c 4 + +++ b/sshfs.c 5 + @@ -14,9 +14,6 @@ 6 + #if !defined(__CYGWIN__) 7 + #include <fuse_lowlevel.h> 8 + #endif 9 + -#ifdef __APPLE__ 10 + -# include <fuse_darwin.h> 11 + -#endif 12 + #include <assert.h> 13 + #include <stdio.h> 14 + #include <stdlib.h>
+11
pkgs/tools/networking/openssh/copyid.nix
··· 1 + { runCommandNoCC, openssh }: 2 + 3 + runCommandNoCC "ssh-copy-id-${openssh.version}" { 4 + meta = openssh.meta // { 5 + description = "A tool to copy SSH public keys to a remote machine"; 6 + priority = (openssh.meta.priority or 0) - 1; 7 + }; 8 + } '' 9 + install -Dm 755 {${openssh},$out}/bin/ssh-copy-id 10 + install -Dm 644 {${openssh},$out}/share/man/man1/ssh-copy-id.1.gz 11 + ''
+1 -1
pkgs/top-level/aliases.nix
··· 620 620 qt-3 = throw "qt-3 has been removed from nixpkgs, as it's unmaintained and insecure"; # added 2021-02-15 621 621 rfkill = throw "rfkill has been removed, as it's included in util-linux"; # added 2020-08-23 622 622 riak-cs = throw "riak-cs is not maintained anymore"; # added 2020-10-14 623 - radare2-cutter = cutter; 623 + radare2-cutter = cutter; # added 2021-03-30 624 624 rkt = throw "rkt was archived by upstream"; # added 2020-05-16 625 625 ruby_2_0_0 = throw "ruby_2_0_0 was deprecated on 2018-02-13: use a newer version of ruby"; 626 626 ruby_2_1_0 = throw "ruby_2_1_0 was deprecated on 2018-02-13: use a newer version of ruby";
+43 -14
pkgs/top-level/all-packages.nix
··· 2252 2252 2253 2253 discount = callPackage ../tools/text/discount { }; 2254 2254 2255 + discourse = callPackage ../servers/web-apps/discourse { 2256 + ruby = ruby_2_7; 2257 + }; 2258 + 2259 + discourse-mail-receiver = callPackage ../servers/web-apps/discourse/mail_receiver { 2260 + ruby = ruby_2_7; 2261 + }; 2262 + 2255 2263 discocss = callPackage ../tools/misc/discocss { }; 2256 2264 2257 2265 disfetch = callPackage ../tools/misc/disfetch { }; ··· 7108 7116 openssh_gssapi = opensshPackages.openssh_gssapi.override { 7109 7117 etcDir = "/etc/ssh"; 7110 7118 }; 7119 + 7120 + ssh-copy-id = callPackage ../tools/networking/openssh/copyid.nix { }; 7111 7121 7112 7122 opensp = callPackage ../tools/text/sgml/opensp { }; 7113 7123 ··· 17631 17641 stdenv = gcc6Stdenv; 17632 17642 }); 17633 17643 17634 - v8_6_x = v8; 17635 17644 v8 = callPackage ../development/libraries/v8 { 17636 17645 inherit (python2Packages) python; 17637 - } // lib.optionalAttrs stdenv.isLinux { 17638 - # doesn't build with gcc7 17639 - stdenv = gcc6Stdenv; 17640 17646 }; 17641 17647 17642 17648 vaapiIntel = callPackage ../development/libraries/vaapi-intel { }; ··· 21997 22003 21998 22004 blogc = callPackage ../applications/misc/blogc { }; 21999 22005 22006 + blucontrol = callPackage ../applications/misc/blucontrol/wrapper.nix { 22007 + inherit (haskellPackages) ghcWithPackages; 22008 + }; 22009 + 22000 22010 bluefish = callPackage ../applications/editors/bluefish { 22001 22011 gtk = gtk3; 22002 22012 }; ··· 22049 22059 22050 22060 caerbannog = callPackage ../applications/misc/caerbannog { }; 22051 22061 22052 - cage = callPackage ../applications/window-managers/cage { }; 22062 + cage = callPackage ../applications/window-managers/cage { 22063 + wlroots = wlroots_0_12; 22064 + }; 22053 22065 22054 22066 calf = callPackage ../applications/audio/calf { 22055 22067 inherit (gnome2) libglade; ··· 23488 23500 23489 23501 super-productivity = callPackage ../applications/networking/super-productivity { }; 23490 23502 23491 - wlroots = callPackage ../development/libraries/wlroots { }; 23503 + wlroots = callPackage ../development/libraries/wlroots { 23504 + inherit (xorg) xcbutilrenderutil; 23505 + }; 23506 + 23507 + wlroots_0_12 = callPackage ../development/libraries/wlroots/0.12.nix {}; 23492 23508 23493 23509 sway-unwrapped = callPackage ../applications/window-managers/sway { }; 23494 23510 sway = callPackage ../applications/window-managers/sway/wrapper.nix { }; ··· 23510 23526 23511 23527 wbg = callPackage ../applications/misc/wbg { }; 23512 23528 23513 - hikari = callPackage ../applications/window-managers/hikari { }; 23529 + hikari = callPackage ../applications/window-managers/hikari { 23530 + wlroots = wlroots_0_12; 23531 + }; 23514 23532 23515 23533 i3 = callPackage ../applications/window-managers/i3 { 23516 23534 xcb-util-cursor = if stdenv.isDarwin then xcb-util-cursor-HEAD else xcb-util-cursor; ··· 23572 23590 23573 23591 i3-wk-switch = callPackage ../applications/window-managers/i3/wk-switch.nix { }; 23574 23592 23575 - waybox = callPackage ../applications/window-managers/waybox { }; 23593 + waybox = callPackage ../applications/window-managers/waybox { 23594 + wlroots = wlroots_0_12; 23595 + }; 23576 23596 23577 23597 windowchef = callPackage ../applications/window-managers/windowchef/default.nix { }; 23578 23598 ··· 26443 26463 26444 26464 wayfireApplications = wayfireApplications-unwrapped.withPlugins (plugins: [ plugins.wf-shell ]); 26445 26465 inherit (wayfireApplications) wayfire wcm; 26446 - wayfireApplications-unwrapped = recurseIntoAttrs (callPackage ../applications/window-managers/wayfire/applications.nix { }); 26447 - wayfirePlugins = recurseIntoAttrs (callPackage ../applications/window-managers/wayfire/plugins.nix { 26448 - inherit (wayfireApplications-unwrapped) wayfire; 26449 - }); 26466 + wayfireApplications-unwrapped = recurseIntoAttrs ( 26467 + (callPackage ../applications/window-managers/wayfire/applications.nix { }). 26468 + extend (_: _: { wlroots = wlroots_0_12; }) 26469 + ); 26470 + wayfirePlugins = recurseIntoAttrs ( 26471 + callPackage ../applications/window-managers/wayfire/plugins.nix { 26472 + inherit (wayfireApplications-unwrapped) wayfire; 26473 + } 26474 + ); 26450 26475 wf-config = callPackage ../applications/window-managers/wayfire/wf-config.nix { }; 26451 26476 26452 26477 waypipe = callPackage ../applications/networking/remote/waypipe { }; ··· 26488 26513 26489 26514 weston = callPackage ../applications/window-managers/weston { pipewire = pipewire_0_2; }; 26490 26515 26491 - wio = callPackage ../applications/window-managers/wio { }; 26516 + wio = callPackage ../applications/window-managers/wio { 26517 + wlroots = wlroots_0_12; 26518 + }; 26492 26519 26493 26520 whitebox-tools = callPackage ../applications/gis/whitebox-tools { 26494 26521 inherit (darwin.apple_sdk.frameworks) Security; ··· 30817 30844 30818 30845 bottom = callPackage ../tools/system/bottom {}; 30819 30846 30820 - cagebreak = callPackage ../applications/window-managers/cagebreak/default.nix {}; 30847 + cagebreak = callPackage ../applications/window-managers/cagebreak/default.nix { 30848 + wlroots = wlroots_0_12; 30849 + }; 30821 30850 30822 30851 psftools = callPackage ../os-specific/linux/psftools {}; 30823 30852
+4 -4
pkgs/top-level/php-packages.nix
··· 146 146 147 147 sha256 = "103nys7zkpi1hifqp9miyl0m1mn07xqshw3sapyz365nb35g5q71"; 148 148 149 - buildInputs = [ pkgs.v8_6_x ]; 150 - configureFlags = [ "--with-v8=${pkgs.v8_6_x}" ]; 149 + buildInputs = [ pkgs.v8 ]; 150 + configureFlags = [ "--with-v8=${pkgs.v8}" ]; 151 151 152 152 meta.maintainers = lib.teams.php.members; 153 153 meta.broken = true; ··· 159 159 160 160 sha256 = "0g63dyhhicngbgqg34wl91nm3556vzdgkq19gy52gvmqj47rj6rg"; 161 161 162 - buildInputs = [ pkgs.v8_6_x ]; 163 - configureFlags = [ "--with-v8js=${pkgs.v8_6_x}" ]; 162 + buildInputs = [ pkgs.v8 ]; 163 + configureFlags = [ "--with-v8js=${pkgs.v8}" ]; 164 164 165 165 meta.maintainers = lib.teams.php.members; 166 166 meta.broken = true;
+8
pkgs/top-level/python-packages.nix
··· 549 549 550 550 asyncio-mqtt = callPackage ../development/python-modules/asyncio_mqtt { }; 551 551 552 + asyncio-nats-client = callPackage ../development/python-modules/asyncio-nats-client { }; 553 + 552 554 asyncio-throttle = callPackage ../development/python-modules/asyncio-throttle { }; 553 555 554 556 asyncpg = callPackage ../development/python-modules/asyncpg { }; ··· 4530 4532 4531 4533 nassl = callPackage ../development/python-modules/nassl { }; 4532 4534 4535 + nats-python = callPackage ../development/python-modules/nats-python { }; 4536 + 4533 4537 natsort = callPackage ../development/python-modules/natsort { }; 4534 4538 4535 4539 naturalsort = callPackage ../development/python-modules/naturalsort { }; ··· 7196 7200 rebulk = callPackage ../development/python-modules/rebulk { }; 7197 7201 7198 7202 recaptcha_client = callPackage ../development/python-modules/recaptcha_client { }; 7203 + 7204 + recoll = disabledIf (!isPy3k) (toPythonModule (pkgs.recoll.override { 7205 + python3Packages = self; 7206 + })); 7199 7207 7200 7208 recommonmark = callPackage ../development/python-modules/recommonmark { }; 7201 7209