]> Git — Sourcephile - sourcephile-nix.git/blob - nixpkgs/patches/sourcehut.diff
carotte: fix CORENAME_MAX_SIZE
[sourcephile-nix.git] / nixpkgs / patches / sourcehut.diff
1 diff --git a/nixos/lib/make-options-doc/options-to-docbook.xsl b/nixos/lib/make-options-doc/options-to-docbook.xsl
2 index da4cd164bf2..30190788f33 100644
3 --- a/nixos/lib/make-options-doc/options-to-docbook.xsl
4 +++ b/nixos/lib/make-options-doc/options-to-docbook.xsl
5 @@ -20,7 +20,7 @@
6 <title>Configuration Options</title>
7 <variablelist xml:id="configuration-variable-list">
8 <xsl:for-each select="attrs">
9 - <xsl:variable name="id" select="concat('opt-', str:replace(str:replace(str:replace(attr[@name = 'name']/string/@value, '*', '_'), '&lt;', '_'), '>', '_'))" />
10 + <xsl:variable name="id" select="concat('opt-', str:replace(str:replace(str:replace(str:replace(attr[@name = 'name']/string/@value, '*', '_'), '&lt;', '_'), '>', '_'), ':', '_'))" />
11 <varlistentry>
12 <term xlink:href="#{$id}">
13 <xsl:attribute name="xml:id"><xsl:value-of select="$id"/></xsl:attribute>
14 diff --git a/nixos/modules/services/databases/redis.nix b/nixos/modules/services/databases/redis.nix
15 index 578d9d9ec8d..e7ca0d4e34c 100644
16 --- a/nixos/modules/services/databases/redis.nix
17 +++ b/nixos/modules/services/databases/redis.nix
18 @@ -5,17 +5,18 @@ with lib;
19 let
20 cfg = config.services.redis;
21
22 - ulimitNofile = cfg.maxclients + 32;
23 -
24 mkValueString = value:
25 if value == true then "yes"
26 else if value == false then "no"
27 else generators.mkValueStringDefault { } value;
28
29 - redisConfig = pkgs.writeText "redis.conf" (generators.toKeyValue {
30 + redisConfig = settings: pkgs.writeText "redis.conf" (generators.toKeyValue {
31 listsAsDuplicateKeys = true;
32 mkKeyValue = generators.mkKeyValueDefault { inherit mkValueString; } " ";
33 - } cfg.settings);
34 + } settings);
35 +
36 + redisName = name: "redis" + optionalString (name != "") ("-"+name);
37 + enabledServers = filterAttrs (name: conf: conf.enable) config.services.redis.servers;
38
39 in {
40 imports = [
41 @@ -25,6 +26,27 @@ in {
42 (mkRemovedOptionModule [ "services" "redis" "appendOnlyFilename" ] "This option was never used.")
43 (mkRemovedOptionModule [ "services" "redis" "pidFile" ] "This option was removed.")
44 (mkRemovedOptionModule [ "services" "redis" "extraConfig" ] "Use services.redis.settings instead.")
45 + (mkRenamedOptionModule [ "services" "redis" "enable"] [ "services" "redis" "servers" "" "enable" ])
46 + (mkRenamedOptionModule [ "services" "redis" "port"] [ "services" "redis" "servers" "" "port" ])
47 + (mkRenamedOptionModule [ "services" "redis" "openFirewall"] [ "services" "redis" "servers" "" "openFirewall" ])
48 + (mkRenamedOptionModule [ "services" "redis" "bind"] [ "services" "redis" "servers" "" "bind" ])
49 + (mkRenamedOptionModule [ "services" "redis" "unixSocket"] [ "services" "redis" "servers" "" "unixSocket" ])
50 + (mkRenamedOptionModule [ "services" "redis" "unixSocketPerm"] [ "services" "redis" "servers" "" "unixSocketPerm" ])
51 + (mkRenamedOptionModule [ "services" "redis" "logLevel"] [ "services" "redis" "servers" "" "logLevel" ])
52 + (mkRenamedOptionModule [ "services" "redis" "logfile"] [ "services" "redis" "servers" "" "logfile" ])
53 + (mkRenamedOptionModule [ "services" "redis" "syslog"] [ "services" "redis" "servers" "" "syslog" ])
54 + (mkRenamedOptionModule [ "services" "redis" "databases"] [ "services" "redis" "servers" "" "databases" ])
55 + (mkRenamedOptionModule [ "services" "redis" "maxclients"] [ "services" "redis" "servers" "" "maxclients" ])
56 + (mkRenamedOptionModule [ "services" "redis" "save"] [ "services" "redis" "servers" "" "save" ])
57 + (mkRenamedOptionModule [ "services" "redis" "slaveOf"] [ "services" "redis" "servers" "" "slaveOf" ])
58 + (mkRenamedOptionModule [ "services" "redis" "masterAuth"] [ "services" "redis" "servers" "" "masterAuth" ])
59 + (mkRenamedOptionModule [ "services" "redis" "requirePass"] [ "services" "redis" "servers" "" "requirePass" ])
60 + (mkRenamedOptionModule [ "services" "redis" "requirePassFile"] [ "services" "redis" "servers" "" "requirePassFile" ])
61 + (mkRenamedOptionModule [ "services" "redis" "appendOnly"] [ "services" "redis" "servers" "" "appendOnly" ])
62 + (mkRenamedOptionModule [ "services" "redis" "appendFsync"] [ "services" "redis" "servers" "" "appendFsync" ])
63 + (mkRenamedOptionModule [ "services" "redis" "slowLogLogSlowerThan"] [ "services" "redis" "servers" "" "slowLogLogSlowerThan" ])
64 + (mkRenamedOptionModule [ "services" "redis" "slowLogMaxLen"] [ "services" "redis" "servers" "" "slowLogMaxLen" ])
65 + (mkRenamedOptionModule [ "services" "redis" "settings"] [ "services" "redis" "servers" "" "settings" ])
66 ];
67
68 ###### interface
69 @@ -32,18 +54,6 @@ in {
70 options = {
71
72 services.redis = {
73 -
74 - enable = mkOption {
75 - type = types.bool;
76 - default = false;
77 - description = ''
78 - Whether to enable the Redis server. Note that the NixOS module for
79 - Redis disables kernel support for Transparent Huge Pages (THP),
80 - because this features causes major performance problems for Redis,
81 - e.g. (https://redis.io/topics/latency).
82 - '';
83 - };
84 -
85 package = mkOption {
86 type = types.package;
87 default = pkgs.redis;
88 @@ -51,176 +61,226 @@ in {
89 description = "Which Redis derivation to use.";
90 };
91
92 - port = mkOption {
93 - type = types.port;
94 - default = 6379;
95 - description = "The port for Redis to listen to.";
96 - };
97 + vmOverCommit = mkEnableOption ''
98 + setting of vm.overcommit_memory to 1
99 + (Suggested for Background Saving: http://redis.io/topics/faq)
100 + '';
101
102 - vmOverCommit = mkOption {
103 - type = types.bool;
104 - default = false;
105 - description = ''
106 - Set vm.overcommit_memory to 1 (Suggested for Background Saving: http://redis.io/topics/faq)
107 - '';
108 - };
109 -
110 - openFirewall = mkOption {
111 - type = types.bool;
112 - default = false;
113 - description = ''
114 - Whether to open ports in the firewall for the server.
115 - '';
116 - };
117 -
118 - bind = mkOption {
119 - type = with types; nullOr str;
120 - default = "127.0.0.1";
121 - description = ''
122 - The IP interface to bind to.
123 - <literal>null</literal> means "all interfaces".
124 - '';
125 - example = "192.0.2.1";
126 - };
127 -
128 - unixSocket = mkOption {
129 - type = with types; nullOr path;
130 - default = null;
131 - description = "The path to the socket to bind to.";
132 - example = "/run/redis/redis.sock";
133 - };
134 -
135 - unixSocketPerm = mkOption {
136 - type = types.int;
137 - default = 750;
138 - description = "Change permissions for the socket";
139 - example = 700;
140 - };
141 -
142 - logLevel = mkOption {
143 - type = types.str;
144 - default = "notice"; # debug, verbose, notice, warning
145 - example = "debug";
146 - description = "Specify the server verbosity level, options: debug, verbose, notice, warning.";
147 - };
148 -
149 - logfile = mkOption {
150 - type = types.str;
151 - default = "/dev/null";
152 - description = "Specify the log file name. Also 'stdout' can be used to force Redis to log on the standard output.";
153 - example = "/var/log/redis.log";
154 - };
155 -
156 - syslog = mkOption {
157 - type = types.bool;
158 - default = true;
159 - description = "Enable logging to the system logger.";
160 - };
161 -
162 - databases = mkOption {
163 - type = types.int;
164 - default = 16;
165 - description = "Set the number of databases.";
166 - };
167 -
168 - maxclients = mkOption {
169 - type = types.int;
170 - default = 10000;
171 - description = "Set the max number of connected clients at the same time.";
172 - };
173 -
174 - save = mkOption {
175 - type = with types; listOf (listOf int);
176 - default = [ [900 1] [300 10] [60 10000] ];
177 - description = "The schedule in which data is persisted to disk, represented as a list of lists where the first element represent the amount of seconds and the second the number of changes.";
178 - };
179 -
180 - slaveOf = mkOption {
181 - type = with types; nullOr (submodule ({ ... }: {
182 + servers = mkOption {
183 + type = with types; attrsOf (submodule ({config, name, ...}@args: {
184 options = {
185 - ip = mkOption {
186 - type = str;
187 - description = "IP of the Redis master";
188 - example = "192.168.1.100";
189 + enable = mkEnableOption ''
190 + Redis server.
191 +
192 + Note that the NixOS module for Redis disables kernel support
193 + for Transparent Huge Pages (THP),
194 + because this features causes major performance problems for Redis,
195 + e.g. (https://redis.io/topics/latency).
196 + '';
197 +
198 + user = mkOption {
199 + type = types.str;
200 + default = redisName name;
201 + defaultText = "\"redis\" or \"redis-\${name}\" if name != \"\"";
202 + description = "The username and groupname for redis-server.";
203 };
204
205 port = mkOption {
206 - type = port;
207 - description = "port of the Redis master";
208 + type = types.port;
209 default = 6379;
210 + description = "The port for Redis to listen to.";
211 + };
212 +
213 + openFirewall = mkOption {
214 + type = types.bool;
215 + default = false;
216 + description = ''
217 + Whether to open ports in the firewall for the server.
218 + '';
219 + };
220 +
221 + bind = mkOption {
222 + type = with types; nullOr str;
223 + default = if name == "" then "127.0.0.1" else null;
224 + defaultText = "127.0.0.1 or null if name != \"\"";
225 + description = ''
226 + The IP interface to bind to.
227 + <literal>null</literal> means "all interfaces".
228 + '';
229 + example = "192.0.2.1";
230 + };
231 +
232 + unixSocket = mkOption {
233 + type = with types; nullOr path;
234 + default = "/run/${redisName name}/redis.sock";
235 + defaultText = "\"/run/redis/redis.sock\" or \"/run/redis-\${name}/redis.sock\" if name != \"\"";
236 + description = "The path to the socket to bind to.";
237 + };
238 +
239 + unixSocketPerm = mkOption {
240 + type = types.int;
241 + default = 660;
242 + description = "Change permissions for the socket";
243 + example = 600;
244 + };
245 +
246 + logLevel = mkOption {
247 + type = types.str;
248 + default = "notice"; # debug, verbose, notice, warning
249 + example = "debug";
250 + description = "Specify the server verbosity level, options: debug, verbose, notice, warning.";
251 + };
252 +
253 + logfile = mkOption {
254 + type = types.str;
255 + default = "/dev/null";
256 + description = "Specify the log file name. Also 'stdout' can be used to force Redis to log on the standard output.";
257 + example = "/var/log/redis.log";
258 + };
259 +
260 + syslog = mkOption {
261 + type = types.bool;
262 + default = true;
263 + description = "Enable logging to the system logger.";
264 + };
265 +
266 + databases = mkOption {
267 + type = types.int;
268 + default = 16;
269 + description = "Set the number of databases.";
270 + };
271 +
272 + maxclients = mkOption {
273 + type = types.int;
274 + default = 10000;
275 + description = "Set the max number of connected clients at the same time.";
276 + };
277 +
278 + save = mkOption {
279 + type = with types; listOf (listOf int);
280 + default = [ [900 1] [300 10] [60 10000] ];
281 + description = "The schedule in which data is persisted to disk, represented as a list of lists where the first element represent the amount of seconds and the second the number of changes.";
282 + };
283 +
284 + slaveOf = mkOption {
285 + type = with types; nullOr (submodule ({ ... }: {
286 + options = {
287 + ip = mkOption {
288 + type = str;
289 + description = "IP of the Redis master";
290 + example = "192.168.1.100";
291 + };
292 +
293 + port = mkOption {
294 + type = port;
295 + description = "port of the Redis master";
296 + default = 6379;
297 + };
298 + };
299 + }));
300 +
301 + default = null;
302 + description = "IP and port to which this redis instance acts as a slave.";
303 + example = { ip = "192.168.1.100"; port = 6379; };
304 + };
305 +
306 + masterAuth = mkOption {
307 + type = with types; nullOr str;
308 + default = null;
309 + description = ''If the master is password protected (using the requirePass configuration)
310 + it is possible to tell the slave to authenticate before starting the replication synchronization
311 + process, otherwise the master will refuse the slave request.
312 + (STORED PLAIN TEXT, WORLD-READABLE IN NIX STORE)'';
313 + };
314 +
315 + requirePass = mkOption {
316 + type = with types; nullOr str;
317 + default = null;
318 + description = ''
319 + Password for database (STORED PLAIN TEXT, WORLD-READABLE IN NIX STORE).
320 + Use requirePassFile to store it outside of the nix store in a dedicated file.
321 + '';
322 + example = "letmein!";
323 + };
324 +
325 + requirePassFile = mkOption {
326 + type = with types; nullOr path;
327 + default = null;
328 + description = "File with password for the database.";
329 + example = "/run/keys/redis-password";
330 + };
331 +
332 + appendOnly = mkOption {
333 + type = types.bool;
334 + default = false;
335 + description = "By default data is only periodically persisted to disk, enable this option to use an append-only file for improved persistence.";
336 + };
337 +
338 + appendFsync = mkOption {
339 + type = types.str;
340 + default = "everysec"; # no, always, everysec
341 + description = "How often to fsync the append-only log, options: no, always, everysec.";
342 + };
343 +
344 + slowLogLogSlowerThan = mkOption {
345 + type = types.int;
346 + default = 10000;
347 + description = "Log queries whose execution take longer than X in milliseconds.";
348 + example = 1000;
349 + };
350 +
351 + slowLogMaxLen = mkOption {
352 + type = types.int;
353 + default = 128;
354 + description = "Maximum number of items to keep in slow log.";
355 + };
356 +
357 + settings = mkOption {
358 + # TODO: this should be converted to freeformType
359 + type = with types; attrsOf (oneOf [ bool int str (listOf str) ]);
360 + default = {};
361 + description = ''
362 + Redis configuration. Refer to
363 + <link xlink:href="https://redis.io/topics/config"/>
364 + for details on supported values.
365 + '';
366 + example = literalExpression ''
367 + {
368 + loadmodule = [ "/path/to/my_module.so" "/path/to/other_module.so" ];
369 + }
370 + '';
371 };
372 };
373 + config.settings = mkMerge [
374 + {
375 + port = if config.bind == null then 0 else config.port;
376 + daemonize = false;
377 + supervised = "systemd";
378 + loglevel = config.logLevel;
379 + logfile = config.logfile;
380 + syslog-enabled = config.syslog;
381 + databases = config.databases;
382 + maxclients = config.maxclients;
383 + save = map (d: "${toString (builtins.elemAt d 0)} ${toString (builtins.elemAt d 1)}") config.save;
384 + dbfilename = "dump.rdb";
385 + dir = "/var/lib/${redisName name}";
386 + appendOnly = config.appendOnly;
387 + appendfsync = config.appendFsync;
388 + slowlog-log-slower-than = config.slowLogLogSlowerThan;
389 + slowlog-max-len = config.slowLogMaxLen;
390 + }
391 + (mkIf (config.bind != null) { bind = config.bind; })
392 + (mkIf (config.unixSocket != null) {
393 + unixsocket = config.unixSocket;
394 + unixsocketperm = toString config.unixSocketPerm;
395 + })
396 + (mkIf (config.slaveOf != null) { slaveof = "${config.slaveOf.ip} ${toString config.slaveOf.port}"; })
397 + (mkIf (config.masterAuth != null) { masterauth = config.masterAuth; })
398 + (mkIf (config.requirePass != null) { requirepass = config.requirePass; })
399 + ];
400 }));
401 -
402 - default = null;
403 - description = "IP and port to which this redis instance acts as a slave.";
404 - example = { ip = "192.168.1.100"; port = 6379; };
405 - };
406 -
407 - masterAuth = mkOption {
408 - type = with types; nullOr str;
409 - default = null;
410 - description = ''If the master is password protected (using the requirePass configuration)
411 - it is possible to tell the slave to authenticate before starting the replication synchronization
412 - process, otherwise the master will refuse the slave request.
413 - (STORED PLAIN TEXT, WORLD-READABLE IN NIX STORE)'';
414 - };
415 -
416 - requirePass = mkOption {
417 - type = with types; nullOr str;
418 - default = null;
419 - description = ''
420 - Password for database (STORED PLAIN TEXT, WORLD-READABLE IN NIX STORE).
421 - Use requirePassFile to store it outside of the nix store in a dedicated file.
422 - '';
423 - example = "letmein!";
424 - };
425 -
426 - requirePassFile = mkOption {
427 - type = with types; nullOr path;
428 - default = null;
429 - description = "File with password for the database.";
430 - example = "/run/keys/redis-password";
431 - };
432 -
433 - appendOnly = mkOption {
434 - type = types.bool;
435 - default = false;
436 - description = "By default data is only periodically persisted to disk, enable this option to use an append-only file for improved persistence.";
437 - };
438 -
439 - appendFsync = mkOption {
440 - type = types.str;
441 - default = "everysec"; # no, always, everysec
442 - description = "How often to fsync the append-only log, options: no, always, everysec.";
443 - };
444 -
445 - slowLogLogSlowerThan = mkOption {
446 - type = types.int;
447 - default = 10000;
448 - description = "Log queries whose execution take longer than X in milliseconds.";
449 - example = 1000;
450 - };
451 -
452 - slowLogMaxLen = mkOption {
453 - type = types.int;
454 - default = 128;
455 - description = "Maximum number of items to keep in slow log.";
456 - };
457 -
458 - settings = mkOption {
459 - type = with types; attrsOf (oneOf [ bool int str (listOf str) ]);
460 + description = "Configuration of multiple <literal>redis-server</literal> instances.";
461 default = {};
462 - description = ''
463 - Redis configuration. Refer to
464 - <link xlink:href="https://redis.io/topics/config"/>
465 - for details on supported values.
466 - '';
467 - example = literalExpression ''
468 - {
469 - loadmodule = [ "/path/to/my_module.so" "/path/to/other_module.so" ];
470 - }
471 - '';
472 };
473 };
474
475 @@ -229,78 +289,61 @@ in {
476
477 ###### implementation
478
479 - config = mkIf config.services.redis.enable {
480 - assertions = [{
481 - assertion = cfg.requirePass != null -> cfg.requirePassFile == null;
482 - message = "You can only set one services.redis.requirePass or services.redis.requirePassFile";
483 - }];
484 - boot.kernel.sysctl = (mkMerge [
485 + config = mkIf (enabledServers != {}) {
486 +
487 + assertions = attrValues (mapAttrs (name: conf: {
488 + assertion = conf.requirePass != null -> conf.requirePassFile == null;
489 + message = ''
490 + You can only set one services.redis.servers.${name}.requirePass
491 + or services.redis.servers.${name}.requirePassFile
492 + '';
493 + }) enabledServers);
494 +
495 + boot.kernel.sysctl = mkMerge [
496 { "vm.nr_hugepages" = "0"; }
497 ( mkIf cfg.vmOverCommit { "vm.overcommit_memory" = "1"; } )
498 - ]);
499 + ];
500
501 - networking.firewall = mkIf cfg.openFirewall {
502 - allowedTCPPorts = [ cfg.port ];
503 - };
504 -
505 - users.users.redis = {
506 - description = "Redis database user";
507 - group = "redis";
508 - isSystemUser = true;
509 - };
510 - users.groups.redis = {};
511 + networking.firewall.allowedTCPPorts = concatMap (conf:
512 + optional conf.openFirewall conf.port
513 + ) (attrValues enabledServers);
514
515 environment.systemPackages = [ cfg.package ];
516
517 - services.redis.settings = mkMerge [
518 - {
519 - port = cfg.port;
520 - daemonize = false;
521 - supervised = "systemd";
522 - loglevel = cfg.logLevel;
523 - logfile = cfg.logfile;
524 - syslog-enabled = cfg.syslog;
525 - databases = cfg.databases;
526 - maxclients = cfg.maxclients;
527 - save = map (d: "${toString (builtins.elemAt d 0)} ${toString (builtins.elemAt d 1)}") cfg.save;
528 - dbfilename = "dump.rdb";
529 - dir = "/var/lib/redis";
530 - appendOnly = cfg.appendOnly;
531 - appendfsync = cfg.appendFsync;
532 - slowlog-log-slower-than = cfg.slowLogLogSlowerThan;
533 - slowlog-max-len = cfg.slowLogMaxLen;
534 - }
535 - (mkIf (cfg.bind != null) { bind = cfg.bind; })
536 - (mkIf (cfg.unixSocket != null) { unixsocket = cfg.unixSocket; unixsocketperm = "${toString cfg.unixSocketPerm}"; })
537 - (mkIf (cfg.slaveOf != null) { slaveof = "${cfg.slaveOf.ip} ${toString cfg.slaveOf.port}"; })
538 - (mkIf (cfg.masterAuth != null) { masterauth = cfg.masterAuth; })
539 - (mkIf (cfg.requirePass != null) { requirepass = cfg.requirePass; })
540 - ];
541 + users.users = mapAttrs' (name: conf: nameValuePair (redisName name) {
542 + description = "System user for the redis-server instance ${name}";
543 + isSystemUser = true;
544 + group = redisName name;
545 + }) enabledServers;
546 + users.groups = mapAttrs' (name: conf: nameValuePair (redisName name) {
547 + }) enabledServers;
548
549 - systemd.services.redis = {
550 - description = "Redis Server";
551 + systemd.services = mapAttrs' (name: conf: nameValuePair (redisName name) {
552 + description = "Redis Server - ${redisName name}";
553
554 wantedBy = [ "multi-user.target" ];
555 after = [ "network.target" ];
556
557 - preStart = ''
558 - install -m 600 ${redisConfig} /run/redis/redis.conf
559 - '' + optionalString (cfg.requirePassFile != null) ''
560 - password=$(cat ${escapeShellArg cfg.requirePassFile})
561 - echo "requirePass $password" >> /run/redis/redis.conf
562 - '';
563 -
564 serviceConfig = {
565 - ExecStart = "${cfg.package}/bin/redis-server /run/redis/redis.conf";
566 + ExecStart = "${cfg.package}/bin/redis-server /run/${redisName name}/redis.conf";
567 + ExecStartPre = [("+"+pkgs.writeShellScript "${redisName name}-credentials" (''
568 + install -o '${conf.user}' -m 600 ${redisConfig conf.settings} /run/${redisName name}/redis.conf
569 + '' + optionalString (conf.requirePassFile != null) ''
570 + {
571 + printf requirePass' '
572 + cat ${escapeShellArg conf.requirePassFile}
573 + } >>/run/${redisName name}/redis.conf
574 + '')
575 + )];
576 Type = "notify";
577 # User and group
578 - User = "redis";
579 - Group = "redis";
580 + User = conf.user;
581 + Group = conf.user;
582 # Runtime directory and mode
583 - RuntimeDirectory = "redis";
584 + RuntimeDirectory = redisName name;
585 RuntimeDirectoryMode = "0750";
586 # State directory and mode
587 - StateDirectory = "redis";
588 + StateDirectory = redisName name;
589 StateDirectoryMode = "0700";
590 # Access write directories
591 UMask = "0077";
592 @@ -309,7 +352,7 @@ in {
593 # Security
594 NoNewPrivileges = true;
595 # Process Properties
596 - LimitNOFILE = "${toString ulimitNofile}";
597 + LimitNOFILE = mkDefault "${toString (conf.maxclients + 32)}";
598 # Sandboxing
599 ProtectSystem = "strict";
600 ProtectHome = true;
601 @@ -322,7 +365,9 @@ in {
602 ProtectKernelModules = true;
603 ProtectKernelTunables = true;
604 ProtectControlGroups = true;
605 - RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" "AF_INET6" ];
606 + RestrictAddressFamilies =
607 + optionals (conf.bind != null) ["AF_INET" "AF_INET6"] ++
608 + optional (conf.unixSocket != null) "AF_UNIX";
609 RestrictNamespaces = true;
610 LockPersonality = true;
611 MemoryDenyWriteExecute = true;
612 @@ -333,6 +378,7 @@ in {
613 SystemCallArchitectures = "native";
614 SystemCallFilter = "~@cpu-emulation @debug @keyring @memlock @mount @obsolete @privileged @resources @setuid";
615 };
616 - };
617 + }) enabledServers;
618 +
619 };
620 }
621 diff --git a/nixos/modules/services/misc/sourcehut/builds.nix b/nixos/modules/services/misc/sourcehut/builds.nix
622 deleted file mode 100644
623 index f806e8c51b9..00000000000
624 --- a/nixos/modules/services/misc/sourcehut/builds.nix
625 +++ /dev/null
626 @@ -1,234 +0,0 @@
627 -{ config, lib, pkgs, ... }:
628 -
629 -with lib;
630 -let
631 - cfg = config.services.sourcehut;
632 - scfg = cfg.builds;
633 - rcfg = config.services.redis;
634 - iniKey = "builds.sr.ht";
635 -
636 - drv = pkgs.sourcehut.buildsrht;
637 -in
638 -{
639 - options.services.sourcehut.builds = {
640 - user = mkOption {
641 - type = types.str;
642 - default = "buildsrht";
643 - description = ''
644 - User for builds.sr.ht.
645 - '';
646 - };
647 -
648 - port = mkOption {
649 - type = types.port;
650 - default = 5002;
651 - description = ''
652 - Port on which the "builds" module should listen.
653 - '';
654 - };
655 -
656 - database = mkOption {
657 - type = types.str;
658 - default = "builds.sr.ht";
659 - description = ''
660 - PostgreSQL database name for builds.sr.ht.
661 - '';
662 - };
663 -
664 - statePath = mkOption {
665 - type = types.path;
666 - default = "${cfg.statePath}/buildsrht";
667 - description = ''
668 - State path for builds.sr.ht.
669 - '';
670 - };
671 -
672 - enableWorker = mkOption {
673 - type = types.bool;
674 - default = false;
675 - description = ''
676 - Run workers for builds.sr.ht.
677 - '';
678 - };
679 -
680 - images = mkOption {
681 - type = types.attrsOf (types.attrsOf (types.attrsOf types.package));
682 - default = { };
683 - example = lib.literalExpression ''(let
684 - # Pinning unstable to allow usage with flakes and limit rebuilds.
685 - pkgs_unstable = builtins.fetchGit {
686 - url = "https://github.com/NixOS/nixpkgs";
687 - rev = "ff96a0fa5635770390b184ae74debea75c3fd534";
688 - ref = "nixos-unstable";
689 - };
690 - image_from_nixpkgs = pkgs_unstable: (import ("${pkgs.sourcehut.buildsrht}/lib/images/nixos/image.nix") {
691 - pkgs = (import pkgs_unstable {});
692 - });
693 - in
694 - {
695 - nixos.unstable.x86_64 = image_from_nixpkgs pkgs_unstable;
696 - }
697 - )'';
698 - description = ''
699 - Images for builds.sr.ht. Each package should be distro.release.arch and point to a /nix/store/package/root.img.qcow2.
700 - '';
701 - };
702 -
703 - };
704 -
705 - config = with scfg; let
706 - image_dirs = lib.lists.flatten (
707 - lib.attrsets.mapAttrsToList
708 - (distro: revs:
709 - lib.attrsets.mapAttrsToList
710 - (rev: archs:
711 - lib.attrsets.mapAttrsToList
712 - (arch: image:
713 - pkgs.runCommand "buildsrht-images" { } ''
714 - mkdir -p $out/${distro}/${rev}/${arch}
715 - ln -s ${image}/*.qcow2 $out/${distro}/${rev}/${arch}/root.img.qcow2
716 - '')
717 - archs)
718 - revs)
719 - scfg.images);
720 - image_dir_pre = pkgs.symlinkJoin {
721 - name = "builds.sr.ht-worker-images-pre";
722 - paths = image_dirs ++ [
723 - "${pkgs.sourcehut.buildsrht}/lib/images"
724 - ];
725 - };
726 - image_dir = pkgs.runCommand "builds.sr.ht-worker-images" { } ''
727 - mkdir -p $out/images
728 - cp -Lr ${image_dir_pre}/* $out/images
729 - '';
730 - in
731 - lib.mkIf (cfg.enable && elem "builds" cfg.services) {
732 - users = {
733 - users = {
734 - "${user}" = {
735 - isSystemUser = true;
736 - group = user;
737 - extraGroups = lib.optionals cfg.builds.enableWorker [ "docker" ];
738 - description = "builds.sr.ht user";
739 - };
740 - };
741 -
742 - groups = {
743 - "${user}" = { };
744 - };
745 - };
746 -
747 - services.postgresql = {
748 - authentication = ''
749 - local ${database} ${user} trust
750 - '';
751 - ensureDatabases = [ database ];
752 - ensureUsers = [
753 - {
754 - name = user;
755 - ensurePermissions = { "DATABASE \"${database}\"" = "ALL PRIVILEGES"; };
756 - }
757 - ];
758 - };
759 -
760 - systemd = {
761 - tmpfiles.rules = [
762 - "d ${statePath} 0755 ${user} ${user} -"
763 - ] ++ (lib.optionals cfg.builds.enableWorker
764 - [ "d ${statePath}/logs 0775 ${user} ${user} - -" ]
765 - );
766 -
767 - services = {
768 - buildsrht = import ./service.nix { inherit config pkgs lib; } scfg drv iniKey
769 - {
770 - after = [ "postgresql.service" "network.target" ];
771 - requires = [ "postgresql.service" ];
772 - wantedBy = [ "multi-user.target" ];
773 -
774 - description = "builds.sr.ht website service";
775 -
776 - serviceConfig.ExecStart = "${cfg.python}/bin/gunicorn ${drv.pname}.app:app -b ${cfg.address}:${toString port}";
777 -
778 - # Hack to bypass this hack: https://git.sr.ht/~sircmpwn/core.sr.ht/tree/master/item/srht-update-profiles#L6
779 - } // { preStart = " "; };
780 -
781 - buildsrht-worker = {
782 - enable = scfg.enableWorker;
783 - after = [ "postgresql.service" "network.target" ];
784 - requires = [ "postgresql.service" ];
785 - wantedBy = [ "multi-user.target" ];
786 - partOf = [ "buildsrht.service" ];
787 - description = "builds.sr.ht worker service";
788 - path = [ pkgs.openssh pkgs.docker ];
789 - preStart = let qemuPackage = pkgs.qemu_kvm;
790 - in ''
791 - if [[ "$(docker images -q qemu:latest 2> /dev/null)" == "" || "$(cat ${statePath}/docker-image-qemu 2> /dev/null || true)" != "${qemuPackage.version}" ]]; then
792 - # Create and import qemu:latest image for docker
793 - ${
794 - pkgs.dockerTools.streamLayeredImage {
795 - name = "qemu";
796 - tag = "latest";
797 - contents = [ qemuPackage ];
798 - }
799 - } | docker load
800 - # Mark down current package version
801 - printf "%s" "${qemuPackage.version}" > ${statePath}/docker-image-qemu
802 - fi
803 - '';
804 - serviceConfig = {
805 - Type = "simple";
806 - User = user;
807 - Group = "nginx";
808 - Restart = "always";
809 - };
810 - serviceConfig.ExecStart = "${pkgs.sourcehut.buildsrht}/bin/builds.sr.ht-worker";
811 - };
812 - };
813 - };
814 -
815 - services.sourcehut.settings = {
816 - # URL builds.sr.ht is being served at (protocol://domain)
817 - "builds.sr.ht".origin = mkDefault "http://builds.${cfg.originBase}";
818 - # Address and port to bind the debug server to
819 - "builds.sr.ht".debug-host = mkDefault "0.0.0.0";
820 - "builds.sr.ht".debug-port = mkDefault port;
821 - # Configures the SQLAlchemy connection string for the database.
822 - "builds.sr.ht".connection-string = mkDefault "postgresql:///${database}?user=${user}&host=/var/run/postgresql";
823 - # Set to "yes" to automatically run migrations on package upgrade.
824 - "builds.sr.ht".migrate-on-upgrade = mkDefault "yes";
825 - # builds.sr.ht's OAuth client ID and secret for meta.sr.ht
826 - # Register your client at meta.example.org/oauth
827 - "builds.sr.ht".oauth-client-id = mkDefault null;
828 - "builds.sr.ht".oauth-client-secret = mkDefault null;
829 - # The redis connection used for the celery worker
830 - "builds.sr.ht".redis = mkDefault "redis://${rcfg.bind}:${toString rcfg.port}/3";
831 - # The shell used for ssh
832 - "builds.sr.ht".shell = mkDefault "runner-shell";
833 - # Register the builds.sr.ht dispatcher
834 - "git.sr.ht::dispatch".${builtins.unsafeDiscardStringContext "${pkgs.sourcehut.buildsrht}/bin/buildsrht-keys"} = mkDefault "${user}:${user}";
835 -
836 - # Location for build logs, images, and control command
837 - } // lib.attrsets.optionalAttrs scfg.enableWorker {
838 - # Default worker stores logs that are accessible via this address:port
839 - "builds.sr.ht::worker".name = mkDefault "127.0.0.1:5020";
840 - "builds.sr.ht::worker".buildlogs = mkDefault "${scfg.statePath}/logs";
841 - "builds.sr.ht::worker".images = mkDefault "${image_dir}/images";
842 - "builds.sr.ht::worker".controlcmd = mkDefault "${image_dir}/images/control";
843 - "builds.sr.ht::worker".timeout = mkDefault "3m";
844 - };
845 -
846 - services.nginx.virtualHosts."logs.${cfg.originBase}" =
847 - if scfg.enableWorker then {
848 - listen = with builtins; let address = split ":" cfg.settings."builds.sr.ht::worker".name;
849 - in [{ addr = elemAt address 0; port = lib.toInt (elemAt address 2); }];
850 - locations."/logs".root = "${scfg.statePath}";
851 - } else { };
852 -
853 - services.nginx.virtualHosts."builds.${cfg.originBase}" = {
854 - forceSSL = true;
855 - locations."/".proxyPass = "http://${cfg.address}:${toString port}";
856 - locations."/query".proxyPass = "http://${cfg.address}:${toString (port + 100)}";
857 - locations."/static".root = "${pkgs.sourcehut.buildsrht}/${pkgs.sourcehut.python.sitePackages}/buildsrht";
858 - };
859 - };
860 -}
861 diff --git a/nixos/modules/services/misc/sourcehut/default.nix b/nixos/modules/services/misc/sourcehut/default.nix
862 index 9c812d6b043..1bd21c278e0 100644
863 --- a/nixos/modules/services/misc/sourcehut/default.nix
864 +++ b/nixos/modules/services/misc/sourcehut/default.nix
865 @@ -1,14 +1,90 @@
866 { config, pkgs, lib, ... }:
867 -
868 with lib;
869 let
870 + inherit (config.services) nginx postfix postgresql redis;
871 + inherit (config.users) users groups;
872 cfg = config.services.sourcehut;
873 - cfgIni = cfg.settings;
874 - settingsFormat = pkgs.formats.ini { };
875 + domain = cfg.settings."sr.ht".global-domain;
876 + settingsFormat = pkgs.formats.ini {
877 + listToValue = concatMapStringsSep "," (generators.mkValueStringDefault {});
878 + mkKeyValue = k: v:
879 + if v == null then ""
880 + else generators.mkKeyValueDefault {
881 + mkValueString = v:
882 + if v == true then "yes"
883 + else if v == false then "no"
884 + else generators.mkValueStringDefault {} v;
885 + } "=" k v;
886 + };
887 + configIniOfService = srv: settingsFormat.generate "sourcehut-${srv}-config.ini"
888 + # Each service needs access to only a subset of sections (and secrets).
889 + (filterAttrs (k: v: v != null)
890 + (mapAttrs (section: v:
891 + let srvMatch = builtins.match "^([a-z]*)\\.sr\\.ht(::.*)?$" section; in
892 + if srvMatch == null # Include sections shared by all services
893 + || head srvMatch == srv # Include sections for the service being configured
894 + then v
895 + # Enable Web links and integrations between services.
896 + else if tail srvMatch == [ null ] && elem (head srvMatch) cfg.services
897 + then {
898 + inherit (v) origin;
899 + # mansrht crashes without it
900 + oauth-client-id = v.oauth-client-id or null;
901 + }
902 + # Drop sub-sections of other services
903 + else null)
904 + (recursiveUpdate cfg.settings {
905 + # Those paths are mounted using BindPaths= or BindReadOnlyPaths=
906 + # for services needing access to them.
907 + "builds.sr.ht::worker".buildlogs = "/var/log/sourcehut/buildsrht-worker";
908 + "git.sr.ht".post-update-script = "/usr/bin/gitsrht-update-hook";
909 + "git.sr.ht".repos = "/var/lib/sourcehut/gitsrht/repos";
910 + "hg.sr.ht".changegroup-script = "/usr/bin/hgsrht-hook-changegroup";
911 + "hg.sr.ht".repos = "/var/lib/sourcehut/hgsrht/repos";
912 + # Making this a per service option despite being in a global section,
913 + # so that it uses the redis-server used by the service.
914 + "sr.ht".redis-host = cfg.${srv}.redis.host;
915 + })));
916 + commonServiceSettings = srv: {
917 + origin = mkOption {
918 + description = "URL ${srv}.sr.ht is being served at (protocol://domain)";
919 + type = types.str;
920 + default = "https://${srv}.${domain}";
921 + defaultText = "https://${srv}.example.com";
922 + };
923 + debug-host = mkOption {
924 + description = "Address to bind the debug server to.";
925 + type = with types; nullOr str;
926 + default = null;
927 + };
928 + debug-port = mkOption {
929 + description = "Port to bind the debug server to.";
930 + type = with types; nullOr str;
931 + default = null;
932 + };
933 + connection-string = mkOption {
934 + description = "SQLAlchemy connection string for the database.";
935 + type = types.str;
936 + default = "postgresql:///localhost?user=${srv}srht&host=/run/postgresql";
937 + };
938 + migrate-on-upgrade = mkEnableOption "automatic migrations on package upgrade" // { default = true; };
939 + oauth-client-id = mkOption {
940 + description = "${srv}.sr.ht's OAuth client id for meta.sr.ht.";
941 + type = types.str;
942 + };
943 + oauth-client-secret = mkOption {
944 + description = "${srv}.sr.ht's OAuth client secret for meta.sr.ht.";
945 + type = types.path;
946 + apply = s: "<" + toString s;
947 + };
948 + };
949
950 # Specialized python containing all the modules
951 python = pkgs.sourcehut.python.withPackages (ps: with ps; [
952 gunicorn
953 + eventlet
954 + # For monitoring Celery: sudo -u listssrht celery --app listssrht.process -b redis+socket:///run/redis-sourcehut/redis.sock?virtual_host=5 flower
955 + flower
956 # Sourcehut services
957 srht
958 buildsrht
959 @@ -19,69 +95,37 @@ let
960 listssrht
961 mansrht
962 metasrht
963 + # Not a python package
964 + #pagessrht
965 pastesrht
966 todosrht
967 ]);
968 + mkOptionNullOrStr = description: mkOption {
969 + inherit description;
970 + type = with types; nullOr str;
971 + default = null;
972 + };
973 in
974 {
975 - imports =
976 - [
977 - ./git.nix
978 - ./hg.nix
979 - ./hub.nix
980 - ./todo.nix
981 - ./man.nix
982 - ./meta.nix
983 - ./paste.nix
984 - ./builds.nix
985 - ./lists.nix
986 - ./dispatch.nix
987 - (mkRemovedOptionModule [ "services" "sourcehut" "nginx" "enable" ] ''
988 - The sourcehut module supports `nginx` as a local reverse-proxy by default and doesn't
989 - support other reverse-proxies officially.
990 -
991 - However it's possible to use an alternative reverse-proxy by
992 -
993 - * disabling nginx
994 - * adjusting the relevant settings for server addresses and ports directly
995 -
996 - Further details about this can be found in the `Sourcehut`-section of the NixOS-manual.
997 - '')
998 - ];
999 -
1000 options.services.sourcehut = {
1001 - enable = mkOption {
1002 - type = types.bool;
1003 - default = false;
1004 - description = ''
1005 - Enable sourcehut - git hosting, continuous integration, mailing list, ticket tracking,
1006 - task dispatching, wiki and account management services
1007 - '';
1008 - };
1009 + enable = mkEnableOption ''
1010 + sourcehut - git hosting, continuous integration, mailing list, ticket tracking,
1011 + task dispatching, wiki and account management services
1012 + '';
1013
1014 services = mkOption {
1015 - type = types.nonEmptyListOf (types.enum [ "builds" "dispatch" "git" "hub" "hg" "lists" "man" "meta" "paste" "todo" ]);
1016 - default = [ "man" "meta" "paste" ];
1017 - example = [ "builds" "dispatch" "git" "hub" "hg" "lists" "man" "meta" "paste" "todo" ];
1018 + type = with types; listOf (enum
1019 + [ "builds" "dispatch" "git" "hg" "hub" "lists" "man" "meta" "pages" "paste" "todo" ]);
1020 + defaultText = "locally enabled services";
1021 description = ''
1022 - Services to enable on the sourcehut network.
1023 + Services that may be displayed as links in the title bar of the Web interface.
1024 '';
1025 };
1026
1027 - originBase = mkOption {
1028 + listenAddress = mkOption {
1029 type = types.str;
1030 - default = with config.networking; hostName + lib.optionalString (domain != null) ".${domain}";
1031 - description = ''
1032 - Host name used by reverse-proxy and for default settings. Will host services at git."''${originBase}". For example: git.sr.ht
1033 - '';
1034 - };
1035 -
1036 - address = mkOption {
1037 - type = types.str;
1038 - default = "127.0.0.1";
1039 - description = ''
1040 - Address to bind to.
1041 - '';
1042 + default = "localhost";
1043 + description = "Address to bind to.";
1044 };
1045
1046 python = mkOption {
1047 @@ -94,105 +138,1247 @@ in
1048 '';
1049 };
1050
1051 - statePath = mkOption {
1052 - type = types.path;
1053 - default = "/var/lib/sourcehut";
1054 - description = ''
1055 - Root state path for the sourcehut network. If left as the default value
1056 - this directory will automatically be created before the sourcehut server
1057 - starts, otherwise the sysadmin is responsible for ensuring the
1058 - directory exists with appropriate ownership and permissions.
1059 - '';
1060 + minio = {
1061 + enable = mkEnableOption ''local minio integration'';
1062 + };
1063 +
1064 + nginx = {
1065 + enable = mkEnableOption ''local nginx integration'';
1066 + virtualHost = mkOption {
1067 + type = types.attrs;
1068 + default = {};
1069 + description = "Virtual-host configuration merged with all Sourcehut's virtual-hosts.";
1070 + };
1071 + };
1072 +
1073 + postfix = {
1074 + enable = mkEnableOption ''local postfix integration'';
1075 + };
1076 +
1077 + postgresql = {
1078 + enable = mkEnableOption ''local postgresql integration'';
1079 + };
1080 +
1081 + redis = {
1082 + enable = mkEnableOption ''local redis integration in a dedicated redis-server'';
1083 };
1084
1085 settings = mkOption {
1086 type = lib.types.submodule {
1087 freeformType = settingsFormat.type;
1088 + options."sr.ht" = {
1089 + global-domain = mkOption {
1090 + description = "Global domain name.";
1091 + type = types.str;
1092 + example = "example.com";
1093 + };
1094 + environment = mkOption {
1095 + description = "Values other than \"production\" adds a banner to each page.";
1096 + type = types.enum [ "development" "production" ];
1097 + default = "development";
1098 + };
1099 + network-key = mkOption {
1100 + description = ''
1101 + An absolute file path (which should be outside the Nix-store)
1102 + to a secret key to encrypt internal messages with. Use <code>srht-keygen network</code> to
1103 + generate this key. It must be consistent between all services and nodes.
1104 + '';
1105 + type = types.path;
1106 + apply = s: "<" + toString s;
1107 + };
1108 + owner-email = mkOption {
1109 + description = "Owner's email.";
1110 + type = types.str;
1111 + default = "contact@example.com";
1112 + };
1113 + owner-name = mkOption {
1114 + description = "Owner's name.";
1115 + type = types.str;
1116 + default = "John Doe";
1117 + };
1118 + site-blurb = mkOption {
1119 + description = "Blurb for your site.";
1120 + type = types.str;
1121 + default = "the hacker's forge";
1122 + };
1123 + site-info = mkOption {
1124 + description = "The top-level info page for your site.";
1125 + type = types.str;
1126 + default = "https://sourcehut.org";
1127 + };
1128 + service-key = mkOption {
1129 + description = ''
1130 + An absolute file path (which should be outside the Nix-store)
1131 + to a key used for encrypting session cookies. Use <code>srht-keygen service</code> to
1132 + generate the service key. This must be shared between each node of the same
1133 + service (e.g. git1.sr.ht and git2.sr.ht), but different services may use
1134 + different keys. If you configure all of your services with the same
1135 + config.ini, you may use the same service-key for all of them.
1136 + '';
1137 + type = types.path;
1138 + apply = s: "<" + toString s;
1139 + };
1140 + site-name = mkOption {
1141 + description = "The name of your network of sr.ht-based sites.";
1142 + type = types.str;
1143 + default = "sourcehut";
1144 + };
1145 + source-url = mkOption {
1146 + description = "The source code for your fork of sr.ht.";
1147 + type = types.str;
1148 + default = "https://git.sr.ht/~sircmpwn/srht";
1149 + };
1150 + };
1151 + options.mail = {
1152 + smtp-host = mkOptionNullOrStr "Outgoing SMTP host.";
1153 + smtp-port = mkOption {
1154 + description = "Outgoing SMTP port.";
1155 + type = with types; nullOr port;
1156 + default = null;
1157 + };
1158 + smtp-user = mkOptionNullOrStr "Outgoing SMTP user.";
1159 + smtp-password = mkOptionNullOrStr "Outgoing SMTP password.";
1160 + smtp-from = mkOptionNullOrStr "Outgoing SMTP FROM.";
1161 + error-to = mkOptionNullOrStr "Address receiving application exceptions";
1162 + error-from = mkOptionNullOrStr "Address sending application exceptions";
1163 + pgp-privkey = mkOptionNullOrStr ''
1164 + An absolute file path (which should be outside the Nix-store)
1165 + to an OpenPGP private key.
1166 +
1167 + Your PGP key information (DO NOT mix up pub and priv here)
1168 + You must remove the password from your secret key, if present.
1169 + You can do this with <code>gpg --edit-key [key-id]</code>,
1170 + then use the <code>passwd</code> command and do not enter a new password.
1171 + '';
1172 + pgp-pubkey = mkOptionNullOrStr "OpenPGP public key.";
1173 + pgp-key-id = mkOptionNullOrStr "OpenPGP key identifier.";
1174 + };
1175 + options.objects = {
1176 + s3-upstream = mkOption {
1177 + description = "Configure the S3-compatible object storage service.";
1178 + type = with types; nullOr str;
1179 + default = null;
1180 + };
1181 + s3-access-key = mkOption {
1182 + description = "Access key to the S3-compatible object storage service";
1183 + type = with types; nullOr str;
1184 + default = null;
1185 + };
1186 + s3-secret-key = mkOption {
1187 + description = ''
1188 + An absolute file path (which should be outside the Nix-store)
1189 + to the secret key of the S3-compatible object storage service.
1190 + '';
1191 + type = with types; nullOr path;
1192 + default = null;
1193 + apply = mapNullable (s: "<" + toString s);
1194 + };
1195 + };
1196 + options.webhooks = {
1197 + private-key = mkOption {
1198 + description = ''
1199 + An absolute file path (which should be outside the Nix-store)
1200 + to a base64-encoded Ed25519 key for signing webhook payloads.
1201 + This should be consistent for all *.sr.ht sites,
1202 + as this key will be used to verify signatures
1203 + from other sites in your network.
1204 + Use the <code>srht-keygen webhook</code> command to generate a key.
1205 + '';
1206 + type = types.path;
1207 + apply = s: "<" + toString s;
1208 + };
1209 + };
1210 +
1211 + options."dispatch.sr.ht" = commonServiceSettings "dispatch" // {
1212 + };
1213 + options."dispatch.sr.ht::github" = {
1214 + oauth-client-id = mkOptionNullOrStr "OAuth client id.";
1215 + oauth-client-secret = mkOptionNullOrStr "OAuth client secret.";
1216 + };
1217 + options."dispatch.sr.ht::gitlab" = {
1218 + enabled = mkEnableOption "GitLab integration";
1219 + canonical-upstream = mkOption {
1220 + type = types.str;
1221 + description = "Canonical upstream.";
1222 + default = "gitlab.com";
1223 + };
1224 + repo-cache = mkOption {
1225 + type = types.str;
1226 + description = "Repository cache directory.";
1227 + default = "./repo-cache";
1228 + };
1229 + "gitlab.com" = mkOption {
1230 + type = with types; nullOr str;
1231 + description = "GitLab id and secret.";
1232 + default = null;
1233 + example = "GitLab:application id:secret";
1234 + };
1235 + };
1236 +
1237 + options."builds.sr.ht" = commonServiceSettings "builds" // {
1238 + allow-free = mkEnableOption "nonpaying users to submit builds";
1239 + redis = mkOption {
1240 + description = "The Redis connection used for the Celery worker.";
1241 + type = types.str;
1242 + default = "redis+socket:///run/redis-sourcehut-buildsrht/redis.sock?virtual_host=2";
1243 + };
1244 + shell = mkOption {
1245 + description = ''
1246 + Scripts used to launch on SSH connection.
1247 + <literal>/usr/bin/master-shell</literal> on master,
1248 + <literal>/usr/bin/runner-shell</literal> on runner.
1249 + If master and worker are on the same system
1250 + set to <literal>/usr/bin/runner-shell</literal>.
1251 + '';
1252 + type = types.enum ["/usr/bin/master-shell" "/usr/bin/runner-shell"];
1253 + default = "/usr/bin/master-shell";
1254 + };
1255 + };
1256 + options."builds.sr.ht::worker" = {
1257 + bind-address = mkOption {
1258 + description = ''
1259 + HTTP bind address for serving local build information/monitoring.
1260 + '';
1261 + type = types.str;
1262 + default = "localhost:8080";
1263 + };
1264 + buildlogs = mkOption {
1265 + description = "Path to write build logs.";
1266 + type = types.str;
1267 + default = "/var/log/sourcehut/buildsrht-worker";
1268 + };
1269 + name = mkOption {
1270 + description = ''
1271 + Listening address and listening port
1272 + of the build runner (with HTTP port if not 80).
1273 + '';
1274 + type = types.str;
1275 + default = "localhost:5020";
1276 + };
1277 + timeout = mkOption {
1278 + description = ''
1279 + Max build duration.
1280 + See <link xlink:href="https://golang.org/pkg/time/#ParseDuration"/>.
1281 + '';
1282 + type = types.str;
1283 + default = "3m";
1284 + };
1285 + };
1286 +
1287 + options."git.sr.ht" = commonServiceSettings "git" // {
1288 + outgoing-domain = mkOption {
1289 + description = "Outgoing domain.";
1290 + type = types.str;
1291 + default = "https://git.localhost.localdomain";
1292 + };
1293 + post-update-script = mkOption {
1294 + description = ''
1295 + A post-update script which is installed in every git repo.
1296 + This setting is propagated to newer and existing repositories.
1297 + '';
1298 + type = types.path;
1299 + default = "${pkgs.sourcehut.gitsrht}/bin/gitsrht-update-hook";
1300 + defaultText = "\${pkgs.sourcehut.gitsrht}/bin/gitsrht-update-hook";
1301 + };
1302 + repos = mkOption {
1303 + description = ''
1304 + Path to git repositories on disk.
1305 + If changing the default, you must ensure that
1306 + the gitsrht's user as read and write access to it.
1307 + '';
1308 + type = types.str;
1309 + default = "/var/lib/sourcehut/gitsrht/repos";
1310 + };
1311 + webhooks = mkOption {
1312 + description = "The Redis connection used for the webhooks worker.";
1313 + type = types.str;
1314 + default = "redis+socket:///run/redis-sourcehut-gitsrht/redis.sock?virtual_host=1";
1315 + };
1316 + };
1317 + options."git.sr.ht::api" = {
1318 + internal-ipnet = mkOption {
1319 + description = ''
1320 + Set of IP subnets which are permitted to utilize internal API
1321 + authentication. This should be limited to the subnets
1322 + from which your *.sr.ht services are running.
1323 + See <xref linkend="opt-services.sourcehut.listenAddress"/>.
1324 + '';
1325 + type = with types; listOf str;
1326 + default = [ "127.0.0.0/8" "::1/128" ];
1327 + };
1328 + };
1329 +
1330 + options."hg.sr.ht" = commonServiceSettings "hg" // {
1331 + changegroup-script = mkOption {
1332 + description = ''
1333 + A changegroup script which is installed in every mercurial repo.
1334 + This setting is propagated to newer and existing repositories.
1335 + '';
1336 + type = types.str;
1337 + default = "${cfg.python}/bin/hgsrht-hook-changegroup";
1338 + defaultText = "\${cfg.python}/bin/hgsrht-hook-changegroup";
1339 + };
1340 + repos = mkOption {
1341 + description = ''
1342 + Path to mercurial repositories on disk.
1343 + If changing the default, you must ensure that
1344 + the hgsrht's user as read and write access to it.
1345 + '';
1346 + type = types.str;
1347 + default = "/var/lib/sourcehut/hgsrht/repos";
1348 + };
1349 + srhtext = mkOptionNullOrStr ''
1350 + Path to the srht mercurial extension
1351 + (defaults to where the hgsrht code is)
1352 + '';
1353 + clone_bundle_threshold = mkOption {
1354 + description = ".hg/store size (in MB) past which the nightly job generates clone bundles.";
1355 + type = types.ints.unsigned;
1356 + default = 50;
1357 + };
1358 + hg_ssh = mkOption {
1359 + description = "Path to hg-ssh (if not in $PATH).";
1360 + type = types.str;
1361 + default = "${pkgs.mercurial}/bin/hg-ssh";
1362 + defaultText = "\${pkgs.mercurial}/bin/hg-ssh";
1363 + };
1364 + webhooks = mkOption {
1365 + description = "The Redis connection used for the webhooks worker.";
1366 + type = types.str;
1367 + default = "redis+socket:///run/redis-sourcehut-hgsrht/redis.sock?virtual_host=1";
1368 + };
1369 + };
1370 +
1371 + options."hub.sr.ht" = commonServiceSettings "hub" // {
1372 + };
1373 +
1374 + options."lists.sr.ht" = commonServiceSettings "lists" // {
1375 + allow-new-lists = mkEnableOption "Allow creation of new lists.";
1376 + notify-from = mkOption {
1377 + description = "Outgoing email for notifications generated by users.";
1378 + type = types.str;
1379 + default = "lists-notify@localhost.localdomain";
1380 + };
1381 + posting-domain = mkOption {
1382 + description = "Posting domain.";
1383 + type = types.str;
1384 + default = "lists.localhost.localdomain";
1385 + };
1386 + redis = mkOption {
1387 + description = "The Redis connection used for the Celery worker.";
1388 + type = types.str;
1389 + default = "redis+socket:///run/redis-sourcehut-listssrht/redis.sock?virtual_host=2";
1390 + };
1391 + webhooks = mkOption {
1392 + description = "The Redis connection used for the webhooks worker.";
1393 + type = types.str;
1394 + default = "redis+socket:///run/redis-sourcehut-listssrht/redis.sock?virtual_host=1";
1395 + };
1396 + };
1397 + options."lists.sr.ht::worker" = {
1398 + reject-mimetypes = mkOption {
1399 + description = ''
1400 + Comma-delimited list of Content-Types to reject. Messages with Content-Types
1401 + included in this list are rejected. Multipart messages are always supported,
1402 + and each part is checked against this list.
1403 +
1404 + Uses fnmatch for wildcard expansion.
1405 + '';
1406 + type = with types; listOf str;
1407 + default = ["text/html"];
1408 + };
1409 + reject-url = mkOption {
1410 + description = "Reject URL.";
1411 + type = types.str;
1412 + default = "https://man.sr.ht/lists.sr.ht/etiquette.md";
1413 + };
1414 + sock = mkOption {
1415 + description = ''
1416 + Path for the lmtp daemon's unix socket. Direct incoming mail to this socket.
1417 + Alternatively, specify IP:PORT and an SMTP server will be run instead.
1418 + '';
1419 + type = types.str;
1420 + default = "/tmp/lists.sr.ht-lmtp.sock";
1421 + };
1422 + sock-group = mkOption {
1423 + description = ''
1424 + The lmtp daemon will make the unix socket group-read/write
1425 + for users in this group.
1426 + '';
1427 + type = types.str;
1428 + default = "postfix";
1429 + };
1430 + };
1431 +
1432 + options."man.sr.ht" = commonServiceSettings "man" // {
1433 + };
1434 +
1435 + options."meta.sr.ht" =
1436 + removeAttrs (commonServiceSettings "meta")
1437 + ["oauth-client-id" "oauth-client-secret"] // {
1438 + api-origin = mkOption {
1439 + description = "Origin URL for API, 100 more than web.";
1440 + type = types.str;
1441 + default = "http://${cfg.listenAddress}:${toString (cfg.meta.port + 100)}";
1442 + defaultText = ''http://<xref linkend="opt-services.sourcehut.listenAddress"/>:''${toString (<xref linkend="opt-services.sourcehut.meta.port"/> + 100)}'';
1443 + };
1444 + webhooks = mkOption {
1445 + description = "The Redis connection used for the webhooks worker.";
1446 + type = types.str;
1447 + default = "redis+socket:///run/redis-sourcehut-metasrht/redis.sock?virtual_host=1";
1448 + };
1449 + welcome-emails = mkEnableOption "sending stock sourcehut welcome emails after signup";
1450 + };
1451 + options."meta.sr.ht::api" = {
1452 + internal-ipnet = mkOption {
1453 + description = ''
1454 + Set of IP subnets which are permitted to utilize internal API
1455 + authentication. This should be limited to the subnets
1456 + from which your *.sr.ht services are running.
1457 + See <xref linkend="opt-services.sourcehut.listenAddress"/>.
1458 + '';
1459 + type = with types; listOf str;
1460 + default = [ "127.0.0.0/8" "::1/128" ];
1461 + };
1462 + };
1463 + options."meta.sr.ht::aliases" = mkOption {
1464 + description = "Aliases for the client IDs of commonly used OAuth clients.";
1465 + type = with types; attrsOf int;
1466 + default = {};
1467 + example = { "git.sr.ht" = 12345; };
1468 + };
1469 + options."meta.sr.ht::billing" = {
1470 + enabled = mkEnableOption "the billing system";
1471 + stripe-public-key = mkOptionNullOrStr "Public key for Stripe. Get your keys at https://dashboard.stripe.com/account/apikeys";
1472 + stripe-secret-key = mkOptionNullOrStr ''
1473 + An absolute file path (which should be outside the Nix-store)
1474 + to a secret key for Stripe. Get your keys at https://dashboard.stripe.com/account/apikeys
1475 + '' // {
1476 + apply = mapNullable (s: "<" + toString s);
1477 + };
1478 + };
1479 + options."meta.sr.ht::settings" = {
1480 + registration = mkEnableOption "public registration";
1481 + onboarding-redirect = mkOption {
1482 + description = "Where to redirect new users upon registration.";
1483 + type = types.str;
1484 + default = "https://meta.localhost.localdomain";
1485 + };
1486 + user-invites = mkOption {
1487 + description = ''
1488 + How many invites each user is issued upon registration
1489 + (only applicable if open registration is disabled).
1490 + '';
1491 + type = types.ints.unsigned;
1492 + default = 5;
1493 + };
1494 + };
1495 +
1496 + options."pages.sr.ht" = commonServiceSettings "pages" // {
1497 + gemini-certs = mkOption {
1498 + description = ''
1499 + An absolute file path (which should be outside the Nix-store)
1500 + to Gemini certificates.
1501 + '';
1502 + type = with types; nullOr path;
1503 + default = null;
1504 + };
1505 + max-site-size = mkOption {
1506 + description = "Maximum size of any given site (post-gunzip), in MiB.";
1507 + type = types.int;
1508 + default = 1024;
1509 + };
1510 + user-domain = mkOption {
1511 + description = ''
1512 + Configures the user domain, if enabled.
1513 + All users are given &lt;username&gt;.this.domain.
1514 + '';
1515 + type = with types; nullOr str;
1516 + default = null;
1517 + };
1518 + };
1519 + options."pages.sr.ht::api" = {
1520 + internal-ipnet = mkOption {
1521 + description = ''
1522 + Set of IP subnets which are permitted to utilize internal API
1523 + authentication. This should be limited to the subnets
1524 + from which your *.sr.ht services are running.
1525 + See <xref linkend="opt-services.sourcehut.listenAddress"/>.
1526 + '';
1527 + type = with types; listOf str;
1528 + default = [ "127.0.0.0/8" "::1/128" ];
1529 + };
1530 + };
1531 +
1532 + options."paste.sr.ht" = commonServiceSettings "paste" // {
1533 + };
1534 +
1535 + options."todo.sr.ht" = commonServiceSettings "todo" // {
1536 + notify-from = mkOption {
1537 + description = "Outgoing email for notifications generated by users.";
1538 + type = types.str;
1539 + default = "todo-notify@localhost.localdomain";
1540 + };
1541 + webhooks = mkOption {
1542 + description = "The Redis connection used for the webhooks worker.";
1543 + type = types.str;
1544 + default = "redis+socket:///run/redis-sourcehut-todosrht/redis.sock?virtual_host=1";
1545 + };
1546 + };
1547 + options."todo.sr.ht::mail" = {
1548 + posting-domain = mkOption {
1549 + description = "Posting domain.";
1550 + type = types.str;
1551 + default = "todo.localhost.localdomain";
1552 + };
1553 + sock = mkOption {
1554 + description = ''
1555 + Path for the lmtp daemon's unix socket. Direct incoming mail to this socket.
1556 + Alternatively, specify IP:PORT and an SMTP server will be run instead.
1557 + '';
1558 + type = types.str;
1559 + default = "/tmp/todo.sr.ht-lmtp.sock";
1560 + };
1561 + sock-group = mkOption {
1562 + description = ''
1563 + The lmtp daemon will make the unix socket group-read/write
1564 + for users in this group.
1565 + '';
1566 + type = types.str;
1567 + default = "postfix";
1568 + };
1569 + };
1570 };
1571 default = { };
1572 description = ''
1573 The configuration for the sourcehut network.
1574 '';
1575 };
1576 - };
1577
1578 - config = mkIf cfg.enable {
1579 - assertions =
1580 - [
1581 - {
1582 - assertion = with cfgIni.webhooks; private-key != null && stringLength private-key == 44;
1583 - message = "The webhook's private key must be defined and of a 44 byte length.";
1584 - }
1585 + builds = {
1586 + enableWorker = mkEnableOption ''
1587 + worker for builds.sr.ht
1588
1589 - {
1590 - assertion = hasAttrByPath [ "meta.sr.ht" "origin" ] cfgIni && cfgIni."meta.sr.ht".origin != null;
1591 - message = "meta.sr.ht's origin must be defined.";
1592 - }
1593 - ];
1594 + <warning><para>
1595 + For smaller deployments, job runners can be installed alongside the master server
1596 + but even if you only build your own software, integration with other services
1597 + may cause you to run untrusted builds
1598 + (e.g. automatic testing of patches via listssrht).
1599 + See <link xlink:href="https://man.sr.ht/builds.sr.ht/configuration.md#security-model"/>.
1600 + </para></warning>
1601 + '';
1602
1603 - virtualisation.docker.enable = true;
1604 - environment.etc."sr.ht/config.ini".source =
1605 - settingsFormat.generate "sourcehut-config.ini" (mapAttrsRecursive
1606 - (
1607 - path: v: if v == null then "" else v
1608 - )
1609 - cfg.settings);
1610 + images = mkOption {
1611 + type = with types; attrsOf (attrsOf (attrsOf package));
1612 + default = { };
1613 + example = lib.literalExpression ''(let
1614 + # Pinning unstable to allow usage with flakes and limit rebuilds.
1615 + pkgs_unstable = builtins.fetchGit {
1616 + url = "https://github.com/NixOS/nixpkgs";
1617 + rev = "ff96a0fa5635770390b184ae74debea75c3fd534";
1618 + ref = "nixos-unstable";
1619 + };
1620 + image_from_nixpkgs = (import ("${pkgs.sourcehut.buildsrht}/lib/images/nixos/image.nix") {
1621 + pkgs = (import pkgs_unstable {});
1622 + });
1623 + in
1624 + {
1625 + nixos.unstable.x86_64 = image_from_nixpkgs;
1626 + }
1627 + )'';
1628 + description = ''
1629 + Images for builds.sr.ht. Each package should be distro.release.arch and point to a /nix/store/package/root.img.qcow2.
1630 + '';
1631 + };
1632 + };
1633
1634 - environment.systemPackages = [ pkgs.sourcehut.coresrht ];
1635 + git = {
1636 + package = mkOption {
1637 + type = types.package;
1638 + default = pkgs.git;
1639 + example = literalExpression "pkgs.gitFull";
1640 + description = ''
1641 + Git package for git.sr.ht. This can help silence collisions.
1642 + '';
1643 + };
1644 + fcgiwrap.preforkProcess = mkOption {
1645 + description = "Number of fcgiwrap processes to prefork.";
1646 + type = types.int;
1647 + default = 4;
1648 + };
1649 + };
1650
1651 - # PostgreSQL server
1652 - services.postgresql.enable = mkOverride 999 true;
1653 - # Mail server
1654 - services.postfix.enable = mkOverride 999 true;
1655 - # Cron daemon
1656 - services.cron.enable = mkOverride 999 true;
1657 - # Redis server
1658 - services.redis.enable = mkOverride 999 true;
1659 - services.redis.bind = mkOverride 999 "127.0.0.1";
1660 + hg = {
1661 + package = mkOption {
1662 + type = types.package;
1663 + default = pkgs.mercurial;
1664 + description = ''
1665 + Mercurial package for hg.sr.ht. This can help silence collisions.
1666 + '';
1667 + };
1668 + cloneBundles = mkOption {
1669 + type = types.bool;
1670 + default = false;
1671 + description = ''
1672 + Generate clonebundles (which require more disk space but dramatically speed up cloning large repositories).
1673 + '';
1674 + };
1675 + };
1676
1677 - services.sourcehut.settings = {
1678 - # The name of your network of sr.ht-based sites
1679 - "sr.ht".site-name = mkDefault "sourcehut";
1680 - # The top-level info page for your site
1681 - "sr.ht".site-info = mkDefault "https://sourcehut.org";
1682 - # {{ site-name }}, {{ site-blurb }}
1683 - "sr.ht".site-blurb = mkDefault "the hacker's forge";
1684 - # If this != production, we add a banner to each page
1685 - "sr.ht".environment = mkDefault "development";
1686 - # Contact information for the site owners
1687 - "sr.ht".owner-name = mkDefault "Drew DeVault";
1688 - "sr.ht".owner-email = mkDefault "sir@cmpwn.com";
1689 - # The source code for your fork of sr.ht
1690 - "sr.ht".source-url = mkDefault "https://git.sr.ht/~sircmpwn/srht";
1691 - # A secret key to encrypt session cookies with
1692 - "sr.ht".secret-key = mkDefault null;
1693 - "sr.ht".global-domain = mkDefault null;
1694 -
1695 - # Outgoing SMTP settings
1696 - mail.smtp-host = mkDefault null;
1697 - mail.smtp-port = mkDefault null;
1698 - mail.smtp-user = mkDefault null;
1699 - mail.smtp-password = mkDefault null;
1700 - mail.smtp-from = mkDefault null;
1701 - # Application exceptions are emailed to this address
1702 - mail.error-to = mkDefault null;
1703 - mail.error-from = mkDefault null;
1704 - # Your PGP key information (DO NOT mix up pub and priv here)
1705 - # You must remove the password from your secret key, if present.
1706 - # You can do this with gpg --edit-key [key-id], then use the passwd
1707 - # command and do not enter a new password.
1708 - mail.pgp-privkey = mkDefault null;
1709 - mail.pgp-pubkey = mkDefault null;
1710 - mail.pgp-key-id = mkDefault null;
1711 -
1712 - # base64-encoded Ed25519 key for signing webhook payloads. This should be
1713 - # consistent for all *.sr.ht sites, as we'll use this key to verify signatures
1714 - # from other sites in your network.
1715 - #
1716 - # Use the srht-webhook-keygen command to generate a key.
1717 - webhooks.private-key = mkDefault null;
1718 + lists = {
1719 + process = {
1720 + extraArgs = mkOption {
1721 + type = with types; listOf str;
1722 + default = [ "--loglevel DEBUG" "--pool eventlet" "--without-heartbeat" ];
1723 + description = "Extra arguments passed to the Celery responsible for processing mails.";
1724 + };
1725 + celeryConfig = mkOption {
1726 + type = types.lines;
1727 + default = "";
1728 + description = "Content of the <literal>celeryconfig.py</literal> used by the Celery of <literal>listssrht-process</literal>.";
1729 + };
1730 + };
1731 };
1732 };
1733 +
1734 + config = mkIf cfg.enable (mkMerge [
1735 + {
1736 + environment.systemPackages = [ pkgs.sourcehut.coresrht ];
1737 +
1738 + services.sourcehut.settings = {
1739 + "git.sr.ht".outgoing-domain = mkDefault "https://git.${domain}";
1740 + "lists.sr.ht".notify-from = mkDefault "lists-notify@${domain}";
1741 + "lists.sr.ht".posting-domain = mkDefault "lists.${domain}";
1742 + "meta.sr.ht::settings".onboarding-redirect = mkDefault "https://meta.${domain}";
1743 + "todo.sr.ht".notify-from = mkDefault "todo-notify@${domain}";
1744 + "todo.sr.ht::mail".posting-domain = mkDefault "todo.${domain}";
1745 + };
1746 + }
1747 + (mkIf cfg.postgresql.enable {
1748 + assertions = [
1749 + { assertion = postgresql.enable;
1750 + message = "postgresql must be enabled and configured";
1751 + }
1752 + ];
1753 + })
1754 + (mkIf cfg.postfix.enable {
1755 + assertions = [
1756 + { assertion = postfix.enable;
1757 + message = "postfix must be enabled and configured";
1758 + }
1759 + ];
1760 + # Needed for sharing the LMTP sockets with JoinsNamespaceOf=
1761 + systemd.services.postfix.serviceConfig.PrivateTmp = true;
1762 + })
1763 + (mkIf cfg.redis.enable {
1764 + services.redis.vmOverCommit = mkDefault true;
1765 + })
1766 + (mkIf cfg.nginx.enable {
1767 + assertions = [
1768 + { assertion = nginx.enable;
1769 + message = "nginx must be enabled and configured";
1770 + }
1771 + ];
1772 + # For proxyPass= in virtual-hosts for Sourcehut services.
1773 + services.nginx.recommendedProxySettings = mkDefault true;
1774 + })
1775 + (mkIf (cfg.builds.enable || cfg.git.enable || cfg.hg.enable) {
1776 + services.openssh = {
1777 + # Note that sshd will continue to honor AuthorizedKeysFile.
1778 + # Note that you may want automatically rotate
1779 + # or link to /dev/null the following log files:
1780 + # - /var/log/gitsrht-dispatch
1781 + # - /var/log/{build,git,hg}srht-keys
1782 + # - /var/log/{git,hg}srht-shell
1783 + # - /var/log/gitsrht-update-hook
1784 + authorizedKeysCommand = ''/etc/ssh/sourcehut/subdir/srht-dispatch "%u" "%h" "%t" "%k"'';
1785 + # srht-dispatch will setuid/setgid according to [git.sr.ht::dispatch]
1786 + authorizedKeysCommandUser = "root";
1787 + extraConfig = ''
1788 + PermitUserEnvironment SRHT_*
1789 + '';
1790 + };
1791 + environment.etc."ssh/sourcehut/config.ini".source =
1792 + settingsFormat.generate "sourcehut-dispatch-config.ini"
1793 + (filterAttrs (k: v: k == "git.sr.ht::dispatch")
1794 + cfg.settings);
1795 + environment.etc."ssh/sourcehut/subdir/srht-dispatch" = {
1796 + # sshd_config(5): The program must be owned by root, not writable by group or others
1797 + mode = "0755";
1798 + source = pkgs.writeShellScript "srht-dispatch" ''
1799 + set -e
1800 + cd /etc/ssh/sourcehut/subdir
1801 + ${cfg.python}/bin/gitsrht-dispatch "$@"
1802 + '';
1803 + };
1804 + systemd.services.sshd = {
1805 + #path = optional cfg.git.enable [ cfg.git.package ];
1806 + serviceConfig = {
1807 + BindReadOnlyPaths =
1808 + # Note that those /usr/bin/* paths are hardcoded in multiple places in *.sr.ht,
1809 + # for instance to get the user from the [git.sr.ht::dispatch] settings.
1810 + # *srht-keys needs to:
1811 + # - access a redis-server in [sr.ht] redis-host,
1812 + # - access the PostgreSQL server in [*.sr.ht] connection-string,
1813 + # - query metasrht-api (through the HTTP API).
1814 + # Using this has the side effect of creating empty files in /usr/bin/
1815 + optionals cfg.builds.enable [
1816 + "${pkgs.writeShellScript "buildsrht-keys-wrapper" ''
1817 + set -e
1818 + cd /run/sourcehut/buildsrht/subdir
1819 + set -x
1820 + exec -a "$0" ${pkgs.sourcehut.buildsrht}/bin/buildsrht-keys "$@"
1821 + ''}:/usr/bin/buildsrht-keys"
1822 + "${pkgs.sourcehut.buildsrht}/bin/master-shell:/usr/bin/master-shell"
1823 + "${pkgs.sourcehut.buildsrht}/bin/runner-shell:/usr/bin/runner-shell"
1824 + ] ++
1825 + optionals cfg.git.enable [
1826 + # /path/to/gitsrht-keys calls /path/to/gitsrht-shell,
1827 + # or [git.sr.ht] shell= if set.
1828 + "${pkgs.writeShellScript "gitsrht-keys-wrapper" ''
1829 + set -e
1830 + cd /run/sourcehut/gitsrht/subdir
1831 + set -x
1832 + exec -a "$0" ${pkgs.sourcehut.gitsrht}/bin/gitsrht-keys "$@"
1833 + ''}:/usr/bin/gitsrht-keys"
1834 + "${pkgs.writeShellScript "gitsrht-shell-wrapper" ''
1835 + set -e
1836 + cd /run/sourcehut/gitsrht/subdir
1837 + set -x
1838 + exec -a "$0" ${pkgs.sourcehut.gitsrht}/bin/gitsrht-shell "$@"
1839 + ''}:/usr/bin/gitsrht-shell"
1840 + "${pkgs.writeShellScript "gitsrht-update-hook" ''
1841 + set -e
1842 + test -e "''${PWD%/*}"/config.ini ||
1843 + # Git hooks are run relative to their repository's directory,
1844 + # but gitsrht-update-hook looks up ../config.ini
1845 + ln -s /run/sourcehut/gitsrht/config.ini "''${PWD%/*}"/config.ini
1846 + # hooks/post-update calls /usr/bin/gitsrht-update-hook as hooks/stage-3
1847 + # but this wrapper being a bash script, it overrides $0 with /usr/bin/gitsrht-update-hook
1848 + # hence this hack to put hooks/stage-3 back into gitsrht-update-hook's $0
1849 + if test "''${STAGE3:+set}"
1850 + then
1851 + set -x
1852 + exec -a hooks/stage-3 ${pkgs.sourcehut.gitsrht}/bin/gitsrht-update-hook "$@"
1853 + else
1854 + export STAGE3=set
1855 + set -x
1856 + exec -a "$0" ${pkgs.sourcehut.gitsrht}/bin/gitsrht-update-hook "$@"
1857 + fi
1858 + ''}:/usr/bin/gitsrht-update-hook"
1859 + ] ++
1860 + optionals cfg.hg.enable [
1861 + # /path/to/hgsrht-keys calls /path/to/hgsrht-shell,
1862 + # or [hg.sr.ht] shell= if set.
1863 + "${pkgs.writeShellScript "hgsrht-keys-wrapper" ''
1864 + set -e
1865 + cd /run/sourcehut/hgsrht/subdir
1866 + set -x
1867 + exec -a "$0" ${pkgs.sourcehut.hgsrht}/bin/hgsrht-keys "$@"
1868 + ''}:/usr/bin/hgsrht-keys"
1869 + "${pkgs.writeShellScript "hgsrht-shell-wrapper" ''
1870 + set -e
1871 + cd /run/sourcehut/hgsrht/subdir
1872 + set -x
1873 + exec -a "$0" ${pkgs.sourcehut.hgsrht}/bin/hgsrht-shell "$@"
1874 + ''}:/usr/bin/hgsrht-shell"
1875 + # Mercurial's changegroup hooks are run relative to their repository's directory,
1876 + # but hgsrht-hook-changegroup looks up ./config.ini
1877 + "${pkgs.writeShellScript "hgsrht-hook-changegroup" ''
1878 + set -e
1879 + test -e "''$PWD"/config.ini ||
1880 + ln -s /run/sourcehut/hgsrht/config.ini "''$PWD"/config.ini
1881 + set -x
1882 + exec -a "$0" ${cfg.python}/bin/hgsrht-hook-changegroup "$@"
1883 + ''}:/usr/bin/hgsrht-hook-changegroup"
1884 + ];
1885 + };
1886 + };
1887 + })
1888 + ]);
1889 +
1890 + imports = [
1891 +
1892 + (import ./service.nix "builds" {
1893 + inherit configIniOfService;
1894 + srvsrht = "buildsrht";
1895 + port = 5002;
1896 + # TODO: a celery worker on the master and worker are apparently needed
1897 + extraServices.buildsrht-worker = let
1898 + qemuPackage = pkgs.qemu_kvm;
1899 + serviceName = "buildsrht-worker";
1900 + statePath = "/var/lib/sourcehut/${serviceName}";
1901 + in mkIf cfg.builds.enableWorker {
1902 + path = [ pkgs.openssh pkgs.docker ];
1903 + preStart = ''
1904 + set -x
1905 + if test -z "$(docker images -q qemu:latest 2>/dev/null)" \
1906 + || test "$(cat ${statePath}/docker-image-qemu)" != "${qemuPackage.version}"
1907 + then
1908 + # Create and import qemu:latest image for docker
1909 + ${pkgs.dockerTools.streamLayeredImage {
1910 + name = "qemu";
1911 + tag = "latest";
1912 + contents = [ qemuPackage ];
1913 + }} | docker load
1914 + # Mark down current package version
1915 + echo '${qemuPackage.version}' >${statePath}/docker-image-qemu
1916 + fi
1917 + '';
1918 + serviceConfig = {
1919 + ExecStart = "${pkgs.sourcehut.buildsrht}/bin/builds.sr.ht-worker";
1920 + BindPaths = [ cfg.settings."builds.sr.ht::worker".buildlogs ];
1921 + LogsDirectory = [ "sourcehut/${serviceName}" ];
1922 + RuntimeDirectory = [ "sourcehut/${serviceName}/subdir" ];
1923 + StateDirectory = [ "sourcehut/${serviceName}" ];
1924 + TimeoutStartSec = "1800s";
1925 + # builds.sr.ht-worker looks up ../config.ini
1926 + WorkingDirectory = "-"+"/run/sourcehut/${serviceName}/subdir";
1927 + };
1928 + };
1929 + extraConfig = let
1930 + image_dirs = flatten (
1931 + mapAttrsToList (distro: revs:
1932 + mapAttrsToList (rev: archs:
1933 + mapAttrsToList (arch: image:
1934 + pkgs.runCommand "buildsrht-images" { } ''
1935 + mkdir -p $out/${distro}/${rev}/${arch}
1936 + ln -s ${image}/*.qcow2 $out/${distro}/${rev}/${arch}/root.img.qcow2
1937 + ''
1938 + ) archs
1939 + ) revs
1940 + ) cfg.builds.images
1941 + );
1942 + image_dir_pre = pkgs.symlinkJoin {
1943 + name = "builds.sr.ht-worker-images-pre";
1944 + paths = image_dirs;
1945 + # FIXME: not working, apparently because ubuntu/latest is a broken link
1946 + # ++ [ "${pkgs.sourcehut.buildsrht}/lib/images" ];
1947 + };
1948 + image_dir = pkgs.runCommand "builds.sr.ht-worker-images" { } ''
1949 + mkdir -p $out/images
1950 + cp -Lr ${image_dir_pre}/* $out/images
1951 + '';
1952 + in mkMerge [
1953 + {
1954 + users.users.${cfg.builds.user}.shell = pkgs.bash;
1955 +
1956 + virtualisation.docker.enable = true;
1957 +
1958 + services.sourcehut.settings = mkMerge [
1959 + { # Note that git.sr.ht::dispatch is not a typo,
1960 + # gitsrht-dispatch always use this section
1961 + "git.sr.ht::dispatch"."/usr/bin/buildsrht-keys" =
1962 + mkDefault "${cfg.builds.user}:${cfg.builds.group}";
1963 + }
1964 + (mkIf cfg.builds.enableWorker {
1965 + "builds.sr.ht::worker".shell = "/usr/bin/runner-shell";
1966 + "builds.sr.ht::worker".images = mkDefault "${image_dir}/images";
1967 + "builds.sr.ht::worker".controlcmd = mkDefault "${image_dir}/images/control";
1968 + })
1969 + ];
1970 + }
1971 + (mkIf cfg.builds.enableWorker {
1972 + users.groups = {
1973 + docker.members = [ cfg.builds.user ];
1974 + };
1975 + })
1976 + (mkIf (cfg.builds.enableWorker && cfg.nginx.enable) {
1977 + # Allow nginx access to buildlogs
1978 + users.users.${nginx.user}.extraGroups = [ cfg.builds.group ];
1979 + systemd.services.nginx = {
1980 + serviceConfig.BindReadOnlyPaths = [ cfg.settings."builds.sr.ht::worker".buildlogs ];
1981 + };
1982 + services.nginx.virtualHosts."logs.${domain}" = mkMerge [ {
1983 + /* FIXME: is a listen needed?
1984 + listen = with builtins;
1985 + # FIXME: not compatible with IPv6
1986 + let address = split ":" cfg.settings."builds.sr.ht::worker".name; in
1987 + [{ addr = elemAt address 0; port = lib.toInt (elemAt address 2); }];
1988 + */
1989 + locations."/logs/".alias = cfg.settings."builds.sr.ht::worker".buildlogs + "/";
1990 + } cfg.nginx.virtualHost ];
1991 + })
1992 + ];
1993 + })
1994 +
1995 + (import ./service.nix "dispatch" {
1996 + inherit configIniOfService;
1997 + port = 5005;
1998 + })
1999 +
2000 + (import ./service.nix "git" (let
2001 + baseService = {
2002 + path = [ cfg.git.package ];
2003 + serviceConfig.BindPaths = [ "${cfg.settings."git.sr.ht".repos}:/var/lib/sourcehut/gitsrht/repos" ];
2004 + };
2005 + in {
2006 + inherit configIniOfService;
2007 + mainService = mkMerge [ baseService {
2008 + serviceConfig.StateDirectory = [ "sourcehut/gitsrht" "sourcehut/gitsrht/repos" ];
2009 + preStart = mkIf (!versionAtLeast config.system.stateVersion "22.05") (mkBefore ''
2010 + # Fix Git hooks of repositories pre-dating https://github.com/NixOS/nixpkgs/pull/133984
2011 + (
2012 + set +f
2013 + shopt -s nullglob
2014 + for h in /var/lib/sourcehut/gitsrht/repos/~*/*/hooks/{pre-receive,update,post-update}
2015 + do ln -fnsv /usr/bin/gitsrht-update-hook "$h"; done
2016 + )
2017 + '');
2018 + } ];
2019 + port = 5001;
2020 + webhooks = true;
2021 + extraTimers.gitsrht-periodic = {
2022 + service = baseService;
2023 + timerConfig.OnCalendar = ["*:0/20"];
2024 + };
2025 + extraConfig = mkMerge [
2026 + {
2027 + # https://stackoverflow.com/questions/22314298/git-push-results-in-fatal-protocol-error-bad-line-length-character-this
2028 + # Probably could use gitsrht-shell if output is restricted to just parameters...
2029 + users.users.${cfg.git.user}.shell = pkgs.bash;
2030 + services.sourcehut.settings = {
2031 + "git.sr.ht::dispatch"."/usr/bin/gitsrht-keys" =
2032 + mkDefault "${cfg.git.user}:${cfg.git.group}";
2033 + };
2034 + systemd.services.sshd = baseService;
2035 + }
2036 + (mkIf cfg.nginx.enable {
2037 + services.nginx.virtualHosts."git.${domain}" = {
2038 + locations."/authorize" = {
2039 + proxyPass = "http://${cfg.listenAddress}:${toString cfg.git.port}";
2040 + extraConfig = ''
2041 + proxy_pass_request_body off;
2042 + proxy_set_header Content-Length "";
2043 + proxy_set_header X-Original-URI $request_uri;
2044 + '';
2045 + };
2046 + locations."~ ^/([^/]+)/([^/]+)/(HEAD|info/refs|objects/info/.*|git-upload-pack).*$" = {
2047 + root = "/var/lib/sourcehut/gitsrht/repos";
2048 + fastcgiParams = {
2049 + GIT_HTTP_EXPORT_ALL = "";
2050 + GIT_PROJECT_ROOT = "$document_root";
2051 + PATH_INFO = "$uri";
2052 + SCRIPT_FILENAME = "${cfg.git.package}/bin/git-http-backend";
2053 + };
2054 + extraConfig = ''
2055 + auth_request /authorize;
2056 + fastcgi_read_timeout 500s;
2057 + fastcgi_pass unix:/run/gitsrht-fcgiwrap.sock;
2058 + gzip off;
2059 + '';
2060 + };
2061 + };
2062 + systemd.sockets.gitsrht-fcgiwrap = {
2063 + before = [ "nginx.service" ];
2064 + wantedBy = [ "sockets.target" "gitsrht.service" ];
2065 + # This path remains accessible to nginx.service, which has no RootDirectory=
2066 + socketConfig.ListenStream = "/run/gitsrht-fcgiwrap.sock";
2067 + socketConfig.SocketUser = nginx.user;
2068 + socketConfig.SocketMode = "600";
2069 + };
2070 + })
2071 + ];
2072 + extraServices.gitsrht-fcgiwrap = mkIf cfg.nginx.enable {
2073 + serviceConfig = {
2074 + # Socket is passed by gitsrht-fcgiwrap.socket
2075 + ExecStart = "${pkgs.fcgiwrap}/sbin/fcgiwrap -c ${toString cfg.git.fcgiwrap.preforkProcess}";
2076 + # No need for config.ini
2077 + ExecStartPre = mkForce [];
2078 + User = null;
2079 + DynamicUser = true;
2080 + BindReadOnlyPaths = [ "${cfg.settings."git.sr.ht".repos}:/var/lib/sourcehut/gitsrht/repos" ];
2081 + IPAddressDeny = "any";
2082 + InaccessiblePaths = [ "-+/run/postgresql" "-+/run/redis-sourcehut" ];
2083 + PrivateNetwork = true;
2084 + RestrictAddressFamilies = mkForce [ "none" ];
2085 + SystemCallFilter = mkForce [
2086 + "@system-service"
2087 + "~@aio" "~@keyring" "~@memlock" "~@privileged" "~@resources" "~@setuid"
2088 + # @timer is needed for alarm()
2089 + ];
2090 + };
2091 + };
2092 + }))
2093 +
2094 + (import ./service.nix "hg" (let
2095 + baseService = {
2096 + path = [ cfg.hg.package ];
2097 + serviceConfig.BindPaths = [ "${cfg.settings."hg.sr.ht".repos}:/var/lib/sourcehut/hgsrht/repos" ];
2098 + };
2099 + in {
2100 + inherit configIniOfService;
2101 + mainService = mkMerge [ baseService {
2102 + serviceConfig.StateDirectory = [ "sourcehut/hgsrht" "sourcehut/hgsrht/repos" ];
2103 + } ];
2104 + port = 5010;
2105 + webhooks = true;
2106 + extraTimers.hgsrht-periodic = {
2107 + service = baseService;
2108 + timerConfig.OnCalendar = ["*:0/20"];
2109 + };
2110 + extraTimers.hgsrht-clonebundles = mkIf cfg.hg.cloneBundles {
2111 + service = baseService;
2112 + timerConfig.OnCalendar = ["daily"];
2113 + timerConfig.AccuracySec = "1h";
2114 + };
2115 + extraConfig = mkMerge [
2116 + {
2117 + users.users.${cfg.hg.user}.shell = pkgs.bash;
2118 + services.sourcehut.settings = {
2119 + # Note that git.sr.ht::dispatch is not a typo,
2120 + # gitsrht-dispatch always uses this section.
2121 + "git.sr.ht::dispatch"."/usr/bin/hgsrht-keys" =
2122 + mkDefault "${cfg.hg.user}:${cfg.hg.group}";
2123 + };
2124 + systemd.services.sshd = baseService;
2125 + }
2126 + (mkIf cfg.nginx.enable {
2127 + # Allow nginx access to repositories
2128 + users.users.${nginx.user}.extraGroups = [ cfg.hg.group ];
2129 + services.nginx.virtualHosts."hg.${domain}" = {
2130 + locations."/authorize" = {
2131 + proxyPass = "http://${cfg.listenAddress}:${toString cfg.hg.port}";
2132 + extraConfig = ''
2133 + proxy_pass_request_body off;
2134 + proxy_set_header Content-Length "";
2135 + proxy_set_header X-Original-URI $request_uri;
2136 + '';
2137 + };
2138 + # Let clients reach pull bundles. We don't really need to lock this down even for
2139 + # private repos because the bundles are named after the revision hashes...
2140 + # so someone would need to know or guess a SHA value to download anything.
2141 + # TODO: proxyPass to an hg serve service?
2142 + locations."~ ^/[~^][a-z0-9_]+/[a-zA-Z0-9_.-]+/\\.hg/bundles/.*$" = {
2143 + root = "/var/lib/nginx/hgsrht/repos";
2144 + extraConfig = ''
2145 + auth_request /authorize;
2146 + gzip off;
2147 + '';
2148 + };
2149 + };
2150 + systemd.services.nginx = {
2151 + serviceConfig.BindReadOnlyPaths = [ "${cfg.settings."hg.sr.ht".repos}:/var/lib/nginx/hgsrht/repos" ];
2152 + };
2153 + })
2154 + ];
2155 + }))
2156 +
2157 + (import ./service.nix "hub" {
2158 + inherit configIniOfService;
2159 + port = 5014;
2160 + extraConfig = {
2161 + services.nginx = mkIf cfg.nginx.enable {
2162 + virtualHosts."hub.${domain}" = mkMerge [ {
2163 + serverAliases = [ domain ];
2164 + } cfg.nginx.virtualHost ];
2165 + };
2166 + };
2167 + })
2168 +
2169 + (import ./service.nix "lists" (let
2170 + srvsrht = "listssrht";
2171 + in {
2172 + inherit configIniOfService;
2173 + port = 5006;
2174 + webhooks = true;
2175 + # Receive the mail from Postfix and enqueue them into Redis and PostgreSQL
2176 + extraServices.listssrht-lmtp = {
2177 + wants = [ "postfix.service" ];
2178 + unitConfig.JoinsNamespaceOf = optional cfg.postfix.enable "postfix.service";
2179 + serviceConfig.ExecStart = "${cfg.python}/bin/listssrht-lmtp";
2180 + # Avoid crashing: os.chown(sock, os.getuid(), sock_gid)
2181 + serviceConfig.PrivateUsers = mkForce false;
2182 + };
2183 + # Dequeue the mails from Redis and dispatch them
2184 + extraServices.listssrht-process = {
2185 + serviceConfig = {
2186 + preStart = ''
2187 + cp ${pkgs.writeText "${srvsrht}-webhooks-celeryconfig.py" cfg.lists.process.celeryConfig} \
2188 + /run/sourcehut/${srvsrht}-webhooks/celeryconfig.py
2189 + '';
2190 + ExecStart = "${cfg.python}/bin/celery --app listssrht.process worker --hostname listssrht-process@%%h " + concatStringsSep " " cfg.lists.process.extraArgs;
2191 + # Avoid crashing: os.getloadavg()
2192 + ProcSubset = mkForce "all";
2193 + };
2194 + };
2195 + extraConfig = mkIf cfg.postfix.enable {
2196 + users.groups.${postfix.group}.members = [ cfg.lists.user ];
2197 + services.sourcehut.settings."lists.sr.ht::mail".sock-group = postfix.group;
2198 + services.postfix = {
2199 + destination = [ "lists.${domain}" ];
2200 + # FIXME: an accurate recipient list should be queried
2201 + # from the lists.sr.ht PostgreSQL database to avoid backscattering.
2202 + # But usernames are unfortunately not in that database but in meta.sr.ht.
2203 + # Note that two syntaxes are allowed:
2204 + # - ~username/list-name@lists.${domain}
2205 + # - u.username.list-name@lists.${domain}
2206 + localRecipients = [ "@lists.${domain}" ];
2207 + transport = ''
2208 + lists.${domain} lmtp:unix:${cfg.settings."lists.sr.ht::worker".sock}
2209 + '';
2210 + };
2211 + };
2212 + }))
2213 +
2214 + (import ./service.nix "man" {
2215 + inherit configIniOfService;
2216 + port = 5004;
2217 + })
2218 +
2219 + (import ./service.nix "meta" {
2220 + inherit configIniOfService;
2221 + port = 5000;
2222 + webhooks = true;
2223 + extraServices.metasrht-api = {
2224 + serviceConfig.Restart = "always";
2225 + serviceConfig.RestartSec = "2s";
2226 + preStart = "set -x\n" + concatStringsSep "\n\n" (attrValues (mapAttrs (k: s:
2227 + let srvMatch = builtins.match "^([a-z]*)\\.sr\\.ht$" k;
2228 + srv = head srvMatch;
2229 + in
2230 + # Configure client(s) as "preauthorized"
2231 + optionalString (srvMatch != null && cfg.${srv}.enable && ((s.oauth-client-id or null) != null)) ''
2232 + # Configure ${srv}'s OAuth client as "preauthorized"
2233 + ${postgresql.package}/bin/psql '${cfg.settings."meta.sr.ht".connection-string}' \
2234 + -c "UPDATE oauthclient SET preauthorized = true WHERE client_id = '${s.oauth-client-id}'"
2235 + ''
2236 + ) cfg.settings));
2237 + serviceConfig.ExecStart = "${pkgs.sourcehut.metasrht}/bin/metasrht-api -b ${cfg.listenAddress}:${toString (cfg.meta.port + 100)}";
2238 + };
2239 + extraTimers.metasrht-daily.timerConfig = {
2240 + OnCalendar = ["daily"];
2241 + AccuracySec = "1h";
2242 + };
2243 + extraConfig = mkMerge [
2244 + {
2245 + assertions = [
2246 + { assertion = let s = cfg.settings."meta.sr.ht::billing"; in
2247 + s.enabled == "yes" -> (s.stripe-public-key != null && s.stripe-secret-key != null);
2248 + message = "If meta.sr.ht::billing is enabled, the keys must be defined.";
2249 + }
2250 + ];
2251 + environment.systemPackages = optional cfg.meta.enable
2252 + (pkgs.writeShellScriptBin "metasrht-manageuser" ''
2253 + set -eux
2254 + if test "$(${pkgs.coreutils}/bin/id -n -u)" != '${cfg.meta.user}'
2255 + then exec sudo -u '${cfg.meta.user}' "$0" "$@"
2256 + else
2257 + # In order to load config.ini
2258 + if cd /run/sourcehut/metasrht
2259 + then exec ${cfg.python}/bin/metasrht-manageuser "$@"
2260 + else cat <<EOF
2261 + Please run: sudo systemctl start metasrht
2262 + EOF
2263 + exit 1
2264 + fi
2265 + fi
2266 + '');
2267 + }
2268 + (mkIf cfg.nginx.enable {
2269 + services.nginx.virtualHosts."meta.${domain}" = {
2270 + locations."/query" = {
2271 + proxyPass = cfg.settings."meta.sr.ht".api-origin;
2272 + extraConfig = ''
2273 + if ($request_method = 'OPTIONS') {
2274 + add_header 'Access-Control-Allow-Origin' '*';
2275 + add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
2276 + add_header 'Access-Control-Allow-Headers' 'User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
2277 + add_header 'Access-Control-Max-Age' 1728000;
2278 + add_header 'Content-Type' 'text/plain; charset=utf-8';
2279 + add_header 'Content-Length' 0;
2280 + return 204;
2281 + }
2282 +
2283 + add_header 'Access-Control-Allow-Origin' '*';
2284 + add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
2285 + add_header 'Access-Control-Allow-Headers' 'User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
2286 + add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
2287 + '';
2288 + };
2289 + };
2290 + })
2291 + ];
2292 + })
2293 +
2294 + (import ./service.nix "pages" {
2295 + inherit configIniOfService;
2296 + port = 5112;
2297 + mainService = let
2298 + srvsrht = "pagessrht";
2299 + version = pkgs.sourcehut.${srvsrht}.version;
2300 + stateDir = "/var/lib/sourcehut/${srvsrht}";
2301 + iniKey = "pages.sr.ht";
2302 + in {
2303 + preStart = mkBefore ''
2304 + set -x
2305 + # Use the /run/sourcehut/${srvsrht}/config.ini
2306 + # installed by a previous ExecStartPre= in baseService
2307 + cd /run/sourcehut/${srvsrht}
2308 +
2309 + if test ! -e ${stateDir}/db; then
2310 + ${postgresql.package}/bin/psql '${cfg.settings.${iniKey}.connection-string}' -f ${pkgs.sourcehut.pagessrht}/share/sql/schema.sql
2311 + echo ${version} >${stateDir}/db
2312 + fi
2313 +
2314 + ${optionalString cfg.settings.${iniKey}.migrate-on-upgrade ''
2315 + # Just try all the migrations because they're not linked to the version
2316 + for sql in ${pkgs.sourcehut.pagessrht}/share/sql/migrations/*.sql; do
2317 + ${postgresql.package}/bin/psql '${cfg.settings.${iniKey}.connection-string}' -f "$sql" || true
2318 + done
2319 + ''}
2320 +
2321 + # Disable webhook
2322 + touch ${stateDir}/webhook
2323 + '';
2324 + serviceConfig = {
2325 + ExecStart = mkForce "${pkgs.sourcehut.pagessrht}/bin/pages.sr.ht -b ${cfg.listenAddress}:${toString cfg.pages.port}";
2326 + };
2327 + };
2328 + })
2329 +
2330 + (import ./service.nix "paste" {
2331 + inherit configIniOfService;
2332 + port = 5011;
2333 + })
2334 +
2335 + (import ./service.nix "todo" {
2336 + inherit configIniOfService;
2337 + port = 5003;
2338 + webhooks = true;
2339 + extraServices.todosrht-lmtp = {
2340 + wants = [ "postfix.service" ];
2341 + unitConfig.JoinsNamespaceOf = optional cfg.postfix.enable "postfix.service";
2342 + serviceConfig.ExecStart = "${cfg.python}/bin/todosrht-lmtp";
2343 + # Avoid crashing: os.chown(sock, os.getuid(), sock_gid)
2344 + serviceConfig.PrivateUsers = mkForce false;
2345 + };
2346 + extraConfig = mkIf cfg.postfix.enable {
2347 + users.groups.${postfix.group}.members = [ cfg.todo.user ];
2348 + services.sourcehut.settings."todo.sr.ht::mail".sock-group = postfix.group;
2349 + services.postfix = {
2350 + destination = [ "todo.${domain}" ];
2351 + # FIXME: an accurate recipient list should be queried
2352 + # from the todo.sr.ht PostgreSQL database to avoid backscattering.
2353 + # But usernames are unfortunately not in that database but in meta.sr.ht.
2354 + # Note that two syntaxes are allowed:
2355 + # - ~username/tracker-name@todo.${domain}
2356 + # - u.username.tracker-name@todo.${domain}
2357 + localRecipients = [ "@todo.${domain}" ];
2358 + transport = ''
2359 + todo.${domain} lmtp:unix:${cfg.settings."todo.sr.ht::mail".sock}
2360 + '';
2361 + };
2362 + };
2363 + })
2364 +
2365 + (mkRenamedOptionModule [ "services" "sourcehut" "originBase" ]
2366 + [ "services" "sourcehut" "settings" "sr.ht" "global-domain" ])
2367 + (mkRenamedOptionModule [ "services" "sourcehut" "address" ]
2368 + [ "services" "sourcehut" "listenAddress" ])
2369 +
2370 + ];
2371 +
2372 meta.doc = ./sourcehut.xml;
2373 - meta.maintainers = with maintainers; [ tomberek ];
2374 + meta.maintainers = with maintainers; [ julm tomberek ];
2375 }
2376 diff --git a/nixos/modules/services/misc/sourcehut/dispatch.nix b/nixos/modules/services/misc/sourcehut/dispatch.nix
2377 deleted file mode 100644
2378 index a9db17bebe8..00000000000
2379 --- a/nixos/modules/services/misc/sourcehut/dispatch.nix
2380 +++ /dev/null
2381 @@ -1,125 +0,0 @@
2382 -{ config, lib, pkgs, ... }:
2383 -
2384 -with lib;
2385 -let
2386 - cfg = config.services.sourcehut;
2387 - cfgIni = cfg.settings;
2388 - scfg = cfg.dispatch;
2389 - iniKey = "dispatch.sr.ht";
2390 -
2391 - drv = pkgs.sourcehut.dispatchsrht;
2392 -in
2393 -{
2394 - options.services.sourcehut.dispatch = {
2395 - user = mkOption {
2396 - type = types.str;
2397 - default = "dispatchsrht";
2398 - description = ''
2399 - User for dispatch.sr.ht.
2400 - '';
2401 - };
2402 -
2403 - port = mkOption {
2404 - type = types.port;
2405 - default = 5005;
2406 - description = ''
2407 - Port on which the "dispatch" module should listen.
2408 - '';
2409 - };
2410 -
2411 - database = mkOption {
2412 - type = types.str;
2413 - default = "dispatch.sr.ht";
2414 - description = ''
2415 - PostgreSQL database name for dispatch.sr.ht.
2416 - '';
2417 - };
2418 -
2419 - statePath = mkOption {
2420 - type = types.path;
2421 - default = "${cfg.statePath}/dispatchsrht";
2422 - description = ''
2423 - State path for dispatch.sr.ht.
2424 - '';
2425 - };
2426 - };
2427 -
2428 - config = with scfg; lib.mkIf (cfg.enable && elem "dispatch" cfg.services) {
2429 -
2430 - users = {
2431 - users = {
2432 - "${user}" = {
2433 - isSystemUser = true;
2434 - group = user;
2435 - description = "dispatch.sr.ht user";
2436 - };
2437 - };
2438 -
2439 - groups = {
2440 - "${user}" = { };
2441 - };
2442 - };
2443 -
2444 - services.postgresql = {
2445 - authentication = ''
2446 - local ${database} ${user} trust
2447 - '';
2448 - ensureDatabases = [ database ];
2449 - ensureUsers = [
2450 - {
2451 - name = user;
2452 - ensurePermissions = { "DATABASE \"${database}\"" = "ALL PRIVILEGES"; };
2453 - }
2454 - ];
2455 - };
2456 -
2457 - systemd = {
2458 - tmpfiles.rules = [
2459 - "d ${statePath} 0750 ${user} ${user} -"
2460 - ];
2461 -
2462 - services.dispatchsrht = import ./service.nix { inherit config pkgs lib; } scfg drv iniKey {
2463 - after = [ "postgresql.service" "network.target" ];
2464 - requires = [ "postgresql.service" ];
2465 - wantedBy = [ "multi-user.target" ];
2466 -
2467 - description = "dispatch.sr.ht website service";
2468 -
2469 - serviceConfig.ExecStart = "${cfg.python}/bin/gunicorn ${drv.pname}.app:app -b ${cfg.address}:${toString port}";
2470 - };
2471 - };
2472 -
2473 - services.sourcehut.settings = {
2474 - # URL dispatch.sr.ht is being served at (protocol://domain)
2475 - "dispatch.sr.ht".origin = mkDefault "http://dispatch.${cfg.originBase}";
2476 - # Address and port to bind the debug server to
2477 - "dispatch.sr.ht".debug-host = mkDefault "0.0.0.0";
2478 - "dispatch.sr.ht".debug-port = mkDefault port;
2479 - # Configures the SQLAlchemy connection string for the database.
2480 - "dispatch.sr.ht".connection-string = mkDefault "postgresql:///${database}?user=${user}&host=/var/run/postgresql";
2481 - # Set to "yes" to automatically run migrations on package upgrade.
2482 - "dispatch.sr.ht".migrate-on-upgrade = mkDefault "yes";
2483 - # dispatch.sr.ht's OAuth client ID and secret for meta.sr.ht
2484 - # Register your client at meta.example.org/oauth
2485 - "dispatch.sr.ht".oauth-client-id = mkDefault null;
2486 - "dispatch.sr.ht".oauth-client-secret = mkDefault null;
2487 -
2488 - # Github Integration
2489 - "dispatch.sr.ht::github".oauth-client-id = mkDefault null;
2490 - "dispatch.sr.ht::github".oauth-client-secret = mkDefault null;
2491 -
2492 - # Gitlab Integration
2493 - "dispatch.sr.ht::gitlab".enabled = mkDefault null;
2494 - "dispatch.sr.ht::gitlab".canonical-upstream = mkDefault "gitlab.com";
2495 - "dispatch.sr.ht::gitlab".repo-cache = mkDefault "./repo-cache";
2496 - # "dispatch.sr.ht::gitlab"."gitlab.com" = mkDefault "GitLab:application id:secret";
2497 - };
2498 -
2499 - services.nginx.virtualHosts."dispatch.${cfg.originBase}" = {
2500 - forceSSL = true;
2501 - locations."/".proxyPass = "http://${cfg.address}:${toString port}";
2502 - locations."/query".proxyPass = "http://${cfg.address}:${toString (port + 100)}";
2503 - locations."/static".root = "${pkgs.sourcehut.dispatchsrht}/${pkgs.sourcehut.python.sitePackages}/dispatchsrht";
2504 - };
2505 - };
2506 -}
2507 diff --git a/nixos/modules/services/misc/sourcehut/git.nix b/nixos/modules/services/misc/sourcehut/git.nix
2508 deleted file mode 100644
2509 index 2653d77876d..00000000000
2510 --- a/nixos/modules/services/misc/sourcehut/git.nix
2511 +++ /dev/null
2512 @@ -1,215 +0,0 @@
2513 -{ config, lib, pkgs, ... }:
2514 -
2515 -with lib;
2516 -let
2517 - cfg = config.services.sourcehut;
2518 - scfg = cfg.git;
2519 - iniKey = "git.sr.ht";
2520 -
2521 - rcfg = config.services.redis;
2522 - drv = pkgs.sourcehut.gitsrht;
2523 -in
2524 -{
2525 - options.services.sourcehut.git = {
2526 - user = mkOption {
2527 - type = types.str;
2528 - visible = false;
2529 - internal = true;
2530 - readOnly = true;
2531 - default = "git";
2532 - description = ''
2533 - User for git.sr.ht.
2534 - '';
2535 - };
2536 -
2537 - port = mkOption {
2538 - type = types.port;
2539 - default = 5001;
2540 - description = ''
2541 - Port on which the "git" module should listen.
2542 - '';
2543 - };
2544 -
2545 - database = mkOption {
2546 - type = types.str;
2547 - default = "git.sr.ht";
2548 - description = ''
2549 - PostgreSQL database name for git.sr.ht.
2550 - '';
2551 - };
2552 -
2553 - statePath = mkOption {
2554 - type = types.path;
2555 - default = "${cfg.statePath}/gitsrht";
2556 - description = ''
2557 - State path for git.sr.ht.
2558 - '';
2559 - };
2560 -
2561 - package = mkOption {
2562 - type = types.package;
2563 - default = pkgs.git;
2564 - defaultText = literalExpression "pkgs.git";
2565 - example = literalExpression "pkgs.gitFull";
2566 - description = ''
2567 - Git package for git.sr.ht. This can help silence collisions.
2568 - '';
2569 - };
2570 - };
2571 -
2572 - config = with scfg; lib.mkIf (cfg.enable && elem "git" cfg.services) {
2573 - # sshd refuses to run with `Unsafe AuthorizedKeysCommand ... bad ownership or modes for directory /nix/store`
2574 - environment.etc."ssh/gitsrht-dispatch" = {
2575 - mode = "0755";
2576 - text = ''
2577 - #! ${pkgs.stdenv.shell}
2578 - ${cfg.python}/bin/gitsrht-dispatch "$@"
2579 - '';
2580 - };
2581 -
2582 - # Needs this in the $PATH when sshing into the server
2583 - environment.systemPackages = [ cfg.git.package ];
2584 -
2585 - users = {
2586 - users = {
2587 - "${user}" = {
2588 - isSystemUser = true;
2589 - group = user;
2590 - # https://stackoverflow.com/questions/22314298/git-push-results-in-fatal-protocol-error-bad-line-length-character-this
2591 - # Probably could use gitsrht-shell if output is restricted to just parameters...
2592 - shell = pkgs.bash;
2593 - description = "git.sr.ht user";
2594 - };
2595 - };
2596 -
2597 - groups = {
2598 - "${user}" = { };
2599 - };
2600 - };
2601 -
2602 - services = {
2603 - cron.systemCronJobs = [ "*/20 * * * * ${cfg.python}/bin/gitsrht-periodic" ];
2604 - fcgiwrap.enable = true;
2605 -
2606 - openssh.authorizedKeysCommand = ''/etc/ssh/gitsrht-dispatch "%u" "%h" "%t" "%k"'';
2607 - openssh.authorizedKeysCommandUser = "root";
2608 - openssh.extraConfig = ''
2609 - PermitUserEnvironment SRHT_*
2610 - '';
2611 -
2612 - postgresql = {
2613 - authentication = ''
2614 - local ${database} ${user} trust
2615 - '';
2616 - ensureDatabases = [ database ];
2617 - ensureUsers = [
2618 - {
2619 - name = user;
2620 - ensurePermissions = { "DATABASE \"${database}\"" = "ALL PRIVILEGES"; };
2621 - }
2622 - ];
2623 - };
2624 - };
2625 -
2626 - systemd = {
2627 - tmpfiles.rules = [
2628 - # /var/log is owned by root
2629 - "f /var/log/git-srht-shell 0644 ${user} ${user} -"
2630 -
2631 - "d ${statePath} 0750 ${user} ${user} -"
2632 - "d ${cfg.settings."${iniKey}".repos} 2755 ${user} ${user} -"
2633 - ];
2634 -
2635 - services = {
2636 - gitsrht = import ./service.nix { inherit config pkgs lib; } scfg drv iniKey {
2637 - after = [ "redis.service" "postgresql.service" "network.target" ];
2638 - requires = [ "redis.service" "postgresql.service" ];
2639 - wantedBy = [ "multi-user.target" ];
2640 -
2641 - # Needs internally to create repos at the very least
2642 - path = [ pkgs.git ];
2643 - description = "git.sr.ht website service";
2644 -
2645 - serviceConfig.ExecStart = "${cfg.python}/bin/gunicorn ${drv.pname}.app:app -b ${cfg.address}:${toString port}";
2646 - };
2647 -
2648 - gitsrht-webhooks = {
2649 - after = [ "postgresql.service" "network.target" ];
2650 - requires = [ "postgresql.service" ];
2651 - wantedBy = [ "multi-user.target" ];
2652 -
2653 - description = "git.sr.ht webhooks service";
2654 - serviceConfig = {
2655 - Type = "simple";
2656 - User = user;
2657 - Restart = "always";
2658 - };
2659 -
2660 - serviceConfig.ExecStart = "${cfg.python}/bin/celery -A ${drv.pname}.webhooks worker --loglevel=info";
2661 - };
2662 - };
2663 - };
2664 -
2665 - services.sourcehut.settings = {
2666 - # URL git.sr.ht is being served at (protocol://domain)
2667 - "git.sr.ht".origin = mkDefault "http://git.${cfg.originBase}";
2668 - # Address and port to bind the debug server to
2669 - "git.sr.ht".debug-host = mkDefault "0.0.0.0";
2670 - "git.sr.ht".debug-port = mkDefault port;
2671 - # Configures the SQLAlchemy connection string for the database.
2672 - "git.sr.ht".connection-string = mkDefault "postgresql:///${database}?user=${user}&host=/var/run/postgresql";
2673 - # Set to "yes" to automatically run migrations on package upgrade.
2674 - "git.sr.ht".migrate-on-upgrade = mkDefault "yes";
2675 - # The redis connection used for the webhooks worker
2676 - "git.sr.ht".webhooks = mkDefault "redis://${rcfg.bind}:${toString rcfg.port}/1";
2677 -
2678 - # A post-update script which is installed in every git repo.
2679 - "git.sr.ht".post-update-script = mkDefault "${pkgs.sourcehut.gitsrht}/bin/gitsrht-update-hook";
2680 -
2681 - # git.sr.ht's OAuth client ID and secret for meta.sr.ht
2682 - # Register your client at meta.example.org/oauth
2683 - "git.sr.ht".oauth-client-id = mkDefault null;
2684 - "git.sr.ht".oauth-client-secret = mkDefault null;
2685 - # Path to git repositories on disk
2686 - "git.sr.ht".repos = mkDefault "/var/lib/git";
2687 -
2688 - "git.sr.ht".outgoing-domain = mkDefault "http://git.${cfg.originBase}";
2689 -
2690 - # The authorized keys hook uses this to dispatch to various handlers
2691 - # The format is a program to exec into as the key, and the user to match as the
2692 - # value. When someone tries to log in as this user, this program is executed
2693 - # and is expected to omit an AuthorizedKeys file.
2694 - #
2695 - # Discard of the string context is in order to allow derivation-derived strings.
2696 - # This is safe if the relevant package is installed which will be the case if the setting is utilized.
2697 - "git.sr.ht::dispatch".${builtins.unsafeDiscardStringContext "${pkgs.sourcehut.gitsrht}/bin/gitsrht-keys"} = mkDefault "${user}:${user}";
2698 - };
2699 -
2700 - services.nginx.virtualHosts."git.${cfg.originBase}" = {
2701 - forceSSL = true;
2702 - locations."/".proxyPass = "http://${cfg.address}:${toString port}";
2703 - locations."/query".proxyPass = "http://${cfg.address}:${toString (port + 100)}";
2704 - locations."/static".root = "${pkgs.sourcehut.gitsrht}/${pkgs.sourcehut.python.sitePackages}/gitsrht";
2705 - extraConfig = ''
2706 - location = /authorize {
2707 - proxy_pass http://${cfg.address}:${toString port};
2708 - proxy_pass_request_body off;
2709 - proxy_set_header Content-Length "";
2710 - proxy_set_header X-Original-URI $request_uri;
2711 - }
2712 - location ~ ^/([^/]+)/([^/]+)/(HEAD|info/refs|objects/info/.*|git-upload-pack).*$ {
2713 - auth_request /authorize;
2714 - root /var/lib/git;
2715 - fastcgi_pass unix:/run/fcgiwrap.sock;
2716 - fastcgi_param SCRIPT_FILENAME ${pkgs.git}/bin/git-http-backend;
2717 - fastcgi_param PATH_INFO $uri;
2718 - fastcgi_param GIT_PROJECT_ROOT $document_root;
2719 - fastcgi_read_timeout 500s;
2720 - include ${pkgs.nginx}/conf/fastcgi_params;
2721 - gzip off;
2722 - }
2723 - '';
2724 -
2725 - };
2726 - };
2727 -}
2728 diff --git a/nixos/modules/services/misc/sourcehut/hg.nix b/nixos/modules/services/misc/sourcehut/hg.nix
2729 deleted file mode 100644
2730 index 5cd36bb0455..00000000000
2731 --- a/nixos/modules/services/misc/sourcehut/hg.nix
2732 +++ /dev/null
2733 @@ -1,173 +0,0 @@
2734 -{ config, lib, pkgs, ... }:
2735 -
2736 -with lib;
2737 -let
2738 - cfg = config.services.sourcehut;
2739 - scfg = cfg.hg;
2740 - iniKey = "hg.sr.ht";
2741 -
2742 - rcfg = config.services.redis;
2743 - drv = pkgs.sourcehut.hgsrht;
2744 -in
2745 -{
2746 - options.services.sourcehut.hg = {
2747 - user = mkOption {
2748 - type = types.str;
2749 - internal = true;
2750 - readOnly = true;
2751 - default = "hg";
2752 - description = ''
2753 - User for hg.sr.ht.
2754 - '';
2755 - };
2756 -
2757 - port = mkOption {
2758 - type = types.port;
2759 - default = 5010;
2760 - description = ''
2761 - Port on which the "hg" module should listen.
2762 - '';
2763 - };
2764 -
2765 - database = mkOption {
2766 - type = types.str;
2767 - default = "hg.sr.ht";
2768 - description = ''
2769 - PostgreSQL database name for hg.sr.ht.
2770 - '';
2771 - };
2772 -
2773 - statePath = mkOption {
2774 - type = types.path;
2775 - default = "${cfg.statePath}/hgsrht";
2776 - description = ''
2777 - State path for hg.sr.ht.
2778 - '';
2779 - };
2780 -
2781 - cloneBundles = mkOption {
2782 - type = types.bool;
2783 - default = false;
2784 - description = ''
2785 - Generate clonebundles (which require more disk space but dramatically speed up cloning large repositories).
2786 - '';
2787 - };
2788 - };
2789 -
2790 - config = with scfg; lib.mkIf (cfg.enable && elem "hg" cfg.services) {
2791 - # In case it ever comes into being
2792 - environment.etc."ssh/hgsrht-dispatch" = {
2793 - mode = "0755";
2794 - text = ''
2795 - #! ${pkgs.stdenv.shell}
2796 - ${cfg.python}/bin/gitsrht-dispatch $@
2797 - '';
2798 - };
2799 -
2800 - environment.systemPackages = [ pkgs.mercurial ];
2801 -
2802 - users = {
2803 - users = {
2804 - "${user}" = {
2805 - isSystemUser = true;
2806 - group = user;
2807 - # Assuming hg.sr.ht needs this too
2808 - shell = pkgs.bash;
2809 - description = "hg.sr.ht user";
2810 - };
2811 - };
2812 -
2813 - groups = {
2814 - "${user}" = { };
2815 - };
2816 - };
2817 -
2818 - services = {
2819 - cron.systemCronJobs = [ "*/20 * * * * ${cfg.python}/bin/hgsrht-periodic" ]
2820 - ++ optional cloneBundles "0 * * * * ${cfg.python}/bin/hgsrht-clonebundles";
2821 -
2822 - openssh.authorizedKeysCommand = ''/etc/ssh/hgsrht-dispatch "%u" "%h" "%t" "%k"'';
2823 - openssh.authorizedKeysCommandUser = "root";
2824 - openssh.extraConfig = ''
2825 - PermitUserEnvironment SRHT_*
2826 - '';
2827 -
2828 - postgresql = {
2829 - authentication = ''
2830 - local ${database} ${user} trust
2831 - '';
2832 - ensureDatabases = [ database ];
2833 - ensureUsers = [
2834 - {
2835 - name = user;
2836 - ensurePermissions = { "DATABASE \"${database}\"" = "ALL PRIVILEGES"; };
2837 - }
2838 - ];
2839 - };
2840 - };
2841 -
2842 - systemd = {
2843 - tmpfiles.rules = [
2844 - # /var/log is owned by root
2845 - "f /var/log/hg-srht-shell 0644 ${user} ${user} -"
2846 -
2847 - "d ${statePath} 0750 ${user} ${user} -"
2848 - "d ${cfg.settings."${iniKey}".repos} 2755 ${user} ${user} -"
2849 - ];
2850 -
2851 - services.hgsrht = import ./service.nix { inherit config pkgs lib; } scfg drv iniKey {
2852 - after = [ "redis.service" "postgresql.service" "network.target" ];
2853 - requires = [ "redis.service" "postgresql.service" ];
2854 - wantedBy = [ "multi-user.target" ];
2855 -
2856 - path = [ pkgs.mercurial ];
2857 - description = "hg.sr.ht website service";
2858 -
2859 - serviceConfig.ExecStart = "${cfg.python}/bin/gunicorn ${drv.pname}.app:app -b ${cfg.address}:${toString port}";
2860 - };
2861 - };
2862 -
2863 - services.sourcehut.settings = {
2864 - # URL hg.sr.ht is being served at (protocol://domain)
2865 - "hg.sr.ht".origin = mkDefault "http://hg.${cfg.originBase}";
2866 - # Address and port to bind the debug server to
2867 - "hg.sr.ht".debug-host = mkDefault "0.0.0.0";
2868 - "hg.sr.ht".debug-port = mkDefault port;
2869 - # Configures the SQLAlchemy connection string for the database.
2870 - "hg.sr.ht".connection-string = mkDefault "postgresql:///${database}?user=${user}&host=/var/run/postgresql";
2871 - # The redis connection used for the webhooks worker
2872 - "hg.sr.ht".webhooks = mkDefault "redis://${rcfg.bind}:${toString rcfg.port}/1";
2873 - # A post-update script which is installed in every mercurial repo.
2874 - "hg.sr.ht".changegroup-script = mkDefault "${cfg.python}/bin/hgsrht-hook-changegroup";
2875 - # hg.sr.ht's OAuth client ID and secret for meta.sr.ht
2876 - # Register your client at meta.example.org/oauth
2877 - "hg.sr.ht".oauth-client-id = mkDefault null;
2878 - "hg.sr.ht".oauth-client-secret = mkDefault null;
2879 - # Path to mercurial repositories on disk
2880 - "hg.sr.ht".repos = mkDefault "/var/lib/hg";
2881 - # Path to the srht mercurial extension
2882 - # (defaults to where the hgsrht code is)
2883 - # "hg.sr.ht".srhtext = mkDefault null;
2884 - # .hg/store size (in MB) past which the nightly job generates clone bundles.
2885 - # "hg.sr.ht".clone_bundle_threshold = mkDefault 50;
2886 - # Path to hg-ssh (if not in $PATH)
2887 - # "hg.sr.ht".hg_ssh = mkDefault /path/to/hg-ssh;
2888 -
2889 - # The authorized keys hook uses this to dispatch to various handlers
2890 - # The format is a program to exec into as the key, and the user to match as the
2891 - # value. When someone tries to log in as this user, this program is executed
2892 - # and is expected to omit an AuthorizedKeys file.
2893 - #
2894 - # Uncomment the relevant lines to enable the various sr.ht dispatchers.
2895 - "hg.sr.ht::dispatch"."/run/current-system/sw/bin/hgsrht-keys" = mkDefault "${user}:${user}";
2896 - };
2897 -
2898 - # TODO: requires testing and addition of hg-specific requirements
2899 - services.nginx.virtualHosts."hg.${cfg.originBase}" = {
2900 - forceSSL = true;
2901 - locations."/".proxyPass = "http://${cfg.address}:${toString port}";
2902 - locations."/query".proxyPass = "http://${cfg.address}:${toString (port + 100)}";
2903 - locations."/static".root = "${pkgs.sourcehut.hgsrht}/${pkgs.sourcehut.python.sitePackages}/hgsrht";
2904 - };
2905 - };
2906 -}
2907 diff --git a/nixos/modules/services/misc/sourcehut/hub.nix b/nixos/modules/services/misc/sourcehut/hub.nix
2908 deleted file mode 100644
2909 index be3ea21011c..00000000000
2910 --- a/nixos/modules/services/misc/sourcehut/hub.nix
2911 +++ /dev/null
2912 @@ -1,118 +0,0 @@
2913 -{ config, lib, pkgs, ... }:
2914 -
2915 -with lib;
2916 -let
2917 - cfg = config.services.sourcehut;
2918 - cfgIni = cfg.settings;
2919 - scfg = cfg.hub;
2920 - iniKey = "hub.sr.ht";
2921 -
2922 - drv = pkgs.sourcehut.hubsrht;
2923 -in
2924 -{
2925 - options.services.sourcehut.hub = {
2926 - user = mkOption {
2927 - type = types.str;
2928 - default = "hubsrht";
2929 - description = ''
2930 - User for hub.sr.ht.
2931 - '';
2932 - };
2933 -
2934 - port = mkOption {
2935 - type = types.port;
2936 - default = 5014;
2937 - description = ''
2938 - Port on which the "hub" module should listen.
2939 - '';
2940 - };
2941 -
2942 - database = mkOption {
2943 - type = types.str;
2944 - default = "hub.sr.ht";
2945 - description = ''
2946 - PostgreSQL database name for hub.sr.ht.
2947 - '';
2948 - };
2949 -
2950 - statePath = mkOption {
2951 - type = types.path;
2952 - default = "${cfg.statePath}/hubsrht";
2953 - description = ''
2954 - State path for hub.sr.ht.
2955 - '';
2956 - };
2957 - };
2958 -
2959 - config = with scfg; lib.mkIf (cfg.enable && elem "hub" cfg.services) {
2960 - users = {
2961 - users = {
2962 - "${user}" = {
2963 - isSystemUser = true;
2964 - group = user;
2965 - description = "hub.sr.ht user";
2966 - };
2967 - };
2968 -
2969 - groups = {
2970 - "${user}" = { };
2971 - };
2972 - };
2973 -
2974 - services.postgresql = {
2975 - authentication = ''
2976 - local ${database} ${user} trust
2977 - '';
2978 - ensureDatabases = [ database ];
2979 - ensureUsers = [
2980 - {
2981 - name = user;
2982 - ensurePermissions = { "DATABASE \"${database}\"" = "ALL PRIVILEGES"; };
2983 - }
2984 - ];
2985 - };
2986 -
2987 - systemd = {
2988 - tmpfiles.rules = [
2989 - "d ${statePath} 0750 ${user} ${user} -"
2990 - ];
2991 -
2992 - services.hubsrht = import ./service.nix { inherit config pkgs lib; } scfg drv iniKey {
2993 - after = [ "postgresql.service" "network.target" ];
2994 - requires = [ "postgresql.service" ];
2995 - wantedBy = [ "multi-user.target" ];
2996 -
2997 - description = "hub.sr.ht website service";
2998 -
2999 - serviceConfig.ExecStart = "${cfg.python}/bin/gunicorn ${drv.pname}.app:app -b ${cfg.address}:${toString port}";
3000 - };
3001 - };
3002 -
3003 - services.sourcehut.settings = {
3004 - # URL hub.sr.ht is being served at (protocol://domain)
3005 - "hub.sr.ht".origin = mkDefault "http://hub.${cfg.originBase}";
3006 - # Address and port to bind the debug server to
3007 - "hub.sr.ht".debug-host = mkDefault "0.0.0.0";
3008 - "hub.sr.ht".debug-port = mkDefault port;
3009 - # Configures the SQLAlchemy connection string for the database.
3010 - "hub.sr.ht".connection-string = mkDefault "postgresql:///${database}?user=${user}&host=/var/run/postgresql";
3011 - # Set to "yes" to automatically run migrations on package upgrade.
3012 - "hub.sr.ht".migrate-on-upgrade = mkDefault "yes";
3013 - # hub.sr.ht's OAuth client ID and secret for meta.sr.ht
3014 - # Register your client at meta.example.org/oauth
3015 - "hub.sr.ht".oauth-client-id = mkDefault null;
3016 - "hub.sr.ht".oauth-client-secret = mkDefault null;
3017 - };
3018 -
3019 - services.nginx.virtualHosts."${cfg.originBase}" = {
3020 - forceSSL = true;
3021 - locations."/".proxyPass = "http://${cfg.address}:${toString port}";
3022 - locations."/query".proxyPass = "http://${cfg.address}:${toString (port + 100)}";
3023 - locations."/static".root = "${pkgs.sourcehut.hubsrht}/${pkgs.sourcehut.python.sitePackages}/hubsrht";
3024 - };
3025 - services.nginx.virtualHosts."hub.${cfg.originBase}" = {
3026 - globalRedirect = "${cfg.originBase}";
3027 - forceSSL = true;
3028 - };
3029 - };
3030 -}
3031 diff --git a/nixos/modules/services/misc/sourcehut/lists.nix b/nixos/modules/services/misc/sourcehut/lists.nix
3032 deleted file mode 100644
3033 index 7b1fe9fd463..00000000000
3034 --- a/nixos/modules/services/misc/sourcehut/lists.nix
3035 +++ /dev/null
3036 @@ -1,185 +0,0 @@
3037 -# Email setup is fairly involved, useful references:
3038 -# https://drewdevault.com/2018/08/05/Local-mail-server.html
3039 -
3040 -{ config, lib, pkgs, ... }:
3041 -
3042 -with lib;
3043 -let
3044 - cfg = config.services.sourcehut;
3045 - cfgIni = cfg.settings;
3046 - scfg = cfg.lists;
3047 - iniKey = "lists.sr.ht";
3048 -
3049 - rcfg = config.services.redis;
3050 - drv = pkgs.sourcehut.listssrht;
3051 -in
3052 -{
3053 - options.services.sourcehut.lists = {
3054 - user = mkOption {
3055 - type = types.str;
3056 - default = "listssrht";
3057 - description = ''
3058 - User for lists.sr.ht.
3059 - '';
3060 - };
3061 -
3062 - port = mkOption {
3063 - type = types.port;
3064 - default = 5006;
3065 - description = ''
3066 - Port on which the "lists" module should listen.
3067 - '';
3068 - };
3069 -
3070 - database = mkOption {
3071 - type = types.str;
3072 - default = "lists.sr.ht";
3073 - description = ''
3074 - PostgreSQL database name for lists.sr.ht.
3075 - '';
3076 - };
3077 -
3078 - statePath = mkOption {
3079 - type = types.path;
3080 - default = "${cfg.statePath}/listssrht";
3081 - description = ''
3082 - State path for lists.sr.ht.
3083 - '';
3084 - };
3085 - };
3086 -
3087 - config = with scfg; lib.mkIf (cfg.enable && elem "lists" cfg.services) {
3088 - users = {
3089 - users = {
3090 - "${user}" = {
3091 - isSystemUser = true;
3092 - group = user;
3093 - extraGroups = [ "postfix" ];
3094 - description = "lists.sr.ht user";
3095 - };
3096 - };
3097 - groups = {
3098 - "${user}" = { };
3099 - };
3100 - };
3101 -
3102 - services.postgresql = {
3103 - authentication = ''
3104 - local ${database} ${user} trust
3105 - '';
3106 - ensureDatabases = [ database ];
3107 - ensureUsers = [
3108 - {
3109 - name = user;
3110 - ensurePermissions = { "DATABASE \"${database}\"" = "ALL PRIVILEGES"; };
3111 - }
3112 - ];
3113 - };
3114 -
3115 - systemd = {
3116 - tmpfiles.rules = [
3117 - "d ${statePath} 0750 ${user} ${user} -"
3118 - ];
3119 -
3120 - services = {
3121 - listssrht = import ./service.nix { inherit config pkgs lib; } scfg drv iniKey {
3122 - after = [ "postgresql.service" "network.target" ];
3123 - requires = [ "postgresql.service" ];
3124 - wantedBy = [ "multi-user.target" ];
3125 -
3126 - description = "lists.sr.ht website service";
3127 -
3128 - serviceConfig.ExecStart = "${cfg.python}/bin/gunicorn ${drv.pname}.app:app -b ${cfg.address}:${toString port}";
3129 - };
3130 -
3131 - listssrht-process = {
3132 - after = [ "postgresql.service" "network.target" ];
3133 - requires = [ "postgresql.service" ];
3134 - wantedBy = [ "multi-user.target" ];
3135 -
3136 - description = "lists.sr.ht process service";
3137 - serviceConfig = {
3138 - Type = "simple";
3139 - User = user;
3140 - Restart = "always";
3141 - ExecStart = "${cfg.python}/bin/celery -A ${drv.pname}.process worker --loglevel=info";
3142 - };
3143 - };
3144 -
3145 - listssrht-lmtp = {
3146 - after = [ "postgresql.service" "network.target" ];
3147 - requires = [ "postgresql.service" ];
3148 - wantedBy = [ "multi-user.target" ];
3149 -
3150 - description = "lists.sr.ht process service";
3151 - serviceConfig = {
3152 - Type = "simple";
3153 - User = user;
3154 - Restart = "always";
3155 - ExecStart = "${cfg.python}/bin/listssrht-lmtp";
3156 - };
3157 - };
3158 -
3159 -
3160 - listssrht-webhooks = {
3161 - after = [ "postgresql.service" "network.target" ];
3162 - requires = [ "postgresql.service" ];
3163 - wantedBy = [ "multi-user.target" ];
3164 -
3165 - description = "lists.sr.ht webhooks service";
3166 - serviceConfig = {
3167 - Type = "simple";
3168 - User = user;
3169 - Restart = "always";
3170 - ExecStart = "${cfg.python}/bin/celery -A ${drv.pname}.webhooks worker --loglevel=info";
3171 - };
3172 - };
3173 - };
3174 - };
3175 -
3176 - services.sourcehut.settings = {
3177 - # URL lists.sr.ht is being served at (protocol://domain)
3178 - "lists.sr.ht".origin = mkDefault "http://lists.${cfg.originBase}";
3179 - # Address and port to bind the debug server to
3180 - "lists.sr.ht".debug-host = mkDefault "0.0.0.0";
3181 - "lists.sr.ht".debug-port = mkDefault port;
3182 - # Configures the SQLAlchemy connection string for the database.
3183 - "lists.sr.ht".connection-string = mkDefault "postgresql:///${database}?user=${user}&host=/var/run/postgresql";
3184 - # Set to "yes" to automatically run migrations on package upgrade.
3185 - "lists.sr.ht".migrate-on-upgrade = mkDefault "yes";
3186 - # lists.sr.ht's OAuth client ID and secret for meta.sr.ht
3187 - # Register your client at meta.example.org/oauth
3188 - "lists.sr.ht".oauth-client-id = mkDefault null;
3189 - "lists.sr.ht".oauth-client-secret = mkDefault null;
3190 - # Outgoing email for notifications generated by users
3191 - "lists.sr.ht".notify-from = mkDefault "CHANGEME@example.org";
3192 - # The redis connection used for the webhooks worker
3193 - "lists.sr.ht".webhooks = mkDefault "redis://${rcfg.bind}:${toString rcfg.port}/2";
3194 - # The redis connection used for the celery worker
3195 - "lists.sr.ht".redis = mkDefault "redis://${rcfg.bind}:${toString rcfg.port}/4";
3196 - # Network-key
3197 - "lists.sr.ht".network-key = mkDefault null;
3198 - # Allow creation
3199 - "lists.sr.ht".allow-new-lists = mkDefault "no";
3200 - # Posting Domain
3201 - "lists.sr.ht".posting-domain = mkDefault "lists.${cfg.originBase}";
3202 -
3203 - # Path for the lmtp daemon's unix socket. Direct incoming mail to this socket.
3204 - # Alternatively, specify IP:PORT and an SMTP server will be run instead.
3205 - "lists.sr.ht::worker".sock = mkDefault "/tmp/lists.sr.ht-lmtp.sock";
3206 - # The lmtp daemon will make the unix socket group-read/write for users in this
3207 - # group.
3208 - "lists.sr.ht::worker".sock-group = mkDefault "postfix";
3209 - "lists.sr.ht::worker".reject-url = mkDefault "https://man.sr.ht/lists.sr.ht/etiquette.md";
3210 - "lists.sr.ht::worker".reject-mimetypes = mkDefault "text/html";
3211 -
3212 - };
3213 -
3214 - services.nginx.virtualHosts."lists.${cfg.originBase}" = {
3215 - forceSSL = true;
3216 - locations."/".proxyPass = "http://${cfg.address}:${toString port}";
3217 - locations."/query".proxyPass = "http://${cfg.address}:${toString (port + 100)}";
3218 - locations."/static".root = "${pkgs.sourcehut.listssrht}/${pkgs.sourcehut.python.sitePackages}/listssrht";
3219 - };
3220 - };
3221 -}
3222 diff --git a/nixos/modules/services/misc/sourcehut/man.nix b/nixos/modules/services/misc/sourcehut/man.nix
3223 deleted file mode 100644
3224 index 7693396d187..00000000000
3225 --- a/nixos/modules/services/misc/sourcehut/man.nix
3226 +++ /dev/null
3227 @@ -1,122 +0,0 @@
3228 -{ config, lib, pkgs, ... }:
3229 -
3230 -with lib;
3231 -let
3232 - cfg = config.services.sourcehut;
3233 - cfgIni = cfg.settings;
3234 - scfg = cfg.man;
3235 - iniKey = "man.sr.ht";
3236 -
3237 - drv = pkgs.sourcehut.mansrht;
3238 -in
3239 -{
3240 - options.services.sourcehut.man = {
3241 - user = mkOption {
3242 - type = types.str;
3243 - default = "mansrht";
3244 - description = ''
3245 - User for man.sr.ht.
3246 - '';
3247 - };
3248 -
3249 - port = mkOption {
3250 - type = types.port;
3251 - default = 5004;
3252 - description = ''
3253 - Port on which the "man" module should listen.
3254 - '';
3255 - };
3256 -
3257 - database = mkOption {
3258 - type = types.str;
3259 - default = "man.sr.ht";
3260 - description = ''
3261 - PostgreSQL database name for man.sr.ht.
3262 - '';
3263 - };
3264 -
3265 - statePath = mkOption {
3266 - type = types.path;
3267 - default = "${cfg.statePath}/mansrht";
3268 - description = ''
3269 - State path for man.sr.ht.
3270 - '';
3271 - };
3272 - };
3273 -
3274 - config = with scfg; lib.mkIf (cfg.enable && elem "man" cfg.services) {
3275 - assertions =
3276 - [
3277 - {
3278 - assertion = hasAttrByPath [ "git.sr.ht" "oauth-client-id" ] cfgIni;
3279 - message = "man.sr.ht needs access to git.sr.ht.";
3280 - }
3281 - ];
3282 -
3283 - users = {
3284 - users = {
3285 - "${user}" = {
3286 - isSystemUser = true;
3287 - group = user;
3288 - description = "man.sr.ht user";
3289 - };
3290 - };
3291 -
3292 - groups = {
3293 - "${user}" = { };
3294 - };
3295 - };
3296 -
3297 - services.postgresql = {
3298 - authentication = ''
3299 - local ${database} ${user} trust
3300 - '';
3301 - ensureDatabases = [ database ];
3302 - ensureUsers = [
3303 - {
3304 - name = user;
3305 - ensurePermissions = { "DATABASE \"${database}\"" = "ALL PRIVILEGES"; };
3306 - }
3307 - ];
3308 - };
3309 -
3310 - systemd = {
3311 - tmpfiles.rules = [
3312 - "d ${statePath} 0750 ${user} ${user} -"
3313 - ];
3314 -
3315 - services.mansrht = import ./service.nix { inherit config pkgs lib; } scfg drv iniKey {
3316 - after = [ "postgresql.service" "network.target" ];
3317 - requires = [ "postgresql.service" ];
3318 - wantedBy = [ "multi-user.target" ];
3319 -
3320 - description = "man.sr.ht website service";
3321 -
3322 - serviceConfig.ExecStart = "${cfg.python}/bin/gunicorn ${drv.pname}.app:app -b ${cfg.address}:${toString port}";
3323 - };
3324 - };
3325 -
3326 - services.sourcehut.settings = {
3327 - # URL man.sr.ht is being served at (protocol://domain)
3328 - "man.sr.ht".origin = mkDefault "http://man.${cfg.originBase}";
3329 - # Address and port to bind the debug server to
3330 - "man.sr.ht".debug-host = mkDefault "0.0.0.0";
3331 - "man.sr.ht".debug-port = mkDefault port;
3332 - # Configures the SQLAlchemy connection string for the database.
3333 - "man.sr.ht".connection-string = mkDefault "postgresql:///${database}?user=${user}&host=/var/run/postgresql";
3334 - # Set to "yes" to automatically run migrations on package upgrade.
3335 - "man.sr.ht".migrate-on-upgrade = mkDefault "yes";
3336 - # man.sr.ht's OAuth client ID and secret for meta.sr.ht
3337 - # Register your client at meta.example.org/oauth
3338 - "man.sr.ht".oauth-client-id = mkDefault null;
3339 - "man.sr.ht".oauth-client-secret = mkDefault null;
3340 - };
3341 -
3342 - services.nginx.virtualHosts."man.${cfg.originBase}" = {
3343 - forceSSL = true;
3344 - locations."/".proxyPass = "http://${cfg.address}:${toString port}";
3345 - locations."/query".proxyPass = "http://${cfg.address}:${toString (port + 100)}";
3346 - locations."/static".root = "${pkgs.sourcehut.mansrht}/${pkgs.sourcehut.python.sitePackages}/mansrht";
3347 - };
3348 - };
3349 -}
3350 diff --git a/nixos/modules/services/misc/sourcehut/meta.nix b/nixos/modules/services/misc/sourcehut/meta.nix
3351 deleted file mode 100644
3352 index 56127a824eb..00000000000
3353 --- a/nixos/modules/services/misc/sourcehut/meta.nix
3354 +++ /dev/null
3355 @@ -1,211 +0,0 @@
3356 -{ config, lib, pkgs, ... }:
3357 -
3358 -with lib;
3359 -let
3360 - cfg = config.services.sourcehut;
3361 - cfgIni = cfg.settings;
3362 - scfg = cfg.meta;
3363 - iniKey = "meta.sr.ht";
3364 -
3365 - rcfg = config.services.redis;
3366 - drv = pkgs.sourcehut.metasrht;
3367 -in
3368 -{
3369 - options.services.sourcehut.meta = {
3370 - user = mkOption {
3371 - type = types.str;
3372 - default = "metasrht";
3373 - description = ''
3374 - User for meta.sr.ht.
3375 - '';
3376 - };
3377 -
3378 - port = mkOption {
3379 - type = types.port;
3380 - default = 5000;
3381 - description = ''
3382 - Port on which the "meta" module should listen.
3383 - '';
3384 - };
3385 -
3386 - database = mkOption {
3387 - type = types.str;
3388 - default = "meta.sr.ht";
3389 - description = ''
3390 - PostgreSQL database name for meta.sr.ht.
3391 - '';
3392 - };
3393 -
3394 - statePath = mkOption {
3395 - type = types.path;
3396 - default = "${cfg.statePath}/metasrht";
3397 - description = ''
3398 - State path for meta.sr.ht.
3399 - '';
3400 - };
3401 - };
3402 -
3403 - config = with scfg; lib.mkIf (cfg.enable && elem "meta" cfg.services) {
3404 - assertions =
3405 - [
3406 - {
3407 - assertion = with cfgIni."meta.sr.ht::billing"; enabled == "yes" -> (stripe-public-key != null && stripe-secret-key != null);
3408 - message = "If meta.sr.ht::billing is enabled, the keys should be defined.";
3409 - }
3410 - ];
3411 -
3412 - users = {
3413 - users = {
3414 - ${user} = {
3415 - isSystemUser = true;
3416 - group = user;
3417 - description = "meta.sr.ht user";
3418 - };
3419 - };
3420 -
3421 - groups = {
3422 - "${user}" = { };
3423 - };
3424 - };
3425 -
3426 - services.cron.systemCronJobs = [ "0 0 * * * ${cfg.python}/bin/metasrht-daily" ];
3427 - services.postgresql = {
3428 - authentication = ''
3429 - local ${database} ${user} trust
3430 - '';
3431 - ensureDatabases = [ database ];
3432 - ensureUsers = [
3433 - {
3434 - name = user;
3435 - ensurePermissions = { "DATABASE \"${database}\"" = "ALL PRIVILEGES"; };
3436 - }
3437 - ];
3438 - };
3439 -
3440 - systemd = {
3441 - tmpfiles.rules = [
3442 - "d ${statePath} 0750 ${user} ${user} -"
3443 - ];
3444 -
3445 - services = {
3446 - metasrht = import ./service.nix { inherit config pkgs lib; } scfg drv iniKey {
3447 - after = [ "postgresql.service" "network.target" ];
3448 - requires = [ "postgresql.service" ];
3449 - wantedBy = [ "multi-user.target" ];
3450 -
3451 - description = "meta.sr.ht website service";
3452 -
3453 - preStart = ''
3454 - # Configure client(s) as "preauthorized"
3455 - ${concatMapStringsSep "\n\n"
3456 - (attr: ''
3457 - if ! test -e "${statePath}/${attr}.oauth" || [ "$(cat ${statePath}/${attr}.oauth)" != "${cfgIni."${attr}".oauth-client-id}" ]; then
3458 - # Configure ${attr}'s OAuth client as "preauthorized"
3459 - psql ${database} \
3460 - -c "UPDATE oauthclient SET preauthorized = true WHERE client_id = '${cfgIni."${attr}".oauth-client-id}'"
3461 -
3462 - printf "%s" "${cfgIni."${attr}".oauth-client-id}" > "${statePath}/${attr}.oauth"
3463 - fi
3464 - '')
3465 - (builtins.attrNames (filterAttrs
3466 - (k: v: !(hasInfix "::" k) && builtins.hasAttr "oauth-client-id" v && v.oauth-client-id != null)
3467 - cfg.settings))}
3468 - '';
3469 -
3470 - serviceConfig.ExecStart = "${cfg.python}/bin/gunicorn ${drv.pname}.app:app -b ${cfg.address}:${toString port}";
3471 - };
3472 -
3473 - metasrht-api = import ./service.nix { inherit config pkgs lib; } scfg drv iniKey {
3474 - after = [ "postgresql.service" "network.target" ];
3475 - requires = [ "postgresql.service" ];
3476 - wantedBy = [ "multi-user.target" ];
3477 -
3478 - description = "meta.sr.ht api service";
3479 -
3480 - preStart = ''
3481 - # Configure client(s) as "preauthorized"
3482 - ${concatMapStringsSep "\n\n"
3483 - (attr: ''
3484 - if ! test -e "${statePath}/${attr}.oauth" || [ "$(cat ${statePath}/${attr}.oauth)" != "${cfgIni."${attr}".oauth-client-id}" ]; then
3485 - # Configure ${attr}'s OAuth client as "preauthorized"
3486 - psql ${database} \
3487 - -c "UPDATE oauthclient SET preauthorized = true WHERE client_id = '${cfgIni."${attr}".oauth-client-id}'"
3488 -
3489 - printf "%s" "${cfgIni."${attr}".oauth-client-id}" > "${statePath}/${attr}.oauth"
3490 - fi
3491 - '')
3492 - (builtins.attrNames (filterAttrs
3493 - (k: v: !(hasInfix "::" k) && builtins.hasAttr "oauth-client-id" v && v.oauth-client-id != null)
3494 - cfg.settings))}
3495 - '';
3496 -
3497 - serviceConfig.ExecStart = "${pkgs.sourcehut.metasrht}/bin/metasrht-api -b :${toString (port + 100)}";
3498 - };
3499 -
3500 - metasrht-webhooks = {
3501 - after = [ "postgresql.service" "network.target" ];
3502 - requires = [ "postgresql.service" ];
3503 - wantedBy = [ "multi-user.target" ];
3504 -
3505 - description = "meta.sr.ht webhooks service";
3506 - serviceConfig = {
3507 - Type = "simple";
3508 - User = user;
3509 - Restart = "always";
3510 - ExecStart = "${cfg.python}/bin/celery -A ${drv.pname}.webhooks worker --loglevel=info";
3511 - };
3512 -
3513 - };
3514 - };
3515 - };
3516 -
3517 - services.sourcehut.settings = {
3518 - # URL meta.sr.ht is being served at (protocol://domain)
3519 - "meta.sr.ht".origin = mkDefault "https://meta.${cfg.originBase}";
3520 - # Address and port to bind the debug server to
3521 - "meta.sr.ht".debug-host = mkDefault "0.0.0.0";
3522 - "meta.sr.ht".debug-port = mkDefault port;
3523 - # Configures the SQLAlchemy connection string for the database.
3524 - "meta.sr.ht".connection-string = mkDefault "postgresql:///${database}?user=${user}&host=/var/run/postgresql";
3525 - # Set to "yes" to automatically run migrations on package upgrade.
3526 - "meta.sr.ht".migrate-on-upgrade = mkDefault "yes";
3527 - # If "yes", the user will be sent the stock sourcehut welcome emails after
3528 - # signup (requires cron to be configured properly). These are specific to the
3529 - # sr.ht instance so you probably want to patch these before enabling this.
3530 - "meta.sr.ht".welcome-emails = mkDefault "no";
3531 -
3532 - # The redis connection used for the webhooks worker
3533 - "meta.sr.ht".webhooks = mkDefault "redis://${rcfg.bind}:${toString rcfg.port}/6";
3534 -
3535 - # If "no", public registration will not be permitted.
3536 - "meta.sr.ht::settings".registration = mkDefault "no";
3537 - # Where to redirect new users upon registration
3538 - "meta.sr.ht::settings".onboarding-redirect = mkDefault "https://meta.${cfg.originBase}";
3539 - # How many invites each user is issued upon registration (only applicable if
3540 - # open registration is disabled)
3541 - "meta.sr.ht::settings".user-invites = mkDefault 5;
3542 -
3543 - # Origin URL for API, 100 more than web
3544 - "meta.sr.ht".api-origin = mkDefault "http://localhost:5100";
3545 -
3546 - # You can add aliases for the client IDs of commonly used OAuth clients here.
3547 - #
3548 - # Example:
3549 - "meta.sr.ht::aliases" = mkDefault { };
3550 - # "meta.sr.ht::aliases"."git.sr.ht" = 12345;
3551 -
3552 - # "yes" to enable the billing system
3553 - "meta.sr.ht::billing".enabled = mkDefault "no";
3554 - # Get your keys at https://dashboard.stripe.com/account/apikeys
3555 - "meta.sr.ht::billing".stripe-public-key = mkDefault null;
3556 - "meta.sr.ht::billing".stripe-secret-key = mkDefault null;
3557 - };
3558 -
3559 - services.nginx.virtualHosts."meta.${cfg.originBase}" = {
3560 - forceSSL = true;
3561 - locations."/".proxyPass = "http://${cfg.address}:${toString port}";
3562 - locations."/query".proxyPass = "http://${cfg.address}:${toString (port + 100)}";
3563 - locations."/static".root = "${pkgs.sourcehut.metasrht}/${pkgs.sourcehut.python.sitePackages}/metasrht";
3564 - };
3565 - };
3566 -}
3567 diff --git a/nixos/modules/services/misc/sourcehut/paste.nix b/nixos/modules/services/misc/sourcehut/paste.nix
3568 deleted file mode 100644
3569 index b2d5151969e..00000000000
3570 --- a/nixos/modules/services/misc/sourcehut/paste.nix
3571 +++ /dev/null
3572 @@ -1,133 +0,0 @@
3573 -{ config, lib, pkgs, ... }:
3574 -
3575 -with lib;
3576 -let
3577 - cfg = config.services.sourcehut;
3578 - cfgIni = cfg.settings;
3579 - scfg = cfg.paste;
3580 - iniKey = "paste.sr.ht";
3581 -
3582 - rcfg = config.services.redis;
3583 - drv = pkgs.sourcehut.pastesrht;
3584 -in
3585 -{
3586 - options.services.sourcehut.paste = {
3587 - user = mkOption {
3588 - type = types.str;
3589 - default = "pastesrht";
3590 - description = ''
3591 - User for paste.sr.ht.
3592 - '';
3593 - };
3594 -
3595 - port = mkOption {
3596 - type = types.port;
3597 - default = 5011;
3598 - description = ''
3599 - Port on which the "paste" module should listen.
3600 - '';
3601 - };
3602 -
3603 - database = mkOption {
3604 - type = types.str;
3605 - default = "paste.sr.ht";
3606 - description = ''
3607 - PostgreSQL database name for paste.sr.ht.
3608 - '';
3609 - };
3610 -
3611 - statePath = mkOption {
3612 - type = types.path;
3613 - default = "${cfg.statePath}/pastesrht";
3614 - description = ''
3615 - State path for pastesrht.sr.ht.
3616 - '';
3617 - };
3618 - };
3619 -
3620 - config = with scfg; lib.mkIf (cfg.enable && elem "paste" cfg.services) {
3621 - users = {
3622 - users = {
3623 - "${user}" = {
3624 - isSystemUser = true;
3625 - group = user;
3626 - description = "paste.sr.ht user";
3627 - };
3628 - };
3629 -
3630 - groups = {
3631 - "${user}" = { };
3632 - };
3633 - };
3634 -
3635 - services.postgresql = {
3636 - authentication = ''
3637 - local ${database} ${user} trust
3638 - '';
3639 - ensureDatabases = [ database ];
3640 - ensureUsers = [
3641 - {
3642 - name = user;
3643 - ensurePermissions = { "DATABASE \"${database}\"" = "ALL PRIVILEGES"; };
3644 - }
3645 - ];
3646 - };
3647 -
3648 - systemd = {
3649 - tmpfiles.rules = [
3650 - "d ${statePath} 0750 ${user} ${user} -"
3651 - ];
3652 -
3653 - services = {
3654 - pastesrht = import ./service.nix { inherit config pkgs lib; } scfg drv iniKey {
3655 - after = [ "postgresql.service" "network.target" ];
3656 - requires = [ "postgresql.service" ];
3657 - wantedBy = [ "multi-user.target" ];
3658 -
3659 - description = "paste.sr.ht website service";
3660 -
3661 - serviceConfig.ExecStart = "${cfg.python}/bin/gunicorn ${drv.pname}.app:app -b ${cfg.address}:${toString port}";
3662 - };
3663 -
3664 - pastesrht-webhooks = {
3665 - after = [ "postgresql.service" "network.target" ];
3666 - requires = [ "postgresql.service" ];
3667 - wantedBy = [ "multi-user.target" ];
3668 -
3669 - description = "paste.sr.ht webhooks service";
3670 - serviceConfig = {
3671 - Type = "simple";
3672 - User = user;
3673 - Restart = "always";
3674 - ExecStart = "${cfg.python}/bin/celery -A ${drv.pname}.webhooks worker --loglevel=info";
3675 - };
3676 -
3677 - };
3678 - };
3679 - };
3680 -
3681 - services.sourcehut.settings = {
3682 - # URL paste.sr.ht is being served at (protocol://domain)
3683 - "paste.sr.ht".origin = mkDefault "http://paste.${cfg.originBase}";
3684 - # Address and port to bind the debug server to
3685 - "paste.sr.ht".debug-host = mkDefault "0.0.0.0";
3686 - "paste.sr.ht".debug-port = mkDefault port;
3687 - # Configures the SQLAlchemy connection string for the database.
3688 - "paste.sr.ht".connection-string = mkDefault "postgresql:///${database}?user=${user}&host=/var/run/postgresql";
3689 - # Set to "yes" to automatically run migrations on package upgrade.
3690 - "paste.sr.ht".migrate-on-upgrade = mkDefault "yes";
3691 - # paste.sr.ht's OAuth client ID and secret for meta.sr.ht
3692 - # Register your client at meta.example.org/oauth
3693 - "paste.sr.ht".oauth-client-id = mkDefault null;
3694 - "paste.sr.ht".oauth-client-secret = mkDefault null;
3695 - "paste.sr.ht".webhooks = mkDefault "redis://${rcfg.bind}:${toString rcfg.port}/5";
3696 - };
3697 -
3698 - services.nginx.virtualHosts."paste.${cfg.originBase}" = {
3699 - forceSSL = true;
3700 - locations."/".proxyPass = "http://${cfg.address}:${toString port}";
3701 - locations."/query".proxyPass = "http://${cfg.address}:${toString (port + 100)}";
3702 - locations."/static".root = "${pkgs.sourcehut.pastesrht}/${pkgs.sourcehut.python.sitePackages}/pastesrht";
3703 - };
3704 - };
3705 -}
3706 diff --git a/nixos/modules/services/misc/sourcehut/service.nix b/nixos/modules/services/misc/sourcehut/service.nix
3707 index 65b4ad020f9..ba304fed08a 100644
3708 --- a/nixos/modules/services/misc/sourcehut/service.nix
3709 +++ b/nixos/modules/services/misc/sourcehut/service.nix
3710 @@ -1,66 +1,381 @@
3711 -{ config, pkgs, lib }:
3712 -serviceCfg: serviceDrv: iniKey: attrs:
3713 +srv:
3714 +{ configIniOfService
3715 +, srvsrht ? "${srv}srht" # Because "buildsrht" does not follow that pattern (missing an "s").
3716 +, iniKey ? "${srv}.sr.ht"
3717 +, webhooks ? false
3718 +, extraTimers ? {}
3719 +, mainService ? {}
3720 +, extraServices ? {}
3721 +, extraConfig ? {}
3722 +, port
3723 +}:
3724 +{ config, lib, pkgs, ... }:
3725 +
3726 +with lib;
3727 let
3728 + inherit (config.services) postgresql;
3729 + redis = config.services.redis.servers."sourcehut-${srvsrht}";
3730 + inherit (config.users) users;
3731 cfg = config.services.sourcehut;
3732 - cfgIni = cfg.settings."${iniKey}";
3733 - pgSuperUser = config.services.postgresql.superUser;
3734 -
3735 - setupDB = pkgs.writeScript "${serviceDrv.pname}-gen-db" ''
3736 - #! ${cfg.python}/bin/python
3737 - from ${serviceDrv.pname}.app import db
3738 - db.create()
3739 - '';
3740 + configIni = configIniOfService srv;
3741 + srvCfg = cfg.${srv};
3742 + baseService = serviceName: { allowStripe ? false }: extraService: let
3743 + runDir = "/run/sourcehut/${serviceName}";
3744 + rootDir = "/run/sourcehut/chroots/${serviceName}";
3745 + in
3746 + mkMerge [ extraService {
3747 + after = [ "network.target" ] ++
3748 + optional cfg.postgresql.enable "postgresql.service" ++
3749 + optional cfg.redis.enable "redis-sourcehut-${srvsrht}.service";
3750 + requires =
3751 + optional cfg.postgresql.enable "postgresql.service" ++
3752 + optional cfg.redis.enable "redis-sourcehut-${srvsrht}.service";
3753 + path = [ pkgs.gawk ];
3754 + environment.HOME = runDir;
3755 + serviceConfig = {
3756 + User = mkDefault srvCfg.user;
3757 + Group = mkDefault srvCfg.group;
3758 + RuntimeDirectory = [
3759 + "sourcehut/${serviceName}"
3760 + # Used by *srht-keys which reads ../config.ini
3761 + "sourcehut/${serviceName}/subdir"
3762 + "sourcehut/chroots/${serviceName}"
3763 + ];
3764 + RuntimeDirectoryMode = "2750";
3765 + # No need for the chroot path once inside the chroot
3766 + InaccessiblePaths = [ "-+${rootDir}" ];
3767 + # g+rx is for group members (eg. fcgiwrap or nginx)
3768 + # to read Git/Mercurial repositories, buildlogs, etc.
3769 + # o+x is for intermediate directories created by BindPaths= and like,
3770 + # as they're owned by root:root.
3771 + UMask = "0026";
3772 + RootDirectory = rootDir;
3773 + RootDirectoryStartOnly = true;
3774 + PrivateTmp = true;
3775 + MountAPIVFS = true;
3776 + # config.ini is looked up in there, before /etc/srht/config.ini
3777 + # Note that it fails to be set in ExecStartPre=
3778 + WorkingDirectory = mkDefault ("-"+runDir);
3779 + BindReadOnlyPaths = [
3780 + builtins.storeDir
3781 + "/etc"
3782 + "/run/booted-system"
3783 + "/run/current-system"
3784 + "/run/systemd"
3785 + ] ++
3786 + optional cfg.postgresql.enable "/run/postgresql" ++
3787 + optional cfg.redis.enable "/run/redis-sourcehut-${srvsrht}";
3788 + # LoadCredential= are unfortunately not available in ExecStartPre=
3789 + # Hence this one is run as root (the +) with RootDirectoryStartOnly=
3790 + # to reach credentials wherever they are.
3791 + # Note that each systemd service gets its own ${runDir}/config.ini file.
3792 + ExecStartPre = mkBefore [("+"+pkgs.writeShellScript "${serviceName}-credentials" ''
3793 + set -x
3794 + # Replace values begining with a '<' by the content of the file whose name is after.
3795 + gawk '{ if (match($0,/^([^=]+=)<(.+)/,m)) { getline f < m[2]; print m[1] f } else print $0 }' ${configIni} |
3796 + ${optionalString (!allowStripe) "gawk '!/^stripe-secret-key=/' |"}
3797 + install -o ${srvCfg.user} -g root -m 400 /dev/stdin ${runDir}/config.ini
3798 + '')];
3799 + # The following options are only for optimizing:
3800 + # systemd-analyze security
3801 + AmbientCapabilities = "";
3802 + CapabilityBoundingSet = "";
3803 + # ProtectClock= adds DeviceAllow=char-rtc r
3804 + DeviceAllow = "";
3805 + LockPersonality = true;
3806 + MemoryDenyWriteExecute = true;
3807 + NoNewPrivileges = true;
3808 + PrivateDevices = true;
3809 + PrivateMounts = true;
3810 + PrivateNetwork = mkDefault false;
3811 + PrivateUsers = true;
3812 + ProcSubset = "pid";
3813 + ProtectClock = true;
3814 + ProtectControlGroups = true;
3815 + ProtectHome = true;
3816 + ProtectHostname = true;
3817 + ProtectKernelLogs = true;
3818 + ProtectKernelModules = true;
3819 + ProtectKernelTunables = true;
3820 + ProtectProc = "invisible";
3821 + ProtectSystem = "strict";
3822 + RemoveIPC = true;
3823 + RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" "AF_INET6" ];
3824 + RestrictNamespaces = true;
3825 + RestrictRealtime = true;
3826 + RestrictSUIDSGID = true;
3827 + #SocketBindAllow = [ "tcp:${toString srvCfg.port}" "tcp:${toString srvCfg.prometheusPort}" ];
3828 + #SocketBindDeny = "any";
3829 + SystemCallFilter = [
3830 + "@system-service"
3831 + "~@aio" "~@keyring" "~@memlock" "~@privileged" "~@resources" "~@timer"
3832 + "@chown" "@setuid"
3833 + ];
3834 + SystemCallArchitectures = "native";
3835 + };
3836 + } ];
3837 in
3838 -with serviceCfg; with lib; recursiveUpdate
3839 {
3840 - environment.HOME = statePath;
3841 - path = [ config.services.postgresql.package ] ++ (attrs.path or [ ]);
3842 - restartTriggers = [ config.environment.etc."sr.ht/config.ini".source ];
3843 - serviceConfig = {
3844 - Type = "simple";
3845 - User = user;
3846 - Group = user;
3847 - Restart = "always";
3848 - WorkingDirectory = statePath;
3849 - } // (if (cfg.statePath == "/var/lib/sourcehut/${serviceDrv.pname}") then {
3850 - StateDirectory = [ "sourcehut/${serviceDrv.pname}" ];
3851 - } else {})
3852 - ;
3853 + options.services.sourcehut.${srv} = {
3854 + enable = mkEnableOption "${srv} service";
3855
3856 - preStart = ''
3857 - if ! test -e ${statePath}/db; then
3858 - # Setup the initial database
3859 - ${setupDB}
3860 + user = mkOption {
3861 + type = types.str;
3862 + default = srvsrht;
3863 + description = ''
3864 + User for ${srv}.sr.ht.
3865 + '';
3866 + };
3867
3868 - # Set the initial state of the database for future database upgrades
3869 - if test -e ${cfg.python}/bin/${serviceDrv.pname}-migrate; then
3870 - # Run alembic stamp head once to tell alembic the schema is up-to-date
3871 - ${cfg.python}/bin/${serviceDrv.pname}-migrate stamp head
3872 - fi
3873 + group = mkOption {
3874 + type = types.str;
3875 + default = srvsrht;
3876 + description = ''
3877 + Group for ${srv}.sr.ht.
3878 + Membership grants access to the Git/Mercurial repositories by default,
3879 + but not to the config.ini file (where secrets are).
3880 + '';
3881 + };
3882
3883 - printf "%s" "${serviceDrv.version}" > ${statePath}/db
3884 - fi
3885 + port = mkOption {
3886 + type = types.port;
3887 + default = port;
3888 + description = ''
3889 + Port on which the "${srv}" backend should listen.
3890 + '';
3891 + };
3892
3893 - # Update copy of each users' profile to the latest
3894 - # See https://lists.sr.ht/~sircmpwn/sr.ht-admins/<20190302181207.GA13778%40cirno.my.domain>
3895 - if ! test -e ${statePath}/webhook; then
3896 - # Update ${iniKey}'s users' profile copy to the latest
3897 - ${cfg.python}/bin/srht-update-profiles ${iniKey}
3898 + redis = {
3899 + host = mkOption {
3900 + type = types.str;
3901 + default = "unix:/run/redis-sourcehut-${srvsrht}/redis.sock?db=0";
3902 + example = "redis://shared.wireguard:6379/0";
3903 + description = ''
3904 + The redis host URL. This is used for caching and temporary storage, and must
3905 + be shared between nodes (e.g. git1.sr.ht and git2.sr.ht), but need not be
3906 + shared between services. It may be shared between services, however, with no
3907 + ill effect, if this better suits your infrastructure.
3908 + '';
3909 + };
3910 + };
3911
3912 - touch ${statePath}/webhook
3913 - fi
3914 + postgresql = {
3915 + database = mkOption {
3916 + type = types.str;
3917 + default = "${srv}.sr.ht";
3918 + description = ''
3919 + PostgreSQL database name for the ${srv}.sr.ht service,
3920 + used if <xref linkend="opt-services.sourcehut.postgresql.enable"/> is <literal>true</literal>.
3921 + '';
3922 + };
3923 + };
3924
3925 - ${optionalString (builtins.hasAttr "migrate-on-upgrade" cfgIni && cfgIni.migrate-on-upgrade == "yes") ''
3926 - if [ "$(cat ${statePath}/db)" != "${serviceDrv.version}" ]; then
3927 - # Manage schema migrations using alembic
3928 - ${cfg.python}/bin/${serviceDrv.pname}-migrate -a upgrade head
3929 + gunicorn = {
3930 + extraArgs = mkOption {
3931 + type = with types; listOf str;
3932 + default = ["--timeout 120" "--workers 1" "--log-level=info"];
3933 + description = "Extra arguments passed to Gunicorn.";
3934 + };
3935 + };
3936 + } // optionalAttrs webhooks {
3937 + webhooks = {
3938 + extraArgs = mkOption {
3939 + type = with types; listOf str;
3940 + default = ["--loglevel DEBUG" "--pool eventlet" "--without-heartbeat"];
3941 + description = "Extra arguments passed to the Celery responsible for webhooks.";
3942 + };
3943 + celeryConfig = mkOption {
3944 + type = types.lines;
3945 + default = "";
3946 + description = "Content of the <literal>celeryconfig.py</literal> used by the Celery responsible for webhooks.";
3947 + };
3948 + };
3949 + };
3950
3951 - # Mark down current package version
3952 - printf "%s" "${serviceDrv.version}" > ${statePath}/db
3953 - fi
3954 - ''}
3955 + config = lib.mkIf (cfg.enable && srvCfg.enable) (mkMerge [ extraConfig {
3956 + users = {
3957 + users = {
3958 + "${srvCfg.user}" = {
3959 + isSystemUser = true;
3960 + group = mkDefault srvCfg.group;
3961 + description = mkDefault "sourcehut user for ${srv}.sr.ht";
3962 + };
3963 + };
3964 + groups = {
3965 + "${srvCfg.group}" = { };
3966 + } // optionalAttrs (cfg.postgresql.enable
3967 + && hasSuffix "0" (postgresql.settings.unix_socket_permissions or "")) {
3968 + "postgres".members = [ srvCfg.user ];
3969 + } // optionalAttrs (cfg.redis.enable
3970 + && hasSuffix "0" (redis.settings.unixsocketperm or "")) {
3971 + "redis-sourcehut-${srvsrht}".members = [ srvCfg.user ];
3972 + };
3973 + };
3974
3975 - ${attrs.preStart or ""}
3976 - '';
3977 + services.nginx = mkIf cfg.nginx.enable {
3978 + virtualHosts."${srv}.${cfg.settings."sr.ht".global-domain}" = mkMerge [ {
3979 + forceSSL = mkDefault true;
3980 + locations."/".proxyPass = "http://${cfg.listenAddress}:${toString srvCfg.port}";
3981 + locations."/static" = {
3982 + root = "${pkgs.sourcehut.${srvsrht}}/${pkgs.sourcehut.python.sitePackages}/${srvsrht}";
3983 + extraConfig = mkDefault ''
3984 + expires 30d;
3985 + '';
3986 + };
3987 + } cfg.nginx.virtualHost ];
3988 + };
3989 +
3990 + services.postgresql = mkIf cfg.postgresql.enable {
3991 + authentication = ''
3992 + local ${srvCfg.postgresql.database} ${srvCfg.user} trust
3993 + '';
3994 + ensureDatabases = [ srvCfg.postgresql.database ];
3995 + ensureUsers = map (name: {
3996 + inherit name;
3997 + ensurePermissions = { "DATABASE \"${srvCfg.postgresql.database}\"" = "ALL PRIVILEGES"; };
3998 + }) [srvCfg.user];
3999 + };
4000 +
4001 + services.sourcehut.services = mkDefault (filter (s: cfg.${s}.enable)
4002 + [ "builds" "dispatch" "git" "hg" "hub" "lists" "man" "meta" "pages" "paste" "todo" ]);
4003 +
4004 + services.sourcehut.settings = mkMerge [
4005 + {
4006 + "${srv}.sr.ht".origin = mkDefault "https://${srv}.${cfg.settings."sr.ht".global-domain}";
4007 + }
4008 +
4009 + (mkIf cfg.postgresql.enable {
4010 + "${srv}.sr.ht".connection-string = mkDefault "postgresql:///${srvCfg.postgresql.database}?user=${srvCfg.user}&host=/run/postgresql";
4011 + })
4012 + ];
4013 +
4014 + services.redis.servers."sourcehut-${srvsrht}" = mkIf cfg.redis.enable {
4015 + enable = true;
4016 + databases = 3;
4017 + syslog = true;
4018 + # TODO: set a more informed value
4019 + save = mkDefault [ [1800 10] [300 100] ];
4020 + settings = {
4021 + # TODO: set a more informed value
4022 + maxmemory = mkDefault "128MB";
4023 + maxmemory-policy = mkDefault "volatile-ttl";
4024 + };
4025 + };
4026 +
4027 + systemd.services = mkMerge [
4028 + {
4029 + "${srvsrht}" = baseService srvsrht { allowStripe = srv == "meta"; } (mkMerge [
4030 + {
4031 + description = "sourcehut ${srv}.sr.ht website service";
4032 + before = optional cfg.nginx.enable "nginx.service";
4033 + wants = optional cfg.nginx.enable "nginx.service";
4034 + wantedBy = [ "multi-user.target" ];
4035 + path = optional cfg.postgresql.enable postgresql.package;
4036 + # Beware: change in credentials' content will not trigger restart.
4037 + restartTriggers = [ configIni ];
4038 + serviceConfig = {
4039 + Type = "simple";
4040 + Restart = mkDefault "always";
4041 + #RestartSec = mkDefault "2min";
4042 + StateDirectory = [ "sourcehut/${srvsrht}" ];
4043 + StateDirectoryMode = "2750";
4044 + ExecStart = "${cfg.python}/bin/gunicorn ${srvsrht}.app:app --name ${srvsrht} --bind ${cfg.listenAddress}:${toString srvCfg.port} " + concatStringsSep " " srvCfg.gunicorn.extraArgs;
4045 + };
4046 + preStart = let
4047 + version = pkgs.sourcehut.${srvsrht}.version;
4048 + stateDir = "/var/lib/sourcehut/${srvsrht}";
4049 + in mkBefore ''
4050 + set -x
4051 + # Use the /run/sourcehut/${srvsrht}/config.ini
4052 + # installed by a previous ExecStartPre= in baseService
4053 + cd /run/sourcehut/${srvsrht}
4054 +
4055 + if test ! -e ${stateDir}/db; then
4056 + # Setup the initial database.
4057 + # Note that it stamps the alembic head afterward
4058 + ${cfg.python}/bin/${srvsrht}-initdb
4059 + echo ${version} >${stateDir}/db
4060 + fi
4061 +
4062 + ${optionalString cfg.settings.${iniKey}.migrate-on-upgrade ''
4063 + if [ "$(cat ${stateDir}/db)" != "${version}" ]; then
4064 + # Manage schema migrations using alembic
4065 + ${cfg.python}/bin/${srvsrht}-migrate -a upgrade head
4066 + echo ${version} >${stateDir}/db
4067 + fi
4068 + ''}
4069 +
4070 + # Update copy of each users' profile to the latest
4071 + # See https://lists.sr.ht/~sircmpwn/sr.ht-admins/<20190302181207.GA13778%40cirno.my.domain>
4072 + if test ! -e ${stateDir}/webhook; then
4073 + # Update ${iniKey}'s users' profile copy to the latest
4074 + ${cfg.python}/bin/srht-update-profiles ${iniKey}
4075 + touch ${stateDir}/webhook
4076 + fi
4077 + '';
4078 + } mainService ]);
4079 + }
4080 +
4081 + (mkIf webhooks {
4082 + "${srvsrht}-webhooks" = baseService "${srvsrht}-webhooks" {}
4083 + {
4084 + description = "sourcehut ${srv}.sr.ht webhooks service";
4085 + after = [ "${srvsrht}.service" ];
4086 + wantedBy = [ "${srvsrht}.service" ];
4087 + partOf = [ "${srvsrht}.service" ];
4088 + preStart = ''
4089 + cp ${pkgs.writeText "${srvsrht}-webhooks-celeryconfig.py" srvCfg.webhooks.celeryConfig} \
4090 + /run/sourcehut/${srvsrht}-webhooks/celeryconfig.py
4091 + '';
4092 + serviceConfig = {
4093 + Type = "simple";
4094 + Restart = "always";
4095 + ExecStart = "${cfg.python}/bin/celery --app ${srvsrht}.webhooks worker --hostname ${srvsrht}-webhooks@%%h " + concatStringsSep " " srvCfg.webhooks.extraArgs;
4096 + # Avoid crashing: os.getloadavg()
4097 + ProcSubset = mkForce "all";
4098 + };
4099 + };
4100 + })
4101 +
4102 + (mkIf cfg.redis.enable {
4103 + "redis-sourcehut-${srvsrht}" = {
4104 + serviceConfig.partOf = [ "${srvsrht}.service" ];
4105 + };
4106 + })
4107 +
4108 + (mapAttrs (timerName: timer: (baseService timerName {} (mkMerge [
4109 + {
4110 + description = "sourcehut ${timerName} service";
4111 + after = [ "network.target" "${srvsrht}.service" ];
4112 + serviceConfig = {
4113 + Type = "oneshot";
4114 + ExecStart = "${cfg.python}/bin/${timerName}";
4115 + };
4116 + }
4117 + (timer.service or {})
4118 + ]))) extraTimers)
4119 +
4120 + (mapAttrs (serviceName: extraService: baseService serviceName {} (mkMerge [
4121 + {
4122 + description = "sourcehut ${serviceName} service";
4123 + # So that extraServices have the PostgreSQL database initialized.
4124 + after = [ "${srvsrht}.service" ];
4125 + wantedBy = [ "${srvsrht}.service" ];
4126 + partOf = [ "${srvsrht}.service" ];
4127 + serviceConfig = {
4128 + Type = "simple";
4129 + Restart = mkDefault "always";
4130 + };
4131 + }
4132 + extraService
4133 + ])) extraServices)
4134 + ];
4135 +
4136 + systemd.timers = mapAttrs (timerName: timer:
4137 + {
4138 + description = "sourcehut timer for ${timerName}";
4139 + wantedBy = [ "timers.target" ];
4140 + inherit (timer) timerConfig;
4141 + }) extraTimers;
4142 + } ]);
4143 }
4144 - (builtins.removeAttrs attrs [ "path" "preStart" ])
4145 diff --git a/nixos/modules/services/misc/sourcehut/sourcehut.xml b/nixos/modules/services/misc/sourcehut/sourcehut.xml
4146 index ab9a8c6cb4b..41094f65a94 100644
4147 --- a/nixos/modules/services/misc/sourcehut/sourcehut.xml
4148 +++ b/nixos/modules/services/misc/sourcehut/sourcehut.xml
4149 @@ -14,13 +14,12 @@
4150 <title>Basic usage</title>
4151 <para>
4152 Sourcehut is a Python and Go based set of applications.
4153 - <literal><link linkend="opt-services.sourcehut.enable">services.sourcehut</link></literal>
4154 - by default will use
4155 + This NixOS module also provides basic configuration integrating Sourcehut into locally running
4156 <literal><link linkend="opt-services.nginx.enable">services.nginx</link></literal>,
4157 - <literal><link linkend="opt-services.nginx.enable">services.redis</link></literal>,
4158 - <literal><link linkend="opt-services.nginx.enable">services.cron</link></literal>,
4159 + <literal><link linkend="opt-services.redis.servers">services.redis.servers.sourcehut</link></literal>,
4160 + <literal><link linkend="opt-services.postfix.enable">services.postfix</link></literal>
4161 and
4162 - <literal><link linkend="opt-services.postgresql.enable">services.postgresql</link></literal>.
4163 + <literal><link linkend="opt-services.postgresql.enable">services.postgresql</link></literal> services.
4164 </para>
4165
4166 <para>
4167 @@ -42,18 +41,23 @@ in {
4168
4169 services.sourcehut = {
4170 <link linkend="opt-services.sourcehut.enable">enable</link> = true;
4171 - <link linkend="opt-services.sourcehut.originBase">originBase</link> = fqdn;
4172 - <link linkend="opt-services.sourcehut.services">services</link> = [ "meta" "man" "git" ];
4173 + <link linkend="opt-services.sourcehut.git.enable">git.enable</link> = true;
4174 + <link linkend="opt-services.sourcehut.man.enable">man.enable</link> = true;
4175 + <link linkend="opt-services.sourcehut.meta.enable">meta.enable</link> = true;
4176 + <link linkend="opt-services.sourcehut.nginx.enable">nginx.enable</link> = true;
4177 + <link linkend="opt-services.sourcehut.postfix.enable">postfix.enable</link> = true;
4178 + <link linkend="opt-services.sourcehut.postgresql.enable">postgresql.enable</link> = true;
4179 + <link linkend="opt-services.sourcehut.redis.enable">redis.enable</link> = true;
4180 <link linkend="opt-services.sourcehut.settings">settings</link> = {
4181 "sr.ht" = {
4182 environment = "production";
4183 global-domain = fqdn;
4184 origin = "https://${fqdn}";
4185 # Produce keys with srht-keygen from <package>sourcehut.coresrht</package>.
4186 - network-key = "SECRET";
4187 - service-key = "SECRET";
4188 + network-key = "/run/keys/path/to/network-key";
4189 + service-key = "/run/keys/path/to/service-key";
4190 };
4191 - webhooks.private-key= "SECRET";
4192 + webhooks.private-key= "/run/keys/path/to/webhook-key";
4193 };
4194 };
4195
4196 diff --git a/nixos/modules/services/misc/sourcehut/todo.nix b/nixos/modules/services/misc/sourcehut/todo.nix
4197 deleted file mode 100644
4198 index aec773b0669..00000000000
4199 --- a/nixos/modules/services/misc/sourcehut/todo.nix
4200 +++ /dev/null
4201 @@ -1,161 +0,0 @@
4202 -{ config, lib, pkgs, ... }:
4203 -
4204 -with lib;
4205 -let
4206 - cfg = config.services.sourcehut;
4207 - cfgIni = cfg.settings;
4208 - scfg = cfg.todo;
4209 - iniKey = "todo.sr.ht";
4210 -
4211 - rcfg = config.services.redis;
4212 - drv = pkgs.sourcehut.todosrht;
4213 -in
4214 -{
4215 - options.services.sourcehut.todo = {
4216 - user = mkOption {
4217 - type = types.str;
4218 - default = "todosrht";
4219 - description = ''
4220 - User for todo.sr.ht.
4221 - '';
4222 - };
4223 -
4224 - port = mkOption {
4225 - type = types.port;
4226 - default = 5003;
4227 - description = ''
4228 - Port on which the "todo" module should listen.
4229 - '';
4230 - };
4231 -
4232 - database = mkOption {
4233 - type = types.str;
4234 - default = "todo.sr.ht";
4235 - description = ''
4236 - PostgreSQL database name for todo.sr.ht.
4237 - '';
4238 - };
4239 -
4240 - statePath = mkOption {
4241 - type = types.path;
4242 - default = "${cfg.statePath}/todosrht";
4243 - description = ''
4244 - State path for todo.sr.ht.
4245 - '';
4246 - };
4247 - };
4248 -
4249 - config = with scfg; lib.mkIf (cfg.enable && elem "todo" cfg.services) {
4250 - users = {
4251 - users = {
4252 - "${user}" = {
4253 - isSystemUser = true;
4254 - group = user;
4255 - extraGroups = [ "postfix" ];
4256 - description = "todo.sr.ht user";
4257 - };
4258 - };
4259 - groups = {
4260 - "${user}" = { };
4261 - };
4262 - };
4263 -
4264 - services.postgresql = {
4265 - authentication = ''
4266 - local ${database} ${user} trust
4267 - '';
4268 - ensureDatabases = [ database ];
4269 - ensureUsers = [
4270 - {
4271 - name = user;
4272 - ensurePermissions = { "DATABASE \"${database}\"" = "ALL PRIVILEGES"; };
4273 - }
4274 - ];
4275 - };
4276 -
4277 - systemd = {
4278 - tmpfiles.rules = [
4279 - "d ${statePath} 0750 ${user} ${user} -"
4280 - ];
4281 -
4282 - services = {
4283 - todosrht = import ./service.nix { inherit config pkgs lib; } scfg drv iniKey {
4284 - after = [ "postgresql.service" "network.target" ];
4285 - requires = [ "postgresql.service" ];
4286 - wantedBy = [ "multi-user.target" ];
4287 -
4288 - description = "todo.sr.ht website service";
4289 -
4290 - serviceConfig.ExecStart = "${cfg.python}/bin/gunicorn ${drv.pname}.app:app -b ${cfg.address}:${toString port}";
4291 - };
4292 -
4293 - todosrht-lmtp = {
4294 - after = [ "postgresql.service" "network.target" ];
4295 - bindsTo = [ "postgresql.service" ];
4296 - wantedBy = [ "multi-user.target" ];
4297 -
4298 - description = "todo.sr.ht process service";
4299 - serviceConfig = {
4300 - Type = "simple";
4301 - User = user;
4302 - Restart = "always";
4303 - ExecStart = "${cfg.python}/bin/todosrht-lmtp";
4304 - };
4305 - };
4306 -
4307 - todosrht-webhooks = {
4308 - after = [ "postgresql.service" "network.target" ];
4309 - requires = [ "postgresql.service" ];
4310 - wantedBy = [ "multi-user.target" ];
4311 -
4312 - description = "todo.sr.ht webhooks service";
4313 - serviceConfig = {
4314 - Type = "simple";
4315 - User = user;
4316 - Restart = "always";
4317 - ExecStart = "${cfg.python}/bin/celery -A ${drv.pname}.webhooks worker --loglevel=info";
4318 - };
4319 -
4320 - };
4321 - };
4322 - };
4323 -
4324 - services.sourcehut.settings = {
4325 - # URL todo.sr.ht is being served at (protocol://domain)
4326 - "todo.sr.ht".origin = mkDefault "http://todo.${cfg.originBase}";
4327 - # Address and port to bind the debug server to
4328 - "todo.sr.ht".debug-host = mkDefault "0.0.0.0";
4329 - "todo.sr.ht".debug-port = mkDefault port;
4330 - # Configures the SQLAlchemy connection string for the database.
4331 - "todo.sr.ht".connection-string = mkDefault "postgresql:///${database}?user=${user}&host=/var/run/postgresql";
4332 - # Set to "yes" to automatically run migrations on package upgrade.
4333 - "todo.sr.ht".migrate-on-upgrade = mkDefault "yes";
4334 - # todo.sr.ht's OAuth client ID and secret for meta.sr.ht
4335 - # Register your client at meta.example.org/oauth
4336 - "todo.sr.ht".oauth-client-id = mkDefault null;
4337 - "todo.sr.ht".oauth-client-secret = mkDefault null;
4338 - # Outgoing email for notifications generated by users
4339 - "todo.sr.ht".notify-from = mkDefault "CHANGEME@example.org";
4340 - # The redis connection used for the webhooks worker
4341 - "todo.sr.ht".webhooks = mkDefault "redis://${rcfg.bind}:${toString rcfg.port}/1";
4342 - # Network-key
4343 - "todo.sr.ht".network-key = mkDefault null;
4344 -
4345 - # Path for the lmtp daemon's unix socket. Direct incoming mail to this socket.
4346 - # Alternatively, specify IP:PORT and an SMTP server will be run instead.
4347 - "todo.sr.ht::mail".sock = mkDefault "/tmp/todo.sr.ht-lmtp.sock";
4348 - # The lmtp daemon will make the unix socket group-read/write for users in this
4349 - # group.
4350 - "todo.sr.ht::mail".sock-group = mkDefault "postfix";
4351 -
4352 - "todo.sr.ht::mail".posting-domain = mkDefault "todo.${cfg.originBase}";
4353 - };
4354 -
4355 - services.nginx.virtualHosts."todo.${cfg.originBase}" = {
4356 - forceSSL = true;
4357 - locations."/".proxyPass = "http://${cfg.address}:${toString port}";
4358 - locations."/query".proxyPass = "http://${cfg.address}:${toString (port + 100)}";
4359 - locations."/static".root = "${pkgs.sourcehut.todosrht}/${pkgs.sourcehut.python.sitePackages}/todosrht";
4360 - };
4361 - };
4362 -}
4363 diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix
4364 index a6eb2c03258..eb0238c0ca1 100644
4365 --- a/nixos/tests/all-tests.nix
4366 +++ b/nixos/tests/all-tests.nix
4367 @@ -412,6 +412,7 @@ in
4368 solanum = handleTest ./solanum.nix {};
4369 solr = handleTest ./solr.nix {};
4370 sonarr = handleTest ./sonarr.nix {};
4371 + sourcehut = handleTest ./sourcehut.nix {};
4372 spacecookie = handleTest ./spacecookie.nix {};
4373 spike = handleTest ./spike.nix {};
4374 sslh = handleTest ./sslh.nix {};
4375 diff --git a/nixos/tests/sourcehut.nix b/nixos/tests/sourcehut.nix
4376 index b56a14ebf85..d1536c59322 100644
4377 --- a/nixos/tests/sourcehut.nix
4378 +++ b/nixos/tests/sourcehut.nix
4379 @@ -1,29 +1,197 @@
4380 -import ./make-test-python.nix ({ pkgs, ... }:
4381 +import ./make-test-python.nix ({ pkgs, lib, ... }:
4382 +let
4383 + domain = "sourcehut.localdomain";
4384
4385 + # Note that wildcard certificates just under the TLD (eg. *.com)
4386 + # would be rejected by clients like curl.
4387 + tls-cert = pkgs.runCommand "selfSignedCerts" { buildInputs = [ pkgs.openssl ]; } ''
4388 + openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -days 36500 \
4389 + -subj '/CN=${domain}' -extensions v3_req \
4390 + -addext 'subjectAltName = DNS:*.${domain}'
4391 + install -D -t $out key.pem cert.pem
4392 + '';
4393 +
4394 + images = {
4395 + nixos.unstable.x86_64 =
4396 + let
4397 + systemConfig = { pkgs, ... }: {
4398 + # passwordless ssh server
4399 + services.openssh = {
4400 + enable = true;
4401 + permitRootLogin = "yes";
4402 + extraConfig = "PermitEmptyPasswords yes";
4403 + };
4404 +
4405 + users = {
4406 + mutableUsers = false;
4407 + # build user
4408 + extraUsers."build" = {
4409 + isNormalUser = true;
4410 + uid = 1000;
4411 + extraGroups = [ "wheel" ];
4412 + password = "";
4413 + };
4414 + users.root.password = "";
4415 + };
4416 +
4417 + security.sudo.wheelNeedsPassword = false;
4418 + nix.trustedUsers = [ "root" "build" ];
4419 + documentation.nixos.enable = false;
4420 +
4421 + # builds.sr.ht-image-specific network settings
4422 + networking = {
4423 + hostName = "build";
4424 + dhcpcd.enable = false;
4425 + defaultGateway.address = "10.0.2.2";
4426 + usePredictableInterfaceNames = false;
4427 + interfaces."eth0".ipv4.addresses = [{
4428 + address = "10.0.2.15";
4429 + prefixLength = 25;
4430 + }];
4431 + enableIPv6 = false;
4432 + nameservers = [
4433 + # OpenNIC anycast
4434 + "185.121.177.177"
4435 + "169.239.202.202"
4436 + # Google
4437 + "8.8.8.8"
4438 + ];
4439 + firewall.allowedTCPPorts = [ 22 ];
4440 + };
4441 +
4442 + environment.systemPackages = [
4443 + pkgs.gitMinimal
4444 + #pkgs.mercurial
4445 + pkgs.curl
4446 + pkgs.gnupg
4447 + ];
4448 + };
4449 + qemuConfig = { pkgs, ... }: {
4450 + imports = [ systemConfig ];
4451 + fileSystems."/".device = "/dev/disk/by-label/nixos";
4452 + boot.initrd.availableKernelModules = [
4453 + "ahci"
4454 + "ehci_pci"
4455 + "sd_mod"
4456 + "usb_storage"
4457 + "usbhid"
4458 + "virtio_balloon"
4459 + "virtio_blk"
4460 + "virtio_pci"
4461 + "virtio_ring"
4462 + "xhci_pci"
4463 + ];
4464 + boot.loader = {
4465 + grub = {
4466 + version = 2;
4467 + device = "/dev/vda";
4468 + };
4469 + timeout = 0;
4470 + };
4471 + };
4472 + config = (import (pkgs.path + "/nixos/lib/eval-config.nix") {
4473 + inherit pkgs; modules = [ qemuConfig ];
4474 + system = "x86_64-linux";
4475 + }).config;
4476 + in
4477 + import (pkgs.path + "/nixos/lib/make-disk-image.nix") {
4478 + inherit pkgs lib config;
4479 + diskSize = 16000;
4480 + format = "qcow2-compressed";
4481 + contents = [
4482 + { source = pkgs.writeText "gitconfig" ''
4483 + [user]
4484 + name = builds.sr.ht
4485 + email = build@sr.ht
4486 + '';
4487 + target = "/home/build/.gitconfig";
4488 + user = "build";
4489 + group = "users";
4490 + mode = "644";
4491 + }
4492 + ];
4493 + };
4494 + };
4495 +
4496 +in
4497 {
4498 name = "sourcehut";
4499
4500 meta.maintainers = [ pkgs.lib.maintainers.tomberek ];
4501
4502 - machine = { config, pkgs, ... }: {
4503 - virtualisation.memorySize = 2048;
4504 - networking.firewall.allowedTCPPorts = [ 80 ];
4505 + machine = { config, pkgs, nodes, ... }: {
4506 + # buildsrht needs space
4507 + virtualisation.diskSize = 4 * 1024;
4508 + virtualisation.memorySize = 2 * 1024;
4509 + networking.domain = domain;
4510 + networking.extraHosts = ''
4511 + ${config.networking.primaryIPAddress} meta.${domain}
4512 + ${config.networking.primaryIPAddress} builds.${domain}
4513 + '';
4514
4515 services.sourcehut = {
4516 enable = true;
4517 - services = [ "meta" ];
4518 - originBase = "sourcehut";
4519 - settings."sr.ht".service-key = "8888888888888888888888888888888888888888888888888888888888888888";
4520 - settings."sr.ht".network-key = "0000000000000000000000000000000000000000000=";
4521 - settings.webhooks.private-key = "0000000000000000000000000000000000000000000=";
4522 + services = [ "meta" "builds" ];
4523 + nginx.enable = true;
4524 + nginx.virtualHost = {
4525 + forceSSL = true;
4526 + sslCertificate = "${tls-cert}/cert.pem";
4527 + sslCertificateKey = "${tls-cert}/key.pem";
4528 + };
4529 + postgresql.enable = true;
4530 + redis.enable = true;
4531 +
4532 + meta.enable = true;
4533 + builds = {
4534 + enable = true;
4535 + # FIXME: see why it does not seem to activate fully.
4536 + #enableWorker = true;
4537 + inherit images;
4538 + };
4539 + settings."sr.ht" = {
4540 + global-domain = config.networking.domain;
4541 + service-key = pkgs.writeText "service-key" "8b327279b77e32a3620e2fc9aabce491cc46e7d821fd6713b2a2e650ce114d01";
4542 + network-key = pkgs.writeText "network-key" "cEEmc30BRBGkgQZcHFksiG7hjc6_dK1XR2Oo5Jb9_nQ=";
4543 + };
4544 + settings."builds.sr.ht" = {
4545 + oauth-client-secret = pkgs.writeText "buildsrht-oauth-client-secret" "2260e9c4d9b8dcedcef642860e0504bc";
4546 + oauth-client-id = "299db9f9c2013170";
4547 + };
4548 + settings.webhooks.private-key = pkgs.writeText "webhook-key" "Ra3IjxgFiwG9jxgp4WALQIZw/BMYt30xWiOsqD0J7EA=";
4549 + };
4550 +
4551 + networking.firewall.allowedTCPPorts = [ 443 ];
4552 + security.pki.certificateFiles = [ "${tls-cert}/cert.pem" ];
4553 + services.nginx = {
4554 + enable = true;
4555 + recommendedGzipSettings = true;
4556 + recommendedOptimisation = true;
4557 + recommendedTlsSettings = true;
4558 + recommendedProxySettings = true;
4559 + };
4560 +
4561 + services.postgresql = {
4562 + enable = true;
4563 + enableTCPIP = false;
4564 + settings.unix_socket_permissions = "0770";
4565 };
4566 };
4567
4568 testScript = ''
4569 start_all()
4570 machine.wait_for_unit("multi-user.target")
4571 +
4572 + # Testing metasrht
4573 + machine.wait_for_unit("metasrht-api.service")
4574 machine.wait_for_unit("metasrht.service")
4575 machine.wait_for_open_port(5000)
4576 - machine.succeed("curl -sL http://localhost:5000 | grep meta.sourcehut")
4577 + machine.succeed("curl -sL http://localhost:5000 | grep meta.${domain}")
4578 + machine.succeed("curl -sL http://meta.${domain} | grep meta.${domain}")
4579 +
4580 + # Testing buildsrht
4581 + machine.wait_for_unit("buildsrht.service")
4582 + machine.wait_for_open_port(5002)
4583 + machine.succeed("curl -sL http://localhost:5002 | grep builds.${domain}")
4584 + #machine.wait_for_unit("buildsrht-worker.service")
4585 '';
4586 })
4587 diff --git a/pkgs/applications/version-management/sourcehut/builds.nix b/pkgs/applications/version-management/sourcehut/builds.nix
4588 index c8163caf8ea..f8bd0ca927c 100644
4589 --- a/pkgs/applications/version-management/sourcehut/builds.nix
4590 +++ b/pkgs/applications/version-management/sourcehut/builds.nix
4591 @@ -11,26 +11,54 @@
4592 , python
4593 }:
4594 let
4595 - version = "0.66.7";
4596 -
4597 - buildWorker = src: buildGoModule {
4598 - inherit src version;
4599 - pname = "builds-sr-ht-worker";
4600 -
4601 - vendorSha256 = "sha256-giOaldV46aBqXyFH/cQVsbUr6Rb4VMhbBO86o48tRZY=";
4602 - };
4603 -in
4604 -buildPythonPackage rec {
4605 - inherit version;
4606 - pname = "buildsrht";
4607 + version = "0.74.9";
4608
4609 src = fetchFromSourcehut {
4610 owner = "~sircmpwn";
4611 repo = "builds.sr.ht";
4612 rev = version;
4613 - sha256 = "sha256-2MLs/DOXHjEYarXDVUcPZe3o0fmZbzVxn528SE72lhM=";
4614 + sha256 = "sha256-YX8NRxq+TBgGN6bm9ea8QJAqOequPt0gDxvCn7yxLfY=";
4615 };
4616
4617 + worker = buildGoModule {
4618 + inherit src version;
4619 + sourceRoot = "source/worker";
4620 + pname = "buildsrht-worker";
4621 +
4622 + vendorSha256 = "sha256-7zlt5305P3KzGrs4wUyAU1+FpoBMyl+yjkLSzqUybxg=";
4623 +
4624 + # What follows is only to update go-redis,
4625 + # and thus also using a patched srht-keys.
4626 + # go.{mod,sum} could be patched directly but that would be less resilient
4627 + # to changes from upstream, and thus harder to maintain the patching
4628 + # while it hasn't been merged upstream.
4629 +
4630 + overrideModAttrs = old: {
4631 + preBuild = ''
4632 + go get github.com/go-redis/redis/v8
4633 + go get github.com/go-redis/redis@none
4634 + go mod tidy
4635 + '';
4636 + # Pass updated go.{mod,sum} from go-modules to worker's vendor/go.{mod,sum}
4637 + postInstall = ''
4638 + cp --reflink=auto go.* $out/
4639 + '';
4640 + };
4641 +
4642 + patches = [
4643 + # Update go-redis to support Unix sockets
4644 + patches/redis-socket/build/v3-0001-worker-update-go-redis-to-support-Unix-sockets.patch
4645 + ];
4646 + patchFlags = ["-p2"];
4647 + postConfigure = ''
4648 + cp -v vendor/go.{mod,sum} .
4649 + '';
4650 + };
4651 +in
4652 +buildPythonPackage rec {
4653 + inherit src version;
4654 + pname = "buildsrht";
4655 +
4656 nativeBuildInputs = srht.nativeBuildInputs;
4657
4658 propagatedBuildInputs = [
4659 @@ -53,13 +81,17 @@ buildPythonPackage rec {
4660
4661 cp -r images $out/lib
4662 cp contrib/submit_image_build $out/bin/builds.sr.ht
4663 - cp ${buildWorker "${src}/worker"}/bin/worker $out/bin/builds.sr.ht-worker
4664 + cp ${worker}/bin/worker $out/bin/builds.sr.ht-worker
4665 '';
4666
4667 + pythonImportsCheck = [ "buildsrht" ];
4668 +
4669 + passthru = { inherit worker; };
4670 +
4671 meta = with lib; {
4672 homepage = "https://git.sr.ht/~sircmpwn/builds.sr.ht";
4673 description = "Continuous integration service for the sr.ht network";
4674 - license = licenses.agpl3;
4675 + license = licenses.agpl3Only;
4676 maintainers = with maintainers; [ eadwu ];
4677 };
4678 }
4679 diff --git a/pkgs/applications/version-management/sourcehut/core.nix b/pkgs/applications/version-management/sourcehut/core.nix
4680 index 7c3a516ed9d..48f0591dae2 100644
4681 --- a/pkgs/applications/version-management/sourcehut/core.nix
4682 +++ b/pkgs/applications/version-management/sourcehut/core.nix
4683 @@ -1,6 +1,7 @@
4684 { lib
4685 , fetchgit
4686 , fetchNodeModules
4687 +, buildGoModule
4688 , buildPythonPackage
4689 , pgpy
4690 , flask
4691 @@ -25,17 +26,16 @@
4692 , sassc
4693 , nodejs
4694 , redis
4695 -, writeText
4696 }:
4697
4698 buildPythonPackage rec {
4699 pname = "srht";
4700 - version = "0.67.4";
4701 + version = "0.68.6";
4702
4703 src = fetchgit {
4704 url = "https://git.sr.ht/~sircmpwn/core.sr.ht";
4705 rev = version;
4706 - sha256 = "sha256-XvzFfcBK5Mq8p7xEBAF/eupUE1kkUBh5k+ByM/WA9bc=";
4707 + sha256 = "sha256-AKbpHCUdPGiwC278Sjuzi83uaEgSOKpOo+7as3dFsKo=";
4708 fetchSubmodules = true;
4709 };
4710
4711 @@ -46,9 +46,33 @@ buildPythonPackage rec {
4712 };
4713
4714 patches = [
4715 - ./disable-npm-install.patch
4716 + # Disable check for npm
4717 + patches/disable-npm-install.patch
4718 + # Add Unix socket support for redis-host=
4719 + patches/redis-socket/core/v3-0001-add-Unix-socket-support-for-redis-host.patch
4720 ];
4721
4722 + passthru = {
4723 + core-go = buildGoModule rec {
4724 + pname = "core-go";
4725 + version = "31e77bac08eedc3d9bf64274b341466f66acf548";
4726 + src = fetchgit {
4727 + url = "https://git.sr.ht/~sircmpwn/core-go";
4728 + rev = version;
4729 + sha256 = "sha256-nC/IBsd0lv9uQX6fFnMHLkXAefRItW9jbimL97ICUPc=";
4730 + fetchSubmodules = true;
4731 + };
4732 +
4733 + vendorSha256 = "sha256-6ibD74VeIfH2g+aqohdDWXkhLFG3QC+CsVTyLGgr/xg=";
4734 +
4735 + patches = [
4736 + # Replace x/crypto package by ProtonMail/go-crypto to support ed25519 OpenPGP keys
4737 + patches/openpgp-ed25519/core-go/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch
4738 + ];
4739 + patchFlags = ["-p1"];
4740 + };
4741 + };
4742 +
4743 nativeBuildInputs = [
4744 sassc
4745 nodejs
4746 @@ -87,6 +111,7 @@ buildPythonPackage rec {
4747 '';
4748
4749 dontUseSetuptoolsCheck = true;
4750 + pythonImportsCheck = [ "srht" ];
4751
4752 meta = with lib; {
4753 homepage = "https://git.sr.ht/~sircmpwn/srht";
4754 diff --git a/pkgs/applications/version-management/sourcehut/default.nix b/pkgs/applications/version-management/sourcehut/default.nix
4755 index 401a1437b7d..e269cbf4346 100644
4756 --- a/pkgs/applications/version-management/sourcehut/default.nix
4757 +++ b/pkgs/applications/version-management/sourcehut/default.nix
4758 @@ -13,6 +13,7 @@ let
4759 python = python3.override {
4760 packageOverrides = self: super: {
4761 srht = self.callPackage ./core.nix { inherit fetchNodeModules; };
4762 + core-go = self.srht.core-go;
4763
4764 buildsrht = self.callPackage ./builds.nix { };
4765 dispatchsrht = self.callPackage ./dispatch.nix { };
4766 @@ -22,16 +23,19 @@ let
4767 listssrht = self.callPackage ./lists.nix { };
4768 mansrht = self.callPackage ./man.nix { };
4769 metasrht = self.callPackage ./meta.nix { };
4770 + pagessrht = self.callPackage ./pages.nix { };
4771 pastesrht = self.callPackage ./paste.nix { };
4772 todosrht = self.callPackage ./todo.nix { };
4773
4774 scmsrht = self.callPackage ./scm.nix { };
4775 + srht-keys = self.scmsrht.srht-keys;
4776 };
4777 };
4778 in
4779 with python.pkgs; recurseIntoAttrs {
4780 inherit python;
4781 coresrht = toPythonApplication srht;
4782 + core-go = srht.core-go;
4783 buildsrht = toPythonApplication buildsrht;
4784 dispatchsrht = toPythonApplication dispatchsrht;
4785 gitsrht = toPythonApplication gitsrht;
4786 @@ -40,6 +44,8 @@ with python.pkgs; recurseIntoAttrs {
4787 listssrht = toPythonApplication listssrht;
4788 mansrht = toPythonApplication mansrht;
4789 metasrht = toPythonApplication metasrht;
4790 + pagessrht = pagessrht;
4791 pastesrht = toPythonApplication pastesrht;
4792 todosrht = toPythonApplication todosrht;
4793 + srht-keys = scmsrht.srht-keys;
4794 }
4795 diff --git a/pkgs/applications/version-management/sourcehut/dispatch.nix b/pkgs/applications/version-management/sourcehut/dispatch.nix
4796 index 637c6f9c1df..32516b437ec 100644
4797 --- a/pkgs/applications/version-management/sourcehut/dispatch.nix
4798 +++ b/pkgs/applications/version-management/sourcehut/dispatch.nix
4799 @@ -9,13 +9,13 @@
4800
4801 buildPythonPackage rec {
4802 pname = "dispatchsrht";
4803 - version = "0.15.8";
4804 + version = "0.15.33";
4805
4806 src = fetchFromSourcehut {
4807 owner = "~sircmpwn";
4808 repo = "dispatch.sr.ht";
4809 rev = version;
4810 - sha256 = "sha256-zWCGPjIgMKHXHJUs9aciV7IFgo0rpahon6KXHDwcfss=";
4811 + sha256 = "sha256-xNYJ5zFlMB9CgW6H9bmjhRfhpty44A90gDrjgV6wFl4=";
4812 };
4813
4814 nativeBuildInputs = srht.nativeBuildInputs;
4815 @@ -31,10 +31,12 @@ buildPythonPackage rec {
4816 export SRHT_PATH=${srht}/${python.sitePackages}/srht
4817 '';
4818
4819 + pythonImportsCheck = [ "dispatchsrht" ];
4820 +
4821 meta = with lib; {
4822 homepage = "https://dispatch.sr.ht/~sircmpwn/dispatch.sr.ht";
4823 description = "Task dispatcher and service integration tool for the sr.ht network";
4824 - license = licenses.agpl3;
4825 + license = licenses.agpl3Only;
4826 maintainers = with maintainers; [ eadwu ];
4827 };
4828 }
4829 diff --git a/pkgs/applications/version-management/sourcehut/git.nix b/pkgs/applications/version-management/sourcehut/git.nix
4830 index e44fb9cd6c6..05fbdfb6098 100644
4831 --- a/pkgs/applications/version-management/sourcehut/git.nix
4832 +++ b/pkgs/applications/version-management/sourcehut/git.nix
4833 @@ -6,42 +6,109 @@
4834 , srht
4835 , pygit2
4836 , scmsrht
4837 +, srht-keys
4838 }:
4839 let
4840 - version = "0.72.8";
4841 + version = "0.75.1";
4842
4843 src = fetchFromSourcehut {
4844 owner = "~sircmpwn";
4845 repo = "git.sr.ht";
4846 rev = version;
4847 - sha256 = "sha256-AB2uzajO5PtcpJfbOOTfuDFM6is5K39v3AZJ1hShRNc=";
4848 + sha256 = "sha256-yYknyhmKCz/Glf/pcNnGTzLNvOha+x/68/YgnMIm9Uk=";
4849 };
4850
4851 - buildShell = src: buildGoModule {
4852 + gitsrht-shell = buildGoModule {
4853 inherit src version;
4854 + sourceRoot = "source/gitsrht-shell";
4855 pname = "gitsrht-shell";
4856 vendorSha256 = "sha256-aqUFICp0C2reqb2p6JCPAUIRsxzSv0t9BHoNWrTYfqk=";
4857 };
4858
4859 - buildDispatcher = src: buildGoModule {
4860 + gitsrht-dispatch = buildGoModule {
4861 inherit src version;
4862 - pname = "gitsrht-dispatcher";
4863 + sourceRoot = "source/gitsrht-dispatch";
4864 + pname = "gitsrht-dispatch";
4865 vendorSha256 = "sha256-qWXPHo86s6iuRBhRMtmD5jxnAWKdrWHtA/iSUkdw89M=";
4866 + patches = [
4867 + # Add support for supplementary groups
4868 + patches/redis-socket/git/v3-0003-gitsrht-dispatch-add-support-for-supplementary-gr.patch
4869 + ];
4870 + patchFlags = ["-p2"];
4871 };
4872
4873 - buildKeys = src: buildGoModule {
4874 + gitsrht-keys = buildGoModule {
4875 inherit src version;
4876 + sourceRoot = "source/gitsrht-keys";
4877 pname = "gitsrht-keys";
4878 - vendorSha256 = "1d94cqy7x0q0agwg515xxsbl70b3qrzxbzsyjhn1pbyj532brn7f";
4879 + vendorSha256 = "sha256-SOI7wimFthY+BwsDtMuyqKS1hCaEa3R90Q0qaA9boyE=";
4880 +
4881 + # What follows is only to update go-redis,
4882 + # and thus also using a patched srht-keys.
4883 + # go.{mod,sum} could be patched directly but that would be less resilient
4884 + # to changes from upstream, and thus harder to maintain the patching
4885 + # while it hasn't been merged upstream.
4886 +
4887 + overrideModAttrs = _: {
4888 + preBuild = ''
4889 + # This is a fixed-output derivation so it is not allowed to reference other derivations,
4890 + # but here srht-keys will be copied to vendor/ by go mod vendor
4891 + ln -s ${srht-keys} srht-keys
4892 + go mod edit -replace git.sr.ht/~sircmpwn/scm.sr.ht/srht-keys=$PWD/srht-keys
4893 + go get github.com/go-redis/redis/v8
4894 + go get github.com/go-redis/redis@none
4895 + go mod tidy
4896 + '';
4897 + # Pass updated go.{mod,sum} from go-modules to gitsrht-keys' vendor/go.{mod,sum}
4898 + postInstall = ''
4899 + cp --reflink=auto go.* $out/
4900 + '';
4901 + };
4902 +
4903 + patches = [
4904 + # Update go-redis to support Unix sockets
4905 + patches/redis-socket/git/v3-0001-gitsrht-keys-update-go-redis-to-support-Unix-sock.patch
4906 + ];
4907 + patchFlags = ["-p2"];
4908 + postConfigure = ''
4909 + cp -v vendor/go.{mod,sum} .
4910 + '';
4911 };
4912
4913 - buildUpdateHook = src: buildGoModule {
4914 + gitsrht-update-hook = buildGoModule {
4915 inherit src version;
4916 + sourceRoot = "source/gitsrht-update-hook";
4917 pname = "gitsrht-update-hook";
4918 - vendorSha256 = "0fwzqpjv8x5y3w3bfjd0x0cvqjjak23m0zj88hf32jpw49xmjkih";
4919 - };
4920 + vendorSha256 = "sha256-L/tGwbBSwhtGhHcinCK/0lsp1ffXjiHXCmGgsY9s2Nc=";
4921
4922 - updateHook = buildUpdateHook "${src}/gitsrht-update-hook";
4923 + # What follows is only to update go-redis
4924 + # and thus also using a patched srht-keys.
4925 +
4926 + overrideModAttrs = old: {
4927 + preBuild = ''
4928 + # This is a fixed-output derivation so it is not allowed to reference other derivations,
4929 + # but here srht-keys will be copied to vendor/ by go mod vendor
4930 + ln -s ${srht-keys} srht-keys
4931 + go mod edit -replace git.sr.ht/~sircmpwn/scm.sr.ht/srht-keys=$PWD/srht-keys
4932 + go get github.com/go-redis/redis/v8
4933 + go get github.com/go-redis/redis@none
4934 + go mod tidy
4935 + '';
4936 + # Pass updated go.{mod,sum} from go-modules to gitsrht-keys' vendor/go.{mod,sum}
4937 + postInstall = ''
4938 + cp --reflink=auto go.* $out/
4939 + '';
4940 + };
4941 +
4942 + patches = [
4943 + # Update go-redis to support Unix sockets
4944 + patches/redis-socket/git/v3-0002-gitsrht-update-hook-update-go-redis-to-support-Un.patch
4945 + ];
4946 + patchFlags = ["-p2"];
4947 + postConfigure = ''
4948 + cp -v vendor/go.{mod,sum} .
4949 + '';
4950 + };
4951
4952 in
4953 buildPythonPackage rec {
4954 @@ -63,19 +130,21 @@ buildPythonPackage rec {
4955
4956 postInstall = ''
4957 mkdir -p $out/bin
4958 - cp ${buildShell "${src}/gitsrht-shell"}/bin/gitsrht-shell $out/bin/gitsrht-shell
4959 - cp ${buildDispatcher "${src}/gitsrht-dispatch"}/bin/gitsrht-dispatch $out/bin/gitsrht-dispatch
4960 - cp ${buildKeys "${src}/gitsrht-keys"}/bin/gitsrht-keys $out/bin/gitsrht-keys
4961 - cp ${updateHook}/bin/gitsrht-update-hook $out/bin/gitsrht-update-hook
4962 + cp ${gitsrht-shell}/bin/gitsrht-shell $out/bin/gitsrht-shell
4963 + cp ${gitsrht-dispatch}/bin/gitsrht-dispatch $out/bin/gitsrht-dispatch
4964 + cp ${gitsrht-keys}/bin/gitsrht-keys $out/bin/gitsrht-keys
4965 + cp ${gitsrht-update-hook}/bin/gitsrht-update-hook $out/bin/gitsrht-update-hook
4966 '';
4967 passthru = {
4968 - inherit updateHook;
4969 + inherit gitsrht-shell gitsrht-dispatch gitsrht-keys gitsrht-update-hook;
4970 };
4971
4972 + pythonImportsCheck = [ "gitsrht" ];
4973 +
4974 meta = with lib; {
4975 homepage = "https://git.sr.ht/~sircmpwn/git.sr.ht";
4976 description = "Git repository hosting service for the sr.ht network";
4977 - license = licenses.agpl3;
4978 + license = licenses.agpl3Only;
4979 maintainers = with maintainers; [ eadwu ];
4980 };
4981 }
4982 diff --git a/pkgs/applications/version-management/sourcehut/hg.nix b/pkgs/applications/version-management/sourcehut/hg.nix
4983 index cddb76cabf2..fe325760885 100644
4984 --- a/pkgs/applications/version-management/sourcehut/hg.nix
4985 +++ b/pkgs/applications/version-management/sourcehut/hg.nix
4986 @@ -10,12 +10,12 @@
4987
4988 buildPythonPackage rec {
4989 pname = "hgsrht";
4990 - version = "0.27.4";
4991 + version = "0.29.1";
4992
4993 src = fetchhg {
4994 url = "https://hg.sr.ht/~sircmpwn/hg.sr.ht";
4995 rev = version;
4996 - sha256 = "1c0qfi0gmbfngvds6917fy9ii2iglawn429757rh7b4bvzn7n6mr";
4997 + sha256 = "WgL4PDyUz+yfB4cAjBK2JcFfh5CbAW83c0zdHIvwLIA=";
4998 };
4999
5000 nativeBuildInputs = srht.nativeBuildInputs;
5001 @@ -32,10 +32,12 @@ buildPythonPackage rec {
5002 export SRHT_PATH=${srht}/${python.sitePackages}/srht
5003 '';
5004
5005 + pythonImportsCheck = [ "hgsrht" ];
5006 +
5007 meta = with lib; {
5008 homepage = "https://git.sr.ht/~sircmpwn/hg.sr.ht";
5009 description = "Mercurial repository hosting service for the sr.ht network";
5010 - license = licenses.agpl3;
5011 + license = licenses.agpl3Only;
5012 maintainers = with maintainers; [ eadwu ];
5013 };
5014 }
5015 diff --git a/pkgs/applications/version-management/sourcehut/hub.nix b/pkgs/applications/version-management/sourcehut/hub.nix
5016 index 17cb3fe4b61..3447531bb25 100644
5017 --- a/pkgs/applications/version-management/sourcehut/hub.nix
5018 +++ b/pkgs/applications/version-management/sourcehut/hub.nix
5019 @@ -6,13 +6,13 @@
5020
5021 buildPythonPackage rec {
5022 pname = "hubsrht";
5023 - version = "0.13.1";
5024 + version = "0.14.1";
5025
5026 src = fetchFromSourcehut {
5027 owner = "~sircmpwn";
5028 repo = "hub.sr.ht";
5029 rev = version;
5030 - sha256 = "sha256-Kqzy4mh5Nn1emzHBco/LVuXro/tW3NX+OYqdEwBSQ/U=";
5031 + sha256 = "sha256-IWaNsmHreLIklDrdtWv3JQJA+0p0rCT10cjevG05We4=";
5032 };
5033
5034 nativeBuildInputs = srht.nativeBuildInputs;
5035 @@ -26,11 +26,12 @@ buildPythonPackage rec {
5036 '';
5037
5038 dontUseSetuptoolsCheck = true;
5039 + pythonImportsCheck = [ "hubsrht" ];
5040
5041 meta = with lib; {
5042 homepage = "https://git.sr.ht/~sircmpwn/hub.sr.ht";
5043 description = "Project hub service for the sr.ht network";
5044 - license = licenses.agpl3;
5045 + license = licenses.agpl3Only;
5046 maintainers = with maintainers; [ eadwu ];
5047 };
5048 }
5049 diff --git a/pkgs/applications/version-management/sourcehut/lists.nix b/pkgs/applications/version-management/sourcehut/lists.nix
5050 index b419b49f7b5..2dcea79b83a 100644
5051 --- a/pkgs/applications/version-management/sourcehut/lists.nix
5052 +++ b/pkgs/applications/version-management/sourcehut/lists.nix
5053 @@ -12,13 +12,13 @@
5054
5055 buildPythonPackage rec {
5056 pname = "listssrht";
5057 - version = "0.48.19";
5058 + version = "0.50.5";
5059
5060 src = fetchFromSourcehut {
5061 owner = "~sircmpwn";
5062 repo = "lists.sr.ht";
5063 rev = version;
5064 - sha256 = "sha256-bsakEMyvWaxiE4/SGcAP4mlGG9jkdHfFxpt9H+TJn/8=";
5065 + sha256 = "sha256-6jFG2D7lIPHoenW9Nhj/24mlszO3i0xVpj6jFDTKOVg=";
5066 };
5067
5068 nativeBuildInputs = srht.nativeBuildInputs;
5069 @@ -37,10 +37,12 @@ buildPythonPackage rec {
5070 export SRHT_PATH=${srht}/${python.sitePackages}/srht
5071 '';
5072
5073 + pythonImportsCheck = [ "listssrht" ];
5074 +
5075 meta = with lib; {
5076 homepage = "https://git.sr.ht/~sircmpwn/lists.sr.ht";
5077 description = "Mailing list service for the sr.ht network";
5078 - license = licenses.agpl3;
5079 + license = licenses.agpl3Only;
5080 maintainers = with maintainers; [ eadwu ];
5081 };
5082 }
5083 diff --git a/pkgs/applications/version-management/sourcehut/man.nix b/pkgs/applications/version-management/sourcehut/man.nix
5084 index bd331f000a7..2d4d152e3aa 100644
5085 --- a/pkgs/applications/version-management/sourcehut/man.nix
5086 +++ b/pkgs/applications/version-management/sourcehut/man.nix
5087 @@ -8,13 +8,13 @@
5088
5089 buildPythonPackage rec {
5090 pname = "mansrht";
5091 - version = "0.15.12";
5092 + version = "0.15.22";
5093
5094 src = fetchFromSourcehut {
5095 owner = "~sircmpwn";
5096 repo = "man.sr.ht";
5097 rev = version;
5098 - sha256 = "sha256-MqH/8K9XRvEg6P7GHE6XXtWnhDP3wT8iGoNaFtYQbio=";
5099 + sha256 = "sha256-curouf+eNCKprDI23blGs4AzJMry6zlCLDt/+0j5c8A=";
5100 };
5101
5102 nativeBuildInputs = srht.nativeBuildInputs;
5103 @@ -29,10 +29,12 @@ buildPythonPackage rec {
5104 export SRHT_PATH=${srht}/${python.sitePackages}/srht
5105 '';
5106
5107 + pythonImportsCheck = [ "mansrht" ];
5108 +
5109 meta = with lib; {
5110 homepage = "https://git.sr.ht/~sircmpwn/man.sr.ht";
5111 description = "Wiki service for the sr.ht network";
5112 - license = licenses.agpl3;
5113 + license = licenses.agpl3Only;
5114 maintainers = with maintainers; [ eadwu ];
5115 };
5116 }
5117 diff --git a/pkgs/applications/version-management/sourcehut/meta.nix b/pkgs/applications/version-management/sourcehut/meta.nix
5118 index 86d293973d7..243a3ffcbbc 100644
5119 --- a/pkgs/applications/version-management/sourcehut/meta.nix
5120 +++ b/pkgs/applications/version-management/sourcehut/meta.nix
5121 @@ -16,21 +16,45 @@
5122 , weasyprint
5123 , prometheus-client
5124 , python
5125 +, core-go
5126 }:
5127 let
5128 - version = "0.53.14";
5129 + version = "0.56.24";
5130
5131 src = fetchFromSourcehut {
5132 owner = "~sircmpwn";
5133 repo = "meta.sr.ht";
5134 rev = version;
5135 - sha256 = "sha256-/+r/XLDkcSTW647xPMh5bcJmR2xZNNH74AJ5jemna2k=";
5136 + sha256 = "sha256-ANRE63IR/Qv1dEX+5qR4pr1Af85KyV6h8oLXP266Q/Y=";
5137 };
5138
5139 - buildApi = src: buildGoModule {
5140 + metasrht-api = buildGoModule {
5141 inherit src version;
5142 + sourceRoot = "source/api";
5143 pname = "metasrht-api";
5144 - vendorSha256 = "sha256-eZyDrr2VcNMxI++18qUy7LA1Q1YDlWCoRtl00L8lfR4=";
5145 + vendorSha256 = "sha256-LnqH8dwVt8+yabjn0WLGhI3Iz+tV1/8aA1HcXXnupmM=";
5146 + overrideModAttrs = _: {
5147 + preBuild = ''
5148 + # This is a fixed-output derivation so it is not allowed to reference other derivations,
5149 + # but here core-go will be copied to vendor/ by go mod vendor
5150 + ln -s ${core-go} core-go
5151 + go mod edit -replace git.sr.ht/~sircmpwn/scm.sr.ht/core-go=$PWD/core-go
5152 + go mod tidy
5153 + '';
5154 + # Pass updated go.{mod,sum} from go-modules to gitsrht-keys' vendor/go.{mod,sum}
5155 + postInstall = ''
5156 + cp --reflink=auto go.* $out/
5157 + '';
5158 + };
5159 +
5160 + patches = [
5161 + # Replace x/crypto package by ProtonMail/go-crypto to support ed25519 OpenPGP keys
5162 + patches/openpgp-ed25519/meta.sr.ht/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch
5163 + ];
5164 + patchFlags = ["-p2"];
5165 + postConfigure = ''
5166 + cp -v vendor/go.{mod,sum} .
5167 + '';
5168 };
5169
5170 in
5171 @@ -63,13 +87,18 @@ buildPythonPackage rec {
5172
5173 postInstall = ''
5174 mkdir -p $out/bin
5175 - cp ${buildApi "${src}/api/"}/bin/api $out/bin/metasrht-api
5176 + cp ${metasrht-api}/bin/api $out/bin/metasrht-api
5177 '';
5178 + passthru = {
5179 + inherit metasrht-api;
5180 + };
5181 +
5182 + pythonImportsCheck = [ "metasrht" ];
5183
5184 meta = with lib; {
5185 homepage = "https://git.sr.ht/~sircmpwn/meta.sr.ht";
5186 description = "Account management service for the sr.ht network";
5187 - license = licenses.agpl3;
5188 + license = licenses.agpl3Only;
5189 maintainers = with maintainers; [ eadwu ];
5190 };
5191 }
5192 diff --git a/pkgs/applications/version-management/sourcehut/pages.nix b/pkgs/applications/version-management/sourcehut/pages.nix
5193 new file mode 100644
5194 index 00000000000..c49e49c2664
5195 --- /dev/null
5196 +++ b/pkgs/applications/version-management/sourcehut/pages.nix
5197 @@ -0,0 +1,30 @@
5198 +{ lib
5199 +, fetchFromSourcehut
5200 +, buildGoModule
5201 +}:
5202 +
5203 +buildGoModule rec {
5204 + pname = "pagessrht";
5205 + version = "0.5.1";
5206 +
5207 + src = fetchFromSourcehut {
5208 + owner = "~sircmpwn";
5209 + repo = "pages.sr.ht";
5210 + rev = version;
5211 + sha256 = "sha256-Cab8zx+9WHHAB1rBoyZACq7lx9JdRBGzI1H+Yu9qHfs=";
5212 + };
5213 +
5214 + vendorSha256 = "sha256-udr+1y5ApQCSPhs3yQTTi9QfzRbz0A9COYuFMjQGa74=";
5215 +
5216 + postInstall = ''
5217 + mkdir -p $out/share/sql/
5218 + cp -r -t $out/share/sql/ schema.sql migrations
5219 + '';
5220 +
5221 + meta = with lib; {
5222 + homepage = "https://git.sr.ht/~sircmpwn/pages.sr.ht";
5223 + description = "Web hosting service for the sr.ht network";
5224 + license = licenses.agpl3Only;
5225 + maintainers = with maintainers; [ eadwu ];
5226 + };
5227 +}
5228 diff --git a/pkgs/applications/version-management/sourcehut/paste.nix b/pkgs/applications/version-management/sourcehut/paste.nix
5229 index 0d8c9135493..c411f8e8c95 100644
5230 --- a/pkgs/applications/version-management/sourcehut/paste.nix
5231 +++ b/pkgs/applications/version-management/sourcehut/paste.nix
5232 @@ -8,13 +8,13 @@
5233
5234 buildPythonPackage rec {
5235 pname = "pastesrht";
5236 - version = "0.12.1";
5237 + version = "0.13.6";
5238
5239 src = fetchFromSourcehut {
5240 owner = "~sircmpwn";
5241 repo = "paste.sr.ht";
5242 rev = version;
5243 - sha256 = "sha256-QQhd2LeH9BLmlHilhsv+9fZ+RPNmEMSmOpFA3dsMBFc=";
5244 + sha256 = "sha256-Khcqk86iD9nxiKXN3+8mSLNoDau2qXNFOrLdkVu+rH8=";
5245 };
5246
5247 nativeBuildInputs = srht.nativeBuildInputs;
5248 @@ -29,10 +29,12 @@ buildPythonPackage rec {
5249 export SRHT_PATH=${srht}/${python.sitePackages}/srht
5250 '';
5251
5252 + pythonImportsCheck = [ "pastesrht" ];
5253 +
5254 meta = with lib; {
5255 homepage = "https://git.sr.ht/~sircmpwn/paste.sr.ht";
5256 description = "Ad-hoc text file hosting service for the sr.ht network";
5257 - license = licenses.agpl3;
5258 + license = licenses.agpl3Only;
5259 maintainers = with maintainers; [ eadwu ];
5260 };
5261 }
5262 diff --git a/pkgs/applications/version-management/sourcehut/disable-npm-install.patch b/pkgs/applications/version-management/sourcehut/patches/disable-npm-install.patch
5263 similarity index 100%
5264 rename from pkgs/applications/version-management/sourcehut/disable-npm-install.patch
5265 rename to pkgs/applications/version-management/sourcehut/patches/disable-npm-install.patch
5266 diff --git a/pkgs/applications/version-management/sourcehut/patches/openpgp-ed25519/core-go/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch b/pkgs/applications/version-management/sourcehut/patches/openpgp-ed25519/core-go/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch
5267 new file mode 100644
5268 index 00000000000..bb4deb35a26
5269 --- /dev/null
5270 +++ b/pkgs/applications/version-management/sourcehut/patches/openpgp-ed25519/core-go/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch
5271 @@ -0,0 +1,953 @@
5272 +From cadb1eab7bd39aa47e5e6e3bd7a70fc582793a7d Mon Sep 17 00:00:00 2001
5273 +From: Julien Moutinho <julm+srht@sourcephile.fr>
5274 +Date: Sat, 4 Dec 2021 13:37:47 +0100
5275 +Subject: [PATCH core-go] Replace x/crypto package by ProtonMail/go-crypto to
5276 + support ed25519 OpenPGP keys
5277 +
5278 +---
5279 + email/worker.go | 2 +-
5280 + go.mod | 21 +-
5281 + go.sum | 642 +++++-------------------------------------------
5282 + 3 files changed, 68 insertions(+), 597 deletions(-)
5283 +
5284 +diff --git a/email/worker.go b/email/worker.go
5285 +index 437864f..57f0b33 100644
5286 +--- a/email/worker.go
5287 ++++ b/email/worker.go
5288 +@@ -16,7 +16,7 @@ import (
5289 + _ "github.com/emersion/go-message/charset"
5290 + "github.com/emersion/go-message/mail"
5291 + "github.com/emersion/go-pgpmail"
5292 +- "golang.org/x/crypto/openpgp"
5293 ++ "github.com/ProtonMail/go-crypto/openpgp"
5294 +
5295 + "git.sr.ht/~sircmpwn/core-go/config"
5296 + )
5297 +diff --git a/go.mod b/go.mod
5298 +index c94fcd4..b542689 100644
5299 +--- a/go.mod
5300 ++++ b/go.mod
5301 +@@ -6,31 +6,28 @@ require (
5302 + git.sr.ht/~sircmpwn/dowork v0.0.0-20210820133136-d3970e97def3
5303 + git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3
5304 + git.sr.ht/~sircmpwn/go-bare v0.0.0-20210227202403-5dae5c48f917
5305 +- github.com/99designs/gqlgen v0.13.0
5306 ++ github.com/99designs/gqlgen v0.14.0
5307 + github.com/DATA-DOG/go-sqlmock v1.5.0
5308 + github.com/Masterminds/squirrel v1.4.0
5309 +- github.com/emersion/go-message v0.13.1-0.20201112194930-f77964fe28bd
5310 +- github.com/emersion/go-pgpmail v0.1.0
5311 ++ github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3
5312 ++ github.com/emersion/go-message v0.15.0
5313 ++ github.com/emersion/go-pgpmail v0.2.0
5314 + github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21
5315 + github.com/emersion/go-smtp v0.15.1-0.20211103212524-30169acc42e7
5316 +- github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 // indirect
5317 + github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001
5318 + github.com/go-chi/chi v4.1.2+incompatible
5319 +- github.com/go-kit/kit v0.10.0 // indirect
5320 +- github.com/go-redis/redis/v8 v8.2.3
5321 +- github.com/golang/protobuf v1.5.2 // indirect
5322 ++ github.com/go-redis/redis/v8 v8.11.4
5323 + github.com/google/uuid v1.0.0
5324 ++ github.com/hashicorp/golang-lru v0.5.1 // indirect
5325 + github.com/kavu/go_reuseport v1.5.0
5326 + github.com/lib/pq v1.8.0
5327 +- github.com/martinlindhe/base36 v1.1.0
5328 +- github.com/prometheus/client_golang v1.11.0
5329 +- github.com/prometheus/common v0.30.0 // indirect
5330 ++ github.com/mitchellh/mapstructure v1.1.2 // indirect
5331 ++ github.com/prometheus/client_golang v1.7.1
5332 + github.com/prometheus/procfs v0.7.3 // indirect
5333 + github.com/stretchr/testify v1.6.1
5334 + github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec
5335 + github.com/vektah/gqlparser v1.3.1
5336 +- github.com/vektah/gqlparser/v2 v2.1.0
5337 +- golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de
5338 ++ github.com/vektah/gqlparser/v2 v2.2.0
5339 + golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 // indirect
5340 + google.golang.org/protobuf v1.27.1 // indirect
5341 + )
5342 +diff --git a/go.sum b/go.sum
5343 +index b2481e7..ca76d28 100644
5344 +--- a/go.sum
5345 ++++ b/go.sum
5346 +@@ -1,297 +1,114 @@
5347 +-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
5348 +-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
5349 +-cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
5350 +-cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
5351 +-cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
5352 +-cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
5353 +-cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
5354 +-cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
5355 +-cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
5356 +-cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
5357 +-cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
5358 +-cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
5359 +-cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
5360 +-cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
5361 +-cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
5362 +-cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
5363 +-cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
5364 +-cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
5365 +-cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
5366 +-cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
5367 +-cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
5368 +-cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
5369 +-cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
5370 +-cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
5371 +-cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
5372 +-cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
5373 +-cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
5374 +-cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
5375 +-cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
5376 +-cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
5377 +-cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
5378 +-cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
5379 +-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
5380 +-git.sr.ht/~sircmpwn/dowork v0.0.0-20201002192337-cc78e95c493c h1:DHYVIt2TT6Nx+CK78om/isyzUp8ZCcGAs8lofsR8EAA=
5381 +-git.sr.ht/~sircmpwn/dowork v0.0.0-20201002192337-cc78e95c493c/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
5382 +-git.sr.ht/~sircmpwn/dowork v0.0.0-20201006201820-f2599e406ecb h1:2Yodrugga89JpSewI+TOj4zUOeujnDdpIAvC91qIpys=
5383 +-git.sr.ht/~sircmpwn/dowork v0.0.0-20201006201820-f2599e406ecb/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
5384 +-git.sr.ht/~sircmpwn/dowork v0.0.0-20201009194917-181b76f9491b h1:7tYMLNLFAjN3R+Q2mRGjQ4TDbYHUdoMmqlTB9++gTB0=
5385 +-git.sr.ht/~sircmpwn/dowork v0.0.0-20201009194917-181b76f9491b/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
5386 +-git.sr.ht/~sircmpwn/dowork v0.0.0-20201009195117-58f54dd4c3e8 h1:MSiW/2sDb2KjidhG/orqaQZfu0bpQcKr9Sbu8aRqS9o=
5387 +-git.sr.ht/~sircmpwn/dowork v0.0.0-20201009195117-58f54dd4c3e8/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
5388 +-git.sr.ht/~sircmpwn/dowork v0.0.0-20201013160733-35ca012e4dc8 h1:ltrdYYclC4wQEg3QdcG2hgYAFCk+6/l2vU1OXygKXVA=
5389 +-git.sr.ht/~sircmpwn/dowork v0.0.0-20201013160733-35ca012e4dc8/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
5390 + git.sr.ht/~sircmpwn/dowork v0.0.0-20210820133136-d3970e97def3 h1:9WCv5cK67s2SiY/R4DWT/OchEsFnfYDz3lbevKxZ4QI=
5391 + git.sr.ht/~sircmpwn/dowork v0.0.0-20210820133136-d3970e97def3/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
5392 +-git.sr.ht/~sircmpwn/dowork v0.0.0-20210820135308-520d48c60a15 h1:6iFAymJT/Ozo0ReU2Bjz1ZA/jmUm+1H/mk7G6TUg6qQ=
5393 +-git.sr.ht/~sircmpwn/dowork v0.0.0-20210820135308-520d48c60a15/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
5394 + git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3 h1:4wDp4BKF7NQqoh73VXpZsB/t1OEhDpz/zEpmdQfbjDk=
5395 + git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw=
5396 +-git.sr.ht/~sircmpwn/go-bare v0.0.0-20200812160916-d2c72e1a5018 h1:89QMorzx6ML69PKPoayL3HuSfb7WqAlxD1dZ7DyzD0k=
5397 +-git.sr.ht/~sircmpwn/go-bare v0.0.0-20200812160916-d2c72e1a5018/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA=
5398 + git.sr.ht/~sircmpwn/go-bare v0.0.0-20210227202403-5dae5c48f917 h1:/pfEvB399XDXksu4vyjfNTytWn/nbbKiNhvjtpgc4pY=
5399 + git.sr.ht/~sircmpwn/go-bare v0.0.0-20210227202403-5dae5c48f917/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA=
5400 +-github.com/99designs/gqlgen v0.13.0 h1:haLTcUp3Vwp80xMVEg5KRNwzfUrgFdRmtBY8fuB8scA=
5401 +-github.com/99designs/gqlgen v0.13.0/go.mod h1:NV130r6f4tpRWuAI+zsrSdooO/eWUv+Gyyoi3rEfXIk=
5402 ++github.com/99designs/gqlgen v0.14.0 h1:Wg8aNYQUjMR/4v+W3xD+7SizOy6lSvVeQ06AobNQAXI=
5403 ++github.com/99designs/gqlgen v0.14.0/go.mod h1:S7z4boV+Nx4VvzMUpVrY/YuHjFX4n7rDyuTqvAkuoRE=
5404 + github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
5405 +-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
5406 + github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
5407 + github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
5408 +-github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
5409 + github.com/Masterminds/squirrel v1.4.0 h1:he5i/EXixZxrBUWcxzDYMiju9WZ3ld/l7QBNuo/eN3w=
5410 + github.com/Masterminds/squirrel v1.4.0/go.mod h1:yaPeOnPG5ZRwL9oKdTsO/prlkPbXWZlRVMQ/gGlzIuA=
5411 +-github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
5412 +-github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
5413 +-github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
5414 +-github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
5415 ++github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3 h1:XcF0cTDJeiuZ5NU8w7WUDge0HRwwNRmxj/GGk6KSA6g=
5416 ++github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo=
5417 + github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
5418 +-github.com/agnivade/levenshtein v1.0.3 h1:M5ZnqLOoZR8ygVq0FfkXsNOKzMCk0xRiow0R5+5VkQ0=
5419 +-github.com/agnivade/levenshtein v1.0.3/go.mod h1:4SFRZbbXWLF4MU1T9Qg0pGgH3Pjs+t6ie5efyrwRJXs=
5420 ++github.com/agnivade/levenshtein v1.1.0 h1:n6qGwyHG61v3ABce1rPVZklEYRT8NFpCMrpZdBUbYGM=
5421 ++github.com/agnivade/levenshtein v1.1.0/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo=
5422 + github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
5423 + github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
5424 + github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
5425 + github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
5426 +-github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
5427 ++github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
5428 + github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
5429 +-github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
5430 +-github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
5431 ++github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
5432 + github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
5433 +-github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
5434 +-github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
5435 +-github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
5436 +-github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
5437 +-github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
5438 +-github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
5439 +-github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
5440 + github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
5441 + github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
5442 + github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
5443 + github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
5444 +-github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
5445 +-github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
5446 +-github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
5447 +-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
5448 +-github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
5449 + github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
5450 +-github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
5451 +-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
5452 +-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
5453 +-github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
5454 +-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
5455 +-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
5456 +-github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
5457 +-github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
5458 +-github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
5459 +-github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
5460 +-github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
5461 ++github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
5462 ++github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
5463 + github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
5464 +-github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
5465 + github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5466 + github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5467 + github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5468 +-github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
5469 + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
5470 + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
5471 +-github.com/dgryski/trifles v0.0.0-20190318185328-a8d75aae118c/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
5472 +-github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
5473 +-github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
5474 +-github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
5475 +-github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
5476 +-github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
5477 +-github.com/emersion/go-message v0.11.1/go.mod h1:C4jnca5HOTo4bGN9YdqNQM9sITuT3Y0K6bSUw9RklvY=
5478 +-github.com/emersion/go-message v0.12.0 h1:mZnv35eZ6lB6EftTQBgYXspOH0FQdhpFhSUhA9i6/Zg=
5479 +-github.com/emersion/go-message v0.12.0/go.mod h1:C4jnca5HOTo4bGN9YdqNQM9sITuT3Y0K6bSUw9RklvY=
5480 +-github.com/emersion/go-message v0.12.1-0.20200903165315-e1abe21f389a h1:3C6qIGgPr1qAT0ikRD5NbyKpME/iHCDeXhpv/JJsFsE=
5481 +-github.com/emersion/go-message v0.12.1-0.20200903165315-e1abe21f389a/go.mod h1:kYIioST9GDHte9/BRWgi93rpqbDuFftMjKSMaXS8ABo=
5482 +-github.com/emersion/go-message v0.13.1-0.20201112194930-f77964fe28bd h1:6CXxdoOzAyQForkd2U/JNceVyNpmg92alCU2R+4dwIY=
5483 +-github.com/emersion/go-message v0.13.1-0.20201112194930-f77964fe28bd/go.mod h1:SXSs/8KamlsyxjpHL1Q3yf5Jrv7QG5icuvPK1SMcnzw=
5484 +-github.com/emersion/go-pgpmail v0.1.0 h1:+NuU9UtGnmmKvmI8evxmTAPXfUod6Gbf2uYT7rxTZ7w=
5485 +-github.com/emersion/go-pgpmail v0.1.0/go.mod h1:9Sy6uI+dlTN56tcWMtBQHqNDeea27xYItaiZ/3XC76g=
5486 ++github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g=
5487 ++github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
5488 ++github.com/emersion/go-message v0.15.0 h1:urgKGqt2JAc9NFJcgncQcohHdiYb803YTH9OQwHBHIY=
5489 ++github.com/emersion/go-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4=
5490 ++github.com/emersion/go-pgpmail v0.2.0 h1:BU9kEGQcDVXi6n0v3JBsWAikyo63xsUGZ1lnVaWa6ks=
5491 ++github.com/emersion/go-pgpmail v0.2.0/go.mod h1:8mQ8Rpn+w28DDaiP8HvJuZjSAymaWr87K3zA/bwwkU0=
5492 + github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 h1:OJyUGMJTzHTd1XQp98QTaHernxMYzRaOasRir9hUlFQ=
5493 + github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ=
5494 +-github.com/emersion/go-smtp v0.14.0 h1:RYW203p+EcPjL8Z/ZpT9lZ6iOc8MG1MQzEx1UKEkXlA=
5495 +-github.com/emersion/go-smtp v0.14.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ=
5496 +-github.com/emersion/go-smtp v0.15.0 h1:3+hMGMGrqP/lqd7qoxZc1hTU8LY8gHV9RFGWlqSDmP8=
5497 +-github.com/emersion/go-smtp v0.15.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ=
5498 + github.com/emersion/go-smtp v0.15.1-0.20211103212524-30169acc42e7 h1:y2h9HJElyAP5kgYujXAJC1DvlcTgCUhtYr/BlXnlGfs=
5499 + github.com/emersion/go-smtp v0.15.1-0.20211103212524-30169acc42e7/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ=
5500 +-github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe h1:40SWqY0zE3qCi6ZrtTf5OUdNm5lDnGnjRSq9GgmeTrg=
5501 +-github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
5502 + github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 h1:IbFBtwoTQyw0fIM5xv1HF+Y+3ZijDR839WMulgxCcUY=
5503 + github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
5504 +-github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
5505 +-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
5506 +-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
5507 +-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
5508 +-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
5509 +-github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
5510 + github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001 h1:/UMxx5lGDg30aioUL9e7xJnbJfJeX7vhcm57fa5udaI=
5511 + github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001/go.mod h1:2H9hjfbpSMHwY503FclkV/lZTBh2YlOmLLSda12uL8c=
5512 +-github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
5513 +-github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
5514 + github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
5515 ++github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
5516 + github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
5517 +-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
5518 +-github.com/go-chi/chi v3.3.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
5519 + github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec=
5520 + github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
5521 +-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
5522 +-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
5523 +-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
5524 + github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
5525 + github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
5526 +-github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
5527 +-github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
5528 + github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
5529 + github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
5530 +-github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
5531 +-github.com/go-redis/redis/v8 v8.2.3 h1:eNesND+DWt/sjQOtPFxAbQkTIXaXX00qNLxjVWkZ70k=
5532 +-github.com/go-redis/redis/v8 v8.2.3/go.mod h1:ysgGY09J/QeDYbu3HikWEIPCwaeOkuNoTgKayTEaEOw=
5533 +-github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
5534 ++github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg=
5535 ++github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w=
5536 + github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
5537 +-github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
5538 +-github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
5539 ++github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
5540 + github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
5541 +-github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
5542 +-github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
5543 +-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
5544 +-github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
5545 +-github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
5546 +-github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
5547 +-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
5548 +-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
5549 +-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
5550 +-github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
5551 +-github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
5552 +-github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
5553 +-github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
5554 +-github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
5555 ++github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
5556 + github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
5557 + github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
5558 + github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
5559 +-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
5560 +-github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
5561 +-github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
5562 + github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
5563 + github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
5564 + github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
5565 + github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
5566 + github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
5567 +-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
5568 +-github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
5569 + github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
5570 +-github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
5571 + github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
5572 + github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
5573 + github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
5574 +-github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
5575 +-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
5576 +-github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
5577 +-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
5578 + github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
5579 + github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
5580 + github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
5581 +-github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
5582 +-github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
5583 +-github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
5584 + github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
5585 + github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
5586 ++github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
5587 ++github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
5588 + github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
5589 +-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
5590 +-github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
5591 +-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
5592 +-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
5593 +-github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
5594 +-github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
5595 +-github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
5596 +-github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
5597 +-github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
5598 +-github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
5599 + github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA=
5600 + github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
5601 +-github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
5602 +-github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
5603 +-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5604 + github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
5605 +-github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
5606 + github.com/gorilla/mux v1.6.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
5607 +-github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
5608 +-github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
5609 +-github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
5610 + github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
5611 + github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
5612 +-github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
5613 +-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
5614 +-github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
5615 +-github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
5616 +-github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
5617 +-github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
5618 +-github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
5619 +-github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
5620 +-github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
5621 +-github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
5622 +-github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
5623 +-github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
5624 +-github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
5625 +-github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
5626 +-github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
5627 +-github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
5628 +-github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
5629 +-github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
5630 + github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
5631 + github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
5632 + github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
5633 +-github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
5634 +-github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
5635 +-github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
5636 +-github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
5637 + github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
5638 +-github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
5639 +-github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
5640 +-github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
5641 +-github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
5642 +-github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
5643 +-github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
5644 +-github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
5645 + github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
5646 +-github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
5647 +-github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
5648 + github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
5649 +-github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
5650 +-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
5651 +-github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
5652 +-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
5653 + github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
5654 +-github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
5655 + github.com/kavu/go_reuseport v1.5.0 h1:UNuiY2OblcqAtVDE8Gsg1kZz8zbBWg907sP1ceBV+bk=
5656 + github.com/kavu/go_reuseport v1.5.0/go.mod h1:CG8Ee7ceMFSMnx/xr25Vm0qXaj2Z4i5PWoUx+JZ5/CU=
5657 +-github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
5658 ++github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
5659 + github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
5660 + github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
5661 +-github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
5662 + github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
5663 ++github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
5664 + github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
5665 + github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
5666 ++github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
5667 + github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
5668 + github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw=
5669 + github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o=
5670 +@@ -299,31 +116,13 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhR
5671 + github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw=
5672 + github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg=
5673 + github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
5674 +-github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
5675 +-github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
5676 + github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
5677 +-github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
5678 +-github.com/martinlindhe/base36 v1.0.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
5679 +-github.com/martinlindhe/base36 v1.1.0 h1:cIwvvwYse/0+1CkUPYH5ZvVIYG3JrILmQEIbLuar02Y=
5680 +-github.com/martinlindhe/base36 v1.1.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
5681 + github.com/matryer/moq v0.0.0-20200106131100-75d0ddfc0007/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ=
5682 +-github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
5683 + github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
5684 +-github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
5685 +-github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
5686 + github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
5687 + github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
5688 +-github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
5689 + github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
5690 + github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
5691 +-github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
5692 +-github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
5693 +-github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
5694 +-github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
5695 +-github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
5696 +-github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
5697 +-github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
5698 +-github.com/mitchellh/mapstructure v0.0.0-20180203102830-a4e142e9c047 h1:zCoDWFD5nrJJVjbXiDZcVhOBSzKn3o9LgRLLMRNuru8=
5699 + github.com/mitchellh/mapstructure v0.0.0-20180203102830-a4e142e9c047/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
5700 + github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
5701 + github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
5702 +@@ -332,487 +131,162 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
5703 + github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
5704 + github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
5705 + github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
5706 +-github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
5707 +-github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
5708 +-github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
5709 +-github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
5710 +-github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
5711 +-github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
5712 +-github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
5713 +-github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
5714 + github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
5715 +-github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
5716 +-github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
5717 +-github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
5718 ++github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
5719 ++github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
5720 + github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
5721 +-github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
5722 + github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
5723 +-github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
5724 +-github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
5725 ++github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
5726 ++github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
5727 + github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
5728 + github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
5729 +-github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
5730 +-github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
5731 +-github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
5732 ++github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c=
5733 ++github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
5734 + github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
5735 + github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
5736 +-github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
5737 +-github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
5738 +-github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
5739 +-github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
5740 +-github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
5741 +-github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
5742 +-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
5743 +-github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
5744 +-github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
5745 +-github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
5746 +-github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
5747 + github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
5748 + github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
5749 +-github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
5750 +-github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
5751 + github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
5752 + github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
5753 +-github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
5754 + github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
5755 +-github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
5756 + github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
5757 +-github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
5758 + github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA=
5759 + github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
5760 +-github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ=
5761 +-github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
5762 + github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
5763 +-github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
5764 + github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
5765 +-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
5766 +-github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
5767 + github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
5768 + github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
5769 +-github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
5770 + github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
5771 +-github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
5772 + github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc=
5773 + github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
5774 +-github.com/prometheus/common v0.14.0 h1:RHRyE8UocrbjU+6UvRzwi6HjiDfxrrBU91TtbKzkGp4=
5775 +-github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
5776 +-github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
5777 +-github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug=
5778 +-github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
5779 + github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
5780 +-github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
5781 + github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
5782 +-github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
5783 +-github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
5784 + github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
5785 +-github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4=
5786 +-github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
5787 +-github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
5788 + github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
5789 + github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
5790 +-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
5791 +-github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
5792 +-github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
5793 + github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
5794 + github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
5795 +-github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
5796 +-github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
5797 +-github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
5798 + github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
5799 ++github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
5800 + github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
5801 + github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
5802 + github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
5803 + github.com/shurcooL/vfsgen v0.0.0-20180121065927-ffb13db8def0/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
5804 + github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
5805 + github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
5806 +-github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
5807 +-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
5808 +-github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
5809 +-github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
5810 +-github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
5811 +-github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
5812 +-github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
5813 +-github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
5814 +-github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
5815 +-github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
5816 + github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
5817 + github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
5818 + github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
5819 + github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
5820 + github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
5821 + github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
5822 ++github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
5823 + github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
5824 + github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
5825 +-github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
5826 +-github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
5827 +-github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
5828 + github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
5829 + github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec h1:DGmKwyZwEB8dI7tbLt/I/gQuP559o/0FrAkHKlQM/Ks=
5830 + github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec/go.mod h1:owBmyHYMLkxyrugmfwE/DLJyW8Ro9mkphwuVErQ0iUw=
5831 + github.com/vektah/dataloaden v0.2.1-0.20190515034641-a19b9a6e7c9e/go.mod h1:/HUdMve7rvxZma+2ZELQeNh88+003LL7Pf/CZ089j8U=
5832 + github.com/vektah/gqlparser v1.3.1 h1:8b0IcD3qZKWJQHSzynbDlrtP3IxVydZ2DZepCGofqfU=
5833 + github.com/vektah/gqlparser v1.3.1/go.mod h1:bkVf0FX+Stjg/MHnm8mEyubuaArhNEqfQhF+OTiAL74=
5834 +-github.com/vektah/gqlparser/v2 v2.1.0 h1:uiKJ+T5HMGGQM2kRKQ8Pxw8+Zq9qhhZhz/lieYvCMns=
5835 +-github.com/vektah/gqlparser/v2 v2.1.0/go.mod h1:SyUiHgLATUR8BiYURfTirrTcGpcE+4XkV2se04Px1Ms=
5836 +-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
5837 +-github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
5838 ++github.com/vektah/gqlparser/v2 v2.2.0 h1:bAc3slekAAJW6sZTi07aGq0OrfaCjj4jxARAaC7g2EM=
5839 ++github.com/vektah/gqlparser/v2 v2.2.0/go.mod h1:i3mQIGIrbK2PD1RrCeMTlVbkF2FJ6WkU1KJlJlC+3F4=
5840 + github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
5841 +-github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
5842 +-go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
5843 +-go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
5844 +-go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
5845 +-go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
5846 +-go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
5847 +-go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
5848 +-go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
5849 +-go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
5850 +-go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
5851 +-go.opentelemetry.io/otel v0.11.0 h1:IN2tzQa9Gc4ZVKnTaMbPVcHjvzOdg5n9QfnmlqiET7E=
5852 +-go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0=
5853 +-go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
5854 +-go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
5855 +-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
5856 +-go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
5857 +-go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
5858 +-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
5859 +-go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
5860 ++github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
5861 + golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
5862 +-golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
5863 + golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
5864 +-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
5865 +-golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
5866 +-golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
5867 + golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
5868 +-golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
5869 + golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
5870 +-golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
5871 +-golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
5872 +-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
5873 +-golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
5874 +-golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
5875 +-golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
5876 +-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
5877 +-golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
5878 +-golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
5879 +-golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
5880 +-golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
5881 +-golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
5882 +-golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
5883 +-golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
5884 +-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
5885 +-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
5886 +-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
5887 +-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
5888 +-golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
5889 +-golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
5890 +-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
5891 +-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
5892 +-golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
5893 +-golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
5894 +-golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
5895 +-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
5896 +-golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
5897 +-golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
5898 +-golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
5899 +-golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
5900 ++golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
5901 ++golang.org/x/crypto v0.0.0-20211202192323-5770296d904e h1:MUP6MR3rJ7Gk9LEia0LP2ytiH6MuCfs7qYz+47jGdD8=
5902 ++golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
5903 + golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
5904 + golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
5905 +-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
5906 +-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
5907 + golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
5908 +-golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
5909 + golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
5910 +-golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
5911 +-golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
5912 +-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
5913 +-golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
5914 +-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
5915 + golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
5916 + golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
5917 +-golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
5918 +-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
5919 +-golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
5920 + golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
5921 + golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
5922 +-golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
5923 +-golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
5924 +-golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
5925 +-golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
5926 +-golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
5927 +-golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
5928 +-golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
5929 + golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
5930 +-golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
5931 +-golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
5932 +-golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
5933 +-golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
5934 +-golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
5935 + golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
5936 +-golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
5937 +-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
5938 +-golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
5939 +-golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
5940 +-golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
5941 +-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
5942 +-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
5943 +-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
5944 +-golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
5945 +-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
5946 +-golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
5947 ++golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
5948 ++golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
5949 ++golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
5950 ++golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
5951 ++golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
5952 + golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
5953 + golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
5954 + golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
5955 +-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
5956 + golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
5957 + golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
5958 +-golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
5959 +-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
5960 ++golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
5961 + golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
5962 +-golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5963 +-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5964 + golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5965 + golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5966 +-golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5967 +-golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5968 + golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5969 +-golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5970 + golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5971 + golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5972 +-golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5973 + golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5974 + golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5975 +-golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5976 +-golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5977 +-golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5978 +-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5979 +-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5980 +-golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5981 + golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5982 +-golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5983 + golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5984 + golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5985 +-golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5986 +-golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5987 +-golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5988 + golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5989 +-golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5990 + golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5991 +-golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5992 +-golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5993 +-golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5994 +-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5995 +-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5996 + golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5997 +-golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5998 +-golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5999 +-golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6000 +-golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6001 +-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6002 +-golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6003 +-golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80=
6004 + golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6005 +-golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6006 +-golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6007 +-golang.org/x/sys v0.0.0-20201007082116-8445cc04cbdf h1:AvBTl0xbF/KtHyvm61X4gSPF7/dKJ/xQqJwKr1Qu9no=
6008 +-golang.org/x/sys v0.0.0-20201007082116-8445cc04cbdf/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6009 +-golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM=
6010 +-golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6011 +-golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb h1:HS9IzC4UFbpMBLQUDSQcU+ViVT1vdFCQVjdPVpTlZrs=
6012 +-golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6013 ++golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6014 + golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6015 ++golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6016 + golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6017 + golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6018 +-golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
6019 ++golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
6020 + golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 h1:rw6UNGRMfarCepjI8qOepea/SXwIBVfTKjztZ5gBbq4=
6021 + golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
6022 + golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
6023 +-golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
6024 + golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
6025 +-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
6026 +-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
6027 + golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
6028 +-golang.org/x/text v0.3.4-0.20201021145329-22f1617af38e h1:0kyKOEC0chG7FKmnf/1uNwvDLc3NtNTRip2rXAN9nwI=
6029 +-golang.org/x/text v0.3.4-0.20201021145329-22f1617af38e/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
6030 +-golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
6031 + golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
6032 +-golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
6033 +-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
6034 +-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
6035 +-golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
6036 +-golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
6037 +-golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
6038 ++golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
6039 ++golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
6040 + golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
6041 +-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
6042 + golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
6043 +-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
6044 +-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
6045 +-golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
6046 +-golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
6047 +-golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
6048 +-golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
6049 +-golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
6050 + golang.org/x/tools v0.0.0-20190515012406-7d7faa4812bd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
6051 +-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
6052 +-golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
6053 +-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
6054 +-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
6055 +-golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
6056 +-golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
6057 +-golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
6058 +-golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
6059 +-golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
6060 +-golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
6061 +-golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
6062 + golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
6063 +-golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
6064 +-golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
6065 +-golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
6066 +-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
6067 +-golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
6068 +-golang.org/x/tools v0.0.0-20200114235610-7ae403b6b589/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
6069 +-golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
6070 +-golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
6071 +-golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
6072 +-golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
6073 +-golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
6074 +-golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
6075 +-golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
6076 +-golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
6077 +-golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
6078 +-golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
6079 +-golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
6080 +-golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
6081 +-golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
6082 +-golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
6083 +-golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
6084 +-golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
6085 +-golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
6086 +-golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
6087 ++golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
6088 ++golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
6089 ++golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
6090 + golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
6091 + golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
6092 + golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
6093 ++golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
6094 + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
6095 +-google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
6096 +-google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
6097 +-google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
6098 +-google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
6099 +-google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
6100 +-google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
6101 +-google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
6102 +-google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
6103 +-google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
6104 +-google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
6105 +-google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
6106 +-google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
6107 +-google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
6108 +-google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
6109 +-google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
6110 +-google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
6111 +-google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
6112 +-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
6113 +-google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
6114 +-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
6115 +-google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
6116 +-google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
6117 +-google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
6118 +-google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
6119 +-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
6120 +-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
6121 +-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
6122 +-google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
6123 +-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
6124 +-google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
6125 +-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
6126 +-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
6127 +-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
6128 +-google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
6129 +-google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
6130 +-google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
6131 +-google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
6132 +-google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
6133 +-google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
6134 +-google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
6135 +-google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
6136 +-google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
6137 +-google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
6138 +-google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
6139 +-google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
6140 +-google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
6141 +-google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
6142 +-google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
6143 +-google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
6144 +-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
6145 +-google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
6146 +-google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
6147 +-google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
6148 +-google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
6149 +-google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
6150 +-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
6151 +-google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
6152 +-google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
6153 +-google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
6154 +-google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
6155 +-google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
6156 +-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
6157 +-google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
6158 +-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
6159 +-google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
6160 +-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
6161 +-google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
6162 +-google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
6163 +-google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
6164 +-google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
6165 +-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
6166 + google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
6167 + google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
6168 + google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
6169 + google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
6170 + google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
6171 +-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
6172 +-google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
6173 + google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
6174 +-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
6175 +-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
6176 +-google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
6177 +-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
6178 + google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
6179 + google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
6180 + google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
6181 + google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
6182 + gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
6183 + gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
6184 +-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
6185 ++gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
6186 + gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
6187 +-gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
6188 +-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
6189 + gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
6190 +-gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
6191 +-gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk=
6192 +-gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
6193 +-gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
6194 ++gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
6195 + gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
6196 +-gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
6197 +-gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
6198 + gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
6199 + gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
6200 + gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
6201 + gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
6202 + gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
6203 ++gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
6204 + gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
6205 + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
6206 + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
6207 +-honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
6208 +-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
6209 +-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
6210 +-honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
6211 +-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
6212 +-honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
6213 +-honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
6214 +-honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
6215 +-rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
6216 +-rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
6217 +-rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
6218 +-sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
6219 +-sourcegraph.com/sourcegraph/appdash v0.0.0-20180110180208-2cc67fd64755/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
6220 + sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
6221 + sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67/go.mod h1:L5q+DGLGOQFpo1snNEkLOJT2d1YTW66rWNzatr3He1k=
6222 +--
6223 +2.33.1
6224 +
6225 diff --git a/pkgs/applications/version-management/sourcehut/patches/openpgp-ed25519/meta.sr.ht/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch b/pkgs/applications/version-management/sourcehut/patches/openpgp-ed25519/meta.sr.ht/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch
6226 new file mode 100644
6227 index 00000000000..43edb9ccfe6
6228 --- /dev/null
6229 +++ b/pkgs/applications/version-management/sourcehut/patches/openpgp-ed25519/meta.sr.ht/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch
6230 @@ -0,0 +1,526 @@
6231 +From 9d6325b1fc4b2cfda47421aa88f2e875ff413824 Mon Sep 17 00:00:00 2001
6232 +From: Julien Moutinho <julm+srht@sourcephile.fr>
6233 +Date: Sat, 4 Dec 2021 14:09:25 +0100
6234 +Subject: [PATCH meta.sr.ht] Replace x/crypto package by ProtonMail/go-crypto
6235 + to support ed25519 OpenPGP keys
6236 +
6237 +---
6238 + api/go.mod | 166 +++++++++++++++++++++++++++++++++-
6239 + api/go.sum | 65 ++++++++++++-
6240 + api/graph/schema.resolvers.go | 4 +-
6241 + 3 files changed, 228 insertions(+), 7 deletions(-)
6242 +
6243 +diff --git a/api/go.mod b/api/go.mod
6244 +index f3c8f2f..bddd9b7 100644
6245 +--- a/api/go.mod
6246 ++++ b/api/go.mod
6247 +@@ -3,18 +3,178 @@ module git.sr.ht/~sircmpwn/meta.sr.ht/api
6248 + go 1.14
6249 +
6250 + require (
6251 +- git.sr.ht/~sircmpwn/core-go v0.0.0-20211129095809-31e77bac08ee
6252 +- github.com/99designs/gqlgen v0.13.0
6253 ++ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 // indirect
6254 ++ git.sr.ht/~sircmpwn/go-bare v0.0.0-20210227202403-5dae5c48f917 // indirect
6255 ++ github.com/99designs/gqlgen v0.8.3
6256 ++ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 // indirect
6257 ++ github.com/DATA-DOG/go-sqlmock v1.5.0 // indirect
6258 + github.com/Masterminds/squirrel v1.4.0
6259 ++ github.com/VividCortex/gohistogram v1.0.0 // indirect
6260 ++ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 // indirect
6261 ++ github.com/agnivade/levenshtein v1.0.3 // indirect
6262 ++ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
6263 ++ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
6264 ++ github.com/apache/thrift v0.13.0 // indirect
6265 ++ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e // indirect
6266 ++ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect
6267 ++ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a // indirect
6268 ++ github.com/aws/aws-lambda-go v1.13.3 // indirect
6269 ++ github.com/aws/aws-sdk-go v1.27.0 // indirect
6270 ++ github.com/aws/aws-sdk-go-v2 v0.18.0 // indirect
6271 ++ github.com/beorn7/perks v1.0.1 // indirect
6272 ++ github.com/casbin/casbin/v2 v2.1.2 // indirect
6273 ++ github.com/cenkalti/backoff v2.2.1+incompatible // indirect
6274 ++ github.com/census-instrumentation/opencensus-proto v0.2.1 // indirect
6275 ++ github.com/cespare/xxhash/v2 v2.1.1 // indirect
6276 ++ github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec // indirect
6277 ++ github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa // indirect
6278 ++ github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd // indirect
6279 ++ github.com/coreos/go-semver v0.2.0 // indirect
6280 ++ github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7 // indirect
6281 ++ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf // indirect
6282 ++ github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
6283 ++ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
6284 ++ github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4 // indirect
6285 ++ github.com/edsrzf/mmap-go v1.0.0 // indirect
6286 + github.com/emersion/go-message v0.13.1-0.20201112194930-f77964fe28bd
6287 ++ github.com/emersion/go-smtp v0.15.1-0.20211103212524-30169acc42e7 // indirect
6288 ++ github.com/envoyproxy/go-control-plane v0.7.1 // indirect
6289 ++ github.com/envoyproxy/protoc-gen-validate v0.1.0 // indirect
6290 ++ github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001 // indirect
6291 ++ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db // indirect
6292 ++ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 // indirect
6293 ++ github.com/fsnotify/fsnotify v1.4.9 // indirect
6294 ++ github.com/go-chi/chi v4.1.2+incompatible // indirect
6295 ++ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 // indirect
6296 ++ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 // indirect
6297 ++ github.com/go-kit/kit v0.9.0 // indirect
6298 ++ github.com/go-kit/log v0.1.0 // indirect
6299 ++ github.com/gogo/googleapis v1.1.0 // indirect
6300 ++ github.com/gogo/protobuf v1.2.1 // indirect
6301 ++ github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
6302 ++ github.com/golang/protobuf v1.5.2 // indirect
6303 ++ github.com/google/btree v1.0.0 // indirect
6304 ++ github.com/google/martian v2.1.0+incompatible // indirect
6305 ++ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99 // indirect
6306 ++ github.com/google/renameio v0.1.0 // indirect
6307 + github.com/google/uuid v1.1.2
6308 ++ github.com/googleapis/gax-go/v2 v2.0.5 // indirect
6309 ++ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 // indirect
6310 ++ github.com/gorilla/mux v1.7.3 // indirect
6311 ++ github.com/gorilla/websocket v1.4.2 // indirect
6312 ++ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 // indirect
6313 ++ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
6314 ++ github.com/grpc-ecosystem/grpc-gateway v1.9.5 // indirect
6315 ++ github.com/hashicorp/consul/sdk v0.3.0 // indirect
6316 ++ github.com/hashicorp/go-immutable-radix v1.0.0 // indirect
6317 ++ github.com/hashicorp/go-msgpack v0.5.3 // indirect
6318 ++ github.com/hashicorp/go-rootcerts v1.0.0 // indirect
6319 ++ github.com/hashicorp/go-sockaddr v1.0.0 // indirect
6320 ++ github.com/hashicorp/go-syslog v1.0.0 // indirect
6321 ++ github.com/hashicorp/go-version v1.2.0 // indirect
6322 ++ github.com/hashicorp/go.net v0.0.1 // indirect
6323 + github.com/hashicorp/golang-lru v0.5.4 // indirect
6324 ++ github.com/hashicorp/logutils v1.0.0 // indirect
6325 ++ github.com/hashicorp/memberlist v0.1.0 // indirect
6326 ++ github.com/hashicorp/serf v0.8.1 // indirect
6327 ++ github.com/hudl/fargo v1.3.0 // indirect
6328 ++ github.com/inconshreveable/mousetrap v1.0.0 // indirect
6329 ++ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d // indirect
6330 ++ github.com/jonboulle/clockwork v0.1.0 // indirect
6331 ++ github.com/jpillora/backoff v1.0.0 // indirect
6332 ++ github.com/json-iterator/go v1.1.11 // indirect
6333 ++ github.com/jstemmer/go-junit-report v0.9.1 // indirect
6334 ++ github.com/jtolds/gls v4.20.0+incompatible // indirect
6335 ++ github.com/julienschmidt/httprouter v1.3.0 // indirect
6336 ++ github.com/kavu/go_reuseport v1.5.0 // indirect
6337 ++ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 // indirect
6338 + github.com/kr/text v0.2.0 // indirect
6339 + github.com/lib/pq v1.8.0
6340 ++ github.com/lightstep/lightstep-tracer-go v0.16.0 // indirect
6341 ++ github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381 // indirect
6342 ++ github.com/lyft/protoc-gen-validate v0.0.13 // indirect
6343 ++ github.com/matryer/moq v0.0.0-20200106131100-75d0ddfc0007 // indirect
6344 ++ github.com/mattn/go-colorable v0.1.4 // indirect
6345 ++ github.com/mattn/go-isatty v0.0.12 // indirect
6346 ++ github.com/mattn/go-runewidth v0.0.2 // indirect
6347 ++ github.com/miekg/dns v1.0.14 // indirect
6348 ++ github.com/mitchellh/cli v1.0.0 // indirect
6349 ++ github.com/mitchellh/gox v0.4.0 // indirect
6350 ++ github.com/mitchellh/iochan v1.0.0 // indirect
6351 + github.com/mitchellh/mapstructure v1.3.2 // indirect
6352 ++ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
6353 ++ github.com/modern-go/reflect2 v1.0.1 // indirect
6354 ++ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
6355 ++ github.com/nats-io/jwt v0.0.4 // indirect
6356 ++ github.com/nats-io/nats.go v1.7.2 // indirect
6357 ++ github.com/nats-io/nkeys v0.0.1 // indirect
6358 ++ github.com/nats-io/nuid v1.0.1 // indirect
6359 + github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354
6360 + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
6361 ++ github.com/oklog/oklog v0.3.2 // indirect
6362 ++ github.com/oklog/run v1.0.0 // indirect
6363 ++ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5 // indirect
6364 ++ github.com/onsi/ginkgo v1.12.1 // indirect
6365 ++ github.com/onsi/gomega v1.10.0 // indirect
6366 ++ github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 // indirect
6367 ++ github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 // indirect
6368 ++ github.com/opentracing/opentracing-go v1.1.0 // indirect
6369 ++ github.com/openzipkin-contrib/zipkin-go-opentracing v0.3.5 // indirect
6370 ++ github.com/openzipkin/zipkin-go v0.1.6 // indirect
6371 ++ github.com/pact-foundation/pact-go v1.0.4 // indirect
6372 ++ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c // indirect
6373 ++ github.com/pborman/uuid v1.2.0 // indirect
6374 ++ github.com/performancecopilot/speed v3.0.0+incompatible // indirect
6375 ++ github.com/pkg/errors v0.9.1 // indirect
6376 ++ github.com/pkg/profile v1.2.1 // indirect
6377 ++ github.com/prometheus/client_model v0.2.0 // indirect
6378 ++ github.com/prometheus/procfs v0.7.3 // indirect
6379 ++ github.com/rogpeppe/go-internal v1.3.0 // indirect
6380 ++ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f // indirect
6381 ++ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da // indirect
6382 ++ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect
6383 ++ github.com/sirupsen/logrus v1.6.0 // indirect
6384 ++ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d // indirect
6385 ++ github.com/smartystreets/goconvey v1.6.3 // indirect
6386 ++ github.com/soheilhy/cmux v0.1.4 // indirect
6387 ++ github.com/sony/gobreaker v0.4.1 // indirect
6388 ++ github.com/spf13/cobra v0.0.3 // indirect
6389 ++ github.com/spf13/pflag v1.0.1 // indirect
6390 ++ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271 // indirect
6391 ++ github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a // indirect
6392 ++ github.com/stretchr/objx v0.1.1 // indirect
6393 ++ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 // indirect
6394 ++ github.com/urfave/cli/v2 v2.1.1 // indirect
6395 ++ github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec // indirect
6396 ++ github.com/vektah/gqlparser v1.3.1 // indirect
6397 + github.com/vektah/gqlparser/v2 v2.1.0
6398 +- golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de
6399 ++ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect
6400 ++ github.com/yuin/goldmark v1.1.32 // indirect
6401 ++ go.etcd.io/bbolt v1.3.3 // indirect
6402 ++ go.opencensus.io v0.19.0 // indirect
6403 ++ go.opentelemetry.io/otel v0.11.0 // indirect
6404 ++ go.uber.org/atomic v1.4.0 // indirect
6405 ++ go.uber.org/multierr v1.2.0 // indirect
6406 ++ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee // indirect
6407 ++ go.uber.org/zap v1.11.0 // indirect
6408 ++ golang.org/x/image v0.0.0-20190802002840-cff245a6509b // indirect
6409 ++ golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 // indirect
6410 ++ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect
6411 ++ golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 // indirect
6412 ++ golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect
6413 ++ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
6414 ++ google.golang.org/api v0.1.0 // indirect
6415 ++ google.golang.org/appengine v1.6.0 // indirect
6416 ++ google.golang.org/grpc v1.19.1 // indirect
6417 ++ google.golang.org/protobuf v1.27.1 // indirect
6418 ++ gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect
6419 + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
6420 ++ gopkg.in/cheggaaa/pb.v1 v1.0.25 // indirect
6421 ++ gopkg.in/gcfg.v1 v1.2.3 // indirect
6422 ++ gopkg.in/warnings.v0 v0.1.2 // indirect
6423 ++ gopkg.in/yaml.v2 v2.4.0 // indirect
6424 ++ rsc.io/binaryregexp v0.2.0 // indirect
6425 ++ rsc.io/quote/v3 v3.1.0 // indirect
6426 ++ sigs.k8s.io/yaml v1.1.0 // indirect
6427 ++ sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 // indirect
6428 + )
6429 +diff --git a/api/go.sum b/api/go.sum
6430 +index 2197d0b..7e8385f 100644
6431 +--- a/api/go.sum
6432 ++++ b/api/go.sum
6433 +@@ -31,6 +31,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
6434 + cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
6435 + cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
6436 + dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
6437 ++git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
6438 ++git.apache.org/thrift.git v0.0.0-20181218151757-9b75e4fe745a/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
6439 + git.sr.ht/~sircmpwn/core-go v0.0.0-20211129095809-31e77bac08ee h1:2ufYP6n7WnHo/5e0v3LHBsbbf2hktgrecpH9VOpAjbQ=
6440 + git.sr.ht/~sircmpwn/core-go v0.0.0-20211129095809-31e77bac08ee/go.mod h1:Q2Ey8oZqoCnOsQ/SBpSeN+868Ji7iIwZ2Q3qxd61NRE=
6441 + git.sr.ht/~sircmpwn/dowork v0.0.0-20210820133136-d3970e97def3 h1:9WCv5cK67s2SiY/R4DWT/OchEsFnfYDz3lbevKxZ4QI=
6442 +@@ -39,6 +41,7 @@ git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3 h1:4wDp4BKF7NQqoh7
6443 + git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw=
6444 + git.sr.ht/~sircmpwn/go-bare v0.0.0-20210227202403-5dae5c48f917 h1:/pfEvB399XDXksu4vyjfNTytWn/nbbKiNhvjtpgc4pY=
6445 + git.sr.ht/~sircmpwn/go-bare v0.0.0-20210227202403-5dae5c48f917/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA=
6446 ++github.com/99designs/gqlgen v0.8.3/go.mod h1:aLyJw9xUgdJxZ8EqNQxo2pGFhXXJ/hq8t7J4yn8TgI4=
6447 + github.com/99designs/gqlgen v0.13.0 h1:haLTcUp3Vwp80xMVEg5KRNwzfUrgFdRmtBY8fuB8scA=
6448 + github.com/99designs/gqlgen v0.13.0/go.mod h1:NV130r6f4tpRWuAI+zsrSdooO/eWUv+Gyyoi3rEfXIk=
6449 + github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
6450 +@@ -48,6 +51,8 @@ github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q
6451 + github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
6452 + github.com/Masterminds/squirrel v1.4.0 h1:he5i/EXixZxrBUWcxzDYMiju9WZ3ld/l7QBNuo/eN3w=
6453 + github.com/Masterminds/squirrel v1.4.0/go.mod h1:yaPeOnPG5ZRwL9oKdTsO/prlkPbXWZlRVMQ/gGlzIuA=
6454 ++github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3 h1:XcF0cTDJeiuZ5NU8w7WUDge0HRwwNRmxj/GGk6KSA6g=
6455 ++github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo=
6456 + github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
6457 + github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
6458 + github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
6459 +@@ -123,6 +128,7 @@ github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe/go.mod h1:
6460 + github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 h1:IbFBtwoTQyw0fIM5xv1HF+Y+3ZijDR839WMulgxCcUY=
6461 + github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
6462 + github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
6463 ++github.com/envoyproxy/go-control-plane v0.7.1/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
6464 + github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
6465 + github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
6466 + github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
6467 +@@ -163,6 +169,7 @@ github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4er
6468 + github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
6469 + github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
6470 + github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
6471 ++github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
6472 + github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
6473 + github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
6474 + github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
6475 +@@ -223,10 +230,13 @@ github.com/gorilla/mux v1.6.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z
6476 + github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
6477 + github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
6478 + github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
6479 ++github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
6480 + github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
6481 + github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
6482 + github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
6483 + github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
6484 ++github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
6485 ++github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
6486 + github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
6487 + github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
6488 + github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
6489 +@@ -248,7 +258,9 @@ github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+l
6490 + github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
6491 + github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
6492 + github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
6493 ++github.com/hashicorp/memberlist v0.1.0/go.mod h1:ncdBp14cuox2iFOq3kDiquKU6fqsTBc3W6JvZwjxxsE=
6494 + github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
6495 ++github.com/hashicorp/serf v0.8.1/go.mod h1:h/Ru6tmZazX7WO/GDmwdpS975F019L4t5ng5IgwbNrE=
6496 + github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
6497 + github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
6498 + github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
6499 +@@ -287,6 +299,7 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6Fm
6500 + github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg=
6501 + github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
6502 + github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
6503 ++github.com/lightstep/lightstep-tracer-go v0.16.0/go.mod h1:6AMpwZpsyCFwSovxzM78e+AsYxE8sGwiM6C3TytaWeI=
6504 + github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
6505 + github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
6506 + github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
6507 +@@ -320,10 +333,13 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
6508 + github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
6509 + github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
6510 + github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
6511 ++github.com/nats-io/jwt v0.0.4/go.mod h1:Zz0yk+BmWnLzEXz85TpyVuPCIzHNNAaQVZ3EiSlfhcs=
6512 + github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
6513 + github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
6514 + github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
6515 ++github.com/nats-io/nats.go v1.7.2/go.mod h1:yo+8b7YsyprMCRao9okCBtz4Gfr9nSmu5vdOjuV27BE=
6516 + github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
6517 ++github.com/nats-io/nkeys v0.0.1/go.mod h1:/5AG7AMgoe6jJRxS8l8qz974c6zxp5ApcV7VkXwSciY=
6518 + github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
6519 + github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
6520 + github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
6521 +@@ -343,6 +359,7 @@ github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4=
6522 + github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
6523 + github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
6524 + github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
6525 ++github.com/onsi/gomega v1.10.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
6526 + github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
6527 + github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs=
6528 + github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
6529 +@@ -351,7 +368,10 @@ github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go
6530 + github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
6531 + github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
6532 + github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
6533 ++github.com/openzipkin-contrib/zipkin-go-opentracing v0.3.5/go.mod h1:uVHyebswE1cCXr2A73cRM2frx5ld1RJUCJkFNZ90ZiI=
6534 + github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
6535 ++github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
6536 ++github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
6537 + github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
6538 + github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
6539 + github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
6540 +@@ -368,7 +388,9 @@ github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6J
6541 + github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
6542 + github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
6543 + github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
6544 ++github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
6545 + github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
6546 ++github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
6547 + github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
6548 + github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
6549 + github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
6550 +@@ -382,6 +404,9 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
6551 + github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
6552 + github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
6553 + github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
6554 ++github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
6555 ++github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
6556 ++github.com/prometheus/common v0.0.0-20181218105931-67670fe90761/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
6557 + github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
6558 + github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
6559 + github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
6560 +@@ -389,7 +414,9 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8
6561 + github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
6562 + github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug=
6563 + github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
6564 ++github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
6565 + github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
6566 ++github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
6567 + github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
6568 + github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
6569 + github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
6570 +@@ -415,6 +442,7 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx
6571 + github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
6572 + github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
6573 + github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
6574 ++github.com/smartystreets/goconvey v1.6.3/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
6575 + github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
6576 + github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
6577 + github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
6578 +@@ -438,7 +466,9 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX
6579 + github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
6580 + github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec h1:DGmKwyZwEB8dI7tbLt/I/gQuP559o/0FrAkHKlQM/Ks=
6581 + github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec/go.mod h1:owBmyHYMLkxyrugmfwE/DLJyW8Ro9mkphwuVErQ0iUw=
6582 ++github.com/vektah/dataloaden v0.2.0/go.mod h1:vxM6NuRlgiR0M6wbVTJeKp9vQIs81ZMfCYO+4yq/jbE=
6583 + github.com/vektah/dataloaden v0.2.1-0.20190515034641-a19b9a6e7c9e/go.mod h1:/HUdMve7rvxZma+2ZELQeNh88+003LL7Pf/CZ089j8U=
6584 ++github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
6585 + github.com/vektah/gqlparser v1.3.1 h1:8b0IcD3qZKWJQHSzynbDlrtP3IxVydZ2DZepCGofqfU=
6586 + github.com/vektah/gqlparser v1.3.1/go.mod h1:bkVf0FX+Stjg/MHnm8mEyubuaArhNEqfQhF+OTiAL74=
6587 + github.com/vektah/gqlparser/v2 v2.1.0 h1:uiKJ+T5HMGGQM2kRKQ8Pxw8+Zq9qhhZhz/lieYvCMns=
6588 +@@ -449,6 +479,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
6589 + github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
6590 + go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
6591 + go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
6592 ++go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
6593 ++go.opencensus.io v0.19.0/go.mod h1:AYeH0+ZxYyghG8diqaaIq/9P3VgCCt5GF2ldCY4dkFg=
6594 + go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
6595 + go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
6596 + go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
6597 +@@ -459,11 +491,14 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
6598 + go.opentelemetry.io/otel v0.11.0 h1:IN2tzQa9Gc4ZVKnTaMbPVcHjvzOdg5n9QfnmlqiET7E=
6599 + go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0=
6600 + go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
6601 ++go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
6602 + go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
6603 + go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
6604 ++go.uber.org/multierr v1.2.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
6605 + go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
6606 + go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
6607 + go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
6608 ++go.uber.org/zap v1.11.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
6609 + go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
6610 + golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
6611 + golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
6612 +@@ -474,8 +509,10 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U
6613 + golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
6614 + golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
6615 + golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
6616 +-golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
6617 + golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
6618 ++golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
6619 ++golang.org/x/crypto v0.0.0-20211202192323-5770296d904e h1:MUP6MR3rJ7Gk9LEia0LP2ytiH6MuCfs7qYz+47jGdD8=
6620 ++golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
6621 + golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
6622 + golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
6623 + golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
6624 +@@ -488,7 +525,9 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH
6625 + golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
6626 + golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
6627 + golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
6628 ++golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
6629 + golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
6630 ++golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
6631 + golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
6632 + golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
6633 + golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
6634 +@@ -506,12 +545,15 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
6635 + golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
6636 + golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
6637 + golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
6638 ++golang.org/x/net v0.0.0-20180404174746-b3c676e531a6/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
6639 + golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
6640 + golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
6641 + golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
6642 + golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
6643 ++golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
6644 + golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
6645 + golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
6646 ++golang.org/x/net v0.0.0-20181217023233-e147a9138326/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
6647 + golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
6648 + golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
6649 + golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
6650 +@@ -541,9 +583,12 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/
6651 + golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
6652 + golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
6653 + golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
6654 +-golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo=
6655 ++golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
6656 + golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
6657 ++golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
6658 ++golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
6659 + golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
6660 ++golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
6661 + golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
6662 + golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
6663 + golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
6664 +@@ -566,6 +611,7 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h
6665 + golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
6666 + golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
6667 + golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
6668 ++golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
6669 + golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
6670 + golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
6671 + golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6672 +@@ -606,8 +652,10 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
6673 + golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6674 + golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6675 + golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
6676 ++golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
6677 + golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 h1:rw6UNGRMfarCepjI8qOepea/SXwIBVfTKjztZ5gBbq4=
6678 + golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
6679 ++golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
6680 + golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
6681 + golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
6682 + golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
6683 +@@ -624,6 +672,7 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb
6684 + golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
6685 + golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
6686 + golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
6687 ++golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
6688 + golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
6689 + golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
6690 + golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
6691 +@@ -675,6 +724,9 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T
6692 + golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
6693 + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
6694 + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
6695 ++google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
6696 ++google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
6697 ++google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
6698 + google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
6699 + google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
6700 + google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
6701 +@@ -694,12 +746,17 @@ google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSr
6702 + google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
6703 + google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
6704 + google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
6705 ++google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
6706 + google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
6707 + google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
6708 ++google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
6709 + google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
6710 + google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
6711 + google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
6712 + google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
6713 ++google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
6714 ++google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
6715 ++google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
6716 + google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
6717 + google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
6718 + google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
6719 +@@ -729,8 +786,11 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc
6720 + google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
6721 + google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
6722 + google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
6723 ++google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
6724 ++google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
6725 + google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
6726 + google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
6727 ++google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
6728 + google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
6729 + google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
6730 + google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
6731 +@@ -785,6 +845,7 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
6732 + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
6733 + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
6734 + honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
6735 ++honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
6736 + honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
6737 + honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
6738 + honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
6739 +diff --git a/api/graph/schema.resolvers.go b/api/graph/schema.resolvers.go
6740 +index b4b5e39..ba232bc 100644
6741 +--- a/api/graph/schema.resolvers.go
6742 ++++ b/api/graph/schema.resolvers.go
6743 +@@ -39,8 +39,8 @@ import (
6744 + "github.com/lib/pq"
6745 + zxcvbn "github.com/nbutton23/zxcvbn-go"
6746 + "golang.org/x/crypto/bcrypt"
6747 +- "golang.org/x/crypto/openpgp"
6748 +- "golang.org/x/crypto/openpgp/packet"
6749 ++ "github.com/ProtonMail/go-crypto/openpgp"
6750 ++ "github.com/ProtonMail/go-crypto/openpgp/packet"
6751 + "golang.org/x/crypto/ssh"
6752 + )
6753 +
6754 +--
6755 +2.33.1
6756 +
6757 diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/v3-0001-worker-update-go-redis-to-support-Unix-sockets.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/v3-0001-worker-update-go-redis-to-support-Unix-sockets.patch
6758 new file mode 100644
6759 index 00000000000..4efd12be875
6760 --- /dev/null
6761 +++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/v3-0001-worker-update-go-redis-to-support-Unix-sockets.patch
6762 @@ -0,0 +1,113 @@
6763 +From 5991960a5d412f0e1bdc505b970248c68b44a720 Mon Sep 17 00:00:00 2001
6764 +From: Julien Moutinho <julm+srht@sourcephile.fr>
6765 +Date: Wed, 15 Sep 2021 19:45:41 +0200
6766 +Subject: [PATCH builds.sr.ht v3 1/2] worker: update go-redis to support Unix
6767 + sockets
6768 +
6769 +---
6770 + worker/context.go | 4 ++--
6771 + worker/main.go | 11 +++++++----
6772 + worker/tasks.go | 10 +++++-----
6773 + 3 files changed, 14 insertions(+), 11 deletions(-)
6774 +
6775 +diff --git a/worker/context.go b/worker/context.go
6776 +index f84a60c..be54717 100644
6777 +--- a/worker/context.go
6778 ++++ b/worker/context.go
6779 +@@ -14,7 +14,7 @@ import (
6780 + "strings"
6781 + "time"
6782 +
6783 +- "github.com/go-redis/redis"
6784 ++ goredis "github.com/go-redis/redis/v8"
6785 + "github.com/google/shlex"
6786 + "github.com/pkg/errors"
6787 + "github.com/prometheus/client_golang/prometheus"
6788 +@@ -41,7 +41,7 @@ var (
6789 +
6790 + type WorkerContext struct {
6791 + Db *sql.DB
6792 +- Redis *redis.Client
6793 ++ Redis *goredis.Client
6794 + Conf func(section, key string) string
6795 + }
6796 +
6797 +diff --git a/worker/main.go b/worker/main.go
6798 +index 274ba68..e22ab6b 100644
6799 +--- a/worker/main.go
6800 ++++ b/worker/main.go
6801 +@@ -1,6 +1,7 @@
6802 + package main
6803 +
6804 + import (
6805 ++ "context"
6806 + "database/sql"
6807 + "flag"
6808 + "log"
6809 +@@ -9,7 +10,7 @@ import (
6810 + "runtime"
6811 + "sync"
6812 +
6813 +- "github.com/go-redis/redis"
6814 ++ goredis "github.com/go-redis/redis/v8"
6815 + "github.com/vaughan0/go-ini"
6816 + "git.sr.ht/~sircmpwn/core-go/crypto"
6817 +
6818 +@@ -26,6 +27,8 @@ var (
6819 + jobsMutex sync.Mutex
6820 + )
6821 +
6822 ++var redisctx = context.Background()
6823 ++
6824 + func main() {
6825 + flag.IntVar(&workers, "workers", runtime.NumCPU(),
6826 + "configure number of workers")
6827 +@@ -68,12 +71,12 @@ func main() {
6828 + if !ok {
6829 + redisHost = "redis://localhost:6379"
6830 + }
6831 +- ropts, err := redis.ParseURL(redisHost)
6832 ++ ropts, err := goredis.ParseURL(redisHost)
6833 + if err != nil {
6834 + panic(err)
6835 + }
6836 +- localRedis := redis.NewClient(ropts)
6837 +- if _, err := localRedis.Ping().Result(); err != nil {
6838 ++ localRedis := goredis.NewClient(ropts)
6839 ++ if _, err := localRedis.Ping(redisctx).Result(); err != nil {
6840 + panic(err)
6841 + }
6842 +
6843 +diff --git a/worker/tasks.go b/worker/tasks.go
6844 +index d27bf33..d0c28f1 100644
6845 +--- a/worker/tasks.go
6846 ++++ b/worker/tasks.go
6847 +@@ -19,7 +19,7 @@ import (
6848 + "time"
6849 +
6850 + "git.sr.ht/~sircmpwn/core-go/auth"
6851 +- "github.com/go-redis/redis"
6852 ++ goredis "github.com/go-redis/redis/v8"
6853 + "github.com/kr/pty"
6854 + "github.com/minio/minio-go/v6"
6855 + "github.com/pkg/errors"
6856 +@@ -39,12 +39,12 @@ var (
6857 + }, []string{"image", "arch"})
6858 + )
6859 +
6860 +-func (ctx *JobContext) Boot(r *redis.Client) func() {
6861 +- port, err := r.Incr("builds.sr.ht.ssh-port").Result()
6862 ++func (ctx *JobContext) Boot(r *goredis.Client) func() {
6863 ++ port, err := r.Incr(ctx.Context, "builds.sr.ht.ssh-port").Result()
6864 + if err == nil && port < 22000 {
6865 +- err = r.Set("builds.sr.ht.ssh-port", 22100, 0).Err()
6866 ++ err = r.Set(ctx.Context, "builds.sr.ht.ssh-port", 22100, 0).Err()
6867 + } else if err == nil && port >= 23000 {
6868 +- err = r.Set("builds.sr.ht.ssh-port", 22000, 0).Err()
6869 ++ err = r.Set(ctx.Context, "builds.sr.ht.ssh-port", 22000, 0).Err()
6870 + }
6871 + if err != nil {
6872 + panic(errors.Wrap(err, "assign port"))
6873 +--
6874 +2.32.0
6875 +
6876 diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/v3-0002-worker-update-go.-mod-sum-for-go-redis.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/v3-0002-worker-update-go.-mod-sum-for-go-redis.patch
6877 new file mode 100644
6878 index 00000000000..c9368d05c18
6879 --- /dev/null
6880 +++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/v3-0002-worker-update-go.-mod-sum-for-go-redis.patch
6881 @@ -0,0 +1,378 @@
6882 +From eac18e913e4ee48895b94acfa56cf1c6a3fb49fa Mon Sep 17 00:00:00 2001
6883 +From: Julien Moutinho <julm+srht@sourcephile.fr>
6884 +Date: Wed, 15 Sep 2021 20:11:49 +0200
6885 +Subject: [PATCH builds.sr.ht v3 2/2] worker: update go.{mod,sum} for go-redis
6886 +
6887 +---
6888 + worker/go.mod | 8 +------
6889 + worker/go.sum | 64 +++++++++++++++++++--------------------------------
6890 + 2 files changed, 25 insertions(+), 47 deletions(-)
6891 +
6892 +diff --git a/worker/go.mod b/worker/go.mod
6893 +index 6e9a11c..4893dfa 100644
6894 +--- a/worker/go.mod
6895 ++++ b/worker/go.mod
6896 +@@ -2,24 +2,18 @@ module git.sr.ht/~sircmpwn/builds.sr.ht/worker
6897 +
6898 + require (
6899 + git.sr.ht/~sircmpwn/core-go v0.0.0-20210108160653-070566136c1a
6900 +- github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df
6901 +- github.com/go-redis/redis v6.15.2+incompatible
6902 ++ github.com/go-redis/redis/v8 v8.2.3
6903 + github.com/gocelery/gocelery v0.0.0-20201111034804-825d89059344
6904 +- github.com/gomodule/redigo v2.0.0+incompatible // indirect
6905 + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
6906 +- github.com/jpillora/longestcommon v0.0.0-20161227235612-adb9d91ee629
6907 + github.com/kr/pty v1.1.3
6908 + github.com/lib/pq v1.8.0
6909 + github.com/martinlindhe/base36 v1.1.0
6910 +- github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
6911 + github.com/minio/minio-go/v6 v6.0.49
6912 + github.com/mitchellh/mapstructure v1.1.2
6913 + github.com/pkg/errors v0.9.1
6914 + github.com/prometheus/client_golang v1.7.1
6915 +- github.com/shicky/gocelery v0.0.0-20180807061531-b2f0dd7ec05b
6916 + github.com/streadway/amqp v1.0.0 // indirect
6917 + github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec
6918 +- golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb
6919 + gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
6920 + gopkg.in/mail.v2 v2.3.1
6921 + gopkg.in/yaml.v2 v2.3.0
6922 +diff --git a/worker/go.sum b/worker/go.sum
6923 +index 1cd3989..4a2d6d9 100644
6924 +--- a/worker/go.sum
6925 ++++ b/worker/go.sum
6926 +@@ -10,6 +10,7 @@ git.sr.ht/~sircmpwn/go-bare v0.0.0-20200812160916-d2c72e1a5018/go.mod h1:BVJwbDf
6927 + github.com/99designs/gqlgen v0.13.0 h1:haLTcUp3Vwp80xMVEg5KRNwzfUrgFdRmtBY8fuB8scA=
6928 + github.com/99designs/gqlgen v0.13.0/go.mod h1:NV130r6f4tpRWuAI+zsrSdooO/eWUv+Gyyoi3rEfXIk=
6929 + github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
6930 ++github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
6931 + github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
6932 + github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
6933 + github.com/Masterminds/squirrel v1.4.0 h1:he5i/EXixZxrBUWcxzDYMiju9WZ3ld/l7QBNuo/eN3w=
6934 +@@ -25,6 +26,7 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy
6935 + github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
6936 + github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
6937 + github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
6938 ++github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
6939 + github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
6940 + github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
6941 + github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
6942 +@@ -36,7 +38,6 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l
6943 + github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
6944 + github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
6945 + github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
6946 +-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
6947 + github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
6948 + github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
6949 + github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
6950 +@@ -58,8 +59,10 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma
6951 + github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
6952 + github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
6953 + github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6954 ++github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
6955 + github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6956 + github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
6957 ++github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
6958 + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
6959 + github.com/dgryski/trifles v0.0.0-20190318185328-a8d75aae118c/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
6960 + github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
6961 +@@ -84,22 +87,18 @@ github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001/go.mod h1:2H9hjfb
6962 + github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
6963 + github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
6964 + github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
6965 ++github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
6966 + github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
6967 + github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
6968 + github.com/go-chi/chi v3.3.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
6969 + github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
6970 +-github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df h1:Bao6dhmbTA1KFVxmJ6nBoMuOJit2yjEgLJpIMYpop0E=
6971 +-github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df/go.mod h1:GJr+FCSXshIwgHBtLglIg9M2l2kQSi6QjVAngtzI08Y=
6972 + github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
6973 + github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
6974 + github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
6975 + github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
6976 + github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
6977 + github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
6978 +-github.com/go-redis/redis v6.14.1+incompatible h1:kSJohAREGMr344uMa8PzuIg5OU6ylCbyDkWkkNOfEik=
6979 +-github.com/go-redis/redis v6.14.1+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
6980 +-github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4=
6981 +-github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
6982 ++github.com/go-redis/redis/v8 v8.2.3 h1:eNesND+DWt/sjQOtPFxAbQkTIXaXX00qNLxjVWkZ70k=
6983 + github.com/go-redis/redis/v8 v8.2.3/go.mod h1:ysgGY09J/QeDYbu3HikWEIPCwaeOkuNoTgKayTEaEOw=
6984 + github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
6985 + github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
6986 +@@ -114,7 +113,6 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU
6987 + github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
6988 + github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
6989 + github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
6990 +-github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
6991 + github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
6992 + github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
6993 + github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
6994 +@@ -136,12 +134,14 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
6995 + github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
6996 + github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
6997 + github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
6998 ++github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
6999 + github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
7000 + github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
7001 + github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
7002 + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
7003 + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
7004 + github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
7005 ++github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
7006 + github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
7007 + github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
7008 + github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
7009 +@@ -180,12 +180,11 @@ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod
7010 + github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
7011 + github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
7012 + github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
7013 +-github.com/jpillora/longestcommon v0.0.0-20161227235612-adb9d91ee629 h1:1dSBUfGlorLAua2CRx0zFN7kQsTpE2DQSmr7rrTNgY8=
7014 +-github.com/jpillora/longestcommon v0.0.0-20161227235612-adb9d91ee629/go.mod h1:mb5nS4uRANwOJSZj8rlCWAfAcGi72GGMIXx+xGOjA7M=
7015 + github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
7016 + github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
7017 + github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
7018 + github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
7019 ++github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
7020 + github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
7021 + github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
7022 + github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
7023 +@@ -200,20 +199,18 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
7024 + github.com/kr/pty v1.1.3 h1:/Um6a/ZmD5tF7peoOJ5oN5KMQ0DrGVQSXLNwyckutPk=
7025 + github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
7026 + github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
7027 ++github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
7028 + github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
7029 + github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw=
7030 + github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o=
7031 + github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk=
7032 + github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw=
7033 +-github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
7034 +-github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
7035 + github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg=
7036 + github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
7037 + github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
7038 + github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
7039 + github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
7040 + github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
7041 +-github.com/martinlindhe/base36 v1.0.0 h1:eYsumTah144C0A8P1T/AVSUk5ZoLnhfYFM3OGQxB52A=
7042 + github.com/martinlindhe/base36 v1.0.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
7043 + github.com/martinlindhe/base36 v1.1.0 h1:cIwvvwYse/0+1CkUPYH5ZvVIYG3JrILmQEIbLuar02Y=
7044 + github.com/martinlindhe/base36 v1.1.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
7045 +@@ -228,7 +225,6 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp
7046 + github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
7047 + github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
7048 + github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
7049 +-github.com/minio/minio-go v6.0.14+incompatible h1:fnV+GD28LeqdN6vT2XdGKW8Qe/IfjJDswNVuni6km9o=
7050 + github.com/minio/minio-go/v6 v6.0.49 h1:bU4kIa/qChTLC1jrWZ8F+8gOiw1MClubddAJVR4gW3w=
7051 + github.com/minio/minio-go/v6 v6.0.49/go.mod h1:qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg=
7052 + github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU=
7053 +@@ -242,8 +238,6 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4
7054 + github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
7055 + github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
7056 + github.com/mitchellh/mapstructure v0.0.0-20180203102830-a4e142e9c047/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
7057 +-github.com/mitchellh/mapstructure v1.0.0 h1:vVpGvMXJPqSDh2VYHF7gsfQj8Ncx+Xw5Y1KHeTRY+7I=
7058 +-github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
7059 + github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
7060 + github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
7061 + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
7062 +@@ -259,7 +253,9 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE
7063 + github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
7064 + github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
7065 + github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
7066 ++github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
7067 + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
7068 ++github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
7069 + github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
7070 + github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
7071 + github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
7072 +@@ -267,10 +263,12 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v
7073 + github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
7074 + github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
7075 + github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
7076 ++github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4=
7077 + github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
7078 + github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
7079 + github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
7080 + github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
7081 ++github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs=
7082 + github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
7083 + github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
7084 + github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
7085 +@@ -287,22 +285,20 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP
7086 + github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
7087 + github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
7088 + github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
7089 +-github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
7090 + github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
7091 + github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
7092 + github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
7093 + github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
7094 + github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
7095 ++github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
7096 + github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
7097 + github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
7098 +-github.com/prometheus/client_golang v0.9.1 h1:K47Rk0v/fkEfwfQet2KWhscE0cJzjgCCDBG2KHZoVno=
7099 + github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
7100 + github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
7101 + github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
7102 + github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
7103 + github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA=
7104 + github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
7105 +-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8=
7106 + github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
7107 + github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
7108 + github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
7109 +@@ -310,15 +306,12 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
7110 + github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
7111 + github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
7112 + github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
7113 +-github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39 h1:Cto4X6SVMWRPBkJ/3YHn1iDGDGc/Z+sW+AEMKHMVvN4=
7114 +-github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
7115 + github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
7116 + github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
7117 + github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
7118 + github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
7119 + github.com/prometheus/common v0.14.0 h1:RHRyE8UocrbjU+6UvRzwi6HjiDfxrrBU91TtbKzkGp4=
7120 + github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
7121 +-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d h1:GoAlyOgbOEIFdaDqxJVlbOQ1DtGmZWs/Qau0hIlk+WQ=
7122 + github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
7123 + github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
7124 + github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
7125 +@@ -333,36 +326,28 @@ github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
7126 + github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
7127 + github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
7128 + github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
7129 +-github.com/satori/go.uuid v1.1.0 h1:B9KXyj+GzIpJbV7gmr873NsY6zpbxNy24CBtGrk7jHo=
7130 +-github.com/satori/go.uuid v1.1.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
7131 +-github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
7132 +-github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
7133 +-github.com/satori/go.uuid v1.2.1-0.20180103174451-36e9d2ebbde5 h1:Jw7W4WMfQDxsXvfeFSaS2cHlY7bAF4MGrgnbd0+Uo78=
7134 +-github.com/satori/go.uuid v1.2.1-0.20180103174451-36e9d2ebbde5/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
7135 + github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM=
7136 + github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
7137 + github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
7138 + github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
7139 ++github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
7140 + github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
7141 +-github.com/shicky/gocelery v0.0.0-20180807061531-b2f0dd7ec05b h1:7kJLeBNcPG1orS3ksAFN0qoJGtf8jvwgOh5Q+bsNZvc=
7142 +-github.com/shicky/gocelery v0.0.0-20180807061531-b2f0dd7ec05b/go.mod h1:kn4CkFIzvsrXBvbNk2hX9DpIM8xo/74mYhiYTpGhYXE=
7143 + github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
7144 + github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
7145 + github.com/shurcooL/vfsgen v0.0.0-20180121065927-ffb13db8def0/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
7146 + github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
7147 + github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
7148 + github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
7149 ++github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
7150 + github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
7151 + github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
7152 ++github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
7153 + github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
7154 + github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
7155 + github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
7156 + github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
7157 + github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
7158 +-github.com/streadway/amqp v0.0.0-20180806233856-70e15c650864 h1:Oj3PUEs+OUSYUpn35O+BE/ivHGirKixA3+vqA0Atu9A=
7159 +-github.com/streadway/amqp v0.0.0-20180806233856-70e15c650864/go.mod h1:1WNBiOZtZQLpVAyu0iTduoJL9hEsMloAK5XWrtW0xdY=
7160 + github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
7161 +-github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271 h1:WhxRHzgeVGETMlmVfqhRn8RIeeNoPr2Czh33I4Zdccw=
7162 + github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
7163 + github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo=
7164 + github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
7165 +@@ -373,6 +358,7 @@ github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
7166 + github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
7167 + github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
7168 + github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
7169 ++github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
7170 + github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
7171 + github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
7172 + github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
7173 +@@ -391,6 +377,7 @@ go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mI
7174 + go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
7175 + go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
7176 + go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
7177 ++go.opentelemetry.io/otel v0.11.0 h1:IN2tzQa9Gc4ZVKnTaMbPVcHjvzOdg5n9QfnmlqiET7E=
7178 + go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0=
7179 + go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
7180 + go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
7181 +@@ -403,7 +390,6 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf
7182 + golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
7183 + golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
7184 + golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
7185 +-golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo=
7186 + golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
7187 + golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
7188 + golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
7189 +@@ -431,7 +417,6 @@ golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73r
7190 + golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
7191 + golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
7192 + golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
7193 +-golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco=
7194 + golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
7195 + golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
7196 + golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
7197 +@@ -451,7 +436,6 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
7198 + golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
7199 + golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
7200 + golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
7201 +-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
7202 + golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
7203 + golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
7204 + golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
7205 +@@ -460,7 +444,6 @@ golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5h
7206 + golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
7207 + golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
7208 + golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7209 +-golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
7210 + golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7211 + golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7212 + golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7213 +@@ -477,7 +460,6 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w
7214 + golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7215 + golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb h1:HS9IzC4UFbpMBLQUDSQcU+ViVT1vdFCQVjdPVpTlZrs=
7216 + golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7217 +-golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
7218 + golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
7219 + golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
7220 + golang.org/x/text v0.3.4-0.20201021145329-22f1617af38e h1:0kyKOEC0chG7FKmnf/1uNwvDLc3NtNTRip2rXAN9nwI=
7221 +@@ -502,6 +484,7 @@ golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapK
7222 + golang.org/x/tools v0.0.0-20200114235610-7ae403b6b589/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
7223 + golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7224 + golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7225 ++golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
7226 + golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7227 + google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
7228 + google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
7229 +@@ -539,6 +522,7 @@ gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod
7230 + gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
7231 + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
7232 + gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
7233 ++gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
7234 + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
7235 + gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
7236 + gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
7237 +@@ -549,6 +533,7 @@ gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
7238 + gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk=
7239 + gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
7240 + gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
7241 ++gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
7242 + gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
7243 + gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
7244 + gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
7245 +@@ -556,10 +541,9 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
7246 + gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
7247 + gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
7248 + gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
7249 +-gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
7250 +-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
7251 + gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
7252 + gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
7253 ++gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
7254 + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
7255 + honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
7256 + honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
7257 +--
7258 +2.32.0
7259 +
7260 diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/core/v3-0001-add-Unix-socket-support-for-redis-host.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/core/v3-0001-add-Unix-socket-support-for-redis-host.patch
7261 new file mode 100644
7262 index 00000000000..299ad3d83c5
7263 --- /dev/null
7264 +++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/core/v3-0001-add-Unix-socket-support-for-redis-host.patch
7265 @@ -0,0 +1,30 @@
7266 +From c0ccc8db051a2f8278edf59b41ed238fa71aa4c0 Mon Sep 17 00:00:00 2001
7267 +From: Julien Moutinho <julm+srht@sourcephile.fr>
7268 +Date: Mon, 23 Aug 2021 18:43:18 +0200
7269 +Subject: [PATCH core.sr.ht v3] add Unix socket support for redis-host=
7270 +
7271 +---
7272 + srht/redis.py | 11 ++---------
7273 + 1 file changed, 2 insertions(+), 9 deletions(-)
7274 +
7275 +diff --git a/srht/redis.py b/srht/redis.py
7276 +index 8a9347c..2e91c35 100644
7277 +--- a/srht/redis.py
7278 ++++ b/srht/redis.py
7279 +@@ -1,11 +1,4 @@
7280 +-from redis import Redis
7281 ++from redis import from_url
7282 + from srht.config import cfg
7283 +-from urllib.parse import urlparse
7284 +
7285 +-url = cfg("sr.ht", "redis-host", "redis://localhost")
7286 +-url = urlparse(url)
7287 +-
7288 +-redis = Redis(host=url.hostname,
7289 +- port=(url.port or 6379),
7290 +- password=url.password,
7291 +- db=int(url.path[1:]) if url.path else 0)
7292 ++redis = from_url(cfg("sr.ht", "redis-host", "redis://localhost"))
7293 +--
7294 +2.32.0
7295 +
7296 diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0001-gitsrht-keys-update-go-redis-to-support-Unix-sock.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0001-gitsrht-keys-update-go-redis-to-support-Unix-sock.patch
7297 new file mode 100644
7298 index 00000000000..48e91ac739b
7299 --- /dev/null
7300 +++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0001-gitsrht-keys-update-go-redis-to-support-Unix-sock.patch
7301 @@ -0,0 +1,26 @@
7302 +From 083e4791771d998c9a6c881a4101d24296e38252 Mon Sep 17 00:00:00 2001
7303 +From: Julien Moutinho <julm+srht@sourcephile.fr>
7304 +Date: Fri, 27 Aug 2021 15:38:28 +0200
7305 +Subject: [PATCH git.sr.ht v3 1/3] gitsrht-keys: update go-redis to support
7306 + Unix sockets
7307 +
7308 +---
7309 + gitsrht-keys/main.go | 2 +-
7310 + 1 file changed, 1 insertion(+), 1 deletion(-)
7311 +
7312 +diff --git a/gitsrht-keys/main.go b/gitsrht-keys/main.go
7313 +index 0c1aea1..fa17183 100644
7314 +--- a/gitsrht-keys/main.go
7315 ++++ b/gitsrht-keys/main.go
7316 +@@ -5,7 +5,7 @@ import (
7317 + "os"
7318 + "path"
7319 +
7320 +- goredis "github.com/go-redis/redis"
7321 ++ goredis "github.com/go-redis/redis/v8"
7322 + "github.com/vaughan0/go-ini"
7323 + "git.sr.ht/~sircmpwn/scm.sr.ht/srht-keys"
7324 + )
7325 +--
7326 +2.32.0
7327 +
7328 diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0002-gitsrht-update-hook-update-go-redis-to-support-Un.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0002-gitsrht-update-hook-update-go-redis-to-support-Un.patch
7329 new file mode 100644
7330 index 00000000000..41847ac8717
7331 --- /dev/null
7332 +++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0002-gitsrht-update-hook-update-go-redis-to-support-Un.patch
7333 @@ -0,0 +1,109 @@
7334 +From d9683aced0dc3a94c56de2fde31c1765054900fa Mon Sep 17 00:00:00 2001
7335 +From: Julien Moutinho <julm+srht@sourcephile.fr>
7336 +Date: Fri, 27 Aug 2021 15:39:29 +0200
7337 +Subject: [PATCH git.sr.ht v3 2/3] gitsrht-update-hook: update go-redis to
7338 + support Unix sockets
7339 +
7340 +---
7341 + gitsrht-update-hook/options.go | 12 +++++++-----
7342 + gitsrht-update-hook/post-update.go | 4 ++--
7343 + gitsrht-update-hook/update.go | 4 ++--
7344 + 3 files changed, 11 insertions(+), 9 deletions(-)
7345 +
7346 +diff --git a/gitsrht-update-hook/options.go b/gitsrht-update-hook/options.go
7347 +index 8efbb0a..962502a 100644
7348 +--- a/gitsrht-update-hook/options.go
7349 ++++ b/gitsrht-update-hook/options.go
7350 +@@ -1,15 +1,17 @@
7351 + package main
7352 +
7353 + import (
7354 ++ "context"
7355 + "fmt"
7356 + "os"
7357 + "strconv"
7358 + "strings"
7359 + "time"
7360 +
7361 +- goredis "github.com/go-redis/redis"
7362 ++ goredis "github.com/go-redis/redis/v8"
7363 + )
7364 +
7365 ++var ctx = context.Background()
7366 + var options map[string]string
7367 +
7368 + func loadOptions() {
7369 +@@ -35,10 +37,10 @@ func loadOptions() {
7370 + var n int
7371 + if nopts, ok := os.LookupEnv("GIT_PUSH_OPTION_COUNT"); ok {
7372 + n, _ = strconv.Atoi(nopts)
7373 +- redis.Set(fmt.Sprintf("git.sr.ht.options.%s", uuid),
7374 ++ redis.Set(ctx, fmt.Sprintf("git.sr.ht.options.%s", uuid),
7375 + nopts, 10*time.Minute)
7376 + } else {
7377 +- nopts, err := redis.Get(fmt.Sprintf(
7378 ++ nopts, err := redis.Get(ctx, fmt.Sprintf(
7379 + "git.sr.ht.options.%s", uuid)).Result()
7380 + if err != nil {
7381 + return
7382 +@@ -51,12 +53,12 @@ func loadOptions() {
7383 + opt, ok := os.LookupEnv(fmt.Sprintf("GIT_PUSH_OPTION_%d", i))
7384 + optkey := fmt.Sprintf("git.sr.ht.options.%s.%d", uuid, i)
7385 + if !ok {
7386 +- opt, err = redis.Get(optkey).Result()
7387 ++ opt, err = redis.Get(ctx, optkey).Result()
7388 + if err != nil {
7389 + return
7390 + }
7391 + } else {
7392 +- redis.Set(optkey, opt, 10*time.Minute)
7393 ++ redis.Set(ctx, optkey, opt, 10*time.Minute)
7394 + }
7395 + parts := strings.SplitN(opt, "=", 2)
7396 + if len(parts) == 1 {
7397 +diff --git a/gitsrht-update-hook/post-update.go b/gitsrht-update-hook/post-update.go
7398 +index d14d616..fcd7864 100644
7399 +--- a/gitsrht-update-hook/post-update.go
7400 ++++ b/gitsrht-update-hook/post-update.go
7401 +@@ -15,7 +15,7 @@ import (
7402 + "github.com/go-git/go-git/v5/plumbing"
7403 + "github.com/go-git/go-git/v5/plumbing/object"
7404 + "github.com/go-git/go-git/v5/plumbing/storer"
7405 +- goredis "github.com/go-redis/redis"
7406 ++ goredis "github.com/go-redis/redis/v8"
7407 + _ "github.com/lib/pq"
7408 + )
7409 +
7410 +@@ -220,7 +220,7 @@ func postUpdate() {
7411 + var oldref, newref string
7412 + var oldobj, newobj object.Object
7413 + updateKey := fmt.Sprintf("update.%s.%s", pushUuid, refname)
7414 +- update, err := redis.Get(updateKey).Result()
7415 ++ update, err := redis.Get(ctx, updateKey).Result()
7416 + if update == "" || err != nil {
7417 + logger.Println("redis.Get: missing key")
7418 + continue
7419 +diff --git a/gitsrht-update-hook/update.go b/gitsrht-update-hook/update.go
7420 +index 72c661a..e33fd4b 100644
7421 +--- a/gitsrht-update-hook/update.go
7422 ++++ b/gitsrht-update-hook/update.go
7423 +@@ -5,7 +5,7 @@ import (
7424 + "os"
7425 + "time"
7426 +
7427 +- goredis "github.com/go-redis/redis"
7428 ++ goredis "github.com/go-redis/redis/v8"
7429 + )
7430 +
7431 + // XXX: This is run once for every single ref that's pushed. If someone pushes
7432 +@@ -31,6 +31,6 @@ func update() {
7433 + logger.Fatalf("Failed to parse redis host: %v", err)
7434 + }
7435 + redis := goredis.NewClient(ropts)
7436 +- redis.Set(fmt.Sprintf("update.%s.%s", pushUuid, refname),
7437 ++ redis.Set(ctx, fmt.Sprintf("update.%s.%s", pushUuid, refname),
7438 + fmt.Sprintf("%s:%s", oldref, newref), 10*time.Minute)
7439 + }
7440 +--
7441 +2.32.0
7442 +
7443 diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0003-gitsrht-dispatch-add-support-for-supplementary-gr.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0003-gitsrht-dispatch-add-support-for-supplementary-gr.patch
7444 new file mode 100644
7445 index 00000000000..9a4b0300921
7446 --- /dev/null
7447 +++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0003-gitsrht-dispatch-add-support-for-supplementary-gr.patch
7448 @@ -0,0 +1,57 @@
7449 +From fcbec39a406562c29dfcf7eeef6f284da28bc619 Mon Sep 17 00:00:00 2001
7450 +From: Julien Moutinho <julm+srht@sourcephile.fr>
7451 +Date: Fri, 27 Aug 2021 17:42:33 +0200
7452 +Subject: [PATCH git.sr.ht v3 3/3] gitsrht-dispatch: add support for
7453 + supplementary groups
7454 +
7455 +---
7456 + gitsrht-dispatch/main.go | 17 ++++++++++++++---
7457 + 1 file changed, 14 insertions(+), 3 deletions(-)
7458 +
7459 +diff --git a/gitsrht-dispatch/main.go b/gitsrht-dispatch/main.go
7460 +index d7aee14..5f17b75 100644
7461 +--- a/gitsrht-dispatch/main.go
7462 ++++ b/gitsrht-dispatch/main.go
7463 +@@ -17,6 +17,7 @@ type Dispatcher struct {
7464 + cmd string
7465 + uid int
7466 + gid int
7467 ++ gids []int
7468 + }
7469 +
7470 + func main() {
7471 +@@ -70,11 +71,20 @@ AuthorizedKeysUser=root`, os.Args[0])
7472 + if err != nil {
7473 + logger.Fatalf("Error looking up group %s: %v", spec[1], err)
7474 + }
7475 ++ groups, err := user.GroupIds()
7476 ++ if err != nil {
7477 ++ logger.Fatalf("Error looking up supplementary groups of user %s: %v", spec[0], err)
7478 ++ }
7479 ++ gids := make([]int, len(groups))
7480 ++ for i, grp := range groups {
7481 ++ sgid, _ := strconv.Atoi(grp)
7482 ++ gids[i] = sgid
7483 ++ }
7484 + uid, _ := strconv.Atoi(user.Uid)
7485 + gid, _ := strconv.Atoi(group.Gid)
7486 +- dispatchers[uid] = Dispatcher{cmd, uid, gid}
7487 +- logger.Printf("Registered dispatcher for %s(%d):%s(%d): %s",
7488 +- spec[0], uid, spec[1], gid, cmd)
7489 ++ dispatchers[uid] = Dispatcher{cmd, uid, gid, gids}
7490 ++ logger.Printf("Registered dispatcher for %s(%d):%s(%d):(%s): %s",
7491 ++ spec[0], uid, spec[1], gid, strings.Join(groups, ","), cmd)
7492 + }
7493 +
7494 + var user *osuser.User
7495 +@@ -93,6 +103,7 @@ AuthorizedKeysUser=root`, os.Args[0])
7496 +
7497 + if dispatcher, ok := dispatchers[uid]; ok {
7498 + logger.Printf("Dispatching to %s", dispatcher.cmd)
7499 ++ syscall.Setgroups(dispatcher.gids)
7500 + syscall.Setgid(dispatcher.gid)
7501 + syscall.Setuid(dispatcher.uid)
7502 + if err := syscall.Exec(dispatcher.cmd, append([]string{
7503 +--
7504 +2.32.0
7505 +
7506 diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/scm/v3-0001-srht-keys-update-go-redis-to-support-Unix-sockets.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/scm/v3-0001-srht-keys-update-go-redis-to-support-Unix-sockets.patch
7507 new file mode 100644
7508 index 00000000000..191ff61b826
7509 --- /dev/null
7510 +++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/scm/v3-0001-srht-keys-update-go-redis-to-support-Unix-sockets.patch
7511 @@ -0,0 +1,61 @@
7512 +From e244cb7398758f91cc6deaabf278a1b6412ee477 Mon Sep 17 00:00:00 2001
7513 +From: Julien Moutinho <julm+srht@sourcephile.fr>
7514 +Date: Fri, 27 Aug 2021 12:48:56 +0200
7515 +Subject: [PATCH scm.sr.ht v3 1/2] srht-keys: update go-redis to support Unix
7516 + sockets
7517 +
7518 +---
7519 + srht-keys/srhtkeys.go | 9 ++++++---
7520 + 1 file changed, 6 insertions(+), 3 deletions(-)
7521 +
7522 +diff --git a/srht-keys/srhtkeys.go b/srht-keys/srhtkeys.go
7523 +index be925ed..1a300d5 100644
7524 +--- a/srht-keys/srhtkeys.go
7525 ++++ b/srht-keys/srhtkeys.go
7526 +@@ -1,6 +1,7 @@
7527 + package srhtkeys
7528 +
7529 + import (
7530 ++ "context"
7531 + "database/sql"
7532 + "encoding/json"
7533 + "errors"
7534 +@@ -12,7 +13,7 @@ import (
7535 + "path"
7536 + "time"
7537 +
7538 +- goredis "github.com/go-redis/redis"
7539 ++ goredis "github.com/go-redis/redis/v8"
7540 + "github.com/google/uuid"
7541 + _ "github.com/lib/pq"
7542 + "github.com/vaughan0/go-ini"
7543 +@@ -37,6 +38,8 @@ type MetaSSHKey struct {
7544 + Owner MetaUser `json:"owner"`
7545 + }
7546 +
7547 ++var ctx = context.Background()
7548 ++
7549 + // Stores the SSH key in the database and returns the user's ID.
7550 + func storeKey(logger *log.Logger, db *sql.DB, key *MetaSSHKey) (int, error) {
7551 + logger.Println("Storing meta.sr.ht key in database")
7552 +@@ -145,7 +148,7 @@ func fetchKeysFromMeta(logger *log.Logger, config ini.File,
7553 + if err != nil {
7554 + logger.Printf("Caching SSH key in redis failed: %v", err)
7555 + } else {
7556 +- redis.Set(cacheKey, cacheBytes, 7*24*time.Hour)
7557 ++ redis.Set(ctx, cacheKey, cacheBytes, 7*24*time.Hour)
7558 + }
7559 +
7560 + return key.Owner.Username, userId
7561 +@@ -168,7 +171,7 @@ func UserFromKey(logger *log.Logger, config ini.File,
7562 +
7563 + cacheKey := fmt.Sprintf("%s.ssh-keys.%s", service, b64key)
7564 + logger.Printf("Cache key for SSH key lookup: %s", cacheKey)
7565 +- cacheBytes, err := redis.Get(cacheKey).Bytes()
7566 ++ cacheBytes, err := redis.Get(ctx, cacheKey).Bytes()
7567 + var (
7568 + username string
7569 + userId int
7570 +--
7571 +2.32.0
7572 +
7573 diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/scm/v3-0002-srht-keys-update-go.-mod-sum-for-go-redis.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/scm/v3-0002-srht-keys-update-go.-mod-sum-for-go-redis.patch
7574 new file mode 100644
7575 index 00000000000..c5407a26491
7576 --- /dev/null
7577 +++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/scm/v3-0002-srht-keys-update-go.-mod-sum-for-go-redis.patch
7578 @@ -0,0 +1,155 @@
7579 +From aeb3e0dc2270e6ab3cd0f651ea735275e527e7ce Mon Sep 17 00:00:00 2001
7580 +From: Julien Moutinho <julm+srht@sourcephile.fr>
7581 +Date: Fri, 27 Aug 2021 13:06:27 +0200
7582 +Subject: [PATCH scm.sr.ht v3 2/2] srht-keys: update go.{mod,sum} for go-redis
7583 +
7584 +---
7585 + srht-keys/go.mod | 2 +-
7586 + srht-keys/go.sum | 103 ++++++++++++++++++++++++++++++++++++++++++++---
7587 + 2 files changed, 99 insertions(+), 6 deletions(-)
7588 +
7589 +diff --git a/srht-keys/go.mod b/srht-keys/go.mod
7590 +index d275913..8d1c10a 100644
7591 +--- a/srht-keys/go.mod
7592 ++++ b/srht-keys/go.mod
7593 +@@ -4,7 +4,7 @@ go 1.13
7594 +
7595 + require (
7596 + git.sr.ht/~sircmpwn/core-go v0.0.0-20201005173246-a9e49d17a1e6
7597 +- github.com/go-redis/redis v6.15.9+incompatible
7598 ++ github.com/go-redis/redis/v8 v8.11.3
7599 + github.com/google/uuid v1.1.1
7600 + github.com/lib/pq v1.8.0
7601 + github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec
7602 +diff --git a/srht-keys/go.sum b/srht-keys/go.sum
7603 +index 974326e..a264a26 100644
7604 +--- a/srht-keys/go.sum
7605 ++++ b/srht-keys/go.sum
7606 +@@ -1,26 +1,119 @@
7607 +-git.sr.ht/~sircmpwn/core-go v0.0.0-20200820135923-98806e712f5e h1:TJqf/neVU5peFAS9WcR1aADXcflPOvAd7ABEirmU7m0=
7608 +-git.sr.ht/~sircmpwn/core-go v0.0.0-20200820135923-98806e712f5e/go.mod h1:aXSNgRsGoI3tTFKlwD0xm2htbEzKlR2xUm1osRxfhOM=
7609 + git.sr.ht/~sircmpwn/core-go v0.0.0-20201005173246-a9e49d17a1e6 h1:Ky6HzcRmbMUxOrWXv04+mb97GkyxO/Nx7v8uJBUdpNk=
7610 + git.sr.ht/~sircmpwn/core-go v0.0.0-20201005173246-a9e49d17a1e6/go.mod h1:HpPX22ilJUWKOA4NDhrOcIyblQhdiKHPg4oMJFYdh0Y=
7611 ++github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
7612 ++github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
7613 + github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
7614 ++github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
7615 ++github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
7616 ++github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
7617 ++github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
7618 ++github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001 h1:/UMxx5lGDg30aioUL9e7xJnbJfJeX7vhcm57fa5udaI=
7619 + github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001/go.mod h1:2H9hjfbpSMHwY503FclkV/lZTBh2YlOmLLSda12uL8c=
7620 +-github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg=
7621 +-github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
7622 ++github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
7623 ++github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
7624 ++github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
7625 ++github.com/go-redis/redis/v8 v8.11.3 h1:GCjoYp8c+yQTJfc0n69iwSiHjvuAdruxl7elnZCxgt8=
7626 ++github.com/go-redis/redis/v8 v8.11.3/go.mod h1:xNJ9xDG09FsIPwh3bWdk+0oDWHbtF9rPN0F/oD9XeKc=
7627 ++github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
7628 ++github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
7629 ++github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
7630 ++github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
7631 ++github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
7632 ++github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
7633 ++github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
7634 ++github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
7635 ++github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
7636 ++github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
7637 ++github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
7638 ++github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
7639 ++github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
7640 ++github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
7641 ++github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
7642 ++github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
7643 ++github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
7644 + github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
7645 + github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
7646 ++github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
7647 + github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg=
7648 + github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
7649 ++github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
7650 ++github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
7651 ++github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
7652 ++github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
7653 ++github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
7654 ++github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
7655 ++github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
7656 ++github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
7657 ++github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
7658 ++github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU=
7659 ++github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
7660 ++github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
7661 + github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
7662 + github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
7663 ++github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
7664 ++github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
7665 + github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
7666 + github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec h1:DGmKwyZwEB8dI7tbLt/I/gQuP559o/0FrAkHKlQM/Ks=
7667 + github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec/go.mod h1:owBmyHYMLkxyrugmfwE/DLJyW8Ro9mkphwuVErQ0iUw=
7668 ++github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
7669 + golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
7670 +-golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
7671 ++golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
7672 ++golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
7673 + golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
7674 ++golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
7675 ++golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
7676 + golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
7677 ++golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
7678 ++golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
7679 ++golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
7680 ++golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0=
7681 ++golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
7682 ++golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
7683 ++golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
7684 ++golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
7685 ++golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
7686 + golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
7687 + golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7688 ++golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7689 ++golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7690 ++golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7691 ++golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7692 ++golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7693 ++golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7694 ++golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7695 ++golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
7696 ++golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7697 ++golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
7698 + golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
7699 ++golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
7700 ++golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
7701 ++golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
7702 ++golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
7703 ++golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
7704 ++golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
7705 ++golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7706 ++golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7707 ++golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7708 ++golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
7709 ++golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7710 ++google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
7711 ++google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
7712 ++google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
7713 ++google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
7714 ++google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
7715 ++google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
7716 ++google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
7717 ++google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
7718 ++google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
7719 ++gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
7720 + gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
7721 ++gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
7722 ++gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
7723 ++gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
7724 ++gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
7725 ++gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
7726 ++gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
7727 ++gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
7728 ++gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
7729 ++gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
7730 + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
7731 +--
7732 +2.32.0
7733 +
7734 diff --git a/pkgs/applications/version-management/sourcehut/scm.nix b/pkgs/applications/version-management/sourcehut/scm.nix
7735 index 1f385265360..55bc2aa9e72 100644
7736 --- a/pkgs/applications/version-management/sourcehut/scm.nix
7737 +++ b/pkgs/applications/version-management/sourcehut/scm.nix
7738 @@ -1,22 +1,57 @@
7739 { lib
7740 , fetchFromSourcehut
7741 +, buildGoModule
7742 , buildPythonPackage
7743 , srht
7744 , redis
7745 , pyyaml
7746 -, buildsrht
7747 -, writeText
7748 +, applyPatches
7749 }:
7750
7751 buildPythonPackage rec {
7752 pname = "scmsrht";
7753 - version = "0.22.9";
7754 + version = "0.22.15";
7755
7756 src = fetchFromSourcehut {
7757 owner = "~sircmpwn";
7758 repo = "scm.sr.ht";
7759 rev = version;
7760 - sha256 = "sha256-327G6C8FW+iZx+167D7TQsFtV6FGc8MpMVo9L/cUUqU=";
7761 + sha256 = "sha256-h4akgDn78ctBF31TX8D8NwUVUVazClPVvCR9xWyQPBk=";
7762 + };
7763 +
7764 + passthru = {
7765 + srht-keys = buildGoModule {
7766 + inherit src version;
7767 + sourceRoot = "source/srht-keys";
7768 + pname = "srht-keys";
7769 + vendorSha256 = "sha256-7j6b9VOpdQ2YcoM1F4xf14IwHg3GFDN6VDbC4gt6wO0=";
7770 +
7771 + # What follows is only to update go-redis
7772 + # go.{mod,sum} could be patched directly but that would be less resilient
7773 + # to changes from upstream, and thus harder to maintain the patching
7774 + # while it hasn't been merged upstream.
7775 +
7776 + overrideModAttrs = old: {
7777 + preBuild = ''
7778 + go get github.com/go-redis/redis/v8
7779 + go get github.com/go-redis/redis@none
7780 + go mod tidy
7781 + '';
7782 + # Pass updated go.{mod,sum} from go-modules to srht-keys's vendor/go.{mod,sum}
7783 + postInstall = ''
7784 + cp --reflink=auto go.* $out
7785 + '';
7786 + };
7787 +
7788 + patches = [
7789 + # Update go-redis to support Unix sockets
7790 + patches/redis-socket/scm/v3-0001-srht-keys-update-go-redis-to-support-Unix-sockets.patch
7791 + ];
7792 + patchFlags = ["-p2"];
7793 + postInstall = ''
7794 + cp --reflink=auto *.go vendor/go.* $out
7795 + '';
7796 + };
7797 };
7798
7799 nativeBuildInputs = srht.nativeBuildInputs;
7800 @@ -25,7 +60,6 @@ buildPythonPackage rec {
7801 srht
7802 redis
7803 pyyaml
7804 - buildsrht
7805 ];
7806
7807 preBuild = ''
7808 @@ -33,11 +67,12 @@ buildPythonPackage rec {
7809 '';
7810
7811 dontUseSetuptoolsCheck = true;
7812 + pythonImportsCheck = [ "scmsrht" ];
7813
7814 meta = with lib; {
7815 homepage = "https://git.sr.ht/~sircmpwn/git.sr.ht";
7816 description = "Shared support code for sr.ht source control services.";
7817 - license = licenses.agpl3;
7818 + license = licenses.agpl3Only;
7819 maintainers = with maintainers; [ eadwu ];
7820 };
7821 }
7822 diff --git a/pkgs/applications/version-management/sourcehut/todo.nix b/pkgs/applications/version-management/sourcehut/todo.nix
7823 index 85e1f5637b6..da494018fc0 100644
7824 --- a/pkgs/applications/version-management/sourcehut/todo.nix
7825 +++ b/pkgs/applications/version-management/sourcehut/todo.nix
7826 @@ -12,13 +12,13 @@
7827
7828 buildPythonPackage rec {
7829 pname = "todosrht";
7830 - version = "0.64.14";
7831 + version = "0.65.3";
7832
7833 src = fetchFromSourcehut {
7834 owner = "~sircmpwn";
7835 repo = "todo.sr.ht";
7836 rev = version;
7837 - sha256 = "sha256-huIAhn6h1F5w5ST4/yBwr82kAzyYwhLu+gpRuOQgnsE=";
7838 + sha256 = "sha256-R6ee+s4zojU/dUAIWbkP6TkBoqQY7FKECxnWZr3n59g=";
7839 };
7840
7841 nativeBuildInputs = srht.nativeBuildInputs;
7842 @@ -42,11 +42,12 @@ buildPythonPackage rec {
7843 ];
7844
7845 dontUseSetuptoolsCheck = true;
7846 + pythonImportsCheck = [ "todosrht" ];
7847
7848 meta = with lib; {
7849 homepage = "https://todo.sr.ht/~sircmpwn/todo.sr.ht";
7850 description = "Ticket tracking service for the sr.ht network";
7851 - license = licenses.agpl3;
7852 + license = licenses.agpl3Only;
7853 maintainers = with maintainers; [ eadwu ];
7854 };
7855 }
7856 diff --git a/pkgs/applications/version-management/sourcehut/update.sh b/pkgs/applications/version-management/sourcehut/update.sh
7857 index 156d4cc35e4..1638313697c 100755
7858 --- a/pkgs/applications/version-management/sourcehut/update.sh
7859 +++ b/pkgs/applications/version-management/sourcehut/update.sh
7860 @@ -1,8 +1,11 @@
7861 #! /usr/bin/env nix-shell
7862 #! nix-shell -i bash -p git mercurial common-updater-scripts
7863 +set -eux -o pipefail
7864
7865 -cd "$(dirname "${BASH_SOURCE[0]}")"
7866 +cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1
7867 root=../../../..
7868 +tmp=$(mktemp -d)
7869 +trap 'rm -rf "$tmp"' EXIT
7870
7871 default() {
7872 (cd "$root" && nix-instantiate --eval --strict -A "sourcehut.python.pkgs.$1.meta.position" | sed -re 's/^"(.*):[0-9]+"$/\1/')
7873 @@ -13,42 +16,61 @@ version() {
7874 }
7875
7876 src_url() {
7877 - (cd "$root" && nix-instantiate --eval --strict -A "sourcehut.python.pkgs.$1.src.drvAttrs.url" | tr -d '"')
7878 + nix-instantiate --eval --strict --expr " with import $root {}; let src = sourcehut.python.pkgs.$1.drvAttrs.src; in src.url or src.meta.homepage" | tr -d '"'
7879 }
7880
7881 get_latest_version() {
7882 src="$(src_url "$1")"
7883 - tmp=$(mktemp -d)
7884 -
7885 + rm -rf "$tmp"
7886 if [ "$1" = "hgsrht" ]; then
7887 - hg clone "$src" "$tmp" &> /dev/null
7888 + hg clone "$src" "$tmp" >/dev/null
7889 printf "%s" "$(cd "$tmp" && hg log --limit 1 --template '{latesttag}')"
7890 else
7891 - git clone "$src" "$tmp"
7892 - printf "%s" "$(cd "$tmp" && git describe $(git rev-list --tags --max-count=1))"
7893 + git clone "$src" "$tmp" >/dev/null
7894 + printf "%s" "$(cd "$tmp" && git describe "$(git rev-list --tags --max-count=1)")"
7895 fi
7896 }
7897
7898 update_version() {
7899 default_nix="$(default "$1")"
7900 - version_old="$(version "$1")"
7901 + oldVersion="$(version "$1")"
7902 version="$(get_latest_version "$1")"
7903
7904 (cd "$root" && update-source-version "sourcehut.python.pkgs.$1" "$version")
7905
7906 - git add "$default_nix"
7907 - git commit -m "$1: $version_old -> $version"
7908 + # Update vendorSha256 of Go modules
7909 + retry=true
7910 + while "$retry"; do
7911 + retry=false;
7912 + exec < <(exec nix -L build -f "$root" sourcehut.python.pkgs."$1" 2>&1)
7913 + while IFS=' :' read -r origin hash; do
7914 + case "$origin" in
7915 + (expected|specified) oldHash="$hash";;
7916 + (got) sed -i "s|$oldHash|$hash|" "$default_nix"; retry=true; break;;
7917 + (*) printf >&2 "%s\n" "$origin${hash:+:$hash}"
7918 + esac
7919 + done
7920 + done
7921 +
7922 + if [ "$oldVersion" != "$version" ]; then
7923 + git add "$default_nix"
7924 + git commit -m "sourcehut.$1: $oldVersion -> $version"
7925 + fi
7926 }
7927
7928 -services=( "srht" "buildsrht" "dispatchsrht" "gitsrht" "hgsrht" "hubsrht" "listssrht" "mansrht"
7929 - "metasrht" "pastesrht" "todosrht" "scmsrht" )
7930 -
7931 -# Whether or not a specific service is requested
7932 -if [ -n "$1" ]; then
7933 - version="$(get_latest_version "$1")"
7934 - (cd "$root" && update-source-version "sourcehut.python.pkgs.$1" "$version")
7935 +if [ $# -gt 0 ]; then
7936 + services=("$@")
7937 else
7938 - for service in "${services[@]}"; do
7939 - update_version "$service"
7940 - done
7941 + # Beware that some packages must be updated before others,
7942 + # eg. srht-keys must be update before gitsrht,
7943 + # otherwise this script would enter an infinite loop
7944 + # because the reported $oldHash to be changed
7945 + # may not actually be in $default_nix
7946 + # but in the file of one of its dependencies.
7947 + services=( "srht" "scmsrht" "srht-keys" "buildsrht" "dispatchsrht" "gitsrht" "hgsrht" "hubsrht" "listssrht" "mansrht"
7948 + "metasrht" "pagessrht" "pastesrht" "todosrht" )
7949 fi
7950 +
7951 +for service in "${services[@]}"; do
7952 + update_version "$service"
7953 +done
7954 diff --git a/pkgs/development/go-modules/generic/default.nix b/pkgs/development/go-modules/generic/default.nix
7955 index 3b645f9ce8b..f00ca1984ec 100644
7956 --- a/pkgs/development/go-modules/generic/default.nix
7957 +++ b/pkgs/development/go-modules/generic/default.nix
7958 @@ -71,6 +71,7 @@ let
7959 inherit (go) GOOS GOARCH;
7960
7961 patches = args.patches or [];
7962 + patchFlags = args.patchFlags or [];
7963 preBuild = args.preBuild or "";
7964 sourceRoot = args.sourceRoot or "";
7965