Merge master into staging-next

authored by

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

+5971 -341
+5 -1
.github/CODEOWNERS
··· 94 /pkgs/applications/science/math/R @peti 95 /pkgs/development/r-modules @peti 96 97 # Rust 98 /pkgs/development/compilers/rust @Mic92 @LnL7 @zowoq 99 /pkgs/build-support/rust @andir @danieldk @zowoq ··· 135 /pkgs/development/libraries/qt-5 @ttuegel 136 137 # PostgreSQL and related stuff 138 - /pkgs/servers/sql/postgresql @thoughtpolice 139 /nixos/modules/services/databases/postgresql.xml @thoughtpolice 140 /nixos/modules/services/databases/postgresql.nix @thoughtpolice 141 /nixos/tests/postgresql.nix @thoughtpolice
··· 94 /pkgs/applications/science/math/R @peti 95 /pkgs/development/r-modules @peti 96 97 + # Ruby 98 + /pkgs/development/interpreters/ruby @marsam 99 + /pkgs/development/ruby-modules @marsam 100 + 101 # Rust 102 /pkgs/development/compilers/rust @Mic92 @LnL7 @zowoq 103 /pkgs/build-support/rust @andir @danieldk @zowoq ··· 139 /pkgs/development/libraries/qt-5 @ttuegel 140 141 # PostgreSQL and related stuff 142 + /pkgs/servers/sql/postgresql @thoughtpolice @marsam 143 /nixos/modules/services/databases/postgresql.xml @thoughtpolice 144 /nixos/modules/services/databases/postgresql.nix @thoughtpolice 145 /nixos/tests/postgresql.nix @thoughtpolice
+10
nixos/doc/manual/release-notes/rl-2105.xml
··· 118 <xref linkend="opt-services.samba-wsdd.enable" /> Web Services Dynamic Discovery host daemon 119 </para> 120 </listitem> 121 </itemizedlist> 122 123 </section>
··· 118 <xref linkend="opt-services.samba-wsdd.enable" /> Web Services Dynamic Discovery host daemon 119 </para> 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> 131 </itemizedlist> 132 133 </section>
+1
nixos/modules/module-list.nix
··· 897 ./services/web-apps/calibre-web.nix 898 ./services/web-apps/convos.nix 899 ./services/web-apps/cryptpad.nix 900 ./services/web-apps/documize.nix 901 ./services/web-apps/dokuwiki.nix 902 ./services/web-apps/engelsystem.nix
··· 897 ./services/web-apps/calibre-web.nix 898 ./services/web-apps/convos.nix 899 ./services/web-apps/cryptpad.nix 900 + ./services/web-apps/discourse.nix 901 ./services/web-apps/documize.nix 902 ./services/web-apps/dokuwiki.nix 903 ./services/web-apps/engelsystem.nix
+1 -1
nixos/modules/services/cluster/kubernetes/kubelet.nix
··· 266 gitMinimal 267 openssh 268 util-linux 269 - iproute 270 ethtool 271 thin-provisioning-tools 272 iptables
··· 266 gitMinimal 267 openssh 268 util-linux 269 + iproute2 270 ethtool 271 thin-provisioning-tools 272 iptables
+11 -8
nixos/modules/services/misc/home-assistant.nix
··· 50 # List of components used in config 51 extraComponents = filter useComponent availableComponents; 52 53 - package = if (cfg.autoExtraComponents && cfg.config != null) 54 then (cfg.package.override { inherit extraComponents; }) 55 else cfg.package; 56 57 # If you are changing this, please update the description in applyDefaultConfig 58 defaultConfig = { ··· 183 }; 184 185 package = mkOption { 186 - default = pkgs.home-assistant.overridePythonAttrs (oldAttrs: { 187 - doCheck = false; 188 - }); 189 defaultText = literalExample '' 190 - pkgs.home-assistant.overridePythonAttrs (oldAttrs: { 191 - doCheck = false; 192 - }) 193 ''; 194 type = types.package; 195 example = literalExample '' ··· 198 } 199 ''; 200 description = '' 201 - Home Assistant package to use. By default the tests are disabled, as they take a considerable amout of time to complete. 202 Override <literal>extraPackages</literal> or <literal>extraComponents</literal> in order to add additional dependencies. 203 If you specify <option>config</option> and do not set <option>autoExtraComponents</option> 204 to <literal>false</literal>, overriding <literal>extraComponents</literal> will have no effect. 205 ''; 206 }; 207
··· 50 # List of components used in config 51 extraComponents = filter useComponent availableComponents; 52 53 + testedPackage = if (cfg.autoExtraComponents && cfg.config != null) 54 then (cfg.package.override { inherit extraComponents; }) 55 else cfg.package; 56 + 57 + # overridePythonAttrs has to be applied after override 58 + package = testedPackage.overridePythonAttrs (oldAttrs: { 59 + doCheck = false; 60 + }); 61 62 # If you are changing this, please update the description in applyDefaultConfig 63 defaultConfig = { ··· 188 }; 189 190 package = mkOption { 191 + default = pkgs.home-assistant; 192 defaultText = literalExample '' 193 + pkgs.home-assistant 194 ''; 195 type = types.package; 196 example = literalExample '' ··· 199 } 200 ''; 201 description = '' 202 + Home Assistant package to use. Tests are automatically disabled, as they take a considerable amout of time to complete. 203 Override <literal>extraPackages</literal> or <literal>extraComponents</literal> in order to add additional dependencies. 204 If you specify <option>config</option> and do not set <option>autoExtraComponents</option> 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>. 208 ''; 209 }; 210
+1 -1
nixos/modules/services/networking/gvpe.nix
··· 27 text = '' 28 #! /bin/sh 29 30 - export PATH=$PATH:${pkgs.iproute}/sbin 31 32 ip link set $IFNAME up 33 ip address add ${cfg.ipAddress} dev $IFNAME
··· 27 text = '' 28 #! /bin/sh 29 30 + export PATH=$PATH:${pkgs.iproute2}/sbin 31 32 ip link set $IFNAME up 33 ip address add ${cfg.ipAddress} dev $IFNAME
+3 -3
nixos/modules/services/networking/libreswan.nix
··· 91 description = "Internet Key Exchange (IKE) Protocol Daemon for IPsec"; 92 path = [ 93 "${pkgs.libreswan}" 94 - "${pkgs.iproute}" 95 "${pkgs.procps}" 96 "${pkgs.nssTools}" 97 "${pkgs.iptables}" ··· 115 ExecStart = "${libexec}/pluto --config ${configFile} --nofork \$PLUTO_OPTIONS"; 116 ExecStop = "${libexec}/whack --shutdown"; 117 ExecStopPost = [ 118 - "${pkgs.iproute}/bin/ip xfrm policy flush" 119 - "${pkgs.iproute}/bin/ip xfrm state flush" 120 "${ipsec} --stopnflog" 121 ]; 122 ExecReload = "${libexec}/whack --listen";
··· 91 description = "Internet Key Exchange (IKE) Protocol Daemon for IPsec"; 92 path = [ 93 "${pkgs.libreswan}" 94 + "${pkgs.iproute2}" 95 "${pkgs.procps}" 96 "${pkgs.nssTools}" 97 "${pkgs.iptables}" ··· 115 ExecStart = "${libexec}/pluto --config ${configFile} --nofork \$PLUTO_OPTIONS"; 116 ExecStop = "${libexec}/whack --shutdown"; 117 ExecStopPost = [ 118 + "${pkgs.iproute2}/bin/ip xfrm policy flush" 119 + "${pkgs.iproute2}/bin/ip xfrm state flush" 120 "${ipsec} --stopnflog" 121 ]; 122 ExecReload = "${libexec}/whack --listen";
+1 -1
nixos/modules/services/networking/mullvad-vpn.nix
··· 28 "systemd-resolved.service" 29 ]; 30 path = [ 31 - pkgs.iproute 32 # Needed for ping 33 "/run/wrappers" 34 ];
··· 28 "systemd-resolved.service" 29 ]; 30 path = [ 31 + pkgs.iproute2 32 # Needed for ping 33 "/run/wrappers" 34 ];
+1 -1
nixos/modules/services/networking/nomad.nix
··· 119 path = cfg.extraPackages ++ (with pkgs; [ 120 # Client mode requires at least the following: 121 coreutils 122 - iproute 123 iptables 124 ]); 125
··· 119 path = cfg.extraPackages ++ (with pkgs; [ 120 # Client mode requires at least the following: 121 coreutils 122 + iproute2 123 iptables 124 ]); 125
+1 -1
nixos/modules/services/networking/quagga.nix
··· 164 preStart = '' 165 install -m 0755 -o quagga -g quagga -d /run/quagga 166 167 - ${pkgs.iproute}/bin/ip route flush proto zebra 168 ''; 169 } 170 else
··· 164 preStart = '' 165 install -m 0755 -o quagga -g quagga -d /run/quagga 166 167 + ${pkgs.iproute2}/bin/ip route flush proto zebra 168 ''; 169 } 170 else
+2 -2
nixos/modules/services/networking/rxe.nix
··· 39 Type = "oneshot"; 40 RemainAfterExit = true; 41 ExecStart = map ( x: 42 - "${pkgs.iproute}/bin/rdma link add rxe_${x} type rxe netdev ${x}" 43 ) cfg.interfaces; 44 45 ExecStop = map ( x: 46 - "${pkgs.iproute}/bin/rdma link delete rxe_${x}" 47 ) cfg.interfaces; 48 }; 49 };
··· 39 Type = "oneshot"; 40 RemainAfterExit = true; 41 ExecStart = map ( x: 42 + "${pkgs.iproute2}/bin/rdma link add rxe_${x} type rxe netdev ${x}" 43 ) cfg.interfaces; 44 45 ExecStop = map ( x: 46 + "${pkgs.iproute2}/bin/rdma link delete rxe_${x}" 47 ) cfg.interfaces; 48 }; 49 };
+4 -4
nixos/modules/services/networking/wg-quick.nix
··· 57 58 preUp = mkOption { 59 example = literalExample '' 60 - ${pkgs.iproute}/bin/ip netns add foo 61 ''; 62 default = ""; 63 type = with types; coercedTo (listOf str) (concatStringsSep "\n") lines; ··· 68 69 preDown = mkOption { 70 example = literalExample '' 71 - ${pkgs.iproute}/bin/ip netns del foo 72 ''; 73 default = ""; 74 type = with types; coercedTo (listOf str) (concatStringsSep "\n") lines; ··· 79 80 postUp = mkOption { 81 example = literalExample '' 82 - ${pkgs.iproute}/bin/ip netns add foo 83 ''; 84 default = ""; 85 type = with types; coercedTo (listOf str) (concatStringsSep "\n") lines; ··· 90 91 postDown = mkOption { 92 example = literalExample '' 93 - ${pkgs.iproute}/bin/ip netns del foo 94 ''; 95 default = ""; 96 type = with types; coercedTo (listOf str) (concatStringsSep "\n") lines;
··· 57 58 preUp = mkOption { 59 example = literalExample '' 60 + ${pkgs.iproute2}/bin/ip netns add foo 61 ''; 62 default = ""; 63 type = with types; coercedTo (listOf str) (concatStringsSep "\n") lines; ··· 68 69 preDown = mkOption { 70 example = literalExample '' 71 + ${pkgs.iproute2}/bin/ip netns del foo 72 ''; 73 default = ""; 74 type = with types; coercedTo (listOf str) (concatStringsSep "\n") lines; ··· 79 80 postUp = mkOption { 81 example = literalExample '' 82 + ${pkgs.iproute2}/bin/ip netns add foo 83 ''; 84 default = ""; 85 type = with types; coercedTo (listOf str) (concatStringsSep "\n") lines; ··· 90 91 postDown = mkOption { 92 example = literalExample '' 93 + ${pkgs.iproute2}/bin/ip netns del foo 94 ''; 95 default = ""; 96 type = with types; coercedTo (listOf str) (concatStringsSep "\n") lines;
+1 -1
nixos/modules/services/system/cloud-init.nix
··· 5 let cfg = config.services.cloud-init; 6 path = with pkgs; [ 7 cloud-init 8 - iproute 9 nettools 10 openssh 11 shadow
··· 5 let cfg = config.services.cloud-init; 6 path = with pkgs; [ 7 cloud-init 8 + iproute2 9 nettools 10 openssh 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 default = pkgs.nginxStable; 398 defaultText = "pkgs.nginxStable"; 399 type = types.package; 400 description = " 401 Nginx package to use. This defaults to the stable version. Note 402 that the nginx team recommends to use the mainline version which 403 available in nixpkgs as <literal>nginxMainline</literal>. 404 "; 405 }; 406 407 logError = mkOption {
··· 397 default = pkgs.nginxStable; 398 defaultText = "pkgs.nginxStable"; 399 type = types.package; 400 + apply = p: p.override { 401 + modules = p.modules ++ cfg.additionalModules; 402 + }; 403 description = " 404 Nginx package to use. This defaults to the stable version. Note 405 that the nginx team recommends to use the mainline version which 406 available in nixpkgs as <literal>nginxMainline</literal>. 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 + ''; 419 }; 420 421 logError = mkOption {
+1 -1
nixos/modules/system/boot/initrd-openvpn.nix
··· 55 # The shared libraries are required for DNS resolution 56 boot.initrd.extraUtilsCommands = '' 57 copy_bin_and_libs ${pkgs.openvpn}/bin/openvpn 58 - copy_bin_and_libs ${pkgs.iproute}/bin/ip 59 60 cp -pv ${pkgs.glibc}/lib/libresolv.so.2 $out/lib 61 cp -pv ${pkgs.glibc}/lib/libnss_dns.so.2 $out/lib
··· 55 # The shared libraries are required for DNS resolution 56 boot.initrd.extraUtilsCommands = '' 57 copy_bin_and_libs ${pkgs.openvpn}/bin/openvpn 58 + copy_bin_and_libs ${pkgs.iproute2}/bin/ip 59 60 cp -pv ${pkgs.glibc}/lib/libresolv.so.2 $out/lib 61 cp -pv ${pkgs.glibc}/lib/libnss_dns.so.2 $out/lib
+1 -1
nixos/modules/tasks/network-interfaces.nix
··· 1144 1145 environment.systemPackages = 1146 [ pkgs.host 1147 - pkgs.iproute 1148 pkgs.iputils 1149 pkgs.nettools 1150 ]
··· 1144 1145 environment.systemPackages = 1146 [ pkgs.host 1147 + pkgs.iproute2 1148 pkgs.iputils 1149 pkgs.nettools 1150 ]
+2 -3
nixos/tests/all-tests.nix
··· 88 croc = handleTest ./croc.nix {}; 89 deluge = handleTest ./deluge.nix {}; 90 dhparams = handleTest ./dhparams.nix {}; 91 dnscrypt-proxy2 = handleTestOn ["x86_64-linux"] ./dnscrypt-proxy2.nix {}; 92 dnscrypt-wrapper = handleTestOn ["x86_64-linux"] ./dnscrypt-wrapper {}; 93 doas = handleTest ./doas.nix {}; ··· 193 keepalived = handleTest ./keepalived.nix {}; 194 keepassxc = handleTest ./keepassxc.nix {}; 195 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 {}; 199 kernel-latest-ath-user-regd = handleTest ./kernel-latest-ath-user-regd.nix {}; 200 keycloak = discoverTests (import ./keycloak.nix); 201 keymap = handleTest ./keymap.nix {};
··· 88 croc = handleTest ./croc.nix {}; 89 deluge = handleTest ./deluge.nix {}; 90 dhparams = handleTest ./dhparams.nix {}; 91 + discourse = handleTest ./discourse.nix {}; 92 dnscrypt-proxy2 = handleTestOn ["x86_64-linux"] ./dnscrypt-proxy2.nix {}; 93 dnscrypt-wrapper = handleTestOn ["x86_64-linux"] ./dnscrypt-wrapper {}; 94 doas = handleTest ./doas.nix {}; ··· 194 keepalived = handleTest ./keepalived.nix {}; 195 keepassxc = handleTest ./keepassxc.nix {}; 196 kerberos = handleTest ./kerberos/default.nix {}; 197 + kernel-generic = handleTest ./kernel-generic.nix {}; 198 kernel-latest-ath-user-regd = handleTest ./kernel-latest-ath-user-regd.nix {}; 199 keycloak = discoverTests (import ./keycloak.nix); 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 # Everyone on the "isp" machine will be able to add routes to the kernel. 44 security.wrappers.add-dhcpd-lease = { 45 source = pkgs.writeShellScript "add-dhcpd-lease" '' 46 - exec ${pkgs.iproute}/bin/ip -6 route replace "$1" via "$2" 47 ''; 48 capabilities = "cap_net_admin+ep"; 49 };
··· 43 # Everyone on the "isp" machine will be able to add routes to the kernel. 44 security.wrappers.add-dhcpd-lease = { 45 source = pkgs.writeShellScript "add-dhcpd-lease" '' 46 + exec ${pkgs.iproute2}/bin/ip -6 route replace "$1" via "$2" 47 ''; 48 capabilities = "cap_net_admin+ep"; 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 { lib 2 , stdenv 3 , fetchFromGitHub 4 , pkg-config 5 , gtk3 6 , alsaLib ··· 17 sha256 = "sha256-Htk2NHgYVL622URx67BUtounAUopLTahaSqfAqd3+ZI="; 18 }; 19 20 - nativeBuildInputs = [ pkg-config ]; 21 buildInputs = [ gtk3 alsaLib ]; 22 23 postPatch = '' ··· 54 install -m644 skins/* $out/share/${pname}/skins 55 runHook postInstall 56 ''; 57 58 meta = with lib; { 59 homepage = "https://github.com/thomasokken/free42";
··· 1 { lib 2 , stdenv 3 , fetchFromGitHub 4 + , makeDesktopItem 5 + , copyDesktopItems 6 , pkg-config 7 , gtk3 8 , alsaLib ··· 19 sha256 = "sha256-Htk2NHgYVL622URx67BUtounAUopLTahaSqfAqd3+ZI="; 20 }; 21 22 + nativeBuildInputs = [ copyDesktopItems pkg-config ]; 23 buildInputs = [ gtk3 alsaLib ]; 24 25 postPatch = '' ··· 56 install -m644 skins/* $out/share/${pname}/skins 57 runHook postInstall 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 + ]; 82 83 meta = with lib; { 84 homepage = "https://github.com/thomasokken/free42";
+2 -2
pkgs/applications/misc/metadata-cleaner/default.nix
··· 17 18 python3.pkgs.buildPythonApplication rec { 19 pname = "metadata-cleaner"; 20 - version = "1.0.3"; 21 22 format = "other"; 23 ··· 25 owner = "rmnvgr"; 26 repo = "metadata-cleaner"; 27 rev = "v${version}"; 28 - sha256 = "06dzfcnjb1xd8lk0r7bi4i784gfj8r7habbjbk2c4vn2847v71lf"; 29 }; 30 31 nativeBuildInputs = [
··· 17 18 python3.pkgs.buildPythonApplication rec { 19 pname = "metadata-cleaner"; 20 + version = "1.0.4"; 21 22 format = "other"; 23 ··· 25 owner = "rmnvgr"; 26 repo = "metadata-cleaner"; 27 rev = "v${version}"; 28 + sha256 = "sha256-F/xh4dFX7W50kFzpWpGKyMUhxOlDO3WDXBzXVsDViY8="; 29 }; 30 31 nativeBuildInputs = [
+3 -3
pkgs/applications/networking/browsers/chromium/upstream-info.json
··· 18 } 19 }, 20 "beta": { 21 - "version": "90.0.4430.51", 22 - "sha256": "1k87fw0pv0d2zlxm0il9b5p60gdz6l44jssmsns4zy2fmd9316wr", 23 - "sha256bin64": "0q5yx7bc266azs3nl29ksz4yafvy2nmzn09ifcgr69fjkvsr1qh7", 24 "deps": { 25 "gn": { 26 "version": "2021-02-09",
··· 18 } 19 }, 20 "beta": { 21 + "version": "90.0.4430.61", 22 + "sha256": "01vssy3q64pv9rw4cdxv5rdg7yrxmhyc03a5r75fhxc95fj66iac", 23 + "sha256bin64": "07l8dzyv0hav1gls3xw91q9ay2l8xxmsf7yagg940cya9ncl0lhi", 24 "deps": { 25 "gn": { 26 "version": "2021-02-09",
+2 -2
pkgs/applications/networking/browsers/palemoon/default.nix
··· 16 17 in stdenv.mkDerivation rec { 18 pname = "palemoon"; 19 - version = "29.1.0"; 20 21 src = fetchFromGitHub { 22 githubBase = "repo.palemoon.org"; 23 owner = "MoonchildProductions"; 24 repo = "Pale-Moon"; 25 rev = "${version}_Release"; 26 - sha256 = "02blhk3v7gpnicd7s5l5fpqvdvj2279g3rq8xyhcd4sw6qnms8m6"; 27 fetchSubmodules = true; 28 }; 29
··· 16 17 in stdenv.mkDerivation rec { 18 pname = "palemoon"; 19 + version = "29.1.1"; 20 21 src = fetchFromGitHub { 22 githubBase = "repo.palemoon.org"; 23 owner = "MoonchildProductions"; 24 repo = "Pale-Moon"; 25 rev = "${version}_Release"; 26 + sha256 = "1ppdmj816zwccb0l0mgpq14ckdwg785wmqz41wran0nl63fg6i1x"; 27 fetchSubmodules = true; 28 }; 29
+6 -4
pkgs/applications/search/recoll/default.nix
··· 46 ++ lib.optionals (!withGui) [ "--disable-qtgui" "--disable-x11mon" ] 47 ++ (if stdenv.isLinux then [ "--with-inotify" ] else [ "--without-inotify" ]); 48 49 - nativeBuildInputs = [ pkg-config ]; 50 51 - buildInputs = with python3Packages; [ 52 - bison chmlib file python setuptools which xapian zlib 53 ] ++ lib.optional withGui qtbase 54 ++ lib.optional stdenv.isDarwin libiconv; 55 ··· 98 homepage = "https://www.lesbonscomptes.com/recoll/"; 99 license = licenses.gpl2; 100 platforms = platforms.unix; 101 - maintainers = [ maintainers.jcumming ]; 102 }; 103 }
··· 46 ++ lib.optionals (!withGui) [ "--disable-qtgui" "--disable-x11mon" ] 47 ++ (if stdenv.isLinux then [ "--with-inotify" ] else [ "--without-inotify" ]); 48 49 + nativeBuildInputs = [ 50 + file pkg-config python3Packages.setuptools which 51 + ]; 52 53 + buildInputs = [ 54 + bison chmlib python3Packages.python xapian zlib 55 ] ++ lib.optional withGui qtbase 56 ++ lib.optional stdenv.isDarwin libiconv; 57 ··· 100 homepage = "https://www.lesbonscomptes.com/recoll/"; 101 license = licenses.gpl2; 102 platforms = platforms.unix; 103 + maintainers = with maintainers; [ jcumming kiyengar ]; 104 }; 105 }
+20 -1
pkgs/applications/window-managers/dwl/default.nix
··· 12 , patches ? [ ] 13 , conf ? null 14 , writeText 15 }: 16 17 stdenv.mkDerivation rec { 18 pname = "dwl"; ··· 39 ]; 40 41 # Allow users to set their own list of patches 42 - inherit patches; 43 44 # Last line of config.mk enables XWayland 45 prePatch = lib.optionalString enable-xwayland ''
··· 12 , patches ? [ ] 13 , conf ? null 14 , writeText 15 + , fetchpatch 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 35 36 stdenv.mkDerivation rec { 37 pname = "dwl"; ··· 58 ]; 59 60 # Allow users to set their own list of patches 61 + patches = totalPatches; 62 63 # Last line of config.mk enables XWayland 64 prePatch = lib.optionalString enable-xwayland ''
+7 -5
pkgs/applications/window-managers/labwc/default.nix
··· 8 , glib 9 , libinput 10 , libxml2 11 - , pandoc 12 , pango 13 , wayland 14 , wayland-protocols ··· 16 , libxcb 17 , libxkbcommon 18 , xwayland 19 }: 20 21 stdenv.mkDerivation rec { 22 pname = "labwc"; 23 - version = "unstable-2021-02-06"; 24 25 src = fetchFromGitHub { 26 owner = "johanmalm"; 27 repo = pname; 28 - rev = "4a8fcf5c6d0b730b1e2e17e544ce7d7d3c72cd13"; 29 - sha256 = "g1ba8dchUN393eis0VAu1bIjQfthDGLaSijSavz4lfU="; 30 }; 31 32 - nativeBuildInputs = [ pkg-config meson ninja pandoc ]; 33 buildInputs = [ 34 cairo 35 glib ··· 42 libxcb 43 libxkbcommon 44 xwayland 45 ]; 46 47 mesonFlags = [ "-Dxwayland=enabled" ];
··· 8 , glib 9 , libinput 10 , libxml2 11 , pango 12 , wayland 13 , wayland-protocols ··· 15 , libxcb 16 , libxkbcommon 17 , xwayland 18 + , libdrm 19 + , scdoc 20 }: 21 22 stdenv.mkDerivation rec { 23 pname = "labwc"; 24 + version = "unstable-2021-03-15"; 25 26 src = fetchFromGitHub { 27 owner = "johanmalm"; 28 repo = pname; 29 + rev = "fddeb74527e5b860d9c1a91a237d390041c758b6"; 30 + sha256 = "0rhniv5j4bypqxxj0nbpa3hclmn8znal9rldv0mrgbizn3wsbs54"; 31 }; 32 33 + nativeBuildInputs = [ pkg-config meson ninja scdoc ]; 34 buildInputs = [ 35 cairo 36 glib ··· 43 libxcb 44 libxkbcommon 45 xwayland 46 + libdrm 47 ]; 48 49 mesonFlags = [ "-Dxwayland=enabled" ];
+5 -4
pkgs/applications/window-managers/sway/default.nix
··· 2 , meson, ninja, pkg-config, wayland, scdoc 3 , libxkbcommon, pcre, json_c, dbus, libevdev 4 , pango, cairo, libinput, libcap, pam, gdk-pixbuf, librsvg 5 - , wlroots, wayland-protocols 6 }: 7 8 stdenv.mkDerivation rec { 9 pname = "sway-unwrapped"; 10 - version = "1.5.1"; 11 12 src = fetchFromGitHub { 13 owner = "swaywm"; 14 repo = "sway"; 15 rev = version; 16 - sha256 = "1xsa3h8zhf29p0mi90baxpr76jkd9pd1gr97ky8cnjbcs4isj9j0"; 17 }; 18 19 patches = [ ··· 33 buildInputs = [ 34 wayland libxkbcommon pcre json_c dbus libevdev 35 pango cairo libinput libcap pam gdk-pixbuf librsvg 36 - wlroots wayland-protocols 37 ]; 38 39 mesonFlags = [ 40 "-Ddefault-wallpaper=false" 41 ]; 42 43 meta = with lib; {
··· 2 , meson, ninja, pkg-config, wayland, scdoc 3 , libxkbcommon, pcre, json_c, dbus, libevdev 4 , pango, cairo, libinput, libcap, pam, gdk-pixbuf, librsvg 5 + , wlroots, wayland-protocols, libdrm 6 }: 7 8 stdenv.mkDerivation rec { 9 pname = "sway-unwrapped"; 10 + version = "1.6"; 11 12 src = fetchFromGitHub { 13 owner = "swaywm"; 14 repo = "sway"; 15 rev = version; 16 + sha256 = "0vnplva11yafhbijrk68wy7pw0psn9jm0caaymswq1s951xsn1c8"; 17 }; 18 19 patches = [ ··· 33 buildInputs = [ 34 wayland libxkbcommon pcre json_c dbus libevdev 35 pango cairo libinput libcap pam gdk-pixbuf librsvg 36 + wlroots wayland-protocols libdrm 37 ]; 38 39 mesonFlags = [ 40 "-Ddefault-wallpaper=false" 41 + "-Dsd-bus-provider=libsystemd" 42 ]; 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 4 Subject: [PATCH] Load configs from /etc but fallback to /nix/store 5 6 This change will load all configuration files from /etc, to make it easy 7 to override them, but fallback to /nix/store/.../etc/sway/config to make 8 Sway work out-of-the-box with the default configuration on non NixOS 9 systems. 10 --- 11 meson.build | 3 ++- 12 - sway/config.c | 1 + 13 - 2 files changed, 3 insertions(+), 1 deletion(-) 14 15 diff --git a/meson.build b/meson.build 16 - index 02b5d606..c03a9c0f 100644 17 --- a/meson.build 18 +++ b/meson.build 19 - @@ -129,7 +129,8 @@ if scdoc.found() 20 endforeach 21 endif 22 ··· 25 +add_project_arguments('-DNIX_SYSCONFDIR="/@0@"'.format(join_paths(prefix, sysconfdir)), language : 'c') 26 27 version = '"@0@"'.format(meson.project_version()) 28 - if git.found() 29 diff --git a/sway/config.c b/sway/config.c 30 - index 4cd21bbc..dd855753 100644 31 --- a/sway/config.c 32 +++ 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", 38 }; 39 40 - char *config_home = getenv("XDG_CONFIG_HOME"); 41 -- 42 - 2.19.2
··· 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 Subject: [PATCH] Load configs from /etc but fallback to /nix/store 5 6 This change will load all configuration files from /etc, to make it easy 7 to override them, but fallback to /nix/store/.../etc/sway/config to make 8 Sway work out-of-the-box with the default configuration on non NixOS 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> 14 --- 15 meson.build | 3 ++- 16 + sway/config.c | 3 ++- 17 + 2 files changed, 4 insertions(+), 2 deletions(-) 18 19 diff --git a/meson.build b/meson.build 20 + index b7a29660..8ae8ceb3 100644 21 --- a/meson.build 22 +++ b/meson.build 23 + @@ -164,7 +164,8 @@ if scdoc.found() 24 endforeach 25 endif 26 ··· 29 +add_project_arguments('-DNIX_SYSCONFDIR="/@0@"'.format(join_paths(prefix, sysconfdir)), language : 'c') 30 31 version = '"@0@"'.format(meson.project_version()) 32 + git = find_program('git', native: true, required: false) 33 diff --git a/sway/config.c b/sway/config.c 34 + index 76b9ec08..fb5b51aa 100644 35 --- a/sway/config.c 36 +++ b/sway/config.c 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"}, 44 }; 45 46 + size_t num_config_paths = sizeof(config_paths)/sizeof(config_paths[0]); 47 -- 48 + 2.30.1
+13 -16
pkgs/applications/window-managers/wayfire/applications.nix
··· 1 - { newScope, wayfirePlugins }: 2 3 - let 4 - self = with self; { 5 - inherit wayfirePlugins; 6 7 - callPackage = newScope self; 8 9 - wayfire = callPackage ./. { }; 10 11 - wcm = callPackage ./wcm.nix { 12 - inherit (wayfirePlugins) wf-shell; 13 - }; 14 15 - wrapWayfireApplication = callPackage ./wrapper.nix { }; 16 17 - withPlugins = selector: self // { 18 - wayfire = wrapWayfireApplication wayfire selector; 19 - wcm = wrapWayfireApplication wcm selector; 20 - }; 21 }; 22 - in 23 - self
··· 1 + { lib, newScope, wayfirePlugins }: 2 3 + lib.makeExtensible (self: with self; { 4 + inherit wayfirePlugins; 5 6 + callPackage = newScope self; 7 8 + wayfire = callPackage ./. { }; 9 10 + wcm = callPackage ./wcm.nix { 11 + inherit (wayfirePlugins) wf-shell; 12 + }; 13 14 + wrapWayfireApplication = callPackage ./wrapper.nix { }; 15 16 + withPlugins = selector: self // { 17 + wayfire = wrapWayfireApplication wayfire selector; 18 + wcm = wrapWayfireApplication wcm selector; 19 }; 20 + })
+1 -1
pkgs/development/compilers/llvm/12/clang/default.nix
··· 8 pname = "clang"; 9 inherit version; 10 11 - src = fetch "clang" "11ay72f81ffygil5ficq7mzplck4gffm77p0yj4ib3dgiqbb1qbw"; 12 inherit clang-tools-extra_src; 13 14 unpackPhase = ''
··· 8 pname = "clang"; 9 inherit version; 10 11 + src = fetch "clang" "185r9rr254v75ja33nmm53j85lcnkj7bzsl18wvnd37jmz2nfxa5"; 12 inherit clang-tools-extra_src; 13 14 unpackPhase = ''
+1 -1
pkgs/development/compilers/llvm/12/compiler-rt.nix
··· 11 stdenv.mkDerivation rec { 12 pname = "compiler-rt"; 13 inherit version; 14 - src = fetch pname "01dvir3858qkjmqhw2h6jjagq0la0kasnwzqbyv91yixnwx8369z"; 15 16 nativeBuildInputs = [ cmake python3 llvm ]; 17 buildInputs = lib.optional stdenv.hostPlatform.isDarwin libcxxabi;
··· 11 stdenv.mkDerivation rec { 12 pname = "compiler-rt"; 13 inherit version; 14 + src = fetch pname "1x0z875nbdpzhr4qb7linm6r9swvdf6dvwqy1s22pbn4wdcw0cvf"; 15 16 nativeBuildInputs = [ cmake python3 llvm ]; 17 buildInputs = lib.optional stdenv.hostPlatform.isDarwin libcxxabi;
+2 -2
pkgs/development/compilers/llvm/12/default.nix
··· 8 9 let 10 release_version = "12.0.0"; 11 - candidate = "rc4"; # empty or "rcN" 12 dash-candidate = lib.optionalString (candidate != "") "-${candidate}"; 13 version = "${release_version}${dash-candidate}"; # differentiating these (variables) is important for RCs 14 targetConfig = stdenv.targetPlatform.config; ··· 18 inherit sha256; 19 }; 20 21 - clang-tools-extra_src = fetch "clang-tools-extra" "1m1qga8m967bzqkxwx9xqkw1lkxi9dhlrn6km2k7g2yqyb6k14ag"; 22 23 tools = lib.makeExtensible (tools: let 24 callPackage = newScope (tools // { inherit stdenv cmake libxml2 python3 isl release_version version fetch; });
··· 8 9 let 10 release_version = "12.0.0"; 11 + candidate = "rc5"; # empty or "rcN" 12 dash-candidate = lib.optionalString (candidate != "") "-${candidate}"; 13 version = "${release_version}${dash-candidate}"; # differentiating these (variables) is important for RCs 14 targetConfig = stdenv.targetPlatform.config; ··· 18 inherit sha256; 19 }; 20 21 + clang-tools-extra_src = fetch "clang-tools-extra" "1hga9k5m60ywmr7m69jf1v6vj1ra1n6ybv1abzlz94f5q22i1a02"; 22 23 tools = lib.makeExtensible (tools: let 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 pname = "libc++"; 7 inherit version; 8 9 - src = fetch "libcxx" "0ai91zls1738502c3b2frhawmjpi73rm3m677hh540wrjp3xv0ql"; 10 11 postUnpack = '' 12 unpackFile ${libcxxabi.src}
··· 6 pname = "libc++"; 7 inherit version; 8 9 + src = fetch "libcxx" "01abh553dvjgk5cjzzp0ghmg00laqbr4ar4frdhyhpbwhhmwc880"; 10 11 postUnpack = '' 12 unpackFile ${libcxxabi.src}
+1 -1
pkgs/development/compilers/llvm/12/libc++abi.nix
··· 6 pname = "libc++abi"; 7 inherit version; 8 9 - src = fetch "libcxxabi" "02qp6ndagq7n48p53z93d1rrx0v0v4rsahd4vkv5frid0vm4ah9h"; 10 11 nativeBuildInputs = [ cmake python3 ]; 12 buildInputs = lib.optional (!stdenv.isDarwin && !stdenv.isFreeBSD && !stdenv.hostPlatform.isWasm) libunwind;
··· 6 pname = "libc++abi"; 7 inherit version; 8 9 + src = fetch "libcxxabi" "0mjj4f63ix4j1b72bgzpcki7mzf3qszrq7snqhiq0c5s73skkwx0"; 10 11 nativeBuildInputs = [ cmake python3 ]; 12 buildInputs = lib.optional (!stdenv.isDarwin && !stdenv.isFreeBSD && !stdenv.hostPlatform.isWasm) libunwind;
+1 -1
pkgs/development/compilers/llvm/12/libunwind.nix
··· 6 pname = "libunwind"; 7 inherit version; 8 9 - src = fetch pname "1a5db1lxw98a430b8mnaclc0w98y6cc8k587kgjhn0nghl40l40i"; 10 11 postUnpack = '' 12 unpackFile ${libcxx.src}
··· 6 pname = "libunwind"; 7 inherit version; 8 9 + src = fetch pname "0kaq75ygzv9dqfsx27pi5a0clipdjq6a9vghhb89d8k1rf20lslh"; 10 11 postUnpack = '' 12 unpackFile ${libcxx.src}
+1 -1
pkgs/development/compilers/llvm/12/lld.nix
··· 11 pname = "lld"; 12 inherit version; 13 14 - src = fetch pname "0r9pxhvinipirv9s5k8fnsnqd30zfniwqjkvw5sac3lq29rn2lp1"; 15 16 nativeBuildInputs = [ cmake ]; 17 buildInputs = [ llvm libxml2 ];
··· 11 pname = "lld"; 12 inherit version; 13 14 + src = fetch pname "044lv1d9am2xmbc3pvssxkkiyxyv72n2xkgk8z3p9k72h3ay00q3"; 15 16 nativeBuildInputs = [ cmake ]; 17 buildInputs = [ llvm libxml2 ];
+1 -1
pkgs/development/compilers/llvm/12/lldb.nix
··· 25 pname = "lldb"; 26 inherit version; 27 28 - src = fetch pname "0943gan83mldizwbhksd07w4h90z4djjpv5f8v49caz8y9113svg"; 29 30 patches = [ ./lldb-procfs.patch ]; 31
··· 25 pname = "lldb"; 26 inherit version; 27 28 + src = fetch pname "0q4p4s5ws1zszs3i4da5w5fnxkpny0q3fr1s1sh7jp9wcwxbxiqq"; 29 30 patches = [ ./lldb-procfs.patch ]; 31
+2 -2
pkgs/development/compilers/llvm/12/llvm.nix
··· 32 pname = "llvm"; 33 inherit version; 34 35 - src = fetch pname "1jif65i165h41cfcsfvfjy5k1yrnikg61assj5vs0f25pv1vbyvf"; 36 - polly_src = fetch "polly" "0hk6j6rsal3zsp1f9fla71yzbwmzz9007m63x22hy7qfiwyplvf2"; 37 38 unpackPhase = '' 39 unpackFile $src
··· 32 pname = "llvm"; 33 inherit version; 34 35 + src = fetch pname "088dyv7hppidl3rqfsjdibvn4d3a74896fg2sz4dwaxlg19way93"; 36 + polly_src = fetch "polly" "1qj7gkfr1yrsrz6j086l9p6d2kyyln15fmfiab4isn96g1dhsfb5"; 37 38 unpackPhase = '' 39 unpackFile $src
+1 -1
pkgs/development/compilers/llvm/12/openmp.nix
··· 11 pname = "openmp"; 12 inherit version; 13 14 - src = fetch pname "07g2rsfhli3szv3chzy6y37p2176ywdb6w3k2fv9g2r416cpxjdz"; 15 16 nativeBuildInputs = [ cmake perl ]; 17 buildInputs = [ llvm ];
··· 11 pname = "openmp"; 12 inherit version; 13 14 + src = fetch pname "1d16r5whjb2n4n28rg8wn2g9krlc92q6nb0qmnnbzhqhx0rbkjfb"; 15 16 nativeBuildInputs = [ cmake perl ]; 17 buildInputs = [ llvm ];
+24 -27
pkgs/development/libraries/openzwave/default.nix
··· 1 - { lib, stdenv, fetchFromGitHub 2 , doxygen, fontconfig, graphviz-nox, libxml2, pkg-config, which 3 , systemd }: 4 5 - let 6 - version = "2019-12-08"; 7 - 8 - in stdenv.mkDerivation { 9 pname = "openzwave"; 10 - inherit version; 11 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 src = fetchFromGitHub { 15 - owner = "home-assistant"; 16 repo = "open-zwave"; 17 - rev = "2cd2137025c529835e4893a7b87c3d56605b2681"; 18 - sha256 = "04g8fb4f4ihakvvsmzcnncgfdd2ikmki7s22i9c6layzdwavbwf1"; 19 }; 20 21 nativeBuildInputs = [ doxygen fontconfig graphviz-nox libxml2 pkg-config which ]; 22 23 buildInputs = [ systemd ]; ··· 26 27 enableParallelBuilding = true; 28 29 - installPhase = '' 30 - runHook preInstall 31 - 32 - DESTDIR=$out PREFIX= pkgconfigdir=lib/pkgconfig make install $installFlags 33 - 34 - runHook postInstall 35 - ''; 36 37 FONTCONFIG_FILE="${fontconfig.out}/etc/fonts/fonts.conf"; 38 FONTCONFIG_PATH="${fontconfig.out}/etc/fonts/"; ··· 40 postPatch = '' 41 substituteInPlace cpp/src/Options.cpp \ 42 --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 ''; 53 54 meta = with lib; {
··· 1 + { lib, stdenv, fetchFromGitHub, fetchpatch 2 , doxygen, fontconfig, graphviz-nox, libxml2, pkg-config, which 3 , systemd }: 4 5 + stdenv.mkDerivation rec { 6 pname = "openzwave"; 7 + version = "1.6"; 8 9 src = fetchFromGitHub { 10 + owner = "OpenZWave"; 11 repo = "open-zwave"; 12 + rev = "v${version}"; 13 + sha256 = "0xgs4mmr0480c269wx9xkk67ikjzxkh8xcssrdx0f5xcl1lyd333"; 14 }; 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 + 31 nativeBuildInputs = [ doxygen fontconfig graphviz-nox libxml2 pkg-config which ]; 32 33 buildInputs = [ systemd ]; ··· 36 37 enableParallelBuilding = true; 38 39 + makeFlags = [ 40 + "PREFIX=${placeholder "out"}" 41 + ]; 42 43 FONTCONFIG_FILE="${fontconfig.out}/etc/fonts/fonts.conf"; 44 FONTCONFIG_PATH="${fontconfig.out}/etc/fonts/"; ··· 46 postPatch = '' 47 substituteInPlace cpp/src/Options.cpp \ 48 --replace /etc/openzwave $out/etc/openzwave 49 ''; 50 51 meta = with lib; {
+8 -2
pkgs/development/libraries/tracker/default.nix
··· 27 , substituteAll 28 }: 29 30 - stdenv.mkDerivation rec { 31 pname = "tracker"; 32 version = "3.0.3"; 33 ··· 82 "-Ddocs=true" 83 ]; 84 85 - doCheck = true; 86 87 postPatch = '' 88 patchShebangs utils/g-ir-merge/g-ir-merge ··· 133 platforms = platforms.linux; 134 }; 135 }
··· 27 , substituteAll 28 }: 29 30 + stdenv.mkDerivation (rec { 31 pname = "tracker"; 32 version = "3.0.3"; 33 ··· 82 "-Ddocs=true" 83 ]; 84 85 + # https://gitlab.gnome.org/GNOME/tracker/-/issues/292#note_1075369 86 + doCheck = !stdenv.isi686; 87 88 postPatch = '' 89 patchShebangs utils/g-ir-merge/g-ir-merge ··· 134 platforms = platforms.linux; 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 deps = { 12 "base/trace_event/common" = fetchgit { 13 url = "${git_url}/chromium/src/base/trace_event/common.git"; 14 - rev = "936ba8a963284a6b3737cf2f0474a7131073abee"; 15 - sha256 = "14nr22fqdpxma1kzjflj6a865vr3hfnnm2gs4vcixyq4kmfzfcy2"; 16 }; 17 build = fetchgit { 18 url = "${git_url}/chromium/src/build.git"; 19 - rev = "325e95d6dae64f35b160b3dc7d73218cee5ec079"; 20 - sha256 = "0dddyxa76p2xpjhmxif05v63i5ar6h5v684fdl667sg84f5bhhxf"; 21 }; 22 "third_party/googletest/src" = fetchgit { 23 url = "${git_url}/external/github.com/google/googletest.git"; 24 - rev = "5ec7f0c4a113e2f18ac2c6cc7df51ad6afc24081"; 25 - sha256 = "0gmr10042c0xybxnn6g7ndj1na1mmd3l9w7449qlcv4s8gmfs7k6"; 26 }; 27 "third_party/icu" = fetchgit { 28 url = "${git_url}/chromium/deps/icu.git"; 29 - rev = "960f195aa87acaec46e6104ec93a596da7ae0843"; 30 - sha256 = "073kh6gpcairgjxf3hlhpqljc13gwl2aj8fz91fv220xibwqs834"; 31 }; 32 "third_party/jinja2" = fetchgit { 33 url = "${git_url}/chromium/src/third_party/jinja2.git"; ··· 39 rev = "8f45f5cfa0009d2a70589bcda0349b8cb2b72783"; 40 sha256 = "168ppjmicfdh4i1l0l25s86mdbrz9fgxmiq1rx33x79mph41scfz"; 41 }; 42 }; 43 44 in 45 46 stdenv.mkDerivation rec { 47 pname = "v8"; 48 - version = "7.4.255"; 49 50 doCheck = true; 51 52 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 ./darwin.patch 58 ]; 59 60 src = fetchFromGitHub { 61 owner = "v8"; 62 repo = "v8"; 63 rev = version; 64 - sha256 = "14i0c71hmffzqnq9n73dh9dnabdxhbjhzkhqpk5yv9y90bwrzi2n"; 65 }; 66 67 postUnpack = '' ··· 97 ''v8_snapshot_toolchain="//build/toolchain/linux/unbundle:default"'' 98 ] ++ lib.optional stdenv.cc.isClang ''clang_base_path="${stdenv.cc}"''; 99 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"; 103 104 nativeBuildInputs = [ gn ninja pkg-config python ] 105 ++ lib.optionals stdenv.isDarwin [ xcbuild darwin.DarwinTools ];
··· 11 deps = { 12 "base/trace_event/common" = fetchgit { 13 url = "${git_url}/chromium/src/base/trace_event/common.git"; 14 + rev = "dab187b372fc17e51f5b9fad8201813d0aed5129"; 15 + sha256 = "0dmpj9hj4xv3xb0fl1kb9hm4bhpbs2s5csx3z8cgjd5vwvhdzig4"; 16 }; 17 build = fetchgit { 18 url = "${git_url}/chromium/src/build.git"; 19 + rev = "26e9d485d01d6e0eb9dadd21df767a63494c8fea"; 20 + sha256 = "1jjvsgj0cs97d26i3ba531ic1f9gqan8x7z4aya8yl8jx02l342q"; 21 }; 22 "third_party/googletest/src" = fetchgit { 23 url = "${git_url}/external/github.com/google/googletest.git"; 24 + rev = "e3f0319d89f4cbf32993de595d984183b1a9fc57"; 25 + sha256 = "18xz71l2xjrqsc0q317whgw4xi1i5db24zcj7v04f5g6r1hyf1a5"; 26 }; 27 "third_party/icu" = fetchgit { 28 url = "${git_url}/chromium/deps/icu.git"; 29 + rev = "f2223961702f00a8833874b0560d615a2cc42738"; 30 + sha256 = "0z5p53kbrjfkjn0i12dpk55cp8976j2zk7a4wk88423s2c5w87zl"; 31 }; 32 "third_party/jinja2" = fetchgit { 33 url = "${git_url}/chromium/src/third_party/jinja2.git"; ··· 39 rev = "8f45f5cfa0009d2a70589bcda0349b8cb2b72783"; 40 sha256 = "168ppjmicfdh4i1l0l25s86mdbrz9fgxmiq1rx33x79mph41scfz"; 41 }; 42 + "third_party/zlib" = fetchgit { 43 + url = "${git_url}/chromium/src/third_party/zlib.git"; 44 + rev = "156be8c52f80cde343088b4a69a80579101b6e67"; 45 + sha256 = "0hxbkkzmlv714fjq2jlp5dd2jc339xyh6gkjx1sz3srwv33mlk92"; 46 + }; 47 }; 48 49 in 50 51 stdenv.mkDerivation rec { 52 pname = "v8"; 53 + version = "8.4.255"; 54 55 doCheck = true; 56 57 patches = [ 58 ./darwin.patch 59 + ./gcc_arm.patch # Fix building zlib with gcc on aarch64, from https://gist.github.com/Adenilson/d973b6fd96c7709d33ddf08cf1dcb149 60 ]; 61 62 src = fetchFromGitHub { 63 owner = "v8"; 64 repo = "v8"; 65 rev = version; 66 + sha256 = "07ymw4kqbz7kv311gpk5bs5q90wj73n2q7jkyfhqk4hvhs1q5bw7"; 67 }; 68 69 postUnpack = '' ··· 99 ''v8_snapshot_toolchain="//build/toolchain/linux/unbundle:default"'' 100 ] ++ lib.optional stdenv.cc.isClang ''clang_base_path="${stdenv.cc}"''; 101 102 + NIX_CFLAGS_COMPILE = "-O2"; 103 104 nativeBuildInputs = [ gn ninja pkg-config python ] 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 { 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 stdenv.mkDerivation rec { 8 pname = "wlroots"; 9 - version = "0.12.0"; 10 11 src = fetchFromGitHub { 12 owner = "swaywm"; 13 repo = "wlroots"; 14 rev = version; 15 - sha256 = "01j38lmgs2c6fq68v8b75pkilia2wsgzgp46ivfbi9hhx47kgcfn"; 16 }; 17 18 # $out for the library and $examples for the example programs (in examples): ··· 23 buildInputs = [ 24 libGL wayland wayland-protocols libinput libxkbcommon pixman 25 xcbutilwm libX11 libcap xcbutilimage xcbutilerrors mesa 26 - libpng ffmpeg 27 ]; 28 29 mesonFlags = [ "-Dlogind-provider=systemd" "-Dlibseat=disabled" ]; ··· 50 changelog = "https://github.com/swaywm/wlroots/releases/tag/${version}"; 51 license = licenses.mit; 52 platforms = platforms.linux; 53 - maintainers = with maintainers; [ primeos ]; 54 }; 55 }
··· 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, libuuid, xcbutilrenderutil, xwayland 5 }: 6 7 stdenv.mkDerivation rec { 8 pname = "wlroots"; 9 + version = "0.13.0"; 10 11 src = fetchFromGitHub { 12 owner = "swaywm"; 13 repo = "wlroots"; 14 rev = version; 15 + sha256 = "01plhbnsp5yg18arz0v8fr0pr9l4w4pdzwkg9px486qdvb3s1vgy"; 16 }; 17 18 # $out for the library and $examples for the example programs (in examples): ··· 23 buildInputs = [ 24 libGL wayland wayland-protocols libinput libxkbcommon pixman 25 xcbutilwm libX11 libcap xcbutilimage xcbutilerrors mesa 26 + libpng ffmpeg libuuid xcbutilrenderutil xwayland 27 ]; 28 29 mesonFlags = [ "-Dlogind-provider=systemd" "-Dlibseat=disabled" ]; ··· 50 changelog = "https://github.com/swaywm/wlroots/releases/tag/${version}"; 51 license = licenses.mit; 52 platforms = platforms.linux; 53 + maintainers = with maintainers; [ primeos synthetica ]; 54 }; 55 }
+2 -10
pkgs/development/python-modules/aiodiscover/default.nix
··· 10 11 buildPythonPackage rec { 12 pname = "aiodiscover"; 13 - version = "1.3.2"; 14 disabled = pythonOlder "3.7"; 15 16 src = fetchFromGitHub { 17 owner = "bdraco"; 18 repo = pname; 19 rev = "v${version}"; 20 - sha256 = "0qg2wm6ddsfai788chylr5ynrvakwg91q3dszz7dxzbkfdcxixj3"; 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 31 propagatedBuildInputs = [ 32 async-dns
··· 10 11 buildPythonPackage rec { 12 pname = "aiodiscover"; 13 + version = "1.3.3"; 14 disabled = pythonOlder "3.7"; 15 16 src = fetchFromGitHub { 17 owner = "bdraco"; 18 repo = pname; 19 rev = "v${version}"; 20 + sha256 = "186agrjx818vn00d3pqlka5ir48rgpbfyn1cifkn9ylsxg9cz3ph"; 21 }; 22 23 propagatedBuildInputs = [ 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 }: 2 3 - python_openzwave.overridePythonAttrs (oldAttrs: rec { 4 pname = "homeassistant_pyozw"; 5 version = "0.1.10"; 6
··· 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 + }; 13 14 + patches = [ ]; 15 + }); 16 + }).overridePythonAttrs (oldAttrs: rec { 17 pname = "homeassistant_pyozw"; 18 version = "0.1.10"; 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 { lib 2 , buildPythonPackage 3 - , fetchhg 4 , isPyPy 5 }: 6 ··· 9 pname = "smartypants"; 10 disabled = isPyPy; 11 12 - src = fetchhg { 13 - url = "https://bitbucket.org/livibetter/smartypants.py"; 14 rev = "v${version}"; 15 sha256 = "1cmzz44d2hm6y8jj2xcq1wfr26760gi7iq92ha8xbhb1axzd7nq6"; 16 }; 17 18 meta = with lib; { 19 description = "Python with the SmartyPants"; 20 - homepage = "https://bitbucket.org/livibetter/smartypants.py"; 21 license = licenses.bsd3; 22 maintainers = with maintainers; [ ]; 23 };
··· 1 { lib 2 , buildPythonPackage 3 + , fetchFromGitHub 4 , isPyPy 5 }: 6 ··· 9 pname = "smartypants"; 10 disabled = isPyPy; 11 12 + src = fetchFromGitHub { 13 + owner = "leohemsted"; 14 + repo = "smartypants.py"; 15 rev = "v${version}"; 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"; 22 }; 23 24 meta = with lib; { 25 description = "Python with the SmartyPants"; 26 + homepage = "https://github.com/leohemsted/smartypants.py"; 27 license = licenses.bsd3; 28 maintainers = with maintainers; [ ]; 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 8 buildPythonPackage rec { 9 pname = "ytmusicapi"; 10 - version = "0.15.0"; 11 12 disabled = isPy27; 13 14 src = fetchPypi { 15 inherit pname version; 16 - sha256 = "sha256-pVQqoMvuuFc/1QNG5z/AspGlgIGPi9aqjZ3/3eVNhis="; 17 }; 18 19 propagatedBuildInputs = [
··· 7 8 buildPythonPackage rec { 9 pname = "ytmusicapi"; 10 + version = "0.15.1"; 11 12 disabled = isPy27; 13 14 src = fetchPypi { 15 inherit pname version; 16 + sha256 = "sha256-W/eZubJ/SNLBya1S6wLUwTwZCUD+wCQ5FAuNcSpl+9Y="; 17 }; 18 19 propagatedBuildInputs = [
+1 -1
pkgs/development/ruby-modules/bundix/default.nix
··· 38 ''; 39 homepage = "https://github.com/manveru/bundix"; 40 license = "MIT"; 41 - maintainers = with lib.maintainers; [ manveru zimbatm ]; 42 platforms = lib.platforms.all; 43 }; 44 }
··· 38 ''; 39 homepage = "https://github.com/manveru/bundix"; 40 license = "MIT"; 41 + maintainers = with lib.maintainers; [ manveru marsam zimbatm ]; 42 platforms = lib.platforms.all; 43 }; 44 }
+6 -11
pkgs/development/tools/analysis/radare2/default.nix
··· 13 , file 14 , libzip 15 , xxHash 16 - , gtk2 ? null 17 - , vte ? null 18 - , gtkdialog ? null 19 - , python3 ? null 20 - , ruby ? null 21 - , lua ? null 22 , useX11 ? false 23 , rubyBindings ? false 24 , pythonBindings ? false 25 , luaBindings ? false 26 }: 27 - 28 - assert useX11 -> (gtk2 != null && vte != null && gtkdialog != null); 29 - assert rubyBindings -> ruby != null; 30 - assert pythonBindings -> python3 != null; 31 - 32 33 let 34 inherit (lib) optional;
··· 13 , file 14 , libzip 15 , xxHash 16 + , gtk2 17 + , vte 18 + , gtkdialog 19 + , python3 20 + , ruby 21 + , lua 22 , useX11 ? false 23 , rubyBindings ? false 24 , pythonBindings ? false 25 , luaBindings ? false 26 }: 27 28 let 29 inherit (lib) optional;
-2
pkgs/development/tools/analysis/rizin/cutter.nix
··· 35 qtWrapperArgs+=(--prefix PYTHONPATH : "$PYTHONPATH") 36 ''; 37 38 - enableParallelBuilding = true; 39 - 40 meta = with lib; { 41 description = "Free and Open Source Reverse Engineering Platform powered by rizin"; 42 homepage = src.meta.homepage;
··· 35 qtWrapperArgs+=(--prefix PYTHONPATH : "$PYTHONPATH") 36 ''; 37 38 meta = with lib; { 39 description = "Free and Open Source Reverse Engineering Platform powered by rizin"; 40 homepage = src.meta.homepage;
-2
pkgs/development/tools/analysis/rizin/default.nix
··· 40 "-Duse_sys_tree_sitter=true" 41 ]; 42 43 - enableParallelBuilding = true; 44 - 45 nativeBuildInputs = [ pkg-config meson ninja cmake ]; 46 47 buildInputs = [
··· 40 "-Duse_sys_tree_sitter=true" 41 ]; 42 43 nativeBuildInputs = [ pkg-config meson ninja cmake ]; 44 45 buildInputs = [
+3 -3
pkgs/development/tools/rust/cargo-deny/default.nix
··· 7 8 rustPlatform.buildRustPackage rec { 9 pname = "cargo-deny"; 10 - version = "0.8.9"; 11 12 src = fetchFromGitHub { 13 owner = "EmbarkStudios"; 14 repo = pname; 15 rev = version; 16 - sha256 = "sha256-K8lNo2XmHzgbaVCMNvwDwr86hrXBPws9v3HD8ku+D6w="; 17 }; 18 19 - cargoSha256 = "sha256-spTy9vzldzqu66904wRVwAeH1rNOQ3WeC6miJkRiAGg="; 20 21 doCheck = false; 22
··· 7 8 rustPlatform.buildRustPackage rec { 9 pname = "cargo-deny"; 10 + version = "0.9.0"; 11 12 src = fetchFromGitHub { 13 owner = "EmbarkStudios"; 14 repo = pname; 15 rev = version; 16 + sha256 = "sha256-ZjXAZN93ij42WVYSOgvKAzFZ/cZ2RTFKT2sr44j7TVc="; 17 }; 18 19 + cargoSha256 = "sha256-eQv9pFegHTjjjFURiD/yN/srtONAwAH3vwfrSY/LM/Q="; 20 21 doCheck = false; 22
+6
pkgs/os-specific/darwin/macfuse/default.nix
··· 56 lgpl2Plus # libfuse 57 ]; 58 }; 59 }
··· 56 lgpl2Plus # libfuse 57 ]; 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 + ''; 65 }
+3 -2
pkgs/os-specific/linux/kernel/generic.nix
··· 55 , autoModules ? stdenv.hostPlatform.linux-kernel.autoModules 56 , preferBuiltin ? stdenv.hostPlatform.linux-kernel.preferBuiltin or false 57 , kernelArch ? stdenv.hostPlatform.linuxArch 58 - 59 , ... 60 }: 61 ··· 178 179 passthru = { 180 features = kernelFeatures; 181 - inherit commonStructuredConfig isXen isZen isHardened isLibre; 182 kernelOlder = lib.versionOlder version; 183 kernelAtLeast = lib.versionAtLeast version; 184 passthru = kernel.passthru // (removeAttrs passthru [ "passthru" ]); 185 }; 186 187 in lib.extendDerivation true passthru kernel
··· 55 , autoModules ? stdenv.hostPlatform.linux-kernel.autoModules 56 , preferBuiltin ? stdenv.hostPlatform.linux-kernel.preferBuiltin or false 57 , kernelArch ? stdenv.hostPlatform.linuxArch 58 + , kernelTests ? [] 59 , ... 60 }: 61 ··· 178 179 passthru = { 180 features = kernelFeatures; 181 + inherit commonStructuredConfig isXen isZen isHardened isLibre modDirVersion; 182 kernelOlder = lib.versionOlder version; 183 kernelAtLeast = lib.versionAtLeast version; 184 passthru = kernel.passthru // (removeAttrs passthru [ "passthru" ]); 185 + tests = kernelTests; 186 }; 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: 2 3 with lib; 4 ··· 15 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz"; 16 sha256 = "0nw1jf6x5a990n69aw2da4s4lc1c7mnwiwcda40bl2rkmd24s1qm"; 17 }; 18 } // (args.argsOverride or {}))
··· 1 + { lib, buildPackages, fetchurl, perl, buildLinux, nixosTests, modDirVersionArg ? null, ... } @ args: 2 3 with lib; 4 ··· 15 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz"; 16 sha256 = "0nw1jf6x5a990n69aw2da4s4lc1c7mnwiwcda40bl2rkmd24s1qm"; 17 }; 18 + 19 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_4_14 ]; 20 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-4.19.nix
··· 1 - { lib, buildPackages, fetchurl, perl, buildLinux, modDirVersionArg ? null, ... } @ args: 2 3 with lib; 4 ··· 15 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz"; 16 sha256 = "0z5pgal8775rf7pvpxq47dnghr42al2k9py0s9jl3js2wamgdyix"; 17 }; 18 } // (args.argsOverride or {}))
··· 1 + { lib, buildPackages, fetchurl, perl, buildLinux, nixosTests, modDirVersionArg ? null, ... } @ args: 2 3 with lib; 4 ··· 15 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz"; 16 sha256 = "0z5pgal8775rf7pvpxq47dnghr42al2k9py0s9jl3js2wamgdyix"; 17 }; 18 + 19 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_4_19 ]; 20 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-4.4.nix
··· 1 - { buildPackages, fetchurl, perl, buildLinux, ... } @ args: 2 3 buildLinux (args // rec { 4 version = "4.4.264"; ··· 8 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz"; 9 sha256 = "1b0d735qnk0bcqn9gdsjqxhk8pkb3597ya9f34lv1vjfaqkkxk7l"; 10 }; 11 } // (args.argsOverride or {}))
··· 1 + { buildPackages, fetchurl, perl, buildLinux, nixosTests, ... } @ args: 2 3 buildLinux (args // rec { 4 version = "4.4.264"; ··· 8 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz"; 9 sha256 = "1b0d735qnk0bcqn9gdsjqxhk8pkb3597ya9f34lv1vjfaqkkxk7l"; 10 }; 11 + 12 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_4_4 ]; 13 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-4.9.nix
··· 1 - { buildPackages, fetchurl, perl, buildLinux, ... } @ args: 2 3 buildLinux (args // rec { 4 version = "4.9.264"; ··· 8 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz"; 9 sha256 = "1df2dv26c9z6zsdlqzbcc60f2pszh0hx1n94v65jswlb72a2mipc"; 10 }; 11 } // (args.argsOverride or {}))
··· 1 + { buildPackages, fetchurl, perl, buildLinux, nixosTests, ... } @ args: 2 3 buildLinux (args // rec { 4 version = "4.9.264"; ··· 8 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz"; 9 sha256 = "1df2dv26c9z6zsdlqzbcc60f2pszh0hx1n94v65jswlb72a2mipc"; 10 }; 11 + 12 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_4_9 ]; 13 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-5.10.nix
··· 1 - { lib, buildPackages, fetchurl, perl, buildLinux, modDirVersionArg ? null, ... } @ args: 2 3 with lib; 4 ··· 15 url = "mirror://kernel/linux/kernel/v5.x/linux-${version}.tar.xz"; 16 sha256 = "1nb95ll66kxiz702gs903n3gy5ialz8cin58l19rqaai55kck7fr"; 17 }; 18 } // (args.argsOverride or {}))
··· 1 + { lib, buildPackages, fetchurl, perl, buildLinux, nixosTests, modDirVersionArg ? null, ... } @ args: 2 3 with lib; 4 ··· 15 url = "mirror://kernel/linux/kernel/v5.x/linux-${version}.tar.xz"; 16 sha256 = "1nb95ll66kxiz702gs903n3gy5ialz8cin58l19rqaai55kck7fr"; 17 }; 18 + 19 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_5_10 ]; 20 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-5.11.nix
··· 1 - { lib, buildPackages, fetchurl, perl, buildLinux, modDirVersionArg ? null, ... } @ args: 2 3 with lib; 4 ··· 15 url = "mirror://kernel/linux/kernel/v5.x/linux-${version}.tar.xz"; 16 sha256 = "1fc3yl4srzla3cbihgnry0pqmgcc17zv0zlkk9zpx99371hpay0a"; 17 }; 18 } // (args.argsOverride or {}))
··· 1 + { lib, buildPackages, fetchurl, perl, buildLinux, nixosTests, modDirVersionArg ? null, ... } @ args: 2 3 with lib; 4 ··· 15 url = "mirror://kernel/linux/kernel/v5.x/linux-${version}.tar.xz"; 16 sha256 = "1fc3yl4srzla3cbihgnry0pqmgcc17zv0zlkk9zpx99371hpay0a"; 17 }; 18 + 19 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_5_11 ]; 20 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-5.4.nix
··· 1 - { lib, buildPackages, fetchurl, perl, buildLinux, modDirVersionArg ? null, ... } @ args: 2 3 with lib; 4 ··· 15 url = "mirror://kernel/linux/kernel/v5.x/linux-${version}.tar.xz"; 16 sha256 = "1vmpc6yrr2zm4m3naflwik5111jr8hy0mnyddwk31l0p4xbg8smc"; 17 }; 18 } // (args.argsOverride or {}))
··· 1 + { lib, buildPackages, fetchurl, perl, buildLinux, nixosTests, modDirVersionArg ? null, ... } @ args: 2 3 with lib; 4 ··· 15 url = "mirror://kernel/linux/kernel/v5.x/linux-${version}.tar.xz"; 16 sha256 = "1vmpc6yrr2zm4m3naflwik5111jr8hy0mnyddwk31l0p4xbg8smc"; 17 }; 18 + 19 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_5_4 ]; 20 } // (args.argsOverride or {}))
+3 -1
pkgs/os-specific/linux/kernel/linux-testing.nix
··· 1 - { lib, buildPackages, fetchurl, perl, buildLinux, modDirVersionArg ? null, ... } @ args: 2 3 with lib; 4 ··· 13 url = "https://git.kernel.org/torvalds/t/linux-${version}.tar.gz"; 14 sha256 = "0w0zk2byimdbcvn8myqaq0ab6lyd43493fnkv9a1407dimpxb03d"; 15 }; 16 17 # Should the testing kernels ever be built on Hydra? 18 extraMeta.hydraPlatforms = [];
··· 1 + { lib, buildPackages, fetchurl, perl, buildLinux, nixosTests, modDirVersionArg ? null, ... } @ args: 2 3 with lib; 4 ··· 13 url = "https://git.kernel.org/torvalds/t/linux-${version}.tar.gz"; 14 sha256 = "0w0zk2byimdbcvn8myqaq0ab6lyd43493fnkv9a1407dimpxb03d"; 15 }; 16 + 17 + kernelTests = args.kernelTests or [ nixosTests.kernel-generic.linux_testing ]; 18 19 # Should the testing kernels ever be built on Hydra? 20 extraMeta.hydraPlatforms = [];
+12 -9
pkgs/servers/home-assistant/component-packages.nix
··· 2 # Do not edit! 3 4 { 5 - version = "2021.3.4"; 6 components = { 7 "abode" = ps: with ps; [ abodepy ]; 8 "accuweather" = ps: with ps; [ accuweather ]; ··· 31 "ambient_station" = ps: with ps; [ aioambient ]; 32 "amcrest" = ps: with ps; [ amcrest ha-ffmpeg ]; 33 "ampio" = ps: with ps; [ ]; # missing inputs: asmog 34 "android_ip_webcam" = ps: with ps; [ ]; # missing inputs: pydroid-ipcam 35 "androidtv" = ps: with ps; [ adb-shell androidtv pure-python-adb ]; 36 "anel_pwrctrl" = ps: with ps; [ ]; # missing inputs: anel_pwrctrl-homeassistant ··· 57 "atag" = ps: with ps; [ ]; # missing inputs: pyatag 58 "aten_pe" = ps: with ps; [ atenpdu ]; 59 "atome" = ps: with ps; [ ]; # missing inputs: pyatome 60 - "august" = ps: with ps; [ ]; # missing inputs: py-august 61 "aurora" = ps: with ps; [ auroranoaa ]; 62 "aurora_abb_powerone" = ps: with ps; [ ]; # missing inputs: aurorapy 63 "auth" = ps: with ps; [ aiohttp-cors ]; ··· 154 "deconz" = ps: with ps; [ pydeconz ]; 155 "decora" = ps: with ps; [ bluepy ]; # missing inputs: decora 156 "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 "delijn" = ps: with ps; [ ]; # missing inputs: pydelijn 159 "deluge" = ps: with ps; [ deluge-client ]; 160 "demo" = ps: with ps; [ aiohttp-cors ]; ··· 167 "device_tracker" = ps: with ps; [ ]; 168 "devolo_home_control" = ps: with ps; [ aiohttp-cors devolo-home-control-api zeroconf ]; 169 "dexcom" = ps: with ps; [ pydexcom ]; 170 - "dhcp" = ps: with ps; [ scapy ]; 171 "dht" = ps: with ps; [ ]; # missing inputs: Adafruit-DHT 172 "dialogflow" = ps: with ps; [ aiohttp-cors ]; 173 "digital_ocean" = ps: with ps; [ digital-ocean ]; ··· 277 "foscam" = ps: with ps; [ ]; # missing inputs: libpyfoscam 278 "foursquare" = ps: with ps; [ aiohttp-cors ]; 279 "free_mobile" = ps: with ps; [ ]; # missing inputs: freesms 280 - "freebox" = ps: with ps; [ aiohttp-cors freebox-api netdisco zeroconf ]; 281 "freedns" = ps: with ps; [ ]; 282 "fritz" = ps: with ps; [ fritzconnection ]; 283 "fritzbox" = ps: with ps; [ pyfritzhome ]; ··· 326 "gree" = ps: with ps; [ ]; # missing inputs: greeclimate 327 "greeneye_monitor" = ps: with ps; [ ]; # missing inputs: greeneye_monitor 328 "greenwave" = ps: with ps; [ ]; # missing inputs: greenwavereality 329 - "griddy" = ps: with ps; [ ]; # missing inputs: griddypower 330 "group" = ps: with ps; [ ]; 331 "growatt_server" = ps: with ps; [ ]; # missing inputs: growattServer 332 "gstreamer" = ps: with ps; [ ]; # missing inputs: gstreamer-player ··· 352 "hive" = ps: with ps; [ ]; # missing inputs: pyhiveapi 353 "hlk_sw16" = ps: with ps; [ ]; # missing inputs: hlk-sw16 354 "home_connect" = ps: with ps; [ aiohttp-cors ]; # missing inputs: homeconnect 355 "homeassistant" = ps: with ps; [ ]; 356 "homekit" = ps: with ps; [ HAP-python pyqrcode pyturbojpeg aiohttp-cors base36 fnvhash ha-ffmpeg zeroconf ]; 357 "homekit_controller" = ps: with ps; [ aiohomekit aiohttp-cors zeroconf ]; ··· 448 "linux_battery" = ps: with ps; [ batinfo ]; 449 "lirc" = ps: with ps; [ ]; # missing inputs: python-lirc 450 "litejet" = ps: with ps; [ ]; # missing inputs: pylitejet 451 - "litterrobot" = ps: with ps; [ ]; # missing inputs: pylitterbot 452 "llamalab_automate" = ps: with ps; [ ]; 453 "local_file" = ps: with ps; [ ]; 454 "local_ip" = ps: with ps; [ ]; ··· 715 "scene" = ps: with ps; [ ]; 716 "schluter" = ps: with ps; [ ]; # missing inputs: py-schluter 717 "scrape" = ps: with ps; [ beautifulsoup4 jsonpath xmltodict ]; 718 "script" = ps: with ps; [ ]; 719 "scsgate" = ps: with ps; [ ]; # missing inputs: scsgate 720 "search" = ps: with ps; [ aiohttp-cors ]; ··· 864 "tplink" = ps: with ps; [ pyhs100 ]; 865 "tplink_lte" = ps: with ps; [ ]; # missing inputs: tp-connected 866 "traccar" = ps: with ps; [ aiohttp-cors stringcase ]; # missing inputs: pytraccar 867 "trackr" = ps: with ps; [ ]; # missing inputs: pytrackr 868 "tradfri" = ps: with ps; [ ]; # missing inputs: pytradfri[async] 869 "trafikverket_train" = ps: with ps; [ pytrafikverket ]; ··· 906 "velux" = ps: with ps; [ pyvlx ]; 907 "venstar" = ps: with ps; [ venstarcolortouch ]; 908 "vera" = ps: with ps; [ pyvera ]; 909 - "verisure" = ps: with ps; [ jsonpath vsure ]; 910 "versasense" = ps: with ps; [ ]; # missing inputs: pyversasense 911 "version" = ps: with ps; [ pyhaversion ]; 912 "vesync" = ps: with ps; [ pyvesync ]; ··· 974 "zeroconf" = ps: with ps; [ aiohttp-cors zeroconf ]; 975 "zerproc" = ps: with ps; [ pyzerproc ]; 976 "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 ]; 978 "zhong_hong" = ps: with ps; [ ]; # missing inputs: zhong_hong_hvac 979 "ziggo_mediabox_xl" = ps: with ps; [ ]; # missing inputs: ziggo-mediabox-xl 980 "zodiac" = ps: with ps; [ ];
··· 2 # Do not edit! 3 4 { 5 + version = "2021.4.0"; 6 components = { 7 "abode" = ps: with ps; [ abodepy ]; 8 "accuweather" = ps: with ps; [ accuweather ]; ··· 31 "ambient_station" = ps: with ps; [ aioambient ]; 32 "amcrest" = ps: with ps; [ amcrest ha-ffmpeg ]; 33 "ampio" = ps: with ps; [ ]; # missing inputs: asmog 34 + "analytics" = ps: with ps; [ aiohttp-cors ]; 35 "android_ip_webcam" = ps: with ps; [ ]; # missing inputs: pydroid-ipcam 36 "androidtv" = ps: with ps; [ adb-shell androidtv pure-python-adb ]; 37 "anel_pwrctrl" = ps: with ps; [ ]; # missing inputs: anel_pwrctrl-homeassistant ··· 58 "atag" = ps: with ps; [ ]; # missing inputs: pyatag 59 "aten_pe" = ps: with ps; [ atenpdu ]; 60 "atome" = ps: with ps; [ ]; # missing inputs: pyatome 61 + "august" = ps: with ps; [ yalexs ]; 62 "aurora" = ps: with ps; [ auroranoaa ]; 63 "aurora_abb_powerone" = ps: with ps; [ ]; # missing inputs: aurorapy 64 "auth" = ps: with ps; [ aiohttp-cors ]; ··· 155 "deconz" = ps: with ps; [ pydeconz ]; 156 "decora" = ps: with ps; [ bluepy ]; # missing inputs: decora 157 "decora_wifi" = ps: with ps; [ ]; # missing inputs: decora_wifi 158 + "default_config" = ps: with ps; [ pynacl aiodiscover aiohttp-cors async-upnp-client defusedxml distro emoji hass-nabucasa netdisco pillow scapy sqlalchemy zeroconf ]; 159 "delijn" = ps: with ps; [ ]; # missing inputs: pydelijn 160 "deluge" = ps: with ps; [ deluge-client ]; 161 "demo" = ps: with ps; [ aiohttp-cors ]; ··· 168 "device_tracker" = ps: with ps; [ ]; 169 "devolo_home_control" = ps: with ps; [ aiohttp-cors devolo-home-control-api zeroconf ]; 170 "dexcom" = ps: with ps; [ pydexcom ]; 171 + "dhcp" = ps: with ps; [ aiodiscover scapy ]; 172 "dht" = ps: with ps; [ ]; # missing inputs: Adafruit-DHT 173 "dialogflow" = ps: with ps; [ aiohttp-cors ]; 174 "digital_ocean" = ps: with ps; [ digital-ocean ]; ··· 278 "foscam" = ps: with ps; [ ]; # missing inputs: libpyfoscam 279 "foursquare" = ps: with ps; [ aiohttp-cors ]; 280 "free_mobile" = ps: with ps; [ ]; # missing inputs: freesms 281 + "freebox" = ps: with ps; [ freebox-api ]; 282 "freedns" = ps: with ps; [ ]; 283 "fritz" = ps: with ps; [ fritzconnection ]; 284 "fritzbox" = ps: with ps; [ pyfritzhome ]; ··· 327 "gree" = ps: with ps; [ ]; # missing inputs: greeclimate 328 "greeneye_monitor" = ps: with ps; [ ]; # missing inputs: greeneye_monitor 329 "greenwave" = ps: with ps; [ ]; # missing inputs: greenwavereality 330 "group" = ps: with ps; [ ]; 331 "growatt_server" = ps: with ps; [ ]; # missing inputs: growattServer 332 "gstreamer" = ps: with ps; [ ]; # missing inputs: gstreamer-player ··· 352 "hive" = ps: with ps; [ ]; # missing inputs: pyhiveapi 353 "hlk_sw16" = ps: with ps; [ ]; # missing inputs: hlk-sw16 354 "home_connect" = ps: with ps; [ aiohttp-cors ]; # missing inputs: homeconnect 355 + "home_plus_control" = ps: with ps; [ aiohttp-cors homepluscontrol ]; 356 "homeassistant" = ps: with ps; [ ]; 357 "homekit" = ps: with ps; [ HAP-python pyqrcode pyturbojpeg aiohttp-cors base36 fnvhash ha-ffmpeg zeroconf ]; 358 "homekit_controller" = ps: with ps; [ aiohomekit aiohttp-cors zeroconf ]; ··· 449 "linux_battery" = ps: with ps; [ batinfo ]; 450 "lirc" = ps: with ps; [ ]; # missing inputs: python-lirc 451 "litejet" = ps: with ps; [ ]; # missing inputs: pylitejet 452 + "litterrobot" = ps: with ps; [ pylitterbot ]; 453 "llamalab_automate" = ps: with ps; [ ]; 454 "local_file" = ps: with ps; [ ]; 455 "local_ip" = ps: with ps; [ ]; ··· 716 "scene" = ps: with ps; [ ]; 717 "schluter" = ps: with ps; [ ]; # missing inputs: py-schluter 718 "scrape" = ps: with ps; [ beautifulsoup4 jsonpath xmltodict ]; 719 + "screenlogic" = ps: with ps; [ screenlogicpy ]; 720 "script" = ps: with ps; [ ]; 721 "scsgate" = ps: with ps; [ ]; # missing inputs: scsgate 722 "search" = ps: with ps; [ aiohttp-cors ]; ··· 866 "tplink" = ps: with ps; [ pyhs100 ]; 867 "tplink_lte" = ps: with ps; [ ]; # missing inputs: tp-connected 868 "traccar" = ps: with ps; [ aiohttp-cors stringcase ]; # missing inputs: pytraccar 869 + "trace" = ps: with ps; [ ]; 870 "trackr" = ps: with ps; [ ]; # missing inputs: pytrackr 871 "tradfri" = ps: with ps; [ ]; # missing inputs: pytradfri[async] 872 "trafikverket_train" = ps: with ps; [ pytrafikverket ]; ··· 909 "velux" = ps: with ps; [ pyvlx ]; 910 "venstar" = ps: with ps; [ venstarcolortouch ]; 911 "vera" = ps: with ps; [ pyvera ]; 912 + "verisure" = ps: with ps; [ vsure ]; 913 "versasense" = ps: with ps; [ ]; # missing inputs: pyversasense 914 "version" = ps: with ps; [ pyhaversion ]; 915 "vesync" = ps: with ps; [ pyvesync ]; ··· 977 "zeroconf" = ps: with ps; [ aiohttp-cors zeroconf ]; 978 "zerproc" = ps: with ps; [ pyzerproc ]; 979 "zestimate" = ps: with ps; [ xmltodict ]; 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 ]; 981 "zhong_hong" = ps: with ps; [ ]; # missing inputs: zhong_hong_hvac 982 "ziggo_mediabox_xl" = ps: with ps; [ ]; # missing inputs: ziggo-mediabox-xl 983 "zodiac" = ps: with ps; [ ];
+32 -17
pkgs/servers/home-assistant/default.nix
··· 1 { stdenv 2 , lib 3 , fetchFromGitHub 4 - , fetchpatch 5 , python3 6 , nixosTests 7 ··· 43 }); 44 }) 45 46 # Pinned due to bug in ring-doorbell 0.7.0 47 # https://github.com/tchellomello/python-ring-doorbell/issues/240 48 (mkOverride "ring-doorbell" "0.6.2" ··· 81 extraBuildInputs = extraPackages py.pkgs; 82 83 # Don't forget to run parse-requirements.py after updating 84 - hassVersion = "2021.3.4"; 85 86 in with py.pkgs; buildPythonApplication rec { 87 pname = "homeassistant"; ··· 100 owner = "home-assistant"; 101 repo = "core"; 102 rev = version; 103 - sha256 = "110pvin39lr40zd3lhb8zvh2wafl0k0dy3nbmc483yafy31xa4kw"; 104 }; 105 106 # leave this in, so users don't have to constantly update their downstream patch handling 107 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 ]; 115 116 postPatch = '' 117 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" \ 122 --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 --replace "pip>=8.0.3,<20.3" "pip" \ 126 - --replace "pytz>=2021.1" "pytz>=2020.5" \ 127 --replace "pyyaml==5.4.1" "pyyaml" \ 128 - --replace "ruamel.yaml==0.15.100" "ruamel.yaml>=0.15.100" 129 substituteInPlace tests/test_config.py --replace '"/usr"' '"/build/media"' 130 ''; 131 ··· 179 componentTests = [ 180 "accuweather" 181 "airly" 182 "alert" 183 "api" 184 "auth" ··· 231 "hddtemp" 232 "history" 233 "history_stats" 234 "homekit" 235 "homekit_controller" 236 "homeassistant" ··· 253 "ipp" 254 "kmtronic" 255 "light" 256 "local_file" 257 "local_ip" 258 "lock" ··· 298 "rss_feed_template" 299 "safe_mode" 300 "scene" 301 "script" 302 "search" 303 "shell_command" ··· 328 "time_date" 329 "timer" 330 "tod" 331 "tts" 332 "universal" 333 "updater" ··· 357 "--dist loadfile" 358 # tests are located in tests/ 359 "tests" 360 # dynamically add packages required for component tests 361 ] ++ map (component: "tests/components/" + component) componentTests; 362 ··· 379 # generic/test_camera.py: AssertionError: 500 == 200 380 "test_fetching_without_verify_ssl" 381 "test_fetching_url_with_verify_ssl" 382 ]; 383 384 preCheck = '' 385 # the tests require the existance of a media dir 386 mkdir /build/media 387
··· 1 { stdenv 2 , lib 3 , fetchFromGitHub 4 , python3 5 , nixosTests 6 ··· 42 }); 43 }) 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 + 60 # Pinned due to bug in ring-doorbell 0.7.0 61 # https://github.com/tchellomello/python-ring-doorbell/issues/240 62 (mkOverride "ring-doorbell" "0.6.2" ··· 95 extraBuildInputs = extraPackages py.pkgs; 96 97 # Don't forget to run parse-requirements.py after updating 98 + hassVersion = "2021.4.0"; 99 100 in with py.pkgs; buildPythonApplication rec { 101 pname = "homeassistant"; ··· 114 owner = "home-assistant"; 115 repo = "core"; 116 rev = version; 117 + sha256 = "1gkbkyxqsw3isdyskzi0ib07fgqvirnr20jkhrz86vl0k9ix8hwf"; 118 }; 119 120 # leave this in, so users don't have to constantly update their downstream patch handling 121 patches = [ 122 ]; 123 124 postPatch = '' 125 substituteInPlace setup.py \ 126 + --replace "awesomeversion==21.2.3" "awesomeversion" \ 127 + --replace "bcrypt==3.1.7" "bcrypt" \ 128 --replace "cryptography==3.3.2" "cryptography" \ 129 --replace "pip>=8.0.3,<20.3" "pip" \ 130 + --replace "pytz>=2021.1" "pytz" \ 131 --replace "pyyaml==5.4.1" "pyyaml" \ 132 + --replace "ruamel.yaml==0.15.100" "ruamel.yaml" 133 substituteInPlace tests/test_config.py --replace '"/usr"' '"/build/media"' 134 ''; 135 ··· 183 componentTests = [ 184 "accuweather" 185 "airly" 186 + "analytics" 187 "alert" 188 "api" 189 "auth" ··· 236 "hddtemp" 237 "history" 238 "history_stats" 239 + "home_plus_control" 240 "homekit" 241 "homekit_controller" 242 "homeassistant" ··· 259 "ipp" 260 "kmtronic" 261 "light" 262 + "litterrobot" 263 "local_file" 264 "local_ip" 265 "lock" ··· 305 "rss_feed_template" 306 "safe_mode" 307 "scene" 308 + "screenlogic" 309 "script" 310 "search" 311 "shell_command" ··· 336 "time_date" 337 "timer" 338 "tod" 339 + "trace" 340 "tts" 341 "universal" 342 "updater" ··· 366 "--dist loadfile" 367 # tests are located in tests/ 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" 371 # dynamically add packages required for component tests 372 ] ++ map (component: "tests/components/" + component) componentTests; 373 ··· 390 # generic/test_camera.py: AssertionError: 500 == 200 391 "test_fetching_without_verify_ssl" 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" 395 ]; 396 397 preCheck = '' 398 + export HOME="$TEMPDIR" 399 + 400 # the tests require the existance of a media dir 401 mkdir /build/media 402
+2 -2
pkgs/servers/home-assistant/frontend.nix
··· 4 # the frontend version corresponding to a specific home-assistant version can be found here 5 # https://github.com/home-assistant/home-assistant/blob/master/homeassistant/components/frontend/manifest.json 6 pname = "home-assistant-frontend"; 7 - version = "20210302.6"; 8 9 src = fetchPypi { 10 inherit pname version; 11 - sha256 = "sha256-h3jCqfAPg+z6vsdLm5Pdr+7PCEWW58GCG9viIz3Mi64="; 12 }; 13 14 # there is nothing to strip in this package
··· 4 # the frontend version corresponding to a specific home-assistant version can be found here 5 # https://github.com/home-assistant/home-assistant/blob/master/homeassistant/components/frontend/manifest.json 6 pname = "home-assistant-frontend"; 7 + version = "20210407.1"; 8 9 src = fetchPypi { 10 inherit pname version; 11 + sha256 = "sha256-7kgL6Ixlc1OZ+3sUAuvJd7vgY6FBgPFEKi6xhq7fiBc="; 12 }; 13 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 - }: 7 8 - stdenv.mkDerivation rec { 9 - version = "3.7.1"; 10 - pname = "sshfs-fuse"; 11 12 - src = fetchFromGitHub { 13 - owner = "libfuse"; 14 - repo = "sshfs"; 15 - rev = "sshfs-${version}"; 16 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 - }
··· 1 + { lib, stdenv, callPackage, fetchpatch }: 2 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 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"; 26 sha256 = "088mgcsqv9f2vly4xn6lvvkmqkgr9jjmjs9qp8938hl7j6rrgd17"; 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 qt-3 = throw "qt-3 has been removed from nixpkgs, as it's unmaintained and insecure"; # added 2021-02-15 621 rfkill = throw "rfkill has been removed, as it's included in util-linux"; # added 2020-08-23 622 riak-cs = throw "riak-cs is not maintained anymore"; # added 2020-10-14 623 - radare2-cutter = cutter; 624 rkt = throw "rkt was archived by upstream"; # added 2020-05-16 625 ruby_2_0_0 = throw "ruby_2_0_0 was deprecated on 2018-02-13: use a newer version of ruby"; 626 ruby_2_1_0 = throw "ruby_2_1_0 was deprecated on 2018-02-13: use a newer version of ruby";
··· 620 qt-3 = throw "qt-3 has been removed from nixpkgs, as it's unmaintained and insecure"; # added 2021-02-15 621 rfkill = throw "rfkill has been removed, as it's included in util-linux"; # added 2020-08-23 622 riak-cs = throw "riak-cs is not maintained anymore"; # added 2020-10-14 623 + radare2-cutter = cutter; # added 2021-03-30 624 rkt = throw "rkt was archived by upstream"; # added 2020-05-16 625 ruby_2_0_0 = throw "ruby_2_0_0 was deprecated on 2018-02-13: use a newer version of ruby"; 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 2253 discount = callPackage ../tools/text/discount { }; 2254 2255 discocss = callPackage ../tools/misc/discocss { }; 2256 2257 disfetch = callPackage ../tools/misc/disfetch { }; ··· 7108 openssh_gssapi = opensshPackages.openssh_gssapi.override { 7109 etcDir = "/etc/ssh"; 7110 }; 7111 7112 opensp = callPackage ../tools/text/sgml/opensp { }; 7113 ··· 17631 stdenv = gcc6Stdenv; 17632 }); 17633 17634 - v8_6_x = v8; 17635 v8 = callPackage ../development/libraries/v8 { 17636 inherit (python2Packages) python; 17637 - } // lib.optionalAttrs stdenv.isLinux { 17638 - # doesn't build with gcc7 17639 - stdenv = gcc6Stdenv; 17640 }; 17641 17642 vaapiIntel = callPackage ../development/libraries/vaapi-intel { }; ··· 21997 21998 blogc = callPackage ../applications/misc/blogc { }; 21999 22000 bluefish = callPackage ../applications/editors/bluefish { 22001 gtk = gtk3; 22002 }; ··· 22049 22050 caerbannog = callPackage ../applications/misc/caerbannog { }; 22051 22052 - cage = callPackage ../applications/window-managers/cage { }; 22053 22054 calf = callPackage ../applications/audio/calf { 22055 inherit (gnome2) libglade; ··· 23488 23489 super-productivity = callPackage ../applications/networking/super-productivity { }; 23490 23491 - wlroots = callPackage ../development/libraries/wlroots { }; 23492 23493 sway-unwrapped = callPackage ../applications/window-managers/sway { }; 23494 sway = callPackage ../applications/window-managers/sway/wrapper.nix { }; ··· 23510 23511 wbg = callPackage ../applications/misc/wbg { }; 23512 23513 - hikari = callPackage ../applications/window-managers/hikari { }; 23514 23515 i3 = callPackage ../applications/window-managers/i3 { 23516 xcb-util-cursor = if stdenv.isDarwin then xcb-util-cursor-HEAD else xcb-util-cursor; ··· 23572 23573 i3-wk-switch = callPackage ../applications/window-managers/i3/wk-switch.nix { }; 23574 23575 - waybox = callPackage ../applications/window-managers/waybox { }; 23576 23577 windowchef = callPackage ../applications/window-managers/windowchef/default.nix { }; 23578 ··· 26443 26444 wayfireApplications = wayfireApplications-unwrapped.withPlugins (plugins: [ plugins.wf-shell ]); 26445 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 - }); 26450 wf-config = callPackage ../applications/window-managers/wayfire/wf-config.nix { }; 26451 26452 waypipe = callPackage ../applications/networking/remote/waypipe { }; ··· 26488 26489 weston = callPackage ../applications/window-managers/weston { pipewire = pipewire_0_2; }; 26490 26491 - wio = callPackage ../applications/window-managers/wio { }; 26492 26493 whitebox-tools = callPackage ../applications/gis/whitebox-tools { 26494 inherit (darwin.apple_sdk.frameworks) Security; ··· 30817 30818 bottom = callPackage ../tools/system/bottom {}; 30819 30820 - cagebreak = callPackage ../applications/window-managers/cagebreak/default.nix {}; 30821 30822 psftools = callPackage ../os-specific/linux/psftools {}; 30823
··· 2252 2253 discount = callPackage ../tools/text/discount { }; 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 + 2263 discocss = callPackage ../tools/misc/discocss { }; 2264 2265 disfetch = callPackage ../tools/misc/disfetch { }; ··· 7116 openssh_gssapi = opensshPackages.openssh_gssapi.override { 7117 etcDir = "/etc/ssh"; 7118 }; 7119 + 7120 + ssh-copy-id = callPackage ../tools/networking/openssh/copyid.nix { }; 7121 7122 opensp = callPackage ../tools/text/sgml/opensp { }; 7123 ··· 17641 stdenv = gcc6Stdenv; 17642 }); 17643 17644 v8 = callPackage ../development/libraries/v8 { 17645 inherit (python2Packages) python; 17646 }; 17647 17648 vaapiIntel = callPackage ../development/libraries/vaapi-intel { }; ··· 22003 22004 blogc = callPackage ../applications/misc/blogc { }; 22005 22006 + blucontrol = callPackage ../applications/misc/blucontrol/wrapper.nix { 22007 + inherit (haskellPackages) ghcWithPackages; 22008 + }; 22009 + 22010 bluefish = callPackage ../applications/editors/bluefish { 22011 gtk = gtk3; 22012 }; ··· 22059 22060 caerbannog = callPackage ../applications/misc/caerbannog { }; 22061 22062 + cage = callPackage ../applications/window-managers/cage { 22063 + wlroots = wlroots_0_12; 22064 + }; 22065 22066 calf = callPackage ../applications/audio/calf { 22067 inherit (gnome2) libglade; ··· 23500 23501 super-productivity = callPackage ../applications/networking/super-productivity { }; 23502 23503 + wlroots = callPackage ../development/libraries/wlroots { 23504 + inherit (xorg) xcbutilrenderutil; 23505 + }; 23506 + 23507 + wlroots_0_12 = callPackage ../development/libraries/wlroots/0.12.nix {}; 23508 23509 sway-unwrapped = callPackage ../applications/window-managers/sway { }; 23510 sway = callPackage ../applications/window-managers/sway/wrapper.nix { }; ··· 23526 23527 wbg = callPackage ../applications/misc/wbg { }; 23528 23529 + hikari = callPackage ../applications/window-managers/hikari { 23530 + wlroots = wlroots_0_12; 23531 + }; 23532 23533 i3 = callPackage ../applications/window-managers/i3 { 23534 xcb-util-cursor = if stdenv.isDarwin then xcb-util-cursor-HEAD else xcb-util-cursor; ··· 23590 23591 i3-wk-switch = callPackage ../applications/window-managers/i3/wk-switch.nix { }; 23592 23593 + waybox = callPackage ../applications/window-managers/waybox { 23594 + wlroots = wlroots_0_12; 23595 + }; 23596 23597 windowchef = callPackage ../applications/window-managers/windowchef/default.nix { }; 23598 ··· 26463 26464 wayfireApplications = wayfireApplications-unwrapped.withPlugins (plugins: [ plugins.wf-shell ]); 26465 inherit (wayfireApplications) wayfire wcm; 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 + ); 26475 wf-config = callPackage ../applications/window-managers/wayfire/wf-config.nix { }; 26476 26477 waypipe = callPackage ../applications/networking/remote/waypipe { }; ··· 26513 26514 weston = callPackage ../applications/window-managers/weston { pipewire = pipewire_0_2; }; 26515 26516 + wio = callPackage ../applications/window-managers/wio { 26517 + wlroots = wlroots_0_12; 26518 + }; 26519 26520 whitebox-tools = callPackage ../applications/gis/whitebox-tools { 26521 inherit (darwin.apple_sdk.frameworks) Security; ··· 30844 30845 bottom = callPackage ../tools/system/bottom {}; 30846 30847 + cagebreak = callPackage ../applications/window-managers/cagebreak/default.nix { 30848 + wlroots = wlroots_0_12; 30849 + }; 30850 30851 psftools = callPackage ../os-specific/linux/psftools {}; 30852
+4 -4
pkgs/top-level/php-packages.nix
··· 146 147 sha256 = "103nys7zkpi1hifqp9miyl0m1mn07xqshw3sapyz365nb35g5q71"; 148 149 - buildInputs = [ pkgs.v8_6_x ]; 150 - configureFlags = [ "--with-v8=${pkgs.v8_6_x}" ]; 151 152 meta.maintainers = lib.teams.php.members; 153 meta.broken = true; ··· 159 160 sha256 = "0g63dyhhicngbgqg34wl91nm3556vzdgkq19gy52gvmqj47rj6rg"; 161 162 - buildInputs = [ pkgs.v8_6_x ]; 163 - configureFlags = [ "--with-v8js=${pkgs.v8_6_x}" ]; 164 165 meta.maintainers = lib.teams.php.members; 166 meta.broken = true;
··· 146 147 sha256 = "103nys7zkpi1hifqp9miyl0m1mn07xqshw3sapyz365nb35g5q71"; 148 149 + buildInputs = [ pkgs.v8 ]; 150 + configureFlags = [ "--with-v8=${pkgs.v8}" ]; 151 152 meta.maintainers = lib.teams.php.members; 153 meta.broken = true; ··· 159 160 sha256 = "0g63dyhhicngbgqg34wl91nm3556vzdgkq19gy52gvmqj47rj6rg"; 161 162 + buildInputs = [ pkgs.v8 ]; 163 + configureFlags = [ "--with-v8js=${pkgs.v8}" ]; 164 165 meta.maintainers = lib.teams.php.members; 166 meta.broken = true;
+8
pkgs/top-level/python-packages.nix
··· 549 550 asyncio-mqtt = callPackage ../development/python-modules/asyncio_mqtt { }; 551 552 asyncio-throttle = callPackage ../development/python-modules/asyncio-throttle { }; 553 554 asyncpg = callPackage ../development/python-modules/asyncpg { }; ··· 4530 4531 nassl = callPackage ../development/python-modules/nassl { }; 4532 4533 natsort = callPackage ../development/python-modules/natsort { }; 4534 4535 naturalsort = callPackage ../development/python-modules/naturalsort { }; ··· 7196 rebulk = callPackage ../development/python-modules/rebulk { }; 7197 7198 recaptcha_client = callPackage ../development/python-modules/recaptcha_client { }; 7199 7200 recommonmark = callPackage ../development/python-modules/recommonmark { }; 7201
··· 549 550 asyncio-mqtt = callPackage ../development/python-modules/asyncio_mqtt { }; 551 552 + asyncio-nats-client = callPackage ../development/python-modules/asyncio-nats-client { }; 553 + 554 asyncio-throttle = callPackage ../development/python-modules/asyncio-throttle { }; 555 556 asyncpg = callPackage ../development/python-modules/asyncpg { }; ··· 4532 4533 nassl = callPackage ../development/python-modules/nassl { }; 4534 4535 + nats-python = callPackage ../development/python-modules/nats-python { }; 4536 + 4537 natsort = callPackage ../development/python-modules/natsort { }; 4538 4539 naturalsort = callPackage ../development/python-modules/naturalsort { }; ··· 7200 rebulk = callPackage ../development/python-modules/rebulk { }; 7201 7202 recaptcha_client = callPackage ../development/python-modules/recaptcha_client { }; 7203 + 7204 + recoll = disabledIf (!isPy3k) (toPythonModule (pkgs.recoll.override { 7205 + python3Packages = self; 7206 + })); 7207 7208 recommonmark = callPackage ../development/python-modules/recommonmark { }; 7209