upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock674
-rw-r--r--Cargo.toml44
-rw-r--r--flake.lock12
-rw-r--r--flake.nix2
-rw-r--r--src/bin/git_remote_nostr/push.rs36
-rw-r--r--src/bin/git_remote_nostr/utils.rs13
-rw-r--r--src/bin/ngit/sub_commands/list.rs13
-rw-r--r--src/bin/ngit/sub_commands/send.rs7
-rw-r--r--src/lib/client.rs135
-rw-r--r--src/lib/git/identify_ahead_behind.rs8
-rw-r--r--src/lib/git/mod.rs94
-rw-r--r--src/lib/git/nostr_url.rs8
-rw-r--r--src/lib/git_events.rs16
-rw-r--r--src/lib/login/fresh.rs8
-rw-r--r--src/lib/login/mod.rs14
-rw-r--r--src/lib/repo_ref.rs13
-rw-r--r--src/lib/repo_state.rs7
-rw-r--r--test_utils/Cargo.toml26
-rw-r--r--test_utils/src/lib.rs214
-rw-r--r--test_utils/src/relay.rs10
-rw-r--r--tests/git_remote_nostr/list.rs23
-rw-r--r--tests/git_remote_nostr/push.rs42
-rw-r--r--tests/ngit_init.rs36
-rw-r--r--tests/ngit_list.rs378
-rw-r--r--tests/ngit_login.rs368
-rw-r--r--tests/ngit_send.rs253
26 files changed, 1388 insertions, 1066 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 6ddc005..04e14a5 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -13,9 +13,9 @@ dependencies = [
13 13
14[[package]] 14[[package]]
15name = "adler2" 15name = "adler2"
16version = "2.0.0" 16version = "2.0.1"
17source = "registry+https://github.com/rust-lang/crates.io-index" 17source = "registry+https://github.com/rust-lang/crates.io-index"
18checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 18checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
19 19
20[[package]] 20[[package]]
21name = "aead" 21name = "aead"
@@ -49,9 +49,9 @@ dependencies = [
49 49
50[[package]] 50[[package]]
51name = "anstream" 51name = "anstream"
52version = "0.6.18" 52version = "0.6.19"
53source = "registry+https://github.com/rust-lang/crates.io-index" 53source = "registry+https://github.com/rust-lang/crates.io-index"
54checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 54checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933"
55dependencies = [ 55dependencies = [
56 "anstyle", 56 "anstyle",
57 "anstyle-parse", 57 "anstyle-parse",
@@ -64,36 +64,36 @@ dependencies = [
64 64
65[[package]] 65[[package]]
66name = "anstyle" 66name = "anstyle"
67version = "1.0.10" 67version = "1.0.11"
68source = "registry+https://github.com/rust-lang/crates.io-index" 68source = "registry+https://github.com/rust-lang/crates.io-index"
69checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 69checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd"
70 70
71[[package]] 71[[package]]
72name = "anstyle-parse" 72name = "anstyle-parse"
73version = "0.2.6" 73version = "0.2.7"
74source = "registry+https://github.com/rust-lang/crates.io-index" 74source = "registry+https://github.com/rust-lang/crates.io-index"
75checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 75checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
76dependencies = [ 76dependencies = [
77 "utf8parse", 77 "utf8parse",
78] 78]
79 79
80[[package]] 80[[package]]
81name = "anstyle-query" 81name = "anstyle-query"
82version = "1.1.2" 82version = "1.1.3"
83source = "registry+https://github.com/rust-lang/crates.io-index" 83source = "registry+https://github.com/rust-lang/crates.io-index"
84checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 84checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9"
85dependencies = [ 85dependencies = [
86 "windows-sys 0.59.0", 86 "windows-sys 0.59.0",
87] 87]
88 88
89[[package]] 89[[package]]
90name = "anstyle-wincon" 90name = "anstyle-wincon"
91version = "3.0.7" 91version = "3.0.9"
92source = "registry+https://github.com/rust-lang/crates.io-index" 92source = "registry+https://github.com/rust-lang/crates.io-index"
93checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 93checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882"
94dependencies = [ 94dependencies = [
95 "anstyle", 95 "anstyle",
96 "once_cell", 96 "once_cell_polyfill",
97 "windows-sys 0.59.0", 97 "windows-sys 0.59.0",
98] 98]
99 99
@@ -175,9 +175,9 @@ checksum = "ef49f5882e4b6afaac09ad239a4f8c70a24b8f2b0897edb1f706008efd109cf4"
175 175
176[[package]] 176[[package]]
177name = "auth-git2" 177name = "auth-git2"
178version = "0.5.7" 178version = "0.5.8"
179source = "registry+https://github.com/rust-lang/crates.io-index" 179source = "registry+https://github.com/rust-lang/crates.io-index"
180checksum = "d55eead120c93036f531829cf9b85830a474e75ce71169680879d28078321ddc" 180checksum = "4888bf91cce63baf1670512d0f12b5d636179a4abbad6504812ac8ab124b3efe"
181dependencies = [ 181dependencies = [
182 "dirs", 182 "dirs",
183 "git2", 183 "git2",
@@ -186,15 +186,15 @@ dependencies = [
186 186
187[[package]] 187[[package]]
188name = "autocfg" 188name = "autocfg"
189version = "1.4.0" 189version = "1.5.0"
190source = "registry+https://github.com/rust-lang/crates.io-index" 190source = "registry+https://github.com/rust-lang/crates.io-index"
191checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 191checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
192 192
193[[package]] 193[[package]]
194name = "backtrace" 194name = "backtrace"
195version = "0.3.74" 195version = "0.3.75"
196source = "registry+https://github.com/rust-lang/crates.io-index" 196source = "registry+https://github.com/rust-lang/crates.io-index"
197checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 197checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
198dependencies = [ 198dependencies = [
199 "addr2line", 199 "addr2line",
200 "cfg-if", 200 "cfg-if",
@@ -213,9 +213,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
213 213
214[[package]] 214[[package]]
215name = "base64ct" 215name = "base64ct"
216version = "1.7.3" 216version = "1.8.0"
217source = "registry+https://github.com/rust-lang/crates.io-index" 217source = "registry+https://github.com/rust-lang/crates.io-index"
218checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" 218checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba"
219 219
220[[package]] 220[[package]]
221name = "bech32" 221name = "bech32"
@@ -225,9 +225,9 @@ checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d"
225 225
226[[package]] 226[[package]]
227name = "bip39" 227name = "bip39"
228version = "2.1.0" 228version = "2.2.0"
229source = "registry+https://github.com/rust-lang/crates.io-index" 229source = "registry+https://github.com/rust-lang/crates.io-index"
230checksum = "33415e24172c1b7d6066f6d999545375ab8e1d95421d6784bdfff9496f292387" 230checksum = "43d193de1f7487df1914d3a568b772458861d33f9c54249612cc2893d6915054"
231dependencies = [ 231dependencies = [
232 "bitcoin_hashes 0.13.0", 232 "bitcoin_hashes 0.13.0",
233 "serde", 233 "serde",
@@ -275,9 +275,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
275 275
276[[package]] 276[[package]]
277name = "bitflags" 277name = "bitflags"
278version = "2.9.0" 278version = "2.9.1"
279source = "registry+https://github.com/rust-lang/crates.io-index" 279source = "registry+https://github.com/rust-lang/crates.io-index"
280checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 280checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
281dependencies = [ 281dependencies = [
282 "serde", 282 "serde",
283] 283]
@@ -313,9 +313,9 @@ dependencies = [
313 313
314[[package]] 314[[package]]
315name = "bumpalo" 315name = "bumpalo"
316version = "3.17.0" 316version = "3.19.0"
317source = "registry+https://github.com/rust-lang/crates.io-index" 317source = "registry+https://github.com/rust-lang/crates.io-index"
318checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 318checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
319 319
320[[package]] 320[[package]]
321name = "byteorder" 321name = "byteorder"
@@ -340,9 +340,9 @@ dependencies = [
340 340
341[[package]] 341[[package]]
342name = "cc" 342name = "cc"
343version = "1.2.21" 343version = "1.2.29"
344source = "registry+https://github.com/rust-lang/crates.io-index" 344source = "registry+https://github.com/rust-lang/crates.io-index"
345checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" 345checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362"
346dependencies = [ 346dependencies = [
347 "jobserver", 347 "jobserver",
348 "libc", 348 "libc",
@@ -351,9 +351,9 @@ dependencies = [
351 351
352[[package]] 352[[package]]
353name = "cfg-if" 353name = "cfg-if"
354version = "1.0.0" 354version = "1.0.1"
355source = "registry+https://github.com/rust-lang/crates.io-index" 355source = "registry+https://github.com/rust-lang/crates.io-index"
356checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 356checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
357 357
358[[package]] 358[[package]]
359name = "cfg_aliases" 359name = "cfg_aliases"
@@ -398,9 +398,9 @@ dependencies = [
398 398
399[[package]] 399[[package]]
400name = "clap" 400name = "clap"
401version = "4.5.37" 401version = "4.5.41"
402source = "registry+https://github.com/rust-lang/crates.io-index" 402source = "registry+https://github.com/rust-lang/crates.io-index"
403checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" 403checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9"
404dependencies = [ 404dependencies = [
405 "clap_builder", 405 "clap_builder",
406 "clap_derive", 406 "clap_derive",
@@ -408,9 +408,9 @@ dependencies = [
408 408
409[[package]] 409[[package]]
410name = "clap_builder" 410name = "clap_builder"
411version = "4.5.37" 411version = "4.5.41"
412source = "registry+https://github.com/rust-lang/crates.io-index" 412source = "registry+https://github.com/rust-lang/crates.io-index"
413checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" 413checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d"
414dependencies = [ 414dependencies = [
415 "anstream", 415 "anstream",
416 "anstyle", 416 "anstyle",
@@ -420,9 +420,9 @@ dependencies = [
420 420
421[[package]] 421[[package]]
422name = "clap_derive" 422name = "clap_derive"
423version = "4.5.32" 423version = "4.5.41"
424source = "registry+https://github.com/rust-lang/crates.io-index" 424source = "registry+https://github.com/rust-lang/crates.io-index"
425checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" 425checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491"
426dependencies = [ 426dependencies = [
427 "heck", 427 "heck",
428 "proc-macro2", 428 "proc-macro2",
@@ -432,15 +432,15 @@ dependencies = [
432 432
433[[package]] 433[[package]]
434name = "clap_lex" 434name = "clap_lex"
435version = "0.7.4" 435version = "0.7.5"
436source = "registry+https://github.com/rust-lang/crates.io-index" 436source = "registry+https://github.com/rust-lang/crates.io-index"
437checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 437checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675"
438 438
439[[package]] 439[[package]]
440name = "colorchoice" 440name = "colorchoice"
441version = "1.0.3" 441version = "1.0.4"
442source = "registry+https://github.com/rust-lang/crates.io-index" 442source = "registry+https://github.com/rust-lang/crates.io-index"
443checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 443checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
444 444
445[[package]] 445[[package]]
446name = "comma" 446name = "comma"
@@ -462,6 +462,19 @@ dependencies = [
462] 462]
463 463
464[[package]] 464[[package]]
465name = "console"
466version = "0.16.0"
467source = "registry+https://github.com/rust-lang/crates.io-index"
468checksum = "2e09ced7ebbccb63b4c65413d821f2e00ce54c5ca4514ddc6b3c892fdbcbc69d"
469dependencies = [
470 "encode_unicode",
471 "libc",
472 "once_cell",
473 "unicode-width",
474 "windows-sys 0.60.2",
475]
476
477[[package]]
465name = "cpufeatures" 478name = "cpufeatures"
466version = "0.2.17" 479version = "0.2.17"
467source = "registry+https://github.com/rust-lang/crates.io-index" 480source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -508,7 +521,7 @@ version = "0.11.0"
508source = "registry+https://github.com/rust-lang/crates.io-index" 521source = "registry+https://github.com/rust-lang/crates.io-index"
509checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" 522checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de"
510dependencies = [ 523dependencies = [
511 "console", 524 "console 0.15.11",
512 "shell-words", 525 "shell-words",
513 "tempfile", 526 "tempfile",
514 "thiserror 1.0.69", 527 "thiserror 1.0.69",
@@ -559,7 +572,7 @@ dependencies = [
559 "libc", 572 "libc",
560 "option-ext", 573 "option-ext",
561 "redox_users", 574 "redox_users",
562 "windows-sys 0.59.0", 575 "windows-sys 0.60.2",
563] 576]
564 577
565[[package]] 578[[package]]
@@ -614,12 +627,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
614 627
615[[package]] 628[[package]]
616name = "errno" 629name = "errno"
617version = "0.3.11" 630version = "0.3.13"
618source = "registry+https://github.com/rust-lang/crates.io-index" 631source = "registry+https://github.com/rust-lang/crates.io-index"
619checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" 632checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
620dependencies = [ 633dependencies = [
621 "libc", 634 "libc",
622 "windows-sys 0.59.0", 635 "windows-sys 0.60.2",
623] 636]
624 637
625[[package]] 638[[package]]
@@ -780,15 +793,15 @@ dependencies = [
780 "cfg-if", 793 "cfg-if",
781 "js-sys", 794 "js-sys",
782 "libc", 795 "libc",
783 "wasi 0.11.0+wasi-snapshot-preview1", 796 "wasi 0.11.1+wasi-snapshot-preview1",
784 "wasm-bindgen", 797 "wasm-bindgen",
785] 798]
786 799
787[[package]] 800[[package]]
788name = "getrandom" 801name = "getrandom"
789version = "0.3.2" 802version = "0.3.3"
790source = "registry+https://github.com/rust-lang/crates.io-index" 803source = "registry+https://github.com/rust-lang/crates.io-index"
791checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" 804checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
792dependencies = [ 805dependencies = [
793 "cfg-if", 806 "cfg-if",
794 "js-sys", 807 "js-sys",
@@ -810,7 +823,7 @@ version = "0.20.2"
810source = "registry+https://github.com/rust-lang/crates.io-index" 823source = "registry+https://github.com/rust-lang/crates.io-index"
811checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" 824checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110"
812dependencies = [ 825dependencies = [
813 "bitflags 2.9.0", 826 "bitflags 2.9.1",
814 "libc", 827 "libc",
815 "libgit2-sys", 828 "libgit2-sys",
816 "log", 829 "log",
@@ -833,9 +846,9 @@ dependencies = [
833 846
834[[package]] 847[[package]]
835name = "hashbrown" 848name = "hashbrown"
836version = "0.15.3" 849version = "0.15.4"
837source = "registry+https://github.com/rust-lang/crates.io-index" 850source = "registry+https://github.com/rust-lang/crates.io-index"
838checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" 851checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
839 852
840[[package]] 853[[package]]
841name = "heck" 854name = "heck"
@@ -849,7 +862,7 @@ version = "0.20.5"
849source = "registry+https://github.com/rust-lang/crates.io-index" 862source = "registry+https://github.com/rust-lang/crates.io-index"
850checksum = "7d4f449bab7320c56003d37732a917e18798e2f1709d80263face2b4f9436ddb" 863checksum = "7d4f449bab7320c56003d37732a917e18798e2f1709d80263face2b4f9436ddb"
851dependencies = [ 864dependencies = [
852 "bitflags 2.9.0", 865 "bitflags 2.9.1",
853 "byteorder", 866 "byteorder",
854 "heed-traits", 867 "heed-traits",
855 "heed-types", 868 "heed-types",
@@ -973,11 +986,10 @@ dependencies = [
973 986
974[[package]] 987[[package]]
975name = "hyper-rustls" 988name = "hyper-rustls"
976version = "0.27.5" 989version = "0.27.7"
977source = "registry+https://github.com/rust-lang/crates.io-index" 990source = "registry+https://github.com/rust-lang/crates.io-index"
978checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" 991checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"
979dependencies = [ 992dependencies = [
980 "futures-util",
981 "http 1.3.1", 993 "http 1.3.1",
982 "hyper", 994 "hyper",
983 "hyper-util", 995 "hyper-util",
@@ -986,22 +998,26 @@ dependencies = [
986 "tokio", 998 "tokio",
987 "tokio-rustls", 999 "tokio-rustls",
988 "tower-service", 1000 "tower-service",
989 "webpki-roots", 1001 "webpki-roots 1.0.1",
990] 1002]
991 1003
992[[package]] 1004[[package]]
993name = "hyper-util" 1005name = "hyper-util"
994version = "0.1.11" 1006version = "0.1.15"
995source = "registry+https://github.com/rust-lang/crates.io-index" 1007source = "registry+https://github.com/rust-lang/crates.io-index"
996checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" 1008checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df"
997dependencies = [ 1009dependencies = [
1010 "base64",
998 "bytes", 1011 "bytes",
999 "futures-channel", 1012 "futures-channel",
1013 "futures-core",
1000 "futures-util", 1014 "futures-util",
1001 "http 1.3.1", 1015 "http 1.3.1",
1002 "http-body", 1016 "http-body",
1003 "hyper", 1017 "hyper",
1018 "ipnet",
1004 "libc", 1019 "libc",
1020 "percent-encoding",
1005 "pin-project-lite", 1021 "pin-project-lite",
1006 "socket2", 1022 "socket2",
1007 "tokio", 1023 "tokio",
@@ -1011,21 +1027,22 @@ dependencies = [
1011 1027
1012[[package]] 1028[[package]]
1013name = "icu_collections" 1029name = "icu_collections"
1014version = "1.5.0" 1030version = "2.0.0"
1015source = "registry+https://github.com/rust-lang/crates.io-index" 1031source = "registry+https://github.com/rust-lang/crates.io-index"
1016checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 1032checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
1017dependencies = [ 1033dependencies = [
1018 "displaydoc", 1034 "displaydoc",
1035 "potential_utf",
1019 "yoke", 1036 "yoke",
1020 "zerofrom", 1037 "zerofrom",
1021 "zerovec", 1038 "zerovec",
1022] 1039]
1023 1040
1024[[package]] 1041[[package]]
1025name = "icu_locid" 1042name = "icu_locale_core"
1026version = "1.5.0" 1043version = "2.0.0"
1027source = "registry+https://github.com/rust-lang/crates.io-index" 1044source = "registry+https://github.com/rust-lang/crates.io-index"
1028checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 1045checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
1029dependencies = [ 1046dependencies = [
1030 "displaydoc", 1047 "displaydoc",
1031 "litemap", 1048 "litemap",
@@ -1035,30 +1052,10 @@ dependencies = [
1035] 1052]
1036 1053
1037[[package]] 1054[[package]]
1038name = "icu_locid_transform"
1039version = "1.5.0"
1040source = "registry+https://github.com/rust-lang/crates.io-index"
1041checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
1042dependencies = [
1043 "displaydoc",
1044 "icu_locid",
1045 "icu_locid_transform_data",
1046 "icu_provider",
1047 "tinystr",
1048 "zerovec",
1049]
1050
1051[[package]]
1052name = "icu_locid_transform_data"
1053version = "1.5.1"
1054source = "registry+https://github.com/rust-lang/crates.io-index"
1055checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d"
1056
1057[[package]]
1058name = "icu_normalizer" 1055name = "icu_normalizer"
1059version = "1.5.0" 1056version = "2.0.0"
1060source = "registry+https://github.com/rust-lang/crates.io-index" 1057source = "registry+https://github.com/rust-lang/crates.io-index"
1061checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 1058checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
1062dependencies = [ 1059dependencies = [
1063 "displaydoc", 1060 "displaydoc",
1064 "icu_collections", 1061 "icu_collections",
@@ -1066,68 +1063,55 @@ dependencies = [
1066 "icu_properties", 1063 "icu_properties",
1067 "icu_provider", 1064 "icu_provider",
1068 "smallvec", 1065 "smallvec",
1069 "utf16_iter",
1070 "utf8_iter",
1071 "write16",
1072 "zerovec", 1066 "zerovec",
1073] 1067]
1074 1068
1075[[package]] 1069[[package]]
1076name = "icu_normalizer_data" 1070name = "icu_normalizer_data"
1077version = "1.5.1" 1071version = "2.0.0"
1078source = "registry+https://github.com/rust-lang/crates.io-index" 1072source = "registry+https://github.com/rust-lang/crates.io-index"
1079checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" 1073checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
1080 1074
1081[[package]] 1075[[package]]
1082name = "icu_properties" 1076name = "icu_properties"
1083version = "1.5.1" 1077version = "2.0.1"
1084source = "registry+https://github.com/rust-lang/crates.io-index" 1078source = "registry+https://github.com/rust-lang/crates.io-index"
1085checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 1079checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
1086dependencies = [ 1080dependencies = [
1087 "displaydoc", 1081 "displaydoc",
1088 "icu_collections", 1082 "icu_collections",
1089 "icu_locid_transform", 1083 "icu_locale_core",
1090 "icu_properties_data", 1084 "icu_properties_data",
1091 "icu_provider", 1085 "icu_provider",
1092 "tinystr", 1086 "potential_utf",
1087 "zerotrie",
1093 "zerovec", 1088 "zerovec",
1094] 1089]
1095 1090
1096[[package]] 1091[[package]]
1097name = "icu_properties_data" 1092name = "icu_properties_data"
1098version = "1.5.1" 1093version = "2.0.1"
1099source = "registry+https://github.com/rust-lang/crates.io-index" 1094source = "registry+https://github.com/rust-lang/crates.io-index"
1100checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" 1095checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
1101 1096
1102[[package]] 1097[[package]]
1103name = "icu_provider" 1098name = "icu_provider"
1104version = "1.5.0" 1099version = "2.0.0"
1105source = "registry+https://github.com/rust-lang/crates.io-index" 1100source = "registry+https://github.com/rust-lang/crates.io-index"
1106checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 1101checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
1107dependencies = [ 1102dependencies = [
1108 "displaydoc", 1103 "displaydoc",
1109 "icu_locid", 1104 "icu_locale_core",
1110 "icu_provider_macros",
1111 "stable_deref_trait", 1105 "stable_deref_trait",
1112 "tinystr", 1106 "tinystr",
1113 "writeable", 1107 "writeable",
1114 "yoke", 1108 "yoke",
1115 "zerofrom", 1109 "zerofrom",
1110 "zerotrie",
1116 "zerovec", 1111 "zerovec",
1117] 1112]
1118 1113
1119[[package]] 1114[[package]]
1120name = "icu_provider_macros"
1121version = "1.5.0"
1122source = "registry+https://github.com/rust-lang/crates.io-index"
1123checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
1124dependencies = [
1125 "proc-macro2",
1126 "quote",
1127 "syn",
1128]
1129
1130[[package]]
1131name = "idna" 1115name = "idna"
1132version = "1.0.3" 1116version = "1.0.3"
1133source = "registry+https://github.com/rust-lang/crates.io-index" 1117source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1140,9 +1124,9 @@ dependencies = [
1140 1124
1141[[package]] 1125[[package]]
1142name = "idna_adapter" 1126name = "idna_adapter"
1143version = "1.2.0" 1127version = "1.2.1"
1144source = "registry+https://github.com/rust-lang/crates.io-index" 1128source = "registry+https://github.com/rust-lang/crates.io-index"
1145checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 1129checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
1146dependencies = [ 1130dependencies = [
1147 "icu_normalizer", 1131 "icu_normalizer",
1148 "icu_properties", 1132 "icu_properties",
@@ -1150,9 +1134,9 @@ dependencies = [
1150 1134
1151[[package]] 1135[[package]]
1152name = "indexmap" 1136name = "indexmap"
1153version = "2.9.0" 1137version = "2.10.0"
1154source = "registry+https://github.com/rust-lang/crates.io-index" 1138source = "registry+https://github.com/rust-lang/crates.io-index"
1155checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 1139checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661"
1156dependencies = [ 1140dependencies = [
1157 "equivalent", 1141 "equivalent",
1158 "hashbrown", 1142 "hashbrown",
@@ -1160,14 +1144,14 @@ dependencies = [
1160 1144
1161[[package]] 1145[[package]]
1162name = "indicatif" 1146name = "indicatif"
1163version = "0.17.11" 1147version = "0.18.0"
1164source = "registry+https://github.com/rust-lang/crates.io-index" 1148source = "registry+https://github.com/rust-lang/crates.io-index"
1165checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" 1149checksum = "70a646d946d06bedbbc4cac4c218acf4bbf2d87757a784857025f4d447e4e1cd"
1166dependencies = [ 1150dependencies = [
1167 "console", 1151 "console 0.16.0",
1168 "number_prefix",
1169 "portable-atomic", 1152 "portable-atomic",
1170 "unicode-width", 1153 "unicode-width",
1154 "unit-prefix",
1171 "web-time", 1155 "web-time",
1172] 1156]
1173 1157
@@ -1194,12 +1178,33 @@ dependencies = [
1194] 1178]
1195 1179
1196[[package]] 1180[[package]]
1181name = "io-uring"
1182version = "0.7.8"
1183source = "registry+https://github.com/rust-lang/crates.io-index"
1184checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013"
1185dependencies = [
1186 "bitflags 2.9.1",
1187 "cfg-if",
1188 "libc",
1189]
1190
1191[[package]]
1197name = "ipnet" 1192name = "ipnet"
1198version = "2.11.0" 1193version = "2.11.0"
1199source = "registry+https://github.com/rust-lang/crates.io-index" 1194source = "registry+https://github.com/rust-lang/crates.io-index"
1200checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 1195checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
1201 1196
1202[[package]] 1197[[package]]
1198name = "iri-string"
1199version = "0.7.8"
1200source = "registry+https://github.com/rust-lang/crates.io-index"
1201checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2"
1202dependencies = [
1203 "memchr",
1204 "serde",
1205]
1206
1207[[package]]
1203name = "is_terminal_polyfill" 1208name = "is_terminal_polyfill"
1204version = "1.70.1" 1209version = "1.70.1"
1205source = "registry+https://github.com/rust-lang/crates.io-index" 1210source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1217,7 +1222,7 @@ version = "0.1.33"
1217source = "registry+https://github.com/rust-lang/crates.io-index" 1222source = "registry+https://github.com/rust-lang/crates.io-index"
1218checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" 1223checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a"
1219dependencies = [ 1224dependencies = [
1220 "getrandom 0.3.2", 1225 "getrandom 0.3.3",
1221 "libc", 1226 "libc",
1222] 1227]
1223 1228
@@ -1233,15 +1238,15 @@ dependencies = [
1233 1238
1234[[package]] 1239[[package]]
1235name = "libc" 1240name = "libc"
1236version = "0.2.172" 1241version = "0.2.174"
1237source = "registry+https://github.com/rust-lang/crates.io-index" 1242source = "registry+https://github.com/rust-lang/crates.io-index"
1238checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 1243checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
1239 1244
1240[[package]] 1245[[package]]
1241name = "libgit2-sys" 1246name = "libgit2-sys"
1242version = "0.18.1+1.9.0" 1247version = "0.18.2+1.9.1"
1243source = "registry+https://github.com/rust-lang/crates.io-index" 1248source = "registry+https://github.com/rust-lang/crates.io-index"
1244checksum = "e1dcb20f84ffcdd825c7a311ae347cce604a6f084a767dec4a4929829645290e" 1249checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222"
1245dependencies = [ 1250dependencies = [
1246 "cc", 1251 "cc",
1247 "libc", 1252 "libc",
@@ -1253,11 +1258,11 @@ dependencies = [
1253 1258
1254[[package]] 1259[[package]]
1255name = "libredox" 1260name = "libredox"
1256version = "0.1.3" 1261version = "0.1.4"
1257source = "registry+https://github.com/rust-lang/crates.io-index" 1262source = "registry+https://github.com/rust-lang/crates.io-index"
1258checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 1263checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638"
1259dependencies = [ 1264dependencies = [
1260 "bitflags 2.9.0", 1265 "bitflags 2.9.1",
1261 "libc", 1266 "libc",
1262] 1267]
1263 1268
@@ -1295,9 +1300,9 @@ checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
1295 1300
1296[[package]] 1301[[package]]
1297name = "litemap" 1302name = "litemap"
1298version = "0.7.5" 1303version = "0.8.0"
1299source = "registry+https://github.com/rust-lang/crates.io-index" 1304source = "registry+https://github.com/rust-lang/crates.io-index"
1300checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" 1305checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
1301 1306
1302[[package]] 1307[[package]]
1303name = "lmdb-master-sys" 1308name = "lmdb-master-sys"
@@ -1312,9 +1317,9 @@ dependencies = [
1312 1317
1313[[package]] 1318[[package]]
1314name = "lock_api" 1319name = "lock_api"
1315version = "0.4.12" 1320version = "0.4.13"
1316source = "registry+https://github.com/rust-lang/crates.io-index" 1321source = "registry+https://github.com/rust-lang/crates.io-index"
1317checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1322checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
1318dependencies = [ 1323dependencies = [
1319 "autocfg", 1324 "autocfg",
1320 "scopeguard", 1325 "scopeguard",
@@ -1328,40 +1333,40 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
1328 1333
1329[[package]] 1334[[package]]
1330name = "lru" 1335name = "lru"
1331version = "0.13.0" 1336version = "0.14.0"
1332source = "registry+https://github.com/rust-lang/crates.io-index" 1337source = "registry+https://github.com/rust-lang/crates.io-index"
1333checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" 1338checksum = "9f8cc7106155f10bdf99a6f379688f543ad6596a415375b36a59a054ceda1198"
1334 1339
1335[[package]] 1340[[package]]
1336name = "memchr" 1341name = "lru-slab"
1337version = "2.7.4" 1342version = "0.1.2"
1338source = "registry+https://github.com/rust-lang/crates.io-index" 1343source = "registry+https://github.com/rust-lang/crates.io-index"
1339checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1344checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
1340 1345
1341[[package]] 1346[[package]]
1342name = "mime" 1347name = "memchr"
1343version = "0.3.17" 1348version = "2.7.5"
1344source = "registry+https://github.com/rust-lang/crates.io-index" 1349source = "registry+https://github.com/rust-lang/crates.io-index"
1345checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1350checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
1346 1351
1347[[package]] 1352[[package]]
1348name = "miniz_oxide" 1353name = "miniz_oxide"
1349version = "0.8.8" 1354version = "0.8.9"
1350source = "registry+https://github.com/rust-lang/crates.io-index" 1355source = "registry+https://github.com/rust-lang/crates.io-index"
1351checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 1356checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
1352dependencies = [ 1357dependencies = [
1353 "adler2", 1358 "adler2",
1354] 1359]
1355 1360
1356[[package]] 1361[[package]]
1357name = "mio" 1362name = "mio"
1358version = "1.0.3" 1363version = "1.0.4"
1359source = "registry+https://github.com/rust-lang/crates.io-index" 1364source = "registry+https://github.com/rust-lang/crates.io-index"
1360checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1365checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
1361dependencies = [ 1366dependencies = [
1362 "libc", 1367 "libc",
1363 "wasi 0.11.0+wasi-snapshot-preview1", 1368 "wasi 0.11.1+wasi-snapshot-preview1",
1364 "windows-sys 0.52.0", 1369 "windows-sys 0.59.0",
1365] 1370]
1366 1371
1367[[package]] 1372[[package]]
@@ -1401,12 +1406,6 @@ dependencies = [
1401 1406
1402[[package]] 1407[[package]]
1403name = "negentropy" 1408name = "negentropy"
1404version = "0.3.1"
1405source = "registry+https://github.com/rust-lang/crates.io-index"
1406checksum = "e664971378a3987224f7a0e10059782035e89899ae403718ee07de85bec42afe"
1407
1408[[package]]
1409name = "negentropy"
1410version = "0.5.0" 1409version = "0.5.0"
1411source = "registry+https://github.com/rust-lang/crates.io-index" 1410source = "registry+https://github.com/rust-lang/crates.io-index"
1412checksum = "f0efe882e02d206d8d279c20eb40e03baf7cb5136a1476dc084a324fbc3ec42d" 1411checksum = "f0efe882e02d206d8d279c20eb40e03baf7cb5136a1476dc084a324fbc3ec42d"
@@ -1421,7 +1420,7 @@ dependencies = [
1421 "auth-git2", 1420 "auth-git2",
1422 "chacha20poly1305", 1421 "chacha20poly1305",
1423 "clap", 1422 "clap",
1424 "console", 1423 "console 0.16.0",
1425 "dialoguer", 1424 "dialoguer",
1426 "directories", 1425 "directories",
1427 "futures", 1426 "futures",
@@ -1454,16 +1453,16 @@ version = "0.27.1"
1454source = "registry+https://github.com/rust-lang/crates.io-index" 1453source = "registry+https://github.com/rust-lang/crates.io-index"
1455checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" 1454checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
1456dependencies = [ 1455dependencies = [
1457 "bitflags 2.9.0", 1456 "bitflags 2.9.1",
1458 "cfg-if", 1457 "cfg-if",
1459 "libc", 1458 "libc",
1460] 1459]
1461 1460
1462[[package]] 1461[[package]]
1463name = "nostr" 1462name = "nostr"
1464version = "0.41.0" 1463version = "0.42.2"
1465source = "registry+https://github.com/rust-lang/crates.io-index" 1464source = "registry+https://github.com/rust-lang/crates.io-index"
1466checksum = "95d3f2f0d564cce3ebe09bb1343af67d88c60108cedc518a307dfdf6e3f503b6" 1465checksum = "d193102a62a22b61f9a61b9df54fb19ebab8c1763d088fbb9a6f0f57000fba2d"
1467dependencies = [ 1466dependencies = [
1468 "aes", 1467 "aes",
1469 "base64", 1468 "base64",
@@ -1487,9 +1486,9 @@ dependencies = [
1487 1486
1488[[package]] 1487[[package]]
1489name = "nostr-connect" 1488name = "nostr-connect"
1490version = "0.41.0" 1489version = "0.42.0"
1491source = "registry+https://github.com/rust-lang/crates.io-index" 1490source = "registry+https://github.com/rust-lang/crates.io-index"
1492checksum = "387abe557e3e43f7704f3c77a9d728de0987108a7f0b5de84f2948310ada11b1" 1491checksum = "29bcce69dcfe07f399cba2f304b2b0662764eaf35b8e227049c063b1d2ec37d0"
1493dependencies = [ 1492dependencies = [
1494 "async-utility", 1493 "async-utility",
1495 "nostr", 1494 "nostr",
@@ -1500,9 +1499,9 @@ dependencies = [
1500 1499
1501[[package]] 1500[[package]]
1502name = "nostr-database" 1501name = "nostr-database"
1503version = "0.41.0" 1502version = "0.42.0"
1504source = "registry+https://github.com/rust-lang/crates.io-index" 1503source = "registry+https://github.com/rust-lang/crates.io-index"
1505checksum = "de6dc456a11d26f99a932b6531d94c20cb2e274ada6eab1d2438e2fb9c944af5" 1504checksum = "b6aafe85dc7c039c399796043b76009fa744c3a45ac073a023932f7b7d91b1e7"
1506dependencies = [ 1505dependencies = [
1507 "flatbuffers", 1506 "flatbuffers",
1508 "lru", 1507 "lru",
@@ -1512,9 +1511,9 @@ dependencies = [
1512 1511
1513[[package]] 1512[[package]]
1514name = "nostr-lmdb" 1513name = "nostr-lmdb"
1515version = "0.41.0" 1514version = "0.42.0"
1516source = "registry+https://github.com/rust-lang/crates.io-index" 1515source = "registry+https://github.com/rust-lang/crates.io-index"
1517checksum = "b0f371f08cef23050bd15deef5fbb34cb24a96314c47462d0b2b9ce7f0902ef1" 1516checksum = "ed36ce93b11d1dea86b50f26a5bcd7317f237915eeed3948cf52c036ba52872a"
1518dependencies = [ 1517dependencies = [
1519 "async-utility", 1518 "async-utility",
1520 "heed", 1519 "heed",
@@ -1526,16 +1525,15 @@ dependencies = [
1526 1525
1527[[package]] 1526[[package]]
1528name = "nostr-relay-pool" 1527name = "nostr-relay-pool"
1529version = "0.41.0" 1528version = "0.42.0"
1530source = "registry+https://github.com/rust-lang/crates.io-index" 1529source = "registry+https://github.com/rust-lang/crates.io-index"
1531checksum = "23994b7a613540de50d0b6ac5fcdfeb65d814b0dc5630875d3e1d3e8f05e8c7c" 1530checksum = "df4d5628d2444349570fb185b0c2d92cfdb7e68d62b13bf3e8a4348b5de7430b"
1532dependencies = [ 1531dependencies = [
1533 "async-utility", 1532 "async-utility",
1534 "async-wsocket", 1533 "async-wsocket",
1535 "atomic-destructor", 1534 "atomic-destructor",
1536 "lru", 1535 "lru",
1537 "negentropy 0.3.1", 1536 "negentropy",
1538 "negentropy 0.5.0",
1539 "nostr", 1537 "nostr",
1540 "nostr-database", 1538 "nostr-database",
1541 "tokio", 1539 "tokio",
@@ -1544,9 +1542,9 @@ dependencies = [
1544 1542
1545[[package]] 1543[[package]]
1546name = "nostr-sdk" 1544name = "nostr-sdk"
1547version = "0.41.0" 1545version = "0.42.0"
1548source = "registry+https://github.com/rust-lang/crates.io-index" 1546source = "registry+https://github.com/rust-lang/crates.io-index"
1549checksum = "58d201c49818ef560a67f9c26c415007da38b007943e7d1644ac55aa98c55a42" 1547checksum = "a1e928ba9ac2695fbe10b8aefda59f2abfeb23c10a0e86a0b3e0f6a27bb274a2"
1550dependencies = [ 1548dependencies = [
1551 "async-utility", 1549 "async-utility",
1552 "nostr", 1550 "nostr",
@@ -1557,12 +1555,6 @@ dependencies = [
1557] 1555]
1558 1556
1559[[package]] 1557[[package]]
1560name = "number_prefix"
1561version = "0.4.0"
1562source = "registry+https://github.com/rust-lang/crates.io-index"
1563checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
1564
1565[[package]]
1566name = "object" 1558name = "object"
1567version = "0.36.7" 1559version = "0.36.7"
1568source = "registry+https://github.com/rust-lang/crates.io-index" 1560source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1578,6 +1570,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1578checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1570checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
1579 1571
1580[[package]] 1572[[package]]
1573name = "once_cell_polyfill"
1574version = "1.70.1"
1575source = "registry+https://github.com/rust-lang/crates.io-index"
1576checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
1577
1578[[package]]
1581name = "opaque-debug" 1579name = "opaque-debug"
1582version = "0.3.1" 1580version = "0.3.1"
1583source = "registry+https://github.com/rust-lang/crates.io-index" 1581source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1591,18 +1589,18 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
1591 1589
1592[[package]] 1590[[package]]
1593name = "openssl-src" 1591name = "openssl-src"
1594version = "300.5.0+3.5.0" 1592version = "300.5.1+3.5.1"
1595source = "registry+https://github.com/rust-lang/crates.io-index" 1593source = "registry+https://github.com/rust-lang/crates.io-index"
1596checksum = "e8ce546f549326b0e6052b649198487d91320875da901e7bd11a06d1ee3f9c2f" 1594checksum = "735230c832b28c000e3bc117119e6466a663ec73506bc0a9907ea4187508e42a"
1597dependencies = [ 1595dependencies = [
1598 "cc", 1596 "cc",
1599] 1597]
1600 1598
1601[[package]] 1599[[package]]
1602name = "openssl-sys" 1600name = "openssl-sys"
1603version = "0.9.108" 1601version = "0.9.109"
1604source = "registry+https://github.com/rust-lang/crates.io-index" 1602source = "registry+https://github.com/rust-lang/crates.io-index"
1605checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" 1603checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571"
1606dependencies = [ 1604dependencies = [
1607 "cc", 1605 "cc",
1608 "libc", 1606 "libc",
@@ -1629,9 +1627,9 @@ dependencies = [
1629 1627
1630[[package]] 1628[[package]]
1631name = "parking_lot" 1629name = "parking_lot"
1632version = "0.12.3" 1630version = "0.12.4"
1633source = "registry+https://github.com/rust-lang/crates.io-index" 1631source = "registry+https://github.com/rust-lang/crates.io-index"
1634checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1632checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
1635dependencies = [ 1633dependencies = [
1636 "lock_api", 1634 "lock_api",
1637 "parking_lot_core", 1635 "parking_lot_core",
@@ -1639,9 +1637,9 @@ dependencies = [
1639 1637
1640[[package]] 1638[[package]]
1641name = "parking_lot_core" 1639name = "parking_lot_core"
1642version = "0.9.10" 1640version = "0.9.11"
1643source = "registry+https://github.com/rust-lang/crates.io-index" 1641source = "registry+https://github.com/rust-lang/crates.io-index"
1644checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1642checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
1645dependencies = [ 1643dependencies = [
1646 "cfg-if", 1644 "cfg-if",
1647 "libc", 1645 "libc",
@@ -1779,9 +1777,18 @@ dependencies = [
1779 1777
1780[[package]] 1778[[package]]
1781name = "portable-atomic" 1779name = "portable-atomic"
1782version = "1.11.0" 1780version = "1.11.1"
1781source = "registry+https://github.com/rust-lang/crates.io-index"
1782checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
1783
1784[[package]]
1785name = "potential_utf"
1786version = "0.1.2"
1783source = "registry+https://github.com/rust-lang/crates.io-index" 1787source = "registry+https://github.com/rust-lang/crates.io-index"
1784checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" 1788checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585"
1789dependencies = [
1790 "zerovec",
1791]
1785 1792
1786[[package]] 1793[[package]]
1787name = "ppv-lite86" 1794name = "ppv-lite86"
@@ -1842,9 +1849,9 @@ checksum = "d68782463e408eb1e668cf6152704bd856c78c5b6417adaee3203d8f4c1fc9ec"
1842 1849
1843[[package]] 1850[[package]]
1844name = "quinn" 1851name = "quinn"
1845version = "0.11.7" 1852version = "0.11.8"
1846source = "registry+https://github.com/rust-lang/crates.io-index" 1853source = "registry+https://github.com/rust-lang/crates.io-index"
1847checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" 1854checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8"
1848dependencies = [ 1855dependencies = [
1849 "bytes", 1856 "bytes",
1850 "cfg_aliases", 1857 "cfg_aliases",
@@ -1862,12 +1869,13 @@ dependencies = [
1862 1869
1863[[package]] 1870[[package]]
1864name = "quinn-proto" 1871name = "quinn-proto"
1865version = "0.11.11" 1872version = "0.11.12"
1866source = "registry+https://github.com/rust-lang/crates.io-index" 1873source = "registry+https://github.com/rust-lang/crates.io-index"
1867checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b" 1874checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e"
1868dependencies = [ 1875dependencies = [
1869 "bytes", 1876 "bytes",
1870 "getrandom 0.3.2", 1877 "getrandom 0.3.3",
1878 "lru-slab",
1871 "rand 0.9.1", 1879 "rand 0.9.1",
1872 "ring", 1880 "ring",
1873 "rustc-hash", 1881 "rustc-hash",
@@ -1882,9 +1890,9 @@ dependencies = [
1882 1890
1883[[package]] 1891[[package]]
1884name = "quinn-udp" 1892name = "quinn-udp"
1885version = "0.5.12" 1893version = "0.5.13"
1886source = "registry+https://github.com/rust-lang/crates.io-index" 1894source = "registry+https://github.com/rust-lang/crates.io-index"
1887checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" 1895checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970"
1888dependencies = [ 1896dependencies = [
1889 "cfg_aliases", 1897 "cfg_aliases",
1890 "libc", 1898 "libc",
@@ -1905,9 +1913,9 @@ dependencies = [
1905 1913
1906[[package]] 1914[[package]]
1907name = "r-efi" 1915name = "r-efi"
1908version = "5.2.0" 1916version = "5.3.0"
1909source = "registry+https://github.com/rust-lang/crates.io-index" 1917source = "registry+https://github.com/rust-lang/crates.io-index"
1910checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 1918checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
1911 1919
1912[[package]] 1920[[package]]
1913name = "rand" 1921name = "rand"
@@ -1965,7 +1973,7 @@ version = "0.9.3"
1965source = "registry+https://github.com/rust-lang/crates.io-index" 1973source = "registry+https://github.com/rust-lang/crates.io-index"
1966checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 1974checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
1967dependencies = [ 1975dependencies = [
1968 "getrandom 0.3.2", 1976 "getrandom 0.3.3",
1969] 1977]
1970 1978
1971[[package]] 1979[[package]]
@@ -2001,11 +2009,11 @@ dependencies = [
2001 2009
2002[[package]] 2010[[package]]
2003name = "redox_syscall" 2011name = "redox_syscall"
2004version = "0.5.12" 2012version = "0.5.13"
2005source = "registry+https://github.com/rust-lang/crates.io-index" 2013source = "registry+https://github.com/rust-lang/crates.io-index"
2006checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" 2014checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
2007dependencies = [ 2015dependencies = [
2008 "bitflags 2.9.0", 2016 "bitflags 2.9.1",
2009] 2017]
2010 2018
2011[[package]] 2019[[package]]
@@ -2050,30 +2058,25 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
2050 2058
2051[[package]] 2059[[package]]
2052name = "reqwest" 2060name = "reqwest"
2053version = "0.12.15" 2061version = "0.12.22"
2054source = "registry+https://github.com/rust-lang/crates.io-index" 2062source = "registry+https://github.com/rust-lang/crates.io-index"
2055checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" 2063checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531"
2056dependencies = [ 2064dependencies = [
2057 "base64", 2065 "base64",
2058 "bytes", 2066 "bytes",
2059 "futures-core", 2067 "futures-core",
2060 "futures-util",
2061 "http 1.3.1", 2068 "http 1.3.1",
2062 "http-body", 2069 "http-body",
2063 "http-body-util", 2070 "http-body-util",
2064 "hyper", 2071 "hyper",
2065 "hyper-rustls", 2072 "hyper-rustls",
2066 "hyper-util", 2073 "hyper-util",
2067 "ipnet",
2068 "js-sys", 2074 "js-sys",
2069 "log", 2075 "log",
2070 "mime",
2071 "once_cell",
2072 "percent-encoding", 2076 "percent-encoding",
2073 "pin-project-lite", 2077 "pin-project-lite",
2074 "quinn", 2078 "quinn",
2075 "rustls", 2079 "rustls",
2076 "rustls-pemfile",
2077 "rustls-pki-types", 2080 "rustls-pki-types",
2078 "serde", 2081 "serde",
2079 "serde_json", 2082 "serde_json",
@@ -2081,15 +2084,14 @@ dependencies = [
2081 "sync_wrapper", 2084 "sync_wrapper",
2082 "tokio", 2085 "tokio",
2083 "tokio-rustls", 2086 "tokio-rustls",
2084 "tokio-socks",
2085 "tower", 2087 "tower",
2088 "tower-http",
2086 "tower-service", 2089 "tower-service",
2087 "url", 2090 "url",
2088 "wasm-bindgen", 2091 "wasm-bindgen",
2089 "wasm-bindgen-futures", 2092 "wasm-bindgen-futures",
2090 "web-sys", 2093 "web-sys",
2091 "webpki-roots", 2094 "webpki-roots 1.0.1",
2092 "windows-registry",
2093] 2095]
2094 2096
2095[[package]] 2097[[package]]
@@ -2120,9 +2122,9 @@ dependencies = [
2120 2122
2121[[package]] 2123[[package]]
2122name = "rustc-demangle" 2124name = "rustc-demangle"
2123version = "0.1.24" 2125version = "0.1.25"
2124source = "registry+https://github.com/rust-lang/crates.io-index" 2126source = "registry+https://github.com/rust-lang/crates.io-index"
2125checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 2127checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f"
2126 2128
2127[[package]] 2129[[package]]
2128name = "rustc-hash" 2130name = "rustc-hash"
@@ -2141,22 +2143,22 @@ dependencies = [
2141 2143
2142[[package]] 2144[[package]]
2143name = "rustix" 2145name = "rustix"
2144version = "1.0.7" 2146version = "1.0.8"
2145source = "registry+https://github.com/rust-lang/crates.io-index" 2147source = "registry+https://github.com/rust-lang/crates.io-index"
2146checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" 2148checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
2147dependencies = [ 2149dependencies = [
2148 "bitflags 2.9.0", 2150 "bitflags 2.9.1",
2149 "errno", 2151 "errno",
2150 "libc", 2152 "libc",
2151 "linux-raw-sys", 2153 "linux-raw-sys",
2152 "windows-sys 0.59.0", 2154 "windows-sys 0.60.2",
2153] 2155]
2154 2156
2155[[package]] 2157[[package]]
2156name = "rustls" 2158name = "rustls"
2157version = "0.23.27" 2159version = "0.23.29"
2158source = "registry+https://github.com/rust-lang/crates.io-index" 2160source = "registry+https://github.com/rust-lang/crates.io-index"
2159checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" 2161checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1"
2160dependencies = [ 2162dependencies = [
2161 "once_cell", 2163 "once_cell",
2162 "ring", 2164 "ring",
@@ -2167,28 +2169,20 @@ dependencies = [
2167] 2169]
2168 2170
2169[[package]] 2171[[package]]
2170name = "rustls-pemfile"
2171version = "2.2.0"
2172source = "registry+https://github.com/rust-lang/crates.io-index"
2173checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
2174dependencies = [
2175 "rustls-pki-types",
2176]
2177
2178[[package]]
2179name = "rustls-pki-types" 2172name = "rustls-pki-types"
2180version = "1.11.0" 2173version = "1.12.0"
2181source = "registry+https://github.com/rust-lang/crates.io-index" 2174source = "registry+https://github.com/rust-lang/crates.io-index"
2182checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" 2175checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
2183dependencies = [ 2176dependencies = [
2184 "web-time", 2177 "web-time",
2178 "zeroize",
2185] 2179]
2186 2180
2187[[package]] 2181[[package]]
2188name = "rustls-webpki" 2182name = "rustls-webpki"
2189version = "0.103.2" 2183version = "0.103.4"
2190source = "registry+https://github.com/rust-lang/crates.io-index" 2184source = "registry+https://github.com/rust-lang/crates.io-index"
2191checksum = "7149975849f1abb3832b246010ef62ccc80d3a76169517ada7188252b9cfb437" 2185checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc"
2192dependencies = [ 2186dependencies = [
2193 "ring", 2187 "ring",
2194 "rustls-pki-types", 2188 "rustls-pki-types",
@@ -2197,9 +2191,9 @@ dependencies = [
2197 2191
2198[[package]] 2192[[package]]
2199name = "rustversion" 2193name = "rustversion"
2200version = "1.0.20" 2194version = "1.0.21"
2201source = "registry+https://github.com/rust-lang/crates.io-index" 2195source = "registry+https://github.com/rust-lang/crates.io-index"
2202checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 2196checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d"
2203 2197
2204[[package]] 2198[[package]]
2205name = "ryu" 2199name = "ryu"
@@ -2245,9 +2239,9 @@ dependencies = [
2245 2239
2246[[package]] 2240[[package]]
2247name = "sdd" 2241name = "sdd"
2248version = "3.0.8" 2242version = "3.0.9"
2249source = "registry+https://github.com/rust-lang/crates.io-index" 2243source = "registry+https://github.com/rust-lang/crates.io-index"
2250checksum = "584e070911c7017da6cb2eb0788d09f43d789029b5877d3e5ecc8acf86ceee21" 2244checksum = "62f5557d2bbddd5afd236ba7856b0e494f5acc7ce805bb0774cc5674b20a06b4"
2251 2245
2252[[package]] 2246[[package]]
2253name = "secp256k1" 2247name = "secp256k1"
@@ -2419,24 +2413,21 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
2419 2413
2420[[package]] 2414[[package]]
2421name = "slab" 2415name = "slab"
2422version = "0.4.9" 2416version = "0.4.10"
2423source = "registry+https://github.com/rust-lang/crates.io-index" 2417source = "registry+https://github.com/rust-lang/crates.io-index"
2424checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2418checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d"
2425dependencies = [
2426 "autocfg",
2427]
2428 2419
2429[[package]] 2420[[package]]
2430name = "smallvec" 2421name = "smallvec"
2431version = "1.15.0" 2422version = "1.15.1"
2432source = "registry+https://github.com/rust-lang/crates.io-index" 2423source = "registry+https://github.com/rust-lang/crates.io-index"
2433checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 2424checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
2434 2425
2435[[package]] 2426[[package]]
2436name = "socket2" 2427name = "socket2"
2437version = "0.5.9" 2428version = "0.5.10"
2438source = "registry+https://github.com/rust-lang/crates.io-index" 2429source = "registry+https://github.com/rust-lang/crates.io-index"
2439checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" 2430checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678"
2440dependencies = [ 2431dependencies = [
2441 "libc", 2432 "libc",
2442 "windows-sys 0.52.0", 2433 "windows-sys 0.52.0",
@@ -2480,9 +2471,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
2480 2471
2481[[package]] 2472[[package]]
2482name = "syn" 2473name = "syn"
2483version = "2.0.101" 2474version = "2.0.104"
2484source = "registry+https://github.com/rust-lang/crates.io-index" 2475source = "registry+https://github.com/rust-lang/crates.io-index"
2485checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" 2476checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40"
2486dependencies = [ 2477dependencies = [
2487 "proc-macro2", 2478 "proc-macro2",
2488 "quote", 2479 "quote",
@@ -2520,12 +2511,12 @@ dependencies = [
2520 2511
2521[[package]] 2512[[package]]
2522name = "tempfile" 2513name = "tempfile"
2523version = "3.19.1" 2514version = "3.20.0"
2524source = "registry+https://github.com/rust-lang/crates.io-index" 2515source = "registry+https://github.com/rust-lang/crates.io-index"
2525checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" 2516checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
2526dependencies = [ 2517dependencies = [
2527 "fastrand", 2518 "fastrand",
2528 "getrandom 0.3.2", 2519 "getrandom 0.3.3",
2529 "once_cell", 2520 "once_cell",
2530 "rustix", 2521 "rustix",
2531 "windows-sys 0.59.0", 2522 "windows-sys 0.59.0",
@@ -2562,13 +2553,13 @@ dependencies = [
2562 "nostr-lmdb", 2553 "nostr-lmdb",
2563 "nostr-sdk", 2554 "nostr-sdk",
2564 "once_cell", 2555 "once_cell",
2565 "rand 0.8.5", 2556 "rand 0.9.1",
2566 "rexpect", 2557 "rexpect",
2567 "sha2", 2558 "sha2",
2568 "simple-websockets", 2559 "simple-websockets",
2569 "strip-ansi-escapes", 2560 "strip-ansi-escapes",
2570 "tokio", 2561 "tokio",
2571 "tungstenite 0.20.1", 2562 "tungstenite 0.27.0",
2572] 2563]
2573 2564
2574[[package]] 2565[[package]]
@@ -2613,9 +2604,9 @@ dependencies = [
2613 2604
2614[[package]] 2605[[package]]
2615name = "tinystr" 2606name = "tinystr"
2616version = "0.7.6" 2607version = "0.8.1"
2617source = "registry+https://github.com/rust-lang/crates.io-index" 2608source = "registry+https://github.com/rust-lang/crates.io-index"
2618checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 2609checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
2619dependencies = [ 2610dependencies = [
2620 "displaydoc", 2611 "displaydoc",
2621 "zerovec", 2612 "zerovec",
@@ -2638,17 +2629,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
2638 2629
2639[[package]] 2630[[package]]
2640name = "tokio" 2631name = "tokio"
2641version = "1.45.0" 2632version = "1.46.1"
2642source = "registry+https://github.com/rust-lang/crates.io-index" 2633source = "registry+https://github.com/rust-lang/crates.io-index"
2643checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" 2634checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17"
2644dependencies = [ 2635dependencies = [
2645 "backtrace", 2636 "backtrace",
2646 "bytes", 2637 "bytes",
2638 "io-uring",
2647 "libc", 2639 "libc",
2648 "mio", 2640 "mio",
2649 "parking_lot", 2641 "parking_lot",
2650 "pin-project-lite", 2642 "pin-project-lite",
2651 "signal-hook-registry", 2643 "signal-hook-registry",
2644 "slab",
2652 "socket2", 2645 "socket2",
2653 "tokio-macros", 2646 "tokio-macros",
2654 "windows-sys 0.52.0", 2647 "windows-sys 0.52.0",
@@ -2712,7 +2705,7 @@ dependencies = [
2712 "tokio", 2705 "tokio",
2713 "tokio-rustls", 2706 "tokio-rustls",
2714 "tungstenite 0.26.2", 2707 "tungstenite 0.26.2",
2715 "webpki-roots", 2708 "webpki-roots 0.26.11",
2716] 2709]
2717 2710
2718[[package]] 2711[[package]]
@@ -2731,6 +2724,24 @@ dependencies = [
2731] 2724]
2732 2725
2733[[package]] 2726[[package]]
2727name = "tower-http"
2728version = "0.6.6"
2729source = "registry+https://github.com/rust-lang/crates.io-index"
2730checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
2731dependencies = [
2732 "bitflags 2.9.1",
2733 "bytes",
2734 "futures-util",
2735 "http 1.3.1",
2736 "http-body",
2737 "iri-string",
2738 "pin-project-lite",
2739 "tower",
2740 "tower-layer",
2741 "tower-service",
2742]
2743
2744[[package]]
2734name = "tower-layer" 2745name = "tower-layer"
2735version = "0.3.3" 2746version = "0.3.3"
2736source = "registry+https://github.com/rust-lang/crates.io-index" 2747source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2755,9 +2766,9 @@ dependencies = [
2755 2766
2756[[package]] 2767[[package]]
2757name = "tracing-attributes" 2768name = "tracing-attributes"
2758version = "0.1.28" 2769version = "0.1.30"
2759source = "registry+https://github.com/rust-lang/crates.io-index" 2770source = "registry+https://github.com/rust-lang/crates.io-index"
2760checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 2771checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
2761dependencies = [ 2772dependencies = [
2762 "proc-macro2", 2773 "proc-macro2",
2763 "quote", 2774 "quote",
@@ -2766,9 +2777,9 @@ dependencies = [
2766 2777
2767[[package]] 2778[[package]]
2768name = "tracing-core" 2779name = "tracing-core"
2769version = "0.1.33" 2780version = "0.1.34"
2770source = "registry+https://github.com/rust-lang/crates.io-index" 2781source = "registry+https://github.com/rust-lang/crates.io-index"
2771checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 2782checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
2772dependencies = [ 2783dependencies = [
2773 "once_cell", 2784 "once_cell",
2774] 2785]
@@ -2818,6 +2829,23 @@ dependencies = [
2818] 2829]
2819 2830
2820[[package]] 2831[[package]]
2832name = "tungstenite"
2833version = "0.27.0"
2834source = "registry+https://github.com/rust-lang/crates.io-index"
2835checksum = "eadc29d668c91fcc564941132e17b28a7ceb2f3ebf0b9dae3e03fd7a6748eb0d"
2836dependencies = [
2837 "bytes",
2838 "data-encoding",
2839 "http 1.3.1",
2840 "httparse",
2841 "log",
2842 "rand 0.9.1",
2843 "sha1",
2844 "thiserror 2.0.12",
2845 "utf-8",
2846]
2847
2848[[package]]
2821name = "typenum" 2849name = "typenum"
2822version = "1.18.0" 2850version = "1.18.0"
2823source = "registry+https://github.com/rust-lang/crates.io-index" 2851source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2831,18 +2859,24 @@ checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
2831 2859
2832[[package]] 2860[[package]]
2833name = "unicode-normalization" 2861name = "unicode-normalization"
2834version = "0.1.22" 2862version = "0.1.24"
2835source = "registry+https://github.com/rust-lang/crates.io-index" 2863source = "registry+https://github.com/rust-lang/crates.io-index"
2836checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 2864checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956"
2837dependencies = [ 2865dependencies = [
2838 "tinyvec", 2866 "tinyvec",
2839] 2867]
2840 2868
2841[[package]] 2869[[package]]
2842name = "unicode-width" 2870name = "unicode-width"
2843version = "0.2.0" 2871version = "0.2.1"
2872source = "registry+https://github.com/rust-lang/crates.io-index"
2873checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c"
2874
2875[[package]]
2876name = "unit-prefix"
2877version = "0.5.1"
2844source = "registry+https://github.com/rust-lang/crates.io-index" 2878source = "registry+https://github.com/rust-lang/crates.io-index"
2845checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" 2879checksum = "323402cff2dd658f39ca17c789b502021b3f18707c91cdf22e3838e1b4023817"
2846 2880
2847[[package]] 2881[[package]]
2848name = "universal-hash" 2882name = "universal-hash"
@@ -2891,12 +2925,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2891checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 2925checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
2892 2926
2893[[package]] 2927[[package]]
2894name = "utf16_iter"
2895version = "1.0.5"
2896source = "registry+https://github.com/rust-lang/crates.io-index"
2897checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
2898
2899[[package]]
2900name = "utf8_iter" 2928name = "utf8_iter"
2901version = "1.0.4" 2929version = "1.0.4"
2902source = "registry+https://github.com/rust-lang/crates.io-index" 2930source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2949,9 +2977,9 @@ dependencies = [
2949 2977
2950[[package]] 2978[[package]]
2951name = "wasi" 2979name = "wasi"
2952version = "0.11.0+wasi-snapshot-preview1" 2980version = "0.11.1+wasi-snapshot-preview1"
2953source = "registry+https://github.com/rust-lang/crates.io-index" 2981source = "registry+https://github.com/rust-lang/crates.io-index"
2954checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2982checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
2955 2983
2956[[package]] 2984[[package]]
2957name = "wasi" 2985name = "wasi"
@@ -3055,9 +3083,18 @@ dependencies = [
3055 3083
3056[[package]] 3084[[package]]
3057name = "webpki-roots" 3085name = "webpki-roots"
3058version = "0.26.10" 3086version = "0.26.11"
3059source = "registry+https://github.com/rust-lang/crates.io-index" 3087source = "registry+https://github.com/rust-lang/crates.io-index"
3060checksum = "37493cadf42a2a939ed404698ded7fb378bf301b5011f973361779a3a74f8c93" 3088checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9"
3089dependencies = [
3090 "webpki-roots 1.0.1",
3091]
3092
3093[[package]]
3094name = "webpki-roots"
3095version = "1.0.1"
3096source = "registry+https://github.com/rust-lang/crates.io-index"
3097checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502"
3061dependencies = [ 3098dependencies = [
3062 "rustls-pki-types", 3099 "rustls-pki-types",
3063] 3100]
@@ -3085,41 +3122,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3085checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3122checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
3086 3123
3087[[package]] 3124[[package]]
3088name = "windows-link"
3089version = "0.1.1"
3090source = "registry+https://github.com/rust-lang/crates.io-index"
3091checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
3092
3093[[package]]
3094name = "windows-registry"
3095version = "0.4.0"
3096source = "registry+https://github.com/rust-lang/crates.io-index"
3097checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3"
3098dependencies = [
3099 "windows-result",
3100 "windows-strings",
3101 "windows-targets 0.53.0",
3102]
3103
3104[[package]]
3105name = "windows-result"
3106version = "0.3.2"
3107source = "registry+https://github.com/rust-lang/crates.io-index"
3108checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252"
3109dependencies = [
3110 "windows-link",
3111]
3112
3113[[package]]
3114name = "windows-strings"
3115version = "0.3.1"
3116source = "registry+https://github.com/rust-lang/crates.io-index"
3117checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319"
3118dependencies = [
3119 "windows-link",
3120]
3121
3122[[package]]
3123name = "windows-sys" 3125name = "windows-sys"
3124version = "0.52.0" 3126version = "0.52.0"
3125source = "registry+https://github.com/rust-lang/crates.io-index" 3127source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3138,6 +3140,15 @@ dependencies = [
3138] 3140]
3139 3141
3140[[package]] 3142[[package]]
3143name = "windows-sys"
3144version = "0.60.2"
3145source = "registry+https://github.com/rust-lang/crates.io-index"
3146checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
3147dependencies = [
3148 "windows-targets 0.53.2",
3149]
3150
3151[[package]]
3141name = "windows-targets" 3152name = "windows-targets"
3142version = "0.52.6" 3153version = "0.52.6"
3143source = "registry+https://github.com/rust-lang/crates.io-index" 3154source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3155,9 +3166,9 @@ dependencies = [
3155 3166
3156[[package]] 3167[[package]]
3157name = "windows-targets" 3168name = "windows-targets"
3158version = "0.53.0" 3169version = "0.53.2"
3159source = "registry+https://github.com/rust-lang/crates.io-index" 3170source = "registry+https://github.com/rust-lang/crates.io-index"
3160checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" 3171checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef"
3161dependencies = [ 3172dependencies = [
3162 "windows_aarch64_gnullvm 0.53.0", 3173 "windows_aarch64_gnullvm 0.53.0",
3163 "windows_aarch64_msvc 0.53.0", 3174 "windows_aarch64_msvc 0.53.0",
@@ -3271,26 +3282,20 @@ version = "0.39.0"
3271source = "registry+https://github.com/rust-lang/crates.io-index" 3282source = "registry+https://github.com/rust-lang/crates.io-index"
3272checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 3283checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
3273dependencies = [ 3284dependencies = [
3274 "bitflags 2.9.0", 3285 "bitflags 2.9.1",
3275] 3286]
3276 3287
3277[[package]] 3288[[package]]
3278name = "write16"
3279version = "1.0.0"
3280source = "registry+https://github.com/rust-lang/crates.io-index"
3281checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
3282
3283[[package]]
3284name = "writeable" 3289name = "writeable"
3285version = "0.5.5" 3290version = "0.6.1"
3286source = "registry+https://github.com/rust-lang/crates.io-index" 3291source = "registry+https://github.com/rust-lang/crates.io-index"
3287checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 3292checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
3288 3293
3289[[package]] 3294[[package]]
3290name = "yoke" 3295name = "yoke"
3291version = "0.7.5" 3296version = "0.8.0"
3292source = "registry+https://github.com/rust-lang/crates.io-index" 3297source = "registry+https://github.com/rust-lang/crates.io-index"
3293checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 3298checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
3294dependencies = [ 3299dependencies = [
3295 "serde", 3300 "serde",
3296 "stable_deref_trait", 3301 "stable_deref_trait",
@@ -3300,9 +3305,9 @@ dependencies = [
3300 3305
3301[[package]] 3306[[package]]
3302name = "yoke-derive" 3307name = "yoke-derive"
3303version = "0.7.5" 3308version = "0.8.0"
3304source = "registry+https://github.com/rust-lang/crates.io-index" 3309source = "registry+https://github.com/rust-lang/crates.io-index"
3305checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 3310checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
3306dependencies = [ 3311dependencies = [
3307 "proc-macro2", 3312 "proc-macro2",
3308 "quote", 3313 "quote",
@@ -3312,18 +3317,18 @@ dependencies = [
3312 3317
3313[[package]] 3318[[package]]
3314name = "zerocopy" 3319name = "zerocopy"
3315version = "0.8.25" 3320version = "0.8.26"
3316source = "registry+https://github.com/rust-lang/crates.io-index" 3321source = "registry+https://github.com/rust-lang/crates.io-index"
3317checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" 3322checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
3318dependencies = [ 3323dependencies = [
3319 "zerocopy-derive", 3324 "zerocopy-derive",
3320] 3325]
3321 3326
3322[[package]] 3327[[package]]
3323name = "zerocopy-derive" 3328name = "zerocopy-derive"
3324version = "0.8.25" 3329version = "0.8.26"
3325source = "registry+https://github.com/rust-lang/crates.io-index" 3330source = "registry+https://github.com/rust-lang/crates.io-index"
3326checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" 3331checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
3327dependencies = [ 3332dependencies = [
3328 "proc-macro2", 3333 "proc-macro2",
3329 "quote", 3334 "quote",
@@ -3358,10 +3363,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3358checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 3363checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
3359 3364
3360[[package]] 3365[[package]]
3366name = "zerotrie"
3367version = "0.2.2"
3368source = "registry+https://github.com/rust-lang/crates.io-index"
3369checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
3370dependencies = [
3371 "displaydoc",
3372 "yoke",
3373 "zerofrom",
3374]
3375
3376[[package]]
3361name = "zerovec" 3377name = "zerovec"
3362version = "0.10.4" 3378version = "0.11.2"
3363source = "registry+https://github.com/rust-lang/crates.io-index" 3379source = "registry+https://github.com/rust-lang/crates.io-index"
3364checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 3380checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428"
3365dependencies = [ 3381dependencies = [
3366 "yoke", 3382 "yoke",
3367 "zerofrom", 3383 "zerofrom",
@@ -3370,9 +3386,9 @@ dependencies = [
3370 3386
3371[[package]] 3387[[package]]
3372name = "zerovec-derive" 3388name = "zerovec-derive"
3373version = "0.10.3" 3389version = "0.11.1"
3374source = "registry+https://github.com/rust-lang/crates.io-index" 3390source = "registry+https://github.com/rust-lang/crates.io-index"
3375checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 3391checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
3376dependencies = [ 3392dependencies = [
3377 "proc-macro2", 3393 "proc-macro2",
3378 "quote", 3394 "quote",
diff --git a/Cargo.toml b/Cargo.toml
index 41353c6..249fb02 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,37 +12,37 @@ keywords = ["nostr", "git"]
12categories = ["command-line-utilities","development-tools"] 12categories = ["command-line-utilities","development-tools"]
13 13
14[dependencies] 14[dependencies]
15anyhow = "1.0.75" 15anyhow = "1.0.98"
16async-trait = "0.1.73" 16async-trait = "0.1.88"
17auth-git2 = "0.5.4" 17auth-git2 = "0.5.8"
18chacha20poly1305 = "0.10.1" 18chacha20poly1305 = "0.10.1"
19clap = { version = "4.3.19", features = ["derive"] } 19clap = { version = "4.5.41", features = ["derive"] }
20console = "0.15.7" 20console = "0.16.0"
21dialoguer = "0.11.0" 21dialoguer = "0.11.0"
22directories = "6.0.0" 22directories = "6.0.0"
23futures = "0.3.28" 23futures = "0.3.31"
24git2 = "0.20.2" 24git2 = "0.20.2"
25indicatif = "0.17.7" 25indicatif = "0.18.0"
26nostr = { version = "0.41.0", features = ["nip05", "nip49"] } 26nostr = { version = "0.42.2", features = ["nip05", "nip49"] }
27nostr-connect = "0.41.0" 27nostr-connect = "0.42.0"
28nostr-database = "0.41.0" 28nostr-database = "0.42.0"
29nostr-lmdb = "0.41.0" 29nostr-lmdb = "0.42.0"
30nostr-relay-pool = "0.41.0" 30nostr-relay-pool = "0.42.0"
31nostr-sdk = "0.41.0" 31nostr-sdk = "0.42.0"
32passwords = "3.1.13" 32passwords = "3.1.16"
33qrcode = { version = "0.14.1", default-features = false } 33qrcode = { version = "0.14.1", default-features = false }
34scrypt = "0.11.0" 34scrypt = "0.11.0"
35serde = { version = "1.0.181", features = ["derive"] } 35serde = { version = "1.0.219", features = ["derive"] }
36serde_json = "1.0.105" 36serde_json = "1.0.140"
37serde_yaml = "0.9.27" 37serde_yaml = "0.9.34"
38tokio = { version = "1.40.0", features = ["full"] } 38tokio = { version = "1.46.1", features = ["full"] }
39urlencoding = "2.1.3" 39urlencoding = "2.1.3"
40zeroize = "1.6.0" 40zeroize = "1.8.1"
41 41
42[dev-dependencies] 42[dev-dependencies]
43assert_cmd = "2.0.12" 43assert_cmd = "2.0.17"
44mockall = "0.13.1" 44mockall = "0.13.1"
45once_cell = "1.18.0" 45once_cell = "1.21.3"
46serial_test = "3.2.0" 46serial_test = "3.2.0"
47test_utils = { path = "test_utils" } 47test_utils = { path = "test_utils" }
48 48
@@ -69,4 +69,4 @@ path = "src/bin/git_remote_nostr/main.rs"
69 69
70[profile.release] 70[profile.release]
71lto = true 71lto = true
72strip = "symbols" \ No newline at end of file 72strip = "symbols"
diff --git a/flake.lock b/flake.lock
index b89753c..6b8a5ab 100644
--- a/flake.lock
+++ b/flake.lock
@@ -20,11 +20,11 @@
20 }, 20 },
21 "nixpkgs": { 21 "nixpkgs": {
22 "locked": { 22 "locked": {
23 "lastModified": 1746141548, 23 "lastModified": 1752480373,
24 "narHash": "sha256-IgBWhX7A2oJmZFIrpRuMnw5RAufVnfvOgHWgIdds+hc=", 24 "narHash": "sha256-JHQbm+OcGp32wAsXTE/FLYGNpb+4GLi5oTvCxwSoBOA=",
25 "owner": "NixOS", 25 "owner": "NixOS",
26 "repo": "nixpkgs", 26 "repo": "nixpkgs",
27 "rev": "f02fddb8acef29a8b32f10a335d44828d7825b78", 27 "rev": "62e0f05ede1da0d54515d4ea8ce9c733f12d9f08",
28 "type": "github" 28 "type": "github"
29 }, 29 },
30 "original": { 30 "original": {
@@ -62,11 +62,11 @@
62 "nixpkgs": "nixpkgs_2" 62 "nixpkgs": "nixpkgs_2"
63 }, 63 },
64 "locked": { 64 "locked": {
65 "lastModified": 1746153335, 65 "lastModified": 1752633862,
66 "narHash": "sha256-vwKelhJJS8haCdH3t8uf96VFao7/YzJahPG5JLTO1PU=", 66 "narHash": "sha256-Bj7ozT1+5P7NmvDcuAXJvj56txcXuAhk3Vd9FdWFQzk=",
67 "owner": "oxalica", 67 "owner": "oxalica",
68 "repo": "rust-overlay", 68 "repo": "rust-overlay",
69 "rev": "ebc7823c3ffde594c7733113042b72694d996de9", 69 "rev": "8668ca94858206ac3db0860a9dec471de0d995f8",
70 "type": "github" 70 "type": "github"
71 }, 71 },
72 "original": { 72 "original": {
diff --git a/flake.nix b/flake.nix
index ff528e5..9ca8a7d 100644
--- a/flake.nix
+++ b/flake.nix
@@ -19,7 +19,7 @@
19 # ideally this wouldn't be pinned to a specific nightly version but 19 # ideally this wouldn't be pinned to a specific nightly version but
20 # selectLatestNightlyWith isn't support with mixed toolchains 20 # selectLatestNightlyWith isn't support with mixed toolchains
21 # https://github.com/oxalica/rust-overlay/issues/136 21 # https://github.com/oxalica/rust-overlay/issues/136
22 (lib.hiPrio rust-bin.nightly."2024-12-15".rustfmt) 22 (lib.hiPrio rust-bin.nightly."2025-07-16".rustfmt)
23 # (rust-bin.stable.latest.override { extensions = [ "rust-analyzer" ]; }) 23 # (rust-bin.stable.latest.override { extensions = [ "rust-analyzer" ]; })
24 rust-bin.stable.latest.default 24 rust-bin.stable.latest.default
25 ]; 25 ];
diff --git a/src/bin/git_remote_nostr/push.rs b/src/bin/git_remote_nostr/push.rs
index 04fc4d8..9ff8af0 100644
--- a/src/bin/git_remote_nostr/push.rs
+++ b/src/bin/git_remote_nostr/push.rs
@@ -1049,10 +1049,13 @@ async fn get_merged_status_events(
1049 let (ahead, _) = 1049 let (ahead, _) =
1050 git_repo.get_commits_ahead_behind(&tip_of_remote_branch, &tip_of_pushed_branch)?; 1050 git_repo.get_commits_ahead_behind(&tip_of_remote_branch, &tip_of_pushed_branch)?;
1051 1051
1052 let commit_events = get_events_from_local_cache(git_repo.get_path()?, vec![ 1052 let commit_events = get_events_from_local_cache(
1053 nostr::Filter::default().kind(nostr::Kind::GitPatch), 1053 git_repo.get_path()?,
1054 // TODO: limit by repo_ref 1054 vec![
1055 ]) 1055 nostr::Filter::default().kind(nostr::Kind::GitPatch),
1056 // TODO: limit by repo_ref
1057 ],
1058 )
1056 .await?; 1059 .await?;
1057 1060
1058 let merged_proposals_info = 1061 let merged_proposals_info =
@@ -1129,9 +1132,12 @@ async fn get_merged_proposals_info(
1129 proposals.entry(proposal_id).or_default(); 1132 proposals.entry(proposal_id).or_default();
1130 // ignore revisions without all the merged commits 1133 // ignore revisions without all the merged commits
1131 if entry_revision_id == &revision_id { 1134 if entry_revision_id == &revision_id {
1132 merged_patches.insert(*commit_hash, MergedPRCommitType::PatchCommit { 1135 merged_patches.insert(
1133 event_id: patch_event.id, 1136 *commit_hash,
1134 }); 1137 MergedPRCommitType::PatchCommit {
1138 event_id: patch_event.id,
1139 },
1140 );
1135 } 1141 }
1136 } 1142 }
1137 } 1143 }
@@ -1156,9 +1162,12 @@ async fn get_merged_proposals_info(
1156 proposals.entry(proposal_id).or_default(); 1162 proposals.entry(proposal_id).or_default();
1157 // ignore revisions without all the applied commits 1163 // ignore revisions without all the applied commits
1158 if entry_revision_id == &revision_id { 1164 if entry_revision_id == &revision_id {
1159 merged_patches.insert(*commit_hash, MergedPRCommitType::PatchApplied { 1165 merged_patches.insert(
1160 event_id: patch_event.id, 1166 *commit_hash,
1161 }); 1167 MergedPRCommitType::PatchApplied {
1168 event_id: patch_event.id,
1169 },
1170 );
1162 } 1171 }
1163 } 1172 }
1164 } 1173 }
@@ -1405,9 +1414,10 @@ async fn get_proposal_and_revision_root_from_patch(
1405 .clone(), 1414 .clone(),
1406 )?; 1415 )?;
1407 1416
1408 get_events_from_local_cache(git_repo.get_path()?, vec![ 1417 get_events_from_local_cache(
1409 nostr::Filter::default().id(proposal_or_revision_id), 1418 git_repo.get_path()?,
1410 ]) 1419 vec![nostr::Filter::default().id(proposal_or_revision_id)],
1420 )
1411 .await? 1421 .await?
1412 .first() 1422 .first()
1413 .unwrap() 1423 .unwrap()
diff --git a/src/bin/git_remote_nostr/utils.rs b/src/bin/git_remote_nostr/utils.rs
index f7e688e..dc75872 100644
--- a/src/bin/git_remote_nostr/utils.rs
+++ b/src/bin/git_remote_nostr/utils.rs
@@ -108,11 +108,14 @@ pub async fn get_open_or_draft_proposals(
108 .collect(); 108 .collect();
109 109
110 let statuses: Vec<nostr::Event> = { 110 let statuses: Vec<nostr::Event> = {
111 let mut statuses = get_events_from_local_cache(git_repo_path, vec![ 111 let mut statuses = get_events_from_local_cache(
112 nostr::Filter::default() 112 git_repo_path,
113 .kinds(status_kinds().clone()) 113 vec![
114 .events(proposals.iter().map(|e| e.id)), 114 nostr::Filter::default()
115 ]) 115 .kinds(status_kinds().clone())
116 .events(proposals.iter().map(|e| e.id)),
117 ],
118 )
116 .await?; 119 .await?;
117 statuses.sort_by_key(|e| e.created_at); 120 statuses.sort_by_key(|e| e.created_at);
118 statuses.reverse(); 121 statuses.reverse();
diff --git a/src/bin/ngit/sub_commands/list.rs b/src/bin/ngit/sub_commands/list.rs
index 2c91e66..0330be1 100644
--- a/src/bin/ngit/sub_commands/list.rs
+++ b/src/bin/ngit/sub_commands/list.rs
@@ -49,11 +49,14 @@ pub async fn launch() -> Result<()> {
49 } 49 }
50 50
51 let statuses: Vec<nostr::Event> = { 51 let statuses: Vec<nostr::Event> = {
52 let mut statuses = get_events_from_local_cache(git_repo_path, vec![ 52 let mut statuses = get_events_from_local_cache(
53 nostr::Filter::default() 53 git_repo_path,
54 .kinds(status_kinds().clone()) 54 vec![
55 .events(proposals_and_revisions.iter().map(|e| e.id)), 55 nostr::Filter::default()
56 ]) 56 .kinds(status_kinds().clone())
57 .events(proposals_and_revisions.iter().map(|e| e.id)),
58 ],
59 )
57 .await?; 60 .await?;
58 statuses.sort_by_key(|e| e.created_at); 61 statuses.sort_by_key(|e| e.created_at);
59 statuses.reverse(); 62 statuses.reverse();
diff --git a/src/bin/ngit/sub_commands/send.rs b/src/bin/ngit/sub_commands/send.rs
index 5a5acc8..c84e339 100644
--- a/src/bin/ngit/sub_commands/send.rs
+++ b/src/bin/ngit/sub_commands/send.rs
@@ -378,9 +378,10 @@ async fn get_root_proposal_id_and_mentions_from_in_reply_to(
378 public_key: _, 378 public_key: _,
379 uppercase: false, 379 uppercase: false,
380 }) => { 380 }) => {
381 let events = get_events_from_local_cache(git_repo_path, vec![ 381 let events = get_events_from_local_cache(
382 nostr::Filter::new().id(*event_id), 382 git_repo_path,
383 ]) 383 vec![nostr::Filter::new().id(*event_id)],
384 )
384 .await?; 385 .await?;
385 386
386 if let Some(first) = events.iter().find(|e| e.id.eq(event_id)) { 387 if let Some(first) = events.iter().find(|e| e.id.eq(event_id)) {
diff --git a/src/lib/client.rs b/src/lib/client.rs
index 445bf77..9253022 100644
--- a/src/lib/client.rs
+++ b/src/lib/client.rs
@@ -794,8 +794,7 @@ pub async fn sign_event(
794 if signer.backend() == SignerBackend::NostrConnect { 794 if signer.backend() == SignerBackend::NostrConnect {
795 let term = console::Term::stderr(); 795 let term = console::Term::stderr();
796 term.write_line(&format!( 796 term.write_line(&format!(
797 "signing event ({}) with remote signer...", 797 "signing event ({description}) with remote signer..."
798 description
799 ))?; 798 ))?;
800 let event = signer 799 let event = signer
801 .sign_event(event_builder.build(signer.get_public_key().await?)) 800 .sign_event(event_builder.build(signer.get_public_key().await?))
@@ -1104,16 +1103,18 @@ pub async fn get_state_from_cache(
1104) -> Result<RepoState> { 1103) -> Result<RepoState> {
1105 if let Some(git_repo_path) = git_repo_path { 1104 if let Some(git_repo_path) = git_repo_path {
1106 RepoState::try_from( 1105 RepoState::try_from(
1107 get_events_from_local_cache(git_repo_path, vec![get_filter_state_events( 1106 get_events_from_local_cache(
1108 &repo_ref.coordinates(), 1107 git_repo_path,
1109 )]) 1108 vec![get_filter_state_events(&repo_ref.coordinates())],
1109 )
1110 .await?, 1110 .await?,
1111 ) 1111 )
1112 } else { 1112 } else {
1113 RepoState::try_from( 1113 RepoState::try_from(
1114 get_event_from_global_cache(git_repo_path, vec![get_filter_state_events( 1114 get_event_from_global_cache(
1115 &repo_ref.coordinates(), 1115 git_repo_path,
1116 )]) 1116 vec![get_filter_state_events(&repo_ref.coordinates())],
1117 )
1117 .await?, 1118 .await?,
1118 ) 1119 )
1119 } 1120 }
@@ -1179,17 +1180,20 @@ async fn create_relays_request(
1179 } 1180 }
1180 1181
1181 if let Some(git_repo_path) = git_repo_path { 1182 if let Some(git_repo_path) = git_repo_path {
1182 for event in &get_events_from_local_cache(git_repo_path, vec![ 1183 for event in &get_events_from_local_cache(
1183 nostr::Filter::default() 1184 git_repo_path,
1184 .kinds(vec![Kind::GitPatch]) 1185 vec![
1185 .custom_tags( 1186 nostr::Filter::default()
1186 SingleLetterTag::lowercase(nostr_sdk::Alphabet::A), 1187 .kinds(vec![Kind::GitPatch])
1187 repo_coordinates_without_relays 1188 .custom_tags(
1188 .iter() 1189 SingleLetterTag::lowercase(nostr_sdk::Alphabet::A),
1189 .map(|c| c.coordinate.to_string()) 1190 repo_coordinates_without_relays
1190 .collect::<Vec<String>>(), 1191 .iter()
1191 ), 1192 .map(|c| c.coordinate.to_string())
1192 ]) 1193 .collect::<Vec<String>>(),
1194 ),
1195 ],
1196 )
1193 .await? 1197 .await?
1194 { 1198 {
1195 if event_is_patch_set_root(event) || event_is_revision_root(event) { 1199 if event_is_patch_set_root(event) || event_is_revision_root(event) {
@@ -1199,11 +1203,11 @@ async fn create_relays_request(
1199 } 1203 }
1200 } 1204 }
1201 1205
1202 let profile_events = 1206 let profile_events = get_event_from_global_cache(
1203 get_event_from_global_cache(git_repo_path, vec![get_filter_contributor_profiles( 1207 git_repo_path,
1204 contributors.clone(), 1208 vec![get_filter_contributor_profiles(contributors.clone())],
1205 )]) 1209 )
1206 .await?; 1210 .await?;
1207 for c in &contributors { 1211 for c in &contributors {
1208 if let Some(event) = profile_events 1212 if let Some(event) = profile_events
1209 .iter() 1213 .iter()
@@ -1769,17 +1773,20 @@ pub async fn get_proposals_and_revisions_from_cache(
1769 git_repo_path: &Path, 1773 git_repo_path: &Path,
1770 repo_coordinates: HashSet<Nip19Coordinate>, 1774 repo_coordinates: HashSet<Nip19Coordinate>,
1771) -> Result<Vec<nostr::Event>> { 1775) -> Result<Vec<nostr::Event>> {
1772 let mut proposals = get_events_from_local_cache(git_repo_path, vec![ 1776 let mut proposals = get_events_from_local_cache(
1773 nostr::Filter::default() 1777 git_repo_path,
1774 .kind(nostr::Kind::GitPatch) 1778 vec![
1775 .custom_tags( 1779 nostr::Filter::default()
1776 nostr::SingleLetterTag::lowercase(nostr_sdk::Alphabet::A), 1780 .kind(nostr::Kind::GitPatch)
1777 repo_coordinates 1781 .custom_tags(
1778 .iter() 1782 nostr::SingleLetterTag::lowercase(nostr_sdk::Alphabet::A),
1779 .map(|c| c.coordinate.to_string()) 1783 repo_coordinates
1780 .collect::<Vec<String>>(), 1784 .iter()
1781 ), 1785 .map(|c| c.coordinate.to_string())
1782 ]) 1786 .collect::<Vec<String>>(),
1787 ),
1788 ],
1789 )
1783 .await? 1790 .await?
1784 .iter() 1791 .iter()
1785 .filter(|e| event_is_patch_set_root(e)) 1792 .filter(|e| event_is_patch_set_root(e))
@@ -1795,23 +1802,29 @@ pub async fn get_all_proposal_patch_events_from_cache(
1795 repo_ref: &RepoRef, 1802 repo_ref: &RepoRef,
1796 proposal_id: &nostr::EventId, 1803 proposal_id: &nostr::EventId,
1797) -> Result<Vec<nostr::Event>> { 1804) -> Result<Vec<nostr::Event>> {
1798 let mut commit_events = get_events_from_local_cache(git_repo_path, vec![ 1805 let mut commit_events = get_events_from_local_cache(
1799 nostr::Filter::default() 1806 git_repo_path,
1800 .kind(nostr::Kind::GitPatch) 1807 vec![
1801 .event(*proposal_id), 1808 nostr::Filter::default()
1802 nostr::Filter::default() 1809 .kind(nostr::Kind::GitPatch)
1803 .kind(nostr::Kind::GitPatch) 1810 .event(*proposal_id),
1804 .id(*proposal_id), 1811 nostr::Filter::default()
1805 ]) 1812 .kind(nostr::Kind::GitPatch)
1813 .id(*proposal_id),
1814 ],
1815 )
1806 .await?; 1816 .await?;
1807 1817
1808 let permissioned_users: HashSet<PublicKey> = [repo_ref.maintainers.clone(), vec![ 1818 let permissioned_users: HashSet<PublicKey> = [
1809 commit_events 1819 repo_ref.maintainers.clone(),
1810 .iter() 1820 vec![
1811 .find(|e| e.id.eq(proposal_id)) 1821 commit_events
1812 .context("proposal not in cache")? 1822 .iter()
1813 .pubkey, 1823 .find(|e| e.id.eq(proposal_id))
1814 ]] 1824 .context("proposal not in cache")?
1825 .pubkey,
1826 ],
1827 ]
1815 .concat() 1828 .concat()
1816 .iter() 1829 .iter()
1817 .copied() 1830 .copied()
@@ -1825,12 +1838,15 @@ pub async fn get_all_proposal_patch_events_from_cache(
1825 .collect(); 1838 .collect();
1826 1839
1827 if !revision_roots.is_empty() { 1840 if !revision_roots.is_empty() {
1828 for event in get_events_from_local_cache(git_repo_path, vec![ 1841 for event in get_events_from_local_cache(
1829 nostr::Filter::default() 1842 git_repo_path,
1830 .kind(nostr::Kind::GitPatch) 1843 vec![
1831 .events(revision_roots) 1844 nostr::Filter::default()
1832 .authors(permissioned_users.clone()), 1845 .kind(nostr::Kind::GitPatch)
1833 ]) 1846 .events(revision_roots)
1847 .authors(permissioned_users.clone()),
1848 ],
1849 )
1834 .await? 1850 .await?
1835 { 1851 {
1836 commit_events.push(event); 1852 commit_events.push(event);
@@ -1845,9 +1861,10 @@ pub async fn get_all_proposal_patch_events_from_cache(
1845} 1861}
1846 1862
1847pub async fn get_event_from_cache_by_id(git_repo: &Repo, event_id: &EventId) -> Result<Event> { 1863pub async fn get_event_from_cache_by_id(git_repo: &Repo, event_id: &EventId) -> Result<Event> {
1848 Ok(get_events_from_local_cache(git_repo.get_path()?, vec![ 1864 Ok(get_events_from_local_cache(
1849 nostr::Filter::default().id(*event_id), 1865 git_repo.get_path()?,
1850 ]) 1866 vec![nostr::Filter::default().id(*event_id)],
1867 )
1851 .await? 1868 .await?
1852 .first() 1869 .first()
1853 .context("failed to find event in cache")? 1870 .context("failed to find event in cache")?
diff --git a/src/lib/git/identify_ahead_behind.rs b/src/lib/git/identify_ahead_behind.rs
index baea687..d736522 100644
--- a/src/lib/git/identify_ahead_behind.rs
+++ b/src/lib/git/identify_ahead_behind.rs
@@ -184,10 +184,10 @@ mod tests {
184 identify_ahead_behind(&git_repo, &Some("feature".to_string()), &None)?; 184 identify_ahead_behind(&git_repo, &Some("feature".to_string()), &None)?;
185 185
186 assert_eq!(from_branch, "feature"); 186 assert_eq!(from_branch, "feature");
187 assert_eq!(ahead, vec![ 187 assert_eq!(
188 oid_to_sha1(&feature_oid), 188 ahead,
189 oid_to_sha1(&dev_oid_first) 189 vec![oid_to_sha1(&feature_oid), oid_to_sha1(&dev_oid_first)]
190 ]); 190 );
191 assert_eq!(to_branch, "main"); 191 assert_eq!(to_branch, "main");
192 assert_eq!(behind, vec![]); 192 assert_eq!(behind, vec![]);
193 193
diff --git a/src/lib/git/mod.rs b/src/lib/git/mod.rs
index 0256457..d4bf2f5 100644
--- a/src/lib/git/mod.rs
+++ b/src/lib/git/mod.rs
@@ -888,7 +888,7 @@ pub fn save_git_config_item(git_repo: &Option<&Repo>, item: &str, value: &str) -
888 git2::Config::open_default()? 888 git2::Config::open_default()?
889 .open_global()? 889 .open_global()?
890 .set_str(item, value) 890 .set_str(item, value)
891 .context(format!("failed to set global git config item {}", item)) 891 .context(format!("failed to set global git config item {item}"))
892 } 892 }
893} 893}
894 894
@@ -901,10 +901,7 @@ pub fn remove_git_config_item(git_repo: &Option<&Repo>, item: &str) -> Result<bo
901 git2::Config::open_default()? 901 git2::Config::open_default()?
902 .open_global()? 902 .open_global()?
903 .remove(item) 903 .remove(item)
904 .context(format!( 904 .context(format!("failed to remove existing git config item {item}"))?;
905 "failed to remove existing git config item {}",
906 item
907 ))?;
908 Ok(true) 905 Ok(true)
909 } 906 }
910} 907}
@@ -1271,7 +1268,7 @@ mod tests {
1271 +some content1\n\\ \ 1268 +some content1\n\\ \
1272 No newline at end of file\n\ 1269 No newline at end of file\n\
1273 --\n\ 1270 --\n\
1274 libgit2 1.9.0\n\ 1271 libgit2 1.9.1\n\
1275 \n\ 1272 \n\
1276 ", 1273 ",
1277 git_repo.make_patch_from_commit(&oid_to_sha1(&oid), &None)?, 1274 git_repo.make_patch_from_commit(&oid_to_sha1(&oid), &None)?,
@@ -1307,7 +1304,7 @@ mod tests {
1307 +some content1\n\\ \ 1304 +some content1\n\\ \
1308 No newline at end of file\n\ 1305 No newline at end of file\n\
1309 --\n\ 1306 --\n\
1310 libgit2 1.9.0\n\ 1307 libgit2 1.9.1\n\
1311 \n\ 1308 \n\
1312 ", 1309 ",
1313 git_repo.make_patch_from_commit(&oid_to_sha1(&oid), &Some((3, 5)))?, 1310 git_repo.make_patch_from_commit(&oid_to_sha1(&oid), &Some((3, 5)))?,
@@ -1493,10 +1490,10 @@ mod tests {
1493 &oid_to_sha1(&feature_oid), 1490 &oid_to_sha1(&feature_oid),
1494 )?; 1491 )?;
1495 assert_eq!(ahead, vec![]); 1492 assert_eq!(ahead, vec![]);
1496 assert_eq!(behind, vec![ 1493 assert_eq!(
1497 oid_to_sha1(&behind_2_oid), 1494 behind,
1498 oid_to_sha1(&behind_1_oid), 1495 vec![oid_to_sha1(&behind_2_oid), oid_to_sha1(&behind_1_oid),],
1499 ],); 1496 );
1500 Ok(()) 1497 Ok(())
1501 } 1498 }
1502 1499
@@ -1518,10 +1515,10 @@ mod tests {
1518 &oid_to_sha1(&main_oid), 1515 &oid_to_sha1(&main_oid),
1519 &oid_to_sha1(&ahead_2_oid), 1516 &oid_to_sha1(&ahead_2_oid),
1520 )?; 1517 )?;
1521 assert_eq!(ahead, vec![ 1518 assert_eq!(
1522 oid_to_sha1(&ahead_2_oid), 1519 ahead,
1523 oid_to_sha1(&ahead_1_oid), 1520 vec![oid_to_sha1(&ahead_2_oid), oid_to_sha1(&ahead_1_oid),],
1524 ],); 1521 );
1525 assert_eq!(behind, vec![]); 1522 assert_eq!(behind, vec![]);
1526 Ok(()) 1523 Ok(())
1527 } 1524 }
@@ -1550,14 +1547,14 @@ mod tests {
1550 &oid_to_sha1(&behind_2_oid), 1547 &oid_to_sha1(&behind_2_oid),
1551 &oid_to_sha1(&ahead_2_oid), 1548 &oid_to_sha1(&ahead_2_oid),
1552 )?; 1549 )?;
1553 assert_eq!(ahead, vec![ 1550 assert_eq!(
1554 oid_to_sha1(&ahead_2_oid), 1551 ahead,
1555 oid_to_sha1(&ahead_1_oid) 1552 vec![oid_to_sha1(&ahead_2_oid), oid_to_sha1(&ahead_1_oid)],
1556 ],); 1553 );
1557 assert_eq!(behind, vec![ 1554 assert_eq!(
1558 oid_to_sha1(&behind_2_oid), 1555 behind,
1559 oid_to_sha1(&behind_1_oid) 1556 vec![oid_to_sha1(&behind_2_oid), oid_to_sha1(&behind_1_oid)],
1560 ],); 1557 );
1561 Ok(()) 1558 Ok(())
1562 } 1559 }
1563 } 1560 }
@@ -2212,9 +2209,10 @@ mod tests {
2212 test_repo.populate_with_test_branch()?; 2209 test_repo.populate_with_test_branch()?;
2213 test_repo.checkout("main")?; 2210 test_repo.checkout("main")?;
2214 2211
2215 assert_eq!(git_repo.parse_starting_commits("HEAD~1")?, vec![ 2212 assert_eq!(
2216 str_to_sha1("431b84edc0d2fa118d63faa3c2db9c73d630a5ae")? 2213 git_repo.parse_starting_commits("HEAD~1")?,
2217 ],); 2214 vec![str_to_sha1("431b84edc0d2fa118d63faa3c2db9c73d630a5ae")?],
2215 );
2218 Ok(()) 2216 Ok(())
2219 } 2217 }
2220 2218
@@ -2224,9 +2222,10 @@ mod tests {
2224 let git_repo = Repo::from_path(&test_repo.dir)?; 2222 let git_repo = Repo::from_path(&test_repo.dir)?;
2225 test_repo.populate_with_test_branch()?; 2223 test_repo.populate_with_test_branch()?;
2226 2224
2227 assert_eq!(git_repo.parse_starting_commits("HEAD~1")?, vec![ 2225 assert_eq!(
2228 str_to_sha1("82ff2bcc9aa94d1bd8faee723d4c8cc190d6061c")? 2226 git_repo.parse_starting_commits("HEAD~1")?,
2229 ],); 2227 vec![str_to_sha1("82ff2bcc9aa94d1bd8faee723d4c8cc190d6061c")?],
2228 );
2230 Ok(()) 2229 Ok(())
2231 } 2230 }
2232 } 2231 }
@@ -2240,10 +2239,13 @@ mod tests {
2240 test_repo.populate_with_test_branch()?; 2239 test_repo.populate_with_test_branch()?;
2241 test_repo.checkout("main")?; 2240 test_repo.checkout("main")?;
2242 2241
2243 assert_eq!(git_repo.parse_starting_commits("HEAD~2")?, vec![ 2242 assert_eq!(
2244 str_to_sha1("431b84edc0d2fa118d63faa3c2db9c73d630a5ae")?, 2243 git_repo.parse_starting_commits("HEAD~2")?,
2245 str_to_sha1("af474d8d271490e5c635aad337abdc050034b16a")?, 2244 vec![
2246 ],); 2245 str_to_sha1("431b84edc0d2fa118d63faa3c2db9c73d630a5ae")?,
2246 str_to_sha1("af474d8d271490e5c635aad337abdc050034b16a")?,
2247 ],
2248 );
2247 Ok(()) 2249 Ok(())
2248 } 2250 }
2249 } 2251 }
@@ -2256,11 +2258,14 @@ mod tests {
2256 let git_repo = Repo::from_path(&test_repo.dir)?; 2258 let git_repo = Repo::from_path(&test_repo.dir)?;
2257 test_repo.populate_with_test_branch()?; 2259 test_repo.populate_with_test_branch()?;
2258 2260
2259 assert_eq!(git_repo.parse_starting_commits("HEAD~3")?, vec![ 2261 assert_eq!(
2260 str_to_sha1("82ff2bcc9aa94d1bd8faee723d4c8cc190d6061c")?, 2262 git_repo.parse_starting_commits("HEAD~3")?,
2261 str_to_sha1("a23e6b05aaeb7d1471b4a838b51f337d5644eeb0")?, 2263 vec![
2262 str_to_sha1("7ab82116068982671a8111f27dc10599172334b2")?, 2264 str_to_sha1("82ff2bcc9aa94d1bd8faee723d4c8cc190d6061c")?,
2263 ],); 2265 str_to_sha1("a23e6b05aaeb7d1471b4a838b51f337d5644eeb0")?,
2266 str_to_sha1("7ab82116068982671a8111f27dc10599172334b2")?,
2267 ],
2268 );
2264 Ok(()) 2269 Ok(())
2265 } 2270 }
2266 } 2271 }
@@ -2274,11 +2279,14 @@ mod tests {
2274 test_repo.populate_with_test_branch()?; 2279 test_repo.populate_with_test_branch()?;
2275 test_repo.checkout("main")?; 2280 test_repo.checkout("main")?;
2276 2281
2277 assert_eq!(git_repo.parse_starting_commits("af474d8..a23e6b0")?, vec![ 2282 assert_eq!(
2278 str_to_sha1("a23e6b05aaeb7d1471b4a838b51f337d5644eeb0")?, 2283 git_repo.parse_starting_commits("af474d8..a23e6b0")?,
2279 str_to_sha1("7ab82116068982671a8111f27dc10599172334b2")?, 2284 vec![
2280 str_to_sha1("431b84edc0d2fa118d63faa3c2db9c73d630a5ae")?, 2285 str_to_sha1("a23e6b05aaeb7d1471b4a838b51f337d5644eeb0")?,
2281 ],); 2286 str_to_sha1("7ab82116068982671a8111f27dc10599172334b2")?,
2287 str_to_sha1("431b84edc0d2fa118d63faa3c2db9c73d630a5ae")?,
2288 ],
2289 );
2282 Ok(()) 2290 Ok(())
2283 } 2291 }
2284 } 2292 }
diff --git a/src/lib/git/nostr_url.rs b/src/lib/git/nostr_url.rs
index a9b08eb..e9b482f 100644
--- a/src/lib/git/nostr_url.rs
+++ b/src/lib/git/nostr_url.rs
@@ -71,13 +71,13 @@ impl fmt::Display for NostrUrlDecoded {
71 } 71 }
72 write!(f, "nostr://")?; 72 write!(f, "nostr://")?;
73 if let Some(user) = &self.user { 73 if let Some(user) = &self.user {
74 write!(f, "{}@", user)?; 74 write!(f, "{user}@")?;
75 } 75 }
76 if let Some(protocol) = &self.protocol { 76 if let Some(protocol) = &self.protocol {
77 write!(f, "{}/", protocol)?; 77 write!(f, "{protocol}/")?;
78 } 78 }
79 if let Some(nip05) = &self.nip05 { 79 if let Some(nip05) = &self.nip05 {
80 write!(f, "{}/", nip05)?; 80 write!(f, "{nip05}/")?;
81 } else { 81 } else {
82 write!(f, "{}/", self.coordinate.public_key.to_bech32().unwrap())?; 82 write!(f, "{}/", self.coordinate.public_key.to_bech32().unwrap())?;
83 } 83 }
@@ -454,7 +454,7 @@ impl CloneUrl {
454 format!("{}@", user.as_deref().unwrap_or("git")).as_str(), 454 format!("{}@", user.as_deref().unwrap_or("git")).as_str(),
455 ); 455 );
456 if url.port().is_some() { 456 if url.port().is_some() {
457 formatted_url = format!("ssh://{}", formatted_url); 457 formatted_url = format!("ssh://{formatted_url}");
458 } else { 458 } else {
459 formatted_url = replace_first_occurrence(&formatted_url, '/', ':'); 459 formatted_url = replace_first_occurrence(&formatted_url, '/', ':');
460 } 460 }
diff --git a/src/lib/git_events.rs b/src/lib/git_events.rs
index 3ce7637..69406c1 100644
--- a/src/lib/git_events.rs
+++ b/src/lib/git_events.rs
@@ -134,14 +134,15 @@ pub async fn generate_patch_event(
134 // code that makes it into the main branch, assuming 134 // code that makes it into the main branch, assuming
135 // the commit id is correct 135 // the commit id is correct
136 Tag::from_standardized(TagStandard::Reference(commit.to_string())), 136 Tag::from_standardized(TagStandard::Reference(commit.to_string())),
137 Tag::custom(TagKind::Custom(std::borrow::Cow::Borrowed("alt")), vec![ 137 Tag::custom(
138 format!( 138 TagKind::Custom(std::borrow::Cow::Borrowed("alt")),
139 vec![format!(
139 "git patch: {}", 140 "git patch: {}",
140 git_repo 141 git_repo
141 .get_commit_message_summary(commit) 142 .get_commit_message_summary(commit)
142 .unwrap_or_default() 143 .unwrap_or_default()
143 ), 144 )],
144 ]), 145 ),
145 ], 146 ],
146 if let Some(thread_event_id) = thread_event_id { 147 if let Some(thread_event_id) = thread_event_id {
147 vec![Tag::from_standardized(nostr_sdk::TagStandard::Event { 148 vec![Tag::from_standardized(nostr_sdk::TagStandard::Event {
@@ -205,9 +206,10 @@ pub async fn generate_patch_event(
205 .collect(), 206 .collect(),
206 vec![ 207 vec![
207 // a fallback is now in place to extract this from the patch 208 // a fallback is now in place to extract this from the patch
208 Tag::custom(TagKind::Custom(std::borrow::Cow::Borrowed("commit")), vec![ 209 Tag::custom(
209 commit.to_string(), 210 TagKind::Custom(std::borrow::Cow::Borrowed("commit")),
210 ]), 211 vec![commit.to_string()],
212 ),
211 // this is required as patches cannot be relied upon to include the 'base 213 // this is required as patches cannot be relied upon to include the 'base
212 // commit' 214 // commit'
213 Tag::custom( 215 Tag::custom(
diff --git a/src/lib/login/fresh.rs b/src/lib/login/fresh.rs
index 683d4af..a169177 100644
--- a/src/lib/login/fresh.rs
+++ b/src/lib/login/fresh.rs
@@ -278,7 +278,7 @@ pub async fn get_fresh_nip46_signer(
278 let input = Interactor::default() 278 let input = Interactor::default()
279 .input( 279 .input(
280 PromptInputParms::default().with_prompt(if let Some(error) = error { 280 PromptInputParms::default().with_prompt(if let Some(error) = error {
281 format!("error: {}. try again with NIP-05 address", error) 281 format!("error: {error}. try again with NIP-05 address")
282 } else { 282 } else {
283 "NIP-05 address".to_string() 283 "NIP-05 address".to_string()
284 }), 284 }),
@@ -296,7 +296,7 @@ pub async fn get_fresh_nip46_signer(
296 let input = Interactor::default() 296 let input = Interactor::default()
297 .input( 297 .input(
298 PromptInputParms::default().with_prompt(if let Some(error) = error { 298 PromptInputParms::default().with_prompt(if let Some(error) = error {
299 format!("error: {}. try again with bunker url", error) 299 format!("error: {error}. try again with bunker url")
300 } else { 300 } else {
301 "bunker url".to_string() 301 "bunker url".to_string()
302 }), 302 }),
@@ -505,7 +505,7 @@ async fn save_to_git_config(
505 if let Err(error) = 505 if let Err(error) =
506 silently_save_to_git_config(git_repo, signer_info, global).context(err_msg.clone()) 506 silently_save_to_git_config(git_repo, signer_info, global).context(err_msg.clone())
507 { 507 {
508 eprintln!("Error: {:?}", error); 508 eprintln!("Error: {error:?}");
509 match signer_info { 509 match signer_info {
510 SignerInfo::Nsec { 510 SignerInfo::Nsec {
511 nsec, 511 nsec,
@@ -577,7 +577,7 @@ async fn save_to_git_config(
577 ), 577 ),
578 ) 578 )
579 { 579 {
580 eprintln!("Error: {:?}", error); 580 eprintln!("Error: {error:?}");
581 eprintln!("login details were not saved"); 581 eprintln!("login details were not saved");
582 } else { 582 } else {
583 eprintln!( 583 eprintln!(
diff --git a/src/lib/login/mod.rs b/src/lib/login/mod.rs
index bfc7328..3fcd755 100644
--- a/src/lib/login/mod.rs
+++ b/src/lib/login/mod.rs
@@ -79,11 +79,15 @@ fn print_logged_in_as(
79 "failed to find your relay list. consider using another nostr client to create one to enhance your nostr experience." 79 "failed to find your relay list. consider using another nostr client to create one to enhance your nostr experience."
80 ); 80 );
81 } 81 }
82 eprintln!("logged in as {}{}", user_ref.metadata.name, match source { 82 eprintln!(
83 SignerInfoSource::CommandLineArguments => " via cli arguments", 83 "logged in as {}{}",
84 SignerInfoSource::GitLocal => " to local repository", 84 user_ref.metadata.name,
85 SignerInfoSource::GitGlobal => "", 85 match source {
86 }); 86 SignerInfoSource::CommandLineArguments => " via cli arguments",
87 SignerInfoSource::GitLocal => " to local repository",
88 SignerInfoSource::GitGlobal => "",
89 }
90 );
87 Ok(()) 91 Ok(())
88} 92}
89 93
diff --git a/src/lib/repo_ref.rs b/src/lib/repo_ref.rs
index c1fc288..0236e34 100644
--- a/src/lib/repo_ref.rs
+++ b/src/lib/repo_ref.rs
@@ -578,11 +578,14 @@ pub fn save_repo_config_to_yaml(
578 .context("failed to convert public key into npub")?, 578 .context("failed to convert public key into npub")?,
579 ); 579 );
580 } 580 }
581 serde_yaml::to_writer(file, &RepoConfigYaml { 581 serde_yaml::to_writer(
582 identifier: Some(identifier), 582 file,
583 maintainers: maintainers_npubs, 583 &RepoConfigYaml {
584 relays, 584 identifier: Some(identifier),
585 }) 585 maintainers: maintainers_npubs,
586 relays,
587 },
588 )
586 .context("failed to write maintainers to maintainers.yaml file serde_yaml") 589 .context("failed to write maintainers to maintainers.yaml file serde_yaml")
587} 590}
588 591
diff --git a/src/lib/repo_state.rs b/src/lib/repo_state.rs
index 04f3cf2..345f05c 100644
--- a/src/lib/repo_state.rs
+++ b/src/lib/repo_state.rs
@@ -56,9 +56,10 @@ impl RepoState {
56 add_head(&mut state); 56 add_head(&mut state);
57 let mut tags = vec![Tag::identifier(identifier.clone())]; 57 let mut tags = vec![Tag::identifier(identifier.clone())];
58 for (name, value) in &state { 58 for (name, value) in &state {
59 tags.push(Tag::custom(nostr_sdk::TagKind::Custom(name.into()), vec![ 59 tags.push(Tag::custom(
60 value.clone(), 60 nostr_sdk::TagKind::Custom(name.into()),
61 ])); 61 vec![value.clone()],
62 ));
62 } 63 }
63 let event = sign_event( 64 let event = sign_event(
64 EventBuilder::new(STATE_KIND, "").tags(tags), 65 EventBuilder::new(STATE_KIND, "").tags(tags),
diff --git a/test_utils/Cargo.toml b/test_utils/Cargo.toml
index 2001733..8602416 100644
--- a/test_utils/Cargo.toml
+++ b/test_utils/Cargo.toml
@@ -4,21 +4,21 @@ version = "0.1.0"
4edition = "2021" 4edition = "2021"
5 5
6[dependencies] 6[dependencies]
7anyhow = "1.0.75" 7anyhow = "1.0.98"
8assert_cmd = "2.0.12" 8assert_cmd = "2.0.17"
9dialoguer = "0.11.0" 9dialoguer = "0.11.0"
10directories = "6.0.0" 10directories = "6.0.0"
11futures = "0.3.28" 11futures = "0.3.31"
12git2 = "0.20.2" 12git2 = "0.20.2"
13nostr = "0.41.0" 13nostr = "0.42.2"
14nostr-database = "0.41.0" 14nostr-database = "0.42.0"
15nostr-lmdb = "0.41.0" 15nostr-lmdb = "0.42.0"
16nostr-sdk = "0.41.0" 16nostr-sdk = "0.42.0"
17once_cell = "1.18.0" 17once_cell = "1.21.3"
18rand = "0.8" 18rand = "0.9"
19rexpect = { git = "https://github.com/rust-cli/rexpect.git", rev = "9eb61dd" } 19rexpect = { git = "https://github.com/rust-cli/rexpect.git", rev = "9eb61dd" }
20simple-websockets = { git = "https://github.com/DanConwayDev/simple-websockets", branch= "auto-release-port" } 20simple-websockets = { git = "https://github.com/DanConwayDev/simple-websockets", branch= "auto-release-port" }
21strip-ansi-escapes = "0.2.0" 21strip-ansi-escapes = "0.2.1"
22tokio = { version = "1.40.0", features = ["full"] } 22tokio = { version = "1.46.1", features = ["full"] }
23tungstenite = "0.20.1" 23tungstenite = "0.27.0"
24sha2 = "0.10" \ No newline at end of file 24sha2 = "0.10"
diff --git a/test_utils/src/lib.rs b/test_utils/src/lib.rs
index 5feb64b..7d79cff 100644
--- a/test_utils/src/lib.rs
+++ b/test_utils/src/lib.rs
@@ -167,7 +167,7 @@ pub fn generate_repo_ref_event_with_git_server_with_keys(
167 .tags([ 167 .tags([
168 Tag::identifier( 168 Tag::identifier(
169 // root_commit.to_string() 169 // root_commit.to_string()
170 format!("{}-consider-it-random", root_commit), 170 format!("{root_commit}-consider-it-random"),
171 ), 171 ),
172 Tag::from_standardized(TagStandard::Reference(root_commit.to_string())), 172 Tag::from_standardized(TagStandard::Reference(root_commit.to_string())),
173 Tag::from_standardized(TagStandard::Name("example name".into())), 173 Tag::from_standardized(TagStandard::Name("example name".into())),
@@ -544,10 +544,14 @@ impl CliTesterConfirmPrompt<'_> {
544 let mut s = String::new(); 544 let mut s = String::new();
545 self.tester 545 self.tester
546 .formatter 546 .formatter
547 .format_confirm_prompt_selection(&mut s, self.prompt.as_str(), match input { 547 .format_confirm_prompt_selection(
548 None => self.default, 548 &mut s,
549 Some(_) => input, 549 self.prompt.as_str(),
550 }) 550 match input {
551 None => self.default,
552 Some(_) => input,
553 },
554 )
551 .expect("diagluer theme formatter should succeed"); 555 .expect("diagluer theme formatter should succeed");
552 if !s.contains(self.prompt.as_str()) { 556 if !s.contains(self.prompt.as_str()) {
553 panic!("dialoguer must be broken as formatted prompt success doesnt contain prompt"); 557 panic!("dialoguer must be broken as formatted prompt success doesnt contain prompt");
@@ -1017,10 +1021,13 @@ where
1017 cmd.env("RUST_BACKTRACE", "0"); 1021 cmd.env("RUST_BACKTRACE", "0");
1018 cmd.args(args); 1022 cmd.args(args);
1019 // using branch for PR https://github.com/rust-cli/rexpect/pull/103 to strip ansi escape codes 1023 // using branch for PR https://github.com/rust-cli/rexpect/pull/103 to strip ansi escape codes
1020 rexpect::session::spawn_with_options(cmd, Options { 1024 rexpect::session::spawn_with_options(
1021 timeout_ms: Some(timeout_ms), 1025 cmd,
1022 strip_ansi_escape_codes: true, 1026 Options {
1023 }) 1027 timeout_ms: Some(timeout_ms),
1028 strip_ansi_escape_codes: true,
1029 },
1030 )
1024} 1031}
1025 1032
1026pub fn rexpect_with_from_dir<I, S>( 1033pub fn rexpect_with_from_dir<I, S>(
@@ -1038,10 +1045,13 @@ where
1038 cmd.current_dir(dir); 1045 cmd.current_dir(dir);
1039 cmd.args(args); 1046 cmd.args(args);
1040 // using branch for PR https://github.com/rust-cli/rexpect/pull/103 to strip ansi escape codes 1047 // using branch for PR https://github.com/rust-cli/rexpect/pull/103 to strip ansi escape codes
1041 rexpect::session::spawn_with_options(cmd, Options { 1048 rexpect::session::spawn_with_options(
1042 timeout_ms: Some(timeout_ms), 1049 cmd,
1043 strip_ansi_escape_codes: true, 1050 Options {
1044 }) 1051 timeout_ms: Some(timeout_ms),
1052 strip_ansi_escape_codes: true,
1053 },
1054 )
1045} 1055}
1046 1056
1047pub fn remote_helper_rexpect_with_from_dir( 1057pub fn remote_helper_rexpect_with_from_dir(
@@ -1056,10 +1066,13 @@ pub fn remote_helper_rexpect_with_from_dir(
1056 cmd.current_dir(dir); 1066 cmd.current_dir(dir);
1057 cmd.args([dir.as_os_str().to_str().unwrap(), nostr_remote_url]); 1067 cmd.args([dir.as_os_str().to_str().unwrap(), nostr_remote_url]);
1058 // using branch for PR https://github.com/rust-cli/rexpect/pull/103 to strip ansi escape codes 1068 // using branch for PR https://github.com/rust-cli/rexpect/pull/103 to strip ansi escape codes
1059 rexpect::session::spawn_with_options(cmd, Options { 1069 rexpect::session::spawn_with_options(
1060 timeout_ms: Some(timeout_ms), 1070 cmd,
1061 strip_ansi_escape_codes: true, 1071 Options {
1062 }) 1072 timeout_ms: Some(timeout_ms),
1073 strip_ansi_escape_codes: true,
1074 },
1075 )
1063} 1076}
1064 1077
1065pub fn git_with_remote_helper_rexpect_with_from_dir<I, S>( 1078pub fn git_with_remote_helper_rexpect_with_from_dir<I, S>(
@@ -1103,10 +1116,13 @@ where
1103 cmd.current_dir(dir); 1116 cmd.current_dir(dir);
1104 cmd.args(args); 1117 cmd.args(args);
1105 // using branch for PR https://github.com/rust-cli/rexpect/pull/103 to strip ansi escape codes 1118 // using branch for PR https://github.com/rust-cli/rexpect/pull/103 to strip ansi escape codes
1106 rexpect::session::spawn_with_options(cmd, Options { 1119 rexpect::session::spawn_with_options(
1107 timeout_ms: Some(timeout_ms), 1120 cmd,
1108 strip_ansi_escape_codes: true, 1121 Options {
1109 }) 1122 timeout_ms: Some(timeout_ms),
1123 strip_ansi_escape_codes: true,
1124 },
1125 )
1110 .context("spawning failed") 1126 .context("spawning failed")
1111} 1127}
1112 1128
@@ -1145,11 +1161,14 @@ pub fn get_proposal_branch_name(
1145 test_repo: &GitTestRepo, 1161 test_repo: &GitTestRepo,
1146 branch_name_in_event: &str, 1162 branch_name_in_event: &str,
1147) -> Result<String> { 1163) -> Result<String> {
1148 let events = block_on(get_events_from_cache(&test_repo.dir, vec![ 1164 let events = block_on(get_events_from_cache(
1149 nostr::Filter::default() 1165 &test_repo.dir,
1150 .kind(nostr_sdk::Kind::GitPatch) 1166 vec![
1151 .hashtag("root"), 1167 nostr::Filter::default()
1152 ]))?; 1168 .kind(nostr_sdk::Kind::GitPatch)
1169 .hashtag("root"),
1170 ],
1171 ))?;
1153 get_proposal_branch_name_from_events(&events, branch_name_in_event) 1172 get_proposal_branch_name_from_events(&events, branch_name_in_event)
1154} 1173}
1155 1174
@@ -1235,10 +1254,10 @@ pub fn create_and_populate_branch(
1235 test_repo.checkout("main")?; 1254 test_repo.checkout("main")?;
1236 test_repo.create_branch(branch_name)?; 1255 test_repo.create_branch(branch_name)?;
1237 test_repo.checkout(branch_name)?; 1256 test_repo.checkout(branch_name)?;
1238 let file_name = format!("{}3.md", prefix); 1257 let file_name = format!("{prefix}3.md");
1239 std::fs::write(test_repo.dir.join(&file_name), "some content")?; 1258 std::fs::write(test_repo.dir.join(&file_name), "some content")?;
1240 test_repo.stage_and_commit_custom_signature( 1259 test_repo.stage_and_commit_custom_signature(
1241 &format!("add {}3.md", prefix), 1260 &format!("add {prefix}3.md"),
1242 Some( 1261 Some(
1243 &Signature::new( 1262 &Signature::new(
1244 "Joe Bloggs", 1263 "Joe Bloggs",
@@ -1250,10 +1269,10 @@ pub fn create_and_populate_branch(
1250 commiter, 1269 commiter,
1251 )?; 1270 )?;
1252 if !only_one_commit { 1271 if !only_one_commit {
1253 let file_name = format!("{}4.md", prefix); 1272 let file_name = format!("{prefix}4.md");
1254 std::fs::write(test_repo.dir.join(&file_name), "some content")?; 1273 std::fs::write(test_repo.dir.join(&file_name), "some content")?;
1255 test_repo.stage_and_commit_custom_signature( 1274 test_repo.stage_and_commit_custom_signature(
1256 &format!("add {}4.md", prefix), 1275 &format!("add {prefix}4.md"),
1257 Some( 1276 Some(
1258 &Signature::new( 1277 &Signature::new(
1259 "Joe Bloggs", 1278 "Joe Bloggs",
@@ -1303,45 +1322,54 @@ pub fn cli_tester_create_proposal(
1303 create_and_populate_branch(test_repo, branch_name, prefix, false, None)?; 1322 create_and_populate_branch(test_repo, branch_name, prefix, false, None)?;
1304 std::thread::sleep(std::time::Duration::from_millis(1000)); 1323 std::thread::sleep(std::time::Duration::from_millis(1000));
1305 if let Some(in_reply_to) = in_reply_to { 1324 if let Some(in_reply_to) = in_reply_to {
1306 let mut p = CliTester::new_from_dir(&test_repo.dir, [ 1325 let mut p = CliTester::new_from_dir(
1307 "--nsec", 1326 &test_repo.dir,
1308 TEST_KEY_1_NSEC, 1327 [
1309 "--password", 1328 "--nsec",
1310 TEST_PASSWORD, 1329 TEST_KEY_1_NSEC,
1311 "--disable-cli-spinners", 1330 "--password",
1312 "send", 1331 TEST_PASSWORD,
1313 "HEAD~2", 1332 "--disable-cli-spinners",
1314 "--no-cover-letter", 1333 "send",
1315 "--in-reply-to", 1334 "HEAD~2",
1316 in_reply_to.as_str(), 1335 "--no-cover-letter",
1317 ]); 1336 "--in-reply-to",
1337 in_reply_to.as_str(),
1338 ],
1339 );
1318 p.expect_end_eventually()?; 1340 p.expect_end_eventually()?;
1319 } else if let Some((title, description)) = cover_letter_title_and_description { 1341 } else if let Some((title, description)) = cover_letter_title_and_description {
1320 let mut p = CliTester::new_from_dir(&test_repo.dir, [ 1342 let mut p = CliTester::new_from_dir(
1321 "--nsec", 1343 &test_repo.dir,
1322 TEST_KEY_1_NSEC, 1344 [
1323 "--password", 1345 "--nsec",
1324 TEST_PASSWORD, 1346 TEST_KEY_1_NSEC,
1325 "--disable-cli-spinners", 1347 "--password",
1326 "send", 1348 TEST_PASSWORD,
1327 "HEAD~2", 1349 "--disable-cli-spinners",
1328 "--title", 1350 "send",
1329 format!("\"{title}\"").as_str(), 1351 "HEAD~2",
1330 "--description", 1352 "--title",
1331 format!("\"{description}\"").as_str(), 1353 format!("\"{title}\"").as_str(),
1332 ]); 1354 "--description",
1355 format!("\"{description}\"").as_str(),
1356 ],
1357 );
1333 p.expect_end_eventually()?; 1358 p.expect_end_eventually()?;
1334 } else { 1359 } else {
1335 let mut p = CliTester::new_from_dir(&test_repo.dir, [ 1360 let mut p = CliTester::new_from_dir(
1336 "--nsec", 1361 &test_repo.dir,
1337 TEST_KEY_1_NSEC, 1362 [
1338 "--password", 1363 "--nsec",
1339 TEST_PASSWORD, 1364 TEST_KEY_1_NSEC,
1340 "--disable-cli-spinners", 1365 "--password",
1341 "send", 1366 TEST_PASSWORD,
1342 "HEAD~2", 1367 "--disable-cli-spinners",
1343 "--no-cover-letter", 1368 "send",
1344 ]); 1369 "HEAD~2",
1370 "--no-cover-letter",
1371 ],
1372 );
1345 p.expect_end_eventually()?; 1373 p.expect_end_eventually()?;
1346 } 1374 }
1347 Ok(()) 1375 Ok(())
@@ -1373,11 +1401,14 @@ pub fn use_ngit_list_to_download_and_checkout_proposal_branch(
1373 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]); 1401 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]);
1374 p.expect("fetching updates...\r\n")?; 1402 p.expect("fetching updates...\r\n")?;
1375 p.expect_eventually("\r\n")?; // some updates listed here 1403 p.expect_eventually("\r\n")?; // some updates listed here
1376 let mut c = p.expect_choice("all proposals", vec![ 1404 let mut c = p.expect_choice(
1377 format!("\"{PROPOSAL_TITLE_3}\""), 1405 "all proposals",
1378 format!("\"{PROPOSAL_TITLE_2}\""), 1406 vec![
1379 format!("\"{PROPOSAL_TITLE_1}\""), 1407 format!("\"{PROPOSAL_TITLE_3}\""),
1380 ])?; 1408 format!("\"{PROPOSAL_TITLE_2}\""),
1409 format!("\"{PROPOSAL_TITLE_1}\""),
1410 ],
1411 )?;
1381 c.succeeds_with( 1412 c.succeeds_with(
1382 if proposal_number == 3 { 1413 if proposal_number == 3 {
1383 0 1414 0
@@ -1389,12 +1420,15 @@ pub fn use_ngit_list_to_download_and_checkout_proposal_branch(
1389 true, 1420 true,
1390 None, 1421 None,
1391 )?; 1422 )?;
1392 let mut c = p.expect_choice("", vec![ 1423 let mut c = p.expect_choice(
1393 format!("create and checkout proposal branch (2 ahead 0 behind 'main')"), 1424 "",
1394 format!("apply to current branch with `git am`"), 1425 vec![
1395 format!("download to ./patches"), 1426 format!("create and checkout proposal branch (2 ahead 0 behind 'main')"),
1396 format!("back"), 1427 format!("apply to current branch with `git am`"),
1397 ])?; 1428 format!("download to ./patches"),
1429 format!("back"),
1430 ],
1431 )?;
1398 c.succeeds_with(0, true, Some(0))?; 1432 c.succeeds_with(0, true, Some(0))?;
1399 p.expect_end_eventually()?; 1433 p.expect_end_eventually()?;
1400 Ok(()) 1434 Ok(())
@@ -1466,9 +1500,10 @@ fn get_first_proposal_event_id() -> Result<nostr::EventId> {
1466 client.fetch_events( 1500 client.fetch_events(
1467 nostr::Filter::default() 1501 nostr::Filter::default()
1468 .kind(nostr::Kind::GitPatch) 1502 .kind(nostr::Kind::GitPatch)
1469 .custom_tags(nostr::SingleLetterTag::lowercase(nostr::Alphabet::T), vec![ 1503 .custom_tags(
1470 "root", 1504 nostr::SingleLetterTag::lowercase(nostr::Alphabet::T),
1471 ]), 1505 vec!["root"],
1506 ),
1472 Duration::from_millis(500), 1507 Duration::from_millis(500),
1473 ), 1508 ),
1474 )? 1509 )?
@@ -1496,15 +1531,18 @@ pub fn create_proposals_with_first_revised_and_repo_with_unrevised_proposal_chec
1496 1531
1497 amend_last_commit(&originating_repo, "add some ammended-commit.md")?; 1532 amend_last_commit(&originating_repo, "add some ammended-commit.md")?;
1498 1533
1499 let mut p = CliTester::new_from_dir(&originating_repo.dir, [ 1534 let mut p = CliTester::new_from_dir(
1500 "--nsec", 1535 &originating_repo.dir,
1501 TEST_KEY_1_NSEC, 1536 [
1502 "--password", 1537 "--nsec",
1503 TEST_PASSWORD, 1538 TEST_KEY_1_NSEC,
1504 "--disable-cli-spinners", 1539 "--password",
1505 "push", 1540 TEST_PASSWORD,
1506 "--force", 1541 "--disable-cli-spinners",
1507 ]); 1542 "push",
1543 "--force",
1544 ],
1545 );
1508 p.expect_end_eventually()?; 1546 p.expect_end_eventually()?;
1509 1547
1510 Ok((originating_repo, test_repo)) 1548 Ok((originating_repo, test_repo))
diff --git a/test_utils/src/relay.rs b/test_utils/src/relay.rs
index e820651..b14f532 100644
--- a/test_utils/src/relay.rs
+++ b/test_utils/src/relay.rs
@@ -161,9 +161,11 @@ impl<'a> Relay<'a> {
161 if let Some(listner) = self.req_listener { 161 if let Some(listner) = self.req_listener {
162 listner(self, client_id, subscription_id, vec![filter.clone()])?; 162 listner(self, client_id, subscription_id, vec![filter.clone()])?;
163 } else { 163 } else {
164 self.respond_standard_req(client_id, &subscription_id, &[ 164 self.respond_standard_req(
165 filter.clone() 165 client_id,
166 ])?; 166 &subscription_id,
167 &[filter.clone()],
168 )?;
167 // self.respond_eose(client_id, subscription_id)?; 169 // self.respond_eose(client_id, subscription_id)?;
168 } 170 }
169 // respond with events 171 // respond with events
@@ -186,7 +188,7 @@ impl<'a> Relay<'a> {
186 188
187pub fn shutdown_relay(port: u64) -> Result<()> { 189pub fn shutdown_relay(port: u64) -> Result<()> {
188 let mut counter = 0; 190 let mut counter = 0;
189 while let Ok((mut socket, _)) = tungstenite::connect(format!("ws://localhost:{}", port)) { 191 while let Ok((mut socket, _)) = tungstenite::connect(format!("ws://localhost:{port}")) {
190 counter += 1; 192 counter += 1;
191 if counter == 1 { 193 if counter == 1 {
192 socket.write(tungstenite::Message::text("shut me down"))?; 194 socket.write(tungstenite::Message::text("shut me down"))?;
diff --git a/tests/git_remote_nostr/list.rs b/tests/git_remote_nostr/list.rs
index 37cff30..c201054 100644
--- a/tests/git_remote_nostr/list.rs
+++ b/tests/git_remote_nostr/list.rs
@@ -41,7 +41,7 @@ mod without_state_announcement {
41 let cli_tester_handle = std::thread::spawn(move || -> Result<()> { 41 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
42 let mut p = cli_tester_after_fetch(&git_repo)?; 42 let mut p = cli_tester_after_fetch(&git_repo)?;
43 p.send_line("list")?; 43 p.send_line("list")?;
44 p.expect(format!("fetching {} ref list over filesystem...\r\n", source_path).as_str())?; 44 p.expect(format!("fetching {source_path} ref list over filesystem...\r\n").as_str())?;
45 p.expect("list: connecting...\r\n\r\r\r")?; 45 p.expect("list: connecting...\r\n\r\r\r")?;
46 // println!("{}", p.expect_eventually("\r\n\r\n")?); 46 // println!("{}", p.expect_eventually("\r\n\r\n")?);
47 let res = p.expect_eventually("\r\n\r\n")?; 47 let res = p.expect_eventually("\r\n\r\n")?;
@@ -59,8 +59,8 @@ mod without_state_announcement {
59 .collect::<HashSet<String>>(), 59 .collect::<HashSet<String>>(),
60 HashSet::from([ 60 HashSet::from([
61 "@refs/heads/main HEAD".to_string(), 61 "@refs/heads/main HEAD".to_string(),
62 format!("{} refs/heads/main", main_commit_id), 62 format!("{main_commit_id} refs/heads/main"),
63 format!("{} refs/heads/vnext", vnext_commit_id), 63 format!("{vnext_commit_id} refs/heads/vnext"),
64 ]), 64 ]),
65 ); 65 );
66 Ok(()) 66 Ok(())
@@ -120,7 +120,7 @@ mod with_state_announcement {
120 let mut p = cli_tester_after_fetch(&git_repo)?; 120 let mut p = cli_tester_after_fetch(&git_repo)?;
121 p.send_line("list")?; 121 p.send_line("list")?;
122 p.expect( 122 p.expect(
123 format!("fetching {} ref list over filesystem...\r\n", source_path).as_str(), 123 format!("fetching {source_path} ref list over filesystem...\r\n").as_str(),
124 )?; 124 )?;
125 p.expect("list: connecting...\r\n\r\r\r")?; 125 p.expect("list: connecting...\r\n\r\r\r")?;
126 // println!("{}", p.expect_eventually("\r\n\r\n")?); 126 // println!("{}", p.expect_eventually("\r\n\r\n")?);
@@ -135,8 +135,8 @@ mod with_state_announcement {
135 .collect::<HashSet<String>>(), 135 .collect::<HashSet<String>>(),
136 HashSet::from([ 136 HashSet::from([
137 "@refs/heads/main HEAD".to_string(), 137 "@refs/heads/main HEAD".to_string(),
138 format!("{} refs/heads/main", main_commit_id), 138 format!("{main_commit_id} refs/heads/main"),
139 format!("{} refs/heads/example-branch", example_commit_id), 139 format!("{example_commit_id} refs/heads/example-branch"),
140 ]), 140 ]),
141 ); 141 );
142 142
@@ -204,13 +204,12 @@ mod with_state_announcement {
204 let mut p = cli_tester_after_fetch(&git_repo)?; 204 let mut p = cli_tester_after_fetch(&git_repo)?;
205 p.send_line("list")?; 205 p.send_line("list")?;
206 p.expect( 206 p.expect(
207 format!("fetching {} ref list over filesystem...\r\n", source_path).as_str(), 207 format!("fetching {source_path} ref list over filesystem...\r\n").as_str(),
208 )?; 208 )?;
209 p.expect("list: connecting...\r\n\r\r\r")?; 209 p.expect("list: connecting...\r\n\r\r\r")?;
210 p.expect( 210 p.expect(
211 format!( 211 format!(
212 "WARNING: {} refs/heads/main is out of sync with nostr \r\n", 212 "WARNING: {source_path} refs/heads/main is out of sync with nostr \r\n"
213 source_path
214 ) 213 )
215 .as_str(), 214 .as_str(),
216 )?; 215 )?;
@@ -231,8 +230,8 @@ mod with_state_announcement {
231 .collect::<HashSet<String>>(), 230 .collect::<HashSet<String>>(),
232 HashSet::from([ 231 HashSet::from([
233 "@refs/heads/main HEAD".to_string(), 232 "@refs/heads/main HEAD".to_string(),
234 format!("{} refs/heads/main", main_original_commit_id), 233 format!("{main_original_commit_id} refs/heads/main"),
235 format!("{} refs/heads/example-branch", example_commit_id), 234 format!("{example_commit_id} refs/heads/example-branch"),
236 ]), 235 ]),
237 ); 236 );
238 Ok(()) 237 Ok(())
@@ -292,7 +291,7 @@ mod with_state_announcement {
292 let mut p = cli_tester_after_fetch(&git_repo)?; 291 let mut p = cli_tester_after_fetch(&git_repo)?;
293 p.send_line("list")?; 292 p.send_line("list")?;
294 p.expect( 293 p.expect(
295 format!("fetching {} ref list over filesystem...\r\n", source_path).as_str(), 294 format!("fetching {source_path} ref list over filesystem...\r\n").as_str(),
296 )?; 295 )?;
297 p.expect("list: connecting...\r\n\r\r\r")?; 296 p.expect("list: connecting...\r\n\r\r\r")?;
298 // println!("{}", p.expect_eventually("\r\n\r\n")?); 297 // println!("{}", p.expect_eventually("\r\n\r\n")?);
diff --git a/tests/git_remote_nostr/push.rs b/tests/git_remote_nostr/push.rs
index f46b0ea..5912543 100644
--- a/tests/git_remote_nostr/push.rs
+++ b/tests/git_remote_nostr/push.rs
@@ -969,19 +969,17 @@ async fn proposal_three_way_merge_commit_pushed_to_main_leads_to_status_event_is
969 std::fs::write(git_repo.dir.join("new.md"), "some content")?; 969 std::fs::write(git_repo.dir.join("new.md"), "some content")?;
970 git_repo.stage_and_commit("new.md")?; 970 git_repo.stage_and_commit("new.md")?;
971 971
972 CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, [ 972 CliTester::new_git_with_remote_helper_from_dir(
973 "merge", 973 &git_repo.dir,
974 &branch_name, 974 ["merge", &branch_name, "-m", "proposal merge commit message"],
975 "-m", 975 )
976 "proposal merge commit message",
977 ])
978 .expect_end_eventually_and_print()?; 976 .expect_end_eventually_and_print()?;
979 977
980 let oid = git_repo.get_tip_of_local_branch("main")?; 978 let oid = git_repo.get_tip_of_local_branch("main")?;
981 979
982 let mut p = CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, ["push"]); 980 let mut p = CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, ["push"]);
983 cli_expect_nostr_fetch(&mut p)?; 981 cli_expect_nostr_fetch(&mut p)?;
984 p.expect(format!("fetching {} ref list over filesystem...\r\n", source_path).as_str())?; 982 p.expect(format!("fetching {source_path} ref list over filesystem...\r\n").as_str())?;
985 p.expect("list: connecting...\r\n")?; 983 p.expect("list: connecting...\r\n")?;
986 p.expect_eventually("merge commit ")?; 984 p.expect_eventually("merge commit ")?;
987 // shorthand merge commit id appears in this gap 985 // shorthand merge commit id appears in this gap
@@ -1125,19 +1123,17 @@ async fn proposal_fast_forward_merge_commits_pushed_to_main_leads_to_status_even
1125 git_repo.checkout_remote_branch(&branch_name)?; 1123 git_repo.checkout_remote_branch(&branch_name)?;
1126 git_repo.checkout("refs/heads/main")?; 1124 git_repo.checkout("refs/heads/main")?;
1127 1125
1128 CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, [ 1126 CliTester::new_git_with_remote_helper_from_dir(
1129 "merge", 1127 &git_repo.dir,
1130 &branch_name, 1128 ["merge", &branch_name, "-m", "proposal merge commit message"],
1131 "-m", 1129 )
1132 "proposal merge commit message",
1133 ])
1134 .expect_end_eventually_and_print()?; 1130 .expect_end_eventually_and_print()?;
1135 1131
1136 let oid = git_repo.get_tip_of_local_branch("main")?; 1132 let oid = git_repo.get_tip_of_local_branch("main")?;
1137 1133
1138 let mut p = CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, ["push"]); 1134 let mut p = CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, ["push"]);
1139 cli_expect_nostr_fetch(&mut p)?; 1135 cli_expect_nostr_fetch(&mut p)?;
1140 p.expect(format!("fetching {} ref list over filesystem...\r\n", source_path).as_str())?; 1136 p.expect(format!("fetching {source_path} ref list over filesystem...\r\n").as_str())?;
1141 p.expect("list: connecting...\r\n")?; 1137 p.expect("list: connecting...\r\n")?;
1142 p.expect_eventually(format!( 1138 p.expect_eventually(format!(
1143 "fast-forward merge: create nostr proposal status event for {branch_name}\r\n" 1139 "fast-forward merge: create nostr proposal status event for {branch_name}\r\n"
@@ -1323,7 +1319,7 @@ async fn proposal_commits_applied_and_pushed_to_main_leads_to_status_event_issue
1323 1319
1324 let mut p = CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, ["push"]); 1320 let mut p = CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, ["push"]);
1325 cli_expect_nostr_fetch(&mut p)?; 1321 cli_expect_nostr_fetch(&mut p)?;
1326 p.expect(format!("fetching {} ref list over filesystem...\r\n", source_path).as_str())?; 1322 p.expect(format!("fetching {source_path} ref list over filesystem...\r\n").as_str())?;
1327 p.expect("list: connecting...\r\n")?; 1323 p.expect("list: connecting...\r\n")?;
1328 p.expect_eventually(format!( 1324 p.expect_eventually(format!(
1329 "applied commits from proposal: create nostr proposal status event for {branch_name}\r\n" ))?; 1325 "applied commits from proposal: create nostr proposal status event for {branch_name}\r\n" ))?;
@@ -1484,7 +1480,7 @@ async fn push_2_commits_to_existing_proposal() -> Result<()> {
1484 1480
1485 let mut p = CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, ["push"]); 1481 let mut p = CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, ["push"]);
1486 cli_expect_nostr_fetch(&mut p)?; 1482 cli_expect_nostr_fetch(&mut p)?;
1487 p.expect(format!("fetching {} ref list over filesystem...\r\n", source_path).as_str())?; 1483 p.expect(format!("fetching {source_path} ref list over filesystem...\r\n").as_str())?;
1488 p.expect("list: connecting...\r\n\r\r\r")?; 1484 p.expect("list: connecting...\r\n\r\r\r")?;
1489 p.expect_eventually_and_print(format!("To {}\r\n", get_nostr_remote_url()?).as_str())?; 1485 p.expect_eventually_and_print(format!("To {}\r\n", get_nostr_remote_url()?).as_str())?;
1490 let output = p.expect_end_eventually()?; 1486 let output = p.expect_end_eventually()?;
@@ -1639,7 +1635,7 @@ async fn force_push_creates_proposal_revision() -> Result<()> {
1639 let mut p = 1635 let mut p =
1640 CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, ["push", "--force"]); 1636 CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, ["push", "--force"]);
1641 cli_expect_nostr_fetch(&mut p)?; 1637 cli_expect_nostr_fetch(&mut p)?;
1642 p.expect(format!("fetching {} ref list over filesystem...\r\n", source_path).as_str())?; 1638 p.expect(format!("fetching {source_path} ref list over filesystem...\r\n").as_str())?;
1643 p.expect("list: connecting...\r\n")?; 1639 p.expect("list: connecting...\r\n")?;
1644 p.expect_eventually_and_print(format!("To {}\r\n", get_nostr_remote_url()?).as_str())?; 1640 p.expect_eventually_and_print(format!("To {}\r\n", get_nostr_remote_url()?).as_str())?;
1645 let output = p.expect_end_eventually()?; 1641 let output = p.expect_end_eventually()?;
@@ -1784,14 +1780,12 @@ async fn push_new_pr_branch_creates_proposal() -> Result<()> {
1784 std::fs::write(git_repo.dir.join("new2.md"), "some content")?; 1780 std::fs::write(git_repo.dir.join("new2.md"), "some content")?;
1785 git_repo.stage_and_commit("new2.md")?; 1781 git_repo.stage_and_commit("new2.md")?;
1786 1782
1787 let mut p = CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, [ 1783 let mut p = CliTester::new_git_with_remote_helper_from_dir(
1788 "push", 1784 &git_repo.dir,
1789 "-u", 1785 ["push", "-u", "origin", branch_name],
1790 "origin", 1786 );
1791 branch_name,
1792 ]);
1793 cli_expect_nostr_fetch(&mut p)?; 1787 cli_expect_nostr_fetch(&mut p)?;
1794 p.expect(format!("fetching {} ref list over filesystem...\r\n", source_path).as_str())?; 1788 p.expect(format!("fetching {source_path} ref list over filesystem...\r\n").as_str())?;
1795 p.expect("list: connecting...\r\n\r\r\r")?; 1789 p.expect("list: connecting...\r\n\r\r\r")?;
1796 p.expect_eventually_and_print(format!("To {}\r\n", get_nostr_remote_url()?).as_str())?; 1790 p.expect_eventually_and_print(format!("To {}\r\n", get_nostr_remote_url()?).as_str())?;
1797 let output = p.expect_end_eventually()?; 1791 let output = p.expect_end_eventually()?;
diff --git a/tests/ngit_init.rs b/tests/ngit_init.rs
index e49dbdd..1a23177 100644
--- a/tests/ngit_init.rs
+++ b/tests/ngit_init.rs
@@ -75,10 +75,14 @@ mod when_repo_not_previously_claimed {
75 8051, 75 8051,
76 None, 76 None,
77 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 77 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
78 relay.respond_events(client_id, &subscription_id, &vec![ 78 relay.respond_events(
79 generate_test_key_1_metadata_event("fred"), 79 client_id,
80 generate_test_key_1_relay_list_event(), 80 &subscription_id,
81 ])?; 81 &vec![
82 generate_test_key_1_metadata_event("fred"),
83 generate_test_key_1_relay_list_event(),
84 ],
85 )?;
82 Ok(()) 86 Ok(())
83 }), 87 }),
84 ), 88 ),
@@ -197,10 +201,14 @@ mod when_repo_not_previously_claimed {
197 8051, 201 8051,
198 None, 202 None,
199 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 203 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
200 relay.respond_events(client_id, &subscription_id, &vec![ 204 relay.respond_events(
201 generate_test_key_1_metadata_event("fred"), 205 client_id,
202 generate_test_key_1_relay_list_event(), 206 &subscription_id,
203 ])?; 207 &vec![
208 generate_test_key_1_metadata_event("fred"),
209 generate_test_key_1_relay_list_event(),
210 ],
211 )?;
204 Ok(()) 212 Ok(())
205 }), 213 }),
206 ), 214 ),
@@ -454,10 +462,14 @@ mod when_repo_not_previously_claimed {
454 8051, 462 8051,
455 None, 463 None,
456 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 464 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
457 relay.respond_events(client_id, &subscription_id, &vec![ 465 relay.respond_events(
458 generate_test_key_1_metadata_event("fred"), 466 client_id,
459 generate_test_key_1_relay_list_event(), 467 &subscription_id,
460 ])?; 468 &vec![
469 generate_test_key_1_metadata_event("fred"),
470 generate_test_key_1_relay_list_event(),
471 ],
472 )?;
461 Ok(()) 473 Ok(())
462 }), 474 }),
463 ), 475 ),
diff --git a/tests/ngit_list.rs b/tests/ngit_list.rs
index bb742cf..0547ad4 100644
--- a/tests/ngit_list.rs
+++ b/tests/ngit_list.rs
@@ -201,11 +201,14 @@ mod when_main_branch_is_uptodate {
201 201
202 p.expect("fetching updates...\r\n")?; 202 p.expect("fetching updates...\r\n")?;
203 p.expect_eventually("\r\n")?; // some updates listed here 203 p.expect_eventually("\r\n")?; // some updates listed here
204 let mut c = p.expect_choice("all proposals", vec![ 204 let mut c = p.expect_choice(
205 format!("\"{PROPOSAL_TITLE_3}\""), 205 "all proposals",
206 format!("\"{PROPOSAL_TITLE_2}\""), 206 vec![
207 format!("\"{PROPOSAL_TITLE_1}\""), 207 format!("\"{PROPOSAL_TITLE_3}\""),
208 ])?; 208 format!("\"{PROPOSAL_TITLE_2}\""),
209 format!("\"{PROPOSAL_TITLE_1}\""),
210 ],
211 )?;
209 c.succeeds_with(2, true, None)?; 212 c.succeeds_with(2, true, None)?;
210 let mut c = p.expect_choice("", vec![ 213 let mut c = p.expect_choice("", vec![
211 format!( 214 format!(
@@ -217,8 +220,7 @@ mod when_main_branch_is_uptodate {
217 ])?; 220 ])?;
218 c.succeeds_with(0, true, None)?; 221 c.succeeds_with(0, true, None)?;
219 p.expect(format!( 222 p.expect(format!(
220 "checked out proposal as 'pr/{}(", 223 "checked out proposal as 'pr/{FEATURE_BRANCH_NAME_1}(",
221 FEATURE_BRANCH_NAME_1,
222 ))?; 224 ))?;
223 p.expect_end_eventually_with(")' branch\r\n")?; 225 p.expect_end_eventually_with(")' branch\r\n")?;
224 226
@@ -318,11 +320,14 @@ mod when_main_branch_is_uptodate {
318 320
319 p.expect("fetching updates...\r\n")?; 321 p.expect("fetching updates...\r\n")?;
320 p.expect_eventually("\r\n")?; // some updates listed here 322 p.expect_eventually("\r\n")?; // some updates listed here
321 let mut c = p.expect_choice("all proposals", vec![ 323 let mut c = p.expect_choice(
322 format!("\"{PROPOSAL_TITLE_3}\""), 324 "all proposals",
323 format!("\"{PROPOSAL_TITLE_2}\""), 325 vec![
324 format!("\"{PROPOSAL_TITLE_1}\""), 326 format!("\"{PROPOSAL_TITLE_3}\""),
325 ])?; 327 format!("\"{PROPOSAL_TITLE_2}\""),
328 format!("\"{PROPOSAL_TITLE_1}\""),
329 ],
330 )?;
326 c.succeeds_with(0, true, None)?; 331 c.succeeds_with(0, true, None)?;
327 let mut c = p.expect_choice("", vec![ 332 let mut c = p.expect_choice("", vec![
328 format!( 333 format!(
@@ -334,8 +339,7 @@ mod when_main_branch_is_uptodate {
334 ])?; 339 ])?;
335 c.succeeds_with(0, true, Some(0))?; 340 c.succeeds_with(0, true, Some(0))?;
336 p.expect(format!( 341 p.expect(format!(
337 "checked out proposal as 'pr/{}(", 342 "checked out proposal as 'pr/{FEATURE_BRANCH_NAME_3}(",
338 FEATURE_BRANCH_NAME_3,
339 ))?; 343 ))?;
340 p.expect_end_eventually_with(")' branch\r\n")?; 344 p.expect_end_eventually_with(")' branch\r\n")?;
341 345
@@ -438,12 +442,15 @@ mod when_main_branch_is_uptodate {
438 442
439 p.expect("fetching updates...\r\n")?; 443 p.expect("fetching updates...\r\n")?;
440 p.expect_eventually("\r\n")?; // some updates listed here 444 p.expect_eventually("\r\n")?; // some updates listed here
441 let mut c = p.expect_choice("all proposals", vec![ 445 let mut c = p.expect_choice(
442 format!("add d3.md"), // commit msg title 446 "all proposals",
443 format!("\"{PROPOSAL_TITLE_3}\""), 447 vec![
444 format!("\"{PROPOSAL_TITLE_2}\""), 448 format!("add d3.md"), // commit msg title
445 format!("\"{PROPOSAL_TITLE_1}\""), 449 format!("\"{PROPOSAL_TITLE_3}\""),
446 ])?; 450 format!("\"{PROPOSAL_TITLE_2}\""),
451 format!("\"{PROPOSAL_TITLE_1}\""),
452 ],
453 )?;
447 c.succeeds_with(0, true, None)?; 454 c.succeeds_with(0, true, None)?;
448 let mut c = p.expect_choice("", vec![ 455 let mut c = p.expect_choice("", vec![
449 format!( 456 format!(
@@ -513,12 +520,15 @@ mod when_main_branch_is_uptodate {
513 520
514 p.expect("fetching updates...\r\n")?; 521 p.expect("fetching updates...\r\n")?;
515 p.expect_eventually("\r\n")?; // some updates listed here 522 p.expect_eventually("\r\n")?; // some updates listed here
516 let mut c = p.expect_choice("all proposals", vec![ 523 let mut c = p.expect_choice(
517 format!("add d3.md"), // commit msg title 524 "all proposals",
518 format!("\"{PROPOSAL_TITLE_3}\""), 525 vec![
519 format!("\"{PROPOSAL_TITLE_2}\""), 526 format!("add d3.md"), // commit msg title
520 format!("\"{PROPOSAL_TITLE_1}\""), 527 format!("\"{PROPOSAL_TITLE_3}\""),
521 ])?; 528 format!("\"{PROPOSAL_TITLE_2}\""),
529 format!("\"{PROPOSAL_TITLE_1}\""),
530 ],
531 )?;
522 c.succeeds_with(0, true, None)?; 532 c.succeeds_with(0, true, None)?;
523 let mut c = p.expect_choice("", vec![ 533 let mut c = p.expect_choice("", vec![
524 format!( 534 format!(
@@ -530,8 +540,7 @@ mod when_main_branch_is_uptodate {
530 ])?; 540 ])?;
531 c.succeeds_with(0, true, Some(0))?; 541 c.succeeds_with(0, true, Some(0))?;
532 p.expect(format!( 542 p.expect(format!(
533 "checked out proposal as 'pr/{}(", 543 "checked out proposal as 'pr/{FEATURE_BRANCH_NAME_4}(",
534 FEATURE_BRANCH_NAME_4,
535 ))?; 544 ))?;
536 p.expect_end_eventually_with(")' branch\r\n")?; 545 p.expect_end_eventually_with(")' branch\r\n")?;
537 546
@@ -633,11 +642,14 @@ mod when_main_branch_is_uptodate {
633 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]); 642 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]);
634 p.expect("fetching updates...\r\n")?; 643 p.expect("fetching updates...\r\n")?;
635 p.expect_eventually("\r\n")?; // some updates listed here 644 p.expect_eventually("\r\n")?; // some updates listed here
636 let mut c = p.expect_choice("all proposals", vec![ 645 let mut c = p.expect_choice(
637 format!("\"{PROPOSAL_TITLE_3}\""), 646 "all proposals",
638 format!("\"{PROPOSAL_TITLE_2}\""), 647 vec![
639 format!("\"{PROPOSAL_TITLE_1}\""), 648 format!("\"{PROPOSAL_TITLE_3}\""),
640 ])?; 649 format!("\"{PROPOSAL_TITLE_2}\""),
650 format!("\"{PROPOSAL_TITLE_1}\""),
651 ],
652 )?;
641 c.succeeds_with(2, true, None)?; 653 c.succeeds_with(2, true, None)?;
642 let mut c = p.expect_choice("", vec![ 654 let mut c = p.expect_choice("", vec![
643 format!( 655 format!(
@@ -655,18 +667,24 @@ mod when_main_branch_is_uptodate {
655 p = CliTester::new_from_dir(&test_repo.dir, ["list"]); 667 p = CliTester::new_from_dir(&test_repo.dir, ["list"]);
656 p.expect("fetching updates...\r\n")?; 668 p.expect("fetching updates...\r\n")?;
657 p.expect_eventually("\r\n")?; // some updates listed here 669 p.expect_eventually("\r\n")?; // some updates listed here
658 let mut c = p.expect_choice("all proposals", vec![ 670 let mut c = p.expect_choice(
659 format!("\"{PROPOSAL_TITLE_3}\""), 671 "all proposals",
660 format!("\"{PROPOSAL_TITLE_2}\""), 672 vec![
661 format!("\"{PROPOSAL_TITLE_1}\""), 673 format!("\"{PROPOSAL_TITLE_3}\""),
662 ])?; 674 format!("\"{PROPOSAL_TITLE_2}\""),
675 format!("\"{PROPOSAL_TITLE_1}\""),
676 ],
677 )?;
663 c.succeeds_with(2, true, None)?; 678 c.succeeds_with(2, true, None)?;
664 let mut c = p.expect_choice("", vec![ 679 let mut c = p.expect_choice(
665 format!("checkout proposal branch (2 ahead 0 behind 'main')"), 680 "",
666 format!("apply to current branch with `git am`"), 681 vec![
667 format!("download to ./patches"), 682 format!("checkout proposal branch (2 ahead 0 behind 'main')"),
668 format!("back"), 683 format!("apply to current branch with `git am`"),
669 ])?; 684 format!("download to ./patches"),
685 format!("back"),
686 ],
687 )?;
670 c.succeeds_with(0, true, Some(0))?; 688 c.succeeds_with(0, true, Some(0))?;
671 p.expect_end_eventually_and_print()?; 689 p.expect_end_eventually_and_print()?;
672 690
@@ -720,11 +738,14 @@ mod when_main_branch_is_uptodate {
720 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]); 738 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]);
721 p.expect("fetching updates...\r\n")?; 739 p.expect("fetching updates...\r\n")?;
722 p.expect_eventually("\r\n")?; // some updates listed here 740 p.expect_eventually("\r\n")?; // some updates listed here
723 let mut c = p.expect_choice("all proposals", vec![ 741 let mut c = p.expect_choice(
724 format!("\"{PROPOSAL_TITLE_3}\""), 742 "all proposals",
725 format!("\"{PROPOSAL_TITLE_2}\""), 743 vec![
726 format!("\"{PROPOSAL_TITLE_1}\""), 744 format!("\"{PROPOSAL_TITLE_3}\""),
727 ])?; 745 format!("\"{PROPOSAL_TITLE_2}\""),
746 format!("\"{PROPOSAL_TITLE_1}\""),
747 ],
748 )?;
728 c.succeeds_with(2, true, None)?; 749 c.succeeds_with(2, true, None)?;
729 let mut c = p.expect_choice("", vec![ 750 let mut c = p.expect_choice("", vec![
730 format!( 751 format!(
@@ -742,22 +763,27 @@ mod when_main_branch_is_uptodate {
742 p = CliTester::new_from_dir(&test_repo.dir, ["list"]); 763 p = CliTester::new_from_dir(&test_repo.dir, ["list"]);
743 p.expect("fetching updates...\r\n")?; 764 p.expect("fetching updates...\r\n")?;
744 p.expect_eventually("\r\n")?; // some updates listed here 765 p.expect_eventually("\r\n")?; // some updates listed here
745 let mut c = p.expect_choice("all proposals", vec![ 766 let mut c = p.expect_choice(
746 format!("\"{PROPOSAL_TITLE_3}\""), 767 "all proposals",
747 format!("\"{PROPOSAL_TITLE_2}\""), 768 vec![
748 format!("\"{PROPOSAL_TITLE_1}\""), 769 format!("\"{PROPOSAL_TITLE_3}\""),
749 ])?; 770 format!("\"{PROPOSAL_TITLE_2}\""),
771 format!("\"{PROPOSAL_TITLE_1}\""),
772 ],
773 )?;
750 c.succeeds_with(2, true, None)?; 774 c.succeeds_with(2, true, None)?;
751 let mut c = p.expect_choice("", vec![ 775 let mut c = p.expect_choice(
752 format!("checkout proposal branch (2 ahead 0 behind 'main')"), 776 "",
753 format!("apply to current branch with `git am`"), 777 vec![
754 format!("download to ./patches"), 778 format!("checkout proposal branch (2 ahead 0 behind 'main')"),
755 format!("back"), 779 format!("apply to current branch with `git am`"),
756 ])?; 780 format!("download to ./patches"),
781 format!("back"),
782 ],
783 )?;
757 c.succeeds_with(0, true, Some(0))?; 784 c.succeeds_with(0, true, Some(0))?;
758 p.expect(format!( 785 p.expect(format!(
759 "checked out proposal as 'pr/{}(", 786 "checked out proposal as 'pr/{FEATURE_BRANCH_NAME_1}(",
760 FEATURE_BRANCH_NAME_1,
761 ))?; 787 ))?;
762 p.expect_end_eventually_with(")' branch\r\n")?; 788 p.expect_end_eventually_with(")' branch\r\n")?;
763 789
@@ -827,18 +853,24 @@ mod when_main_branch_is_uptodate {
827 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]); 853 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]);
828 p.expect("fetching updates...\r\n")?; 854 p.expect("fetching updates...\r\n")?;
829 p.expect_eventually("\r\n")?; // some updates listed here 855 p.expect_eventually("\r\n")?; // some updates listed here
830 let mut c = p.expect_choice("all proposals", vec![ 856 let mut c = p.expect_choice(
831 format!("\"{PROPOSAL_TITLE_3}\""), 857 "all proposals",
832 format!("\"{PROPOSAL_TITLE_2}\""), 858 vec![
833 format!("\"{PROPOSAL_TITLE_1}\""), 859 format!("\"{PROPOSAL_TITLE_3}\""),
834 ])?; 860 format!("\"{PROPOSAL_TITLE_2}\""),
861 format!("\"{PROPOSAL_TITLE_1}\""),
862 ],
863 )?;
835 c.succeeds_with(2, true, None)?; 864 c.succeeds_with(2, true, None)?;
836 let mut c = p.expect_choice("", vec![ 865 let mut c = p.expect_choice(
837 format!("checkout proposal branch and apply 1 appendments"), 866 "",
838 format!("apply to current branch with `git am`"), 867 vec![
839 format!("download to ./patches"), 868 format!("checkout proposal branch and apply 1 appendments"),
840 format!("back"), 869 format!("apply to current branch with `git am`"),
841 ])?; 870 format!("download to ./patches"),
871 format!("back"),
872 ],
873 )?;
842 c.succeeds_with(0, true, Some(0))?; 874 c.succeeds_with(0, true, Some(0))?;
843 p.expect("checked out proposal branch and applied 1 appendments (2 ahead 0 behind 'main')\r\n")?; 875 p.expect("checked out proposal branch and applied 1 appendments (2 ahead 0 behind 'main')\r\n")?;
844 p.expect_end()?; 876 p.expect_end()?;
@@ -897,18 +929,24 @@ mod when_main_branch_is_uptodate {
897 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]); 929 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]);
898 p.expect("fetching updates...\r\n")?; 930 p.expect("fetching updates...\r\n")?;
899 p.expect_eventually("\r\n")?; // some updates listed here 931 p.expect_eventually("\r\n")?; // some updates listed here
900 let mut c = p.expect_choice("all proposals", vec![ 932 let mut c = p.expect_choice(
901 format!("\"{PROPOSAL_TITLE_3}\""), 933 "all proposals",
902 format!("\"{PROPOSAL_TITLE_2}\""), 934 vec![
903 format!("\"{PROPOSAL_TITLE_1}\""), 935 format!("\"{PROPOSAL_TITLE_3}\""),
904 ])?; 936 format!("\"{PROPOSAL_TITLE_2}\""),
937 format!("\"{PROPOSAL_TITLE_1}\""),
938 ],
939 )?;
905 c.succeeds_with(2, true, None)?; 940 c.succeeds_with(2, true, None)?;
906 let mut c = p.expect_choice("", vec![ 941 let mut c = p.expect_choice(
907 format!("checkout proposal branch and apply 1 appendments"), 942 "",
908 format!("apply to current branch with `git am`"), 943 vec![
909 format!("download to ./patches"), 944 format!("checkout proposal branch and apply 1 appendments"),
910 format!("back"), 945 format!("apply to current branch with `git am`"),
911 ])?; 946 format!("download to ./patches"),
947 format!("back"),
948 ],
949 )?;
912 c.succeeds_with(0, true, Some(0))?; 950 c.succeeds_with(0, true, Some(0))?;
913 p.expect("checked out proposal branch and applied 1 appendments (2 ahead 0 behind 'main')\r\n")?; 951 p.expect("checked out proposal branch and applied 1 appendments (2 ahead 0 behind 'main')\r\n")?;
914 p.expect_end()?; 952 p.expect_end()?;
@@ -1004,21 +1042,29 @@ mod when_main_branch_is_uptodate {
1004 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]); 1042 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]);
1005 p.expect("fetching updates...\r\n")?; 1043 p.expect("fetching updates...\r\n")?;
1006 p.expect_eventually("\r\n")?; // some updates listed here 1044 p.expect_eventually("\r\n")?; // some updates listed here
1007 let mut c = p.expect_choice("all proposals", vec![ 1045 let mut c = p.expect_choice(
1008 format!("\"{PROPOSAL_TITLE_3}\""), 1046 "all proposals",
1009 format!("\"{PROPOSAL_TITLE_2}\""), 1047 vec![
1010 format!("\"{PROPOSAL_TITLE_1}\""), 1048 format!("\"{PROPOSAL_TITLE_3}\""),
1011 ])?; 1049 format!("\"{PROPOSAL_TITLE_2}\""),
1050 format!("\"{PROPOSAL_TITLE_1}\""),
1051 ],
1052 )?;
1012 c.succeeds_with(2, true, None)?; 1053 c.succeeds_with(2, true, None)?;
1013 p.expect_eventually("--force`\r\n")?; 1054 p.expect_eventually("--force`\r\n")?;
1014 1055
1015 let mut c = p.expect_choice("", vec![ 1056 let mut c = p.expect_choice(
1016 format!("checkout local branch with unpublished changes"), 1057 "",
1017 format!("discard unpublished changes and checkout new revision"), 1058 vec![
1018 format!("apply to current branch with `git am`"), 1059 format!("checkout local branch with unpublished changes"),
1019 format!("download to ./patches"), 1060 format!(
1020 "back".to_string(), 1061 "discard unpublished changes and checkout new revision"
1021 ])?; 1062 ),
1063 format!("apply to current branch with `git am`"),
1064 format!("download to ./patches"),
1065 "back".to_string(),
1066 ],
1067 )?;
1022 c.succeeds_with(1, true, Some(0))?; 1068 c.succeeds_with(1, true, Some(0))?;
1023 1069
1024 p.expect_end_eventually_and_print()?; 1070 p.expect_end_eventually_and_print()?;
@@ -1075,11 +1121,14 @@ mod when_main_branch_is_uptodate {
1075 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]); 1121 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]);
1076 p.expect("fetching updates...\r\n")?; 1122 p.expect("fetching updates...\r\n")?;
1077 p.expect_eventually("\r\n")?; // some updates listed here 1123 p.expect_eventually("\r\n")?; // some updates listed here
1078 let mut c = p.expect_choice("all proposals", vec![ 1124 let mut c = p.expect_choice(
1079 format!("\"{PROPOSAL_TITLE_3}\""), 1125 "all proposals",
1080 format!("\"{PROPOSAL_TITLE_2}\""), 1126 vec![
1081 format!("\"{PROPOSAL_TITLE_1}\""), 1127 format!("\"{PROPOSAL_TITLE_3}\""),
1082 ])?; 1128 format!("\"{PROPOSAL_TITLE_2}\""),
1129 format!("\"{PROPOSAL_TITLE_1}\""),
1130 ],
1131 )?;
1083 c.succeeds_with(2, true, None)?; 1132 c.succeeds_with(2, true, None)?;
1084 p.expect("you have an amended/rebase version the proposal that is unpublished\r\n")?; 1133 p.expect("you have an amended/rebase version the proposal that is unpublished\r\n")?;
1085 p.expect("you have previously applied the latest version of the proposal (2 ahead 0 behind 'main') but your local proposal branch has amended or rebased it (2 ahead 0 behind 'main')\r\n")?; 1134 p.expect("you have previously applied the latest version of the proposal (2 ahead 0 behind 'main') but your local proposal branch has amended or rebased it (2 ahead 0 behind 'main')\r\n")?;
@@ -1088,13 +1137,18 @@ mod when_main_branch_is_uptodate {
1088 p.expect(" 2) run `ngit list` and checkout the latest published version of this proposal\r\n")?; 1137 p.expect(" 2) run `ngit list` and checkout the latest published version of this proposal\r\n")?;
1089 p.expect("if you are confident in your changes consider running `ngit push --force`\r\n")?; 1138 p.expect("if you are confident in your changes consider running `ngit push --force`\r\n")?;
1090 1139
1091 let mut c = p.expect_choice("", vec![ 1140 let mut c = p.expect_choice(
1092 format!("checkout local branch with unpublished changes"), 1141 "",
1093 format!("discard unpublished changes and checkout new revision"), 1142 vec![
1094 format!("apply to current branch with `git am`"), 1143 format!("checkout local branch with unpublished changes"),
1095 format!("download to ./patches"), 1144 format!(
1096 "back".to_string(), 1145 "discard unpublished changes and checkout new revision"
1097 ])?; 1146 ),
1147 format!("apply to current branch with `git am`"),
1148 format!("download to ./patches"),
1149 "back".to_string(),
1150 ],
1151 )?;
1098 c.succeeds_with(1, true, Some(1))?; 1152 c.succeeds_with(1, true, Some(1))?;
1099 p.expect_end_with("checked out latest version of proposal (2 ahead 0 behind 'main'), replacing unpublished version (2 ahead 0 behind 'main')\r\n")?; 1153 p.expect_end_with("checked out latest version of proposal (2 ahead 0 behind 'main'), replacing unpublished version (2 ahead 0 behind 'main')\r\n")?;
1100 1154
@@ -1172,20 +1226,26 @@ mod when_main_branch_is_uptodate {
1172 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]); 1226 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]);
1173 p.expect("fetching updates...\r\n")?; 1227 p.expect("fetching updates...\r\n")?;
1174 p.expect_eventually("\r\n")?; // some updates listed here 1228 p.expect_eventually("\r\n")?; // some updates listed here
1175 let mut c = p.expect_choice("all proposals", vec![ 1229 let mut c = p.expect_choice(
1176 format!("\"{PROPOSAL_TITLE_3}\""), 1230 "all proposals",
1177 format!("\"{PROPOSAL_TITLE_2}\""), 1231 vec![
1178 format!("\"{PROPOSAL_TITLE_1}\""), 1232 format!("\"{PROPOSAL_TITLE_3}\""),
1179 ])?; 1233 format!("\"{PROPOSAL_TITLE_2}\""),
1234 format!("\"{PROPOSAL_TITLE_1}\""),
1235 ],
1236 )?;
1180 c.succeeds_with(2, true, None)?; 1237 c.succeeds_with(2, true, None)?;
1181 p.expect( 1238 p.expect(
1182 "local proposal branch exists with 1 unpublished commits on top of the most up-to-date version of the proposal (3 ahead 0 behind 'main')\r\n", 1239 "local proposal branch exists with 1 unpublished commits on top of the most up-to-date version of the proposal (3 ahead 0 behind 'main')\r\n",
1183 )?; 1240 )?;
1184 1241
1185 let mut c = p.expect_choice("", vec![ 1242 let mut c = p.expect_choice(
1186 format!("checkout proposal branch with 1 unpublished commits"), 1243 "",
1187 format!("back"), 1244 vec![
1188 ])?; 1245 format!("checkout proposal branch with 1 unpublished commits"),
1246 format!("back"),
1247 ],
1248 )?;
1189 c.succeeds_with(0, true, Some(0))?; 1249 c.succeeds_with(0, true, Some(0))?;
1190 p.expect("checked out proposal branch with 1 unpublished commits (3 ahead 0 behind 'main')\r\n")?; 1250 p.expect("checked out proposal branch with 1 unpublished commits (3 ahead 0 behind 'main')\r\n")?;
1191 p.expect_end()?; 1251 p.expect_end()?;
@@ -1248,20 +1308,26 @@ mod when_main_branch_is_uptodate {
1248 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]); 1308 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]);
1249 p.expect("fetching updates...\r\n")?; 1309 p.expect("fetching updates...\r\n")?;
1250 p.expect_eventually("\r\n")?; // some updates listed here 1310 p.expect_eventually("\r\n")?; // some updates listed here
1251 let mut c = p.expect_choice("all proposals", vec![ 1311 let mut c = p.expect_choice(
1252 format!("\"{PROPOSAL_TITLE_3}\""), 1312 "all proposals",
1253 format!("\"{PROPOSAL_TITLE_2}\""), 1313 vec![
1254 format!("\"{PROPOSAL_TITLE_1}\""), 1314 format!("\"{PROPOSAL_TITLE_3}\""),
1255 ])?; 1315 format!("\"{PROPOSAL_TITLE_2}\""),
1316 format!("\"{PROPOSAL_TITLE_1}\""),
1317 ],
1318 )?;
1256 c.succeeds_with(2, true, None)?; 1319 c.succeeds_with(2, true, None)?;
1257 p.expect( 1320 p.expect(
1258 "local proposal branch exists with 1 unpublished commits on top of the most up-to-date version of the proposal (3 ahead 0 behind 'main')\r\n", 1321 "local proposal branch exists with 1 unpublished commits on top of the most up-to-date version of the proposal (3 ahead 0 behind 'main')\r\n",
1259 )?; 1322 )?;
1260 1323
1261 let mut c = p.expect_choice("", vec![ 1324 let mut c = p.expect_choice(
1262 format!("checkout proposal branch with 1 unpublished commits"), 1325 "",
1263 format!("back"), 1326 vec![
1264 ])?; 1327 format!("checkout proposal branch with 1 unpublished commits"),
1328 format!("back"),
1329 ],
1330 )?;
1265 c.succeeds_with(0, true, Some(0))?; 1331 c.succeeds_with(0, true, Some(0))?;
1266 p.expect("checked out proposal branch with 1 unpublished commits (3 ahead 0 behind 'main')\r\n")?; 1332 p.expect("checked out proposal branch with 1 unpublished commits (3 ahead 0 behind 'main')\r\n")?;
1267 p.expect_end()?; 1333 p.expect_end()?;
@@ -1344,20 +1410,26 @@ mod when_main_branch_is_uptodate {
1344 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]); 1410 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]);
1345 p.expect("fetching updates...\r\n")?; 1411 p.expect("fetching updates...\r\n")?;
1346 p.expect_eventually("\r\n")?; // some updates listed here 1412 p.expect_eventually("\r\n")?; // some updates listed here
1347 let mut c = p.expect_choice("all proposals", vec![ 1413 let mut c = p.expect_choice(
1348 format!("\"{PROPOSAL_TITLE_3}\""), 1414 "all proposals",
1349 format!("\"{PROPOSAL_TITLE_2}\""), 1415 vec![
1350 format!("\"{PROPOSAL_TITLE_1}\""), 1416 format!("\"{PROPOSAL_TITLE_3}\""),
1351 ])?; 1417 format!("\"{PROPOSAL_TITLE_2}\""),
1418 format!("\"{PROPOSAL_TITLE_1}\""),
1419 ],
1420 )?;
1352 c.succeeds_with(2, true, None)?; 1421 c.succeeds_with(2, true, None)?;
1353 p.expect("updated proposal available (2 ahead 0 behind 'main'). existing version is 2 ahead 1 behind 'main'\r\n")?; 1422 p.expect("updated proposal available (2 ahead 0 behind 'main'). existing version is 2 ahead 1 behind 'main'\r\n")?;
1354 let mut c = p.expect_choice("", vec![ 1423 let mut c = p.expect_choice(
1355 format!("checkout and overwrite existing proposal branch"), 1424 "",
1356 format!("checkout existing outdated proposal branch"), 1425 vec![
1357 format!("apply to current branch with `git am`"), 1426 format!("checkout and overwrite existing proposal branch"),
1358 format!("download to ./patches"), 1427 format!("checkout existing outdated proposal branch"),
1359 format!("back"), 1428 format!("apply to current branch with `git am`"),
1360 ])?; 1429 format!("download to ./patches"),
1430 format!("back"),
1431 ],
1432 )?;
1361 c.succeeds_with(0, true, Some(0))?; 1433 c.succeeds_with(0, true, Some(0))?;
1362 p.expect("checked out new version of proposal (2 ahead 0 behind 'main'), replacing old version (2 ahead 1 behind 'main')\r\n")?; 1434 p.expect("checked out new version of proposal (2 ahead 0 behind 'main'), replacing old version (2 ahead 1 behind 'main')\r\n")?;
1363 p.expect_end()?; 1435 p.expect_end()?;
@@ -1411,20 +1483,26 @@ mod when_main_branch_is_uptodate {
1411 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]); 1483 let mut p = CliTester::new_from_dir(&test_repo.dir, ["list"]);
1412 p.expect("fetching updates...\r\n")?; 1484 p.expect("fetching updates...\r\n")?;
1413 p.expect_eventually("\r\n")?; // some updates listed here 1485 p.expect_eventually("\r\n")?; // some updates listed here
1414 let mut c = p.expect_choice("all proposals", vec![ 1486 let mut c = p.expect_choice(
1415 format!("\"{PROPOSAL_TITLE_3}\""), 1487 "all proposals",
1416 format!("\"{PROPOSAL_TITLE_2}\""), 1488 vec![
1417 format!("\"{PROPOSAL_TITLE_1}\""), 1489 format!("\"{PROPOSAL_TITLE_3}\""),
1418 ])?; 1490 format!("\"{PROPOSAL_TITLE_2}\""),
1491 format!("\"{PROPOSAL_TITLE_1}\""),
1492 ],
1493 )?;
1419 c.succeeds_with(2, true, None)?; 1494 c.succeeds_with(2, true, None)?;
1420 p.expect("updated proposal available (2 ahead 0 behind 'main'). existing version is 2 ahead 1 behind 'main'\r\n")?; 1495 p.expect("updated proposal available (2 ahead 0 behind 'main'). existing version is 2 ahead 1 behind 'main'\r\n")?;
1421 let mut c = p.expect_choice("", vec![ 1496 let mut c = p.expect_choice(
1422 format!("checkout and overwrite existing proposal branch"), 1497 "",
1423 format!("checkout existing outdated proposal branch"), 1498 vec![
1424 format!("apply to current branch with `git am`"), 1499 format!("checkout and overwrite existing proposal branch"),
1425 format!("download to ./patches"), 1500 format!("checkout existing outdated proposal branch"),
1426 format!("back"), 1501 format!("apply to current branch with `git am`"),
1427 ])?; 1502 format!("download to ./patches"),
1503 format!("back"),
1504 ],
1505 )?;
1428 c.succeeds_with(0, true, Some(0))?; 1506 c.succeeds_with(0, true, Some(0))?;
1429 p.expect("checked out new version of proposal (2 ahead 0 behind 'main'), replacing old version (2 ahead 1 behind 'main')\r\n")?; 1507 p.expect("checked out new version of proposal (2 ahead 0 behind 'main'), replacing old version (2 ahead 1 behind 'main')\r\n")?;
1430 p.expect_end()?; 1508 p.expect_end()?;
diff --git a/tests/ngit_login.rs b/tests/ngit_login.rs
index b1e2676..9e708dc 100644
--- a/tests/ngit_login.rs
+++ b/tests/ngit_login.rs
@@ -6,21 +6,27 @@ use test_utils::*;
6static EXPECTED_NSEC_PROMPT: &str = "nsec"; 6static EXPECTED_NSEC_PROMPT: &str = "nsec";
7 7
8fn show_first_time_login_choices(p: &mut CliTester) -> Result<CliTesterChoicePrompt> { 8fn show_first_time_login_choices(p: &mut CliTester) -> Result<CliTesterChoicePrompt> {
9 p.expect_choice("login to nostr", vec![ 9 p.expect_choice(
10 "secret key (nsec / ncryptsec)".to_string(), 10 "login to nostr",
11 "nostr connect (remote signer)".to_string(), 11 vec![
12 "create account".to_string(), 12 "secret key (nsec / ncryptsec)".to_string(),
13 "help".to_string(), 13 "nostr connect (remote signer)".to_string(),
14 ]) 14 "create account".to_string(),
15 "help".to_string(),
16 ],
17 )
15} 18}
16 19
17fn first_time_login_choices_succeeds_with_nsec(p: &mut CliTester, nsec: &str) -> Result<()> { 20fn first_time_login_choices_succeeds_with_nsec(p: &mut CliTester, nsec: &str) -> Result<()> {
18 p.expect_choice("login to nostr", vec![ 21 p.expect_choice(
19 "secret key (nsec / ncryptsec)".to_string(), 22 "login to nostr",
20 "nostr connect (remote signer)".to_string(), 23 vec![
21 "create account".to_string(), 24 "secret key (nsec / ncryptsec)".to_string(),
22 "help".to_string(), 25 "nostr connect (remote signer)".to_string(),
23 ])? 26 "create account".to_string(),
27 "help".to_string(),
28 ],
29 )?
24 .succeeds_with(0, false, Some(0))?; 30 .succeeds_with(0, false, Some(0))?;
25 31
26 p.expect_input(EXPECTED_NSEC_PROMPT)? 32 p.expect_input(EXPECTED_NSEC_PROMPT)?
@@ -110,9 +116,7 @@ mod with_relays {
110 116
111 p.expect("failed to extract account name from account metadata...\r\n")?; 117 p.expect("failed to extract account name from account metadata...\r\n")?;
112 118
113 p.expect_end_with( 119 p.expect_end_with(format!("logged in as {TEST_KEY_1_NPUB}\r\n").as_str())?;
114 format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str(),
115 )?;
116 for p in [51, 52] { 120 for p in [51, 52] {
117 shutdown_relay(8000 + p)?; 121 shutdown_relay(8000 + p)?;
118 } 122 }
@@ -131,17 +135,25 @@ mod with_relays {
131 async fn when_latest_metadata_and_relay_list_on_all_relays() -> Result<()> { 135 async fn when_latest_metadata_and_relay_list_on_all_relays() -> Result<()> {
132 run_test_displays_correct_name( 136 run_test_displays_correct_name(
133 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 137 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
134 relay.respond_events(client_id, &subscription_id, &vec![ 138 relay.respond_events(
135 generate_test_key_1_metadata_event("fred"), 139 client_id,
136 generate_test_key_1_relay_list_event_same_as_fallback(), 140 &subscription_id,
137 ])?; 141 &vec![
142 generate_test_key_1_metadata_event("fred"),
143 generate_test_key_1_relay_list_event_same_as_fallback(),
144 ],
145 )?;
138 Ok(()) 146 Ok(())
139 }), 147 }),
140 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 148 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
141 relay.respond_events(client_id, &subscription_id, &vec![ 149 relay.respond_events(
142 generate_test_key_1_metadata_event("fred"), 150 client_id,
143 generate_test_key_1_relay_list_event_same_as_fallback(), 151 &subscription_id,
144 ])?; 152 &vec![
153 generate_test_key_1_metadata_event("fred"),
154 generate_test_key_1_relay_list_event_same_as_fallback(),
155 ],
156 )?;
145 Ok(()) 157 Ok(())
146 }), 158 }),
147 ) 159 )
@@ -156,14 +168,18 @@ mod with_relays {
156 async fn when_metadata_contains_only_display_name() -> Result<()> { 168 async fn when_metadata_contains_only_display_name() -> Result<()> {
157 run_test_displays_correct_name( 169 run_test_displays_correct_name(
158 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 170 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
159 relay.respond_events(client_id, &subscription_id, &vec![ 171 relay.respond_events(
160 nostr::event::EventBuilder::metadata( 172 client_id,
161 &nostr::Metadata::new().display_name("fred"), 173 &subscription_id,
162 ) 174 &vec![
163 .sign_with_keys(&TEST_KEY_1_KEYS) 175 nostr::event::EventBuilder::metadata(
164 .unwrap(), 176 &nostr::Metadata::new().display_name("fred"),
165 generate_test_key_1_relay_list_event_same_as_fallback(), 177 )
166 ])?; 178 .sign_with_keys(&TEST_KEY_1_KEYS)
179 .unwrap(),
180 generate_test_key_1_relay_list_event_same_as_fallback(),
181 ],
182 )?;
167 Ok(()) 183 Ok(())
168 }), 184 }),
169 None, 185 None,
@@ -189,14 +205,19 @@ mod with_relays {
189 205
190 run_test_displays_correct_name( 206 run_test_displays_correct_name(
191 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 207 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
192 relay.respond_events(client_id, &subscription_id, &vec![ 208 relay.respond_events(
193 nostr::event::EventBuilder::metadata( 209 client_id,
194 &nostr::Metadata::new().custom_field("displayName", "fred"), 210 &subscription_id,
195 ) 211 &vec![
196 .sign_with_keys(&TEST_KEY_1_KEYS) 212 nostr::event::EventBuilder::metadata(
197 .unwrap(), 213 &nostr::Metadata::new()
198 generate_test_key_1_relay_list_event_same_as_fallback(), 214 .custom_field("displayName", "fred"),
199 ])?; 215 )
216 .sign_with_keys(&TEST_KEY_1_KEYS)
217 .unwrap(),
218 generate_test_key_1_relay_list_event_same_as_fallback(),
219 ],
220 )?;
200 Ok(()) 221 Ok(())
201 }), 222 }),
202 None, 223 None,
@@ -210,14 +231,18 @@ mod with_relays {
210 -> Result<()> { 231 -> Result<()> {
211 run_test_displays_fallback_to_npub( 232 run_test_displays_fallback_to_npub(
212 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 233 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
213 relay.respond_events(client_id, &subscription_id, &vec![ 234 relay.respond_events(
214 nostr::event::EventBuilder::metadata( 235 client_id,
215 &nostr::Metadata::new().about("other info in metadata"), 236 &subscription_id,
216 ) 237 &vec![
217 .sign_with_keys(&TEST_KEY_1_KEYS) 238 nostr::event::EventBuilder::metadata(
218 .unwrap(), 239 &nostr::Metadata::new().about("other info in metadata"),
219 generate_test_key_1_relay_list_event_same_as_fallback(), 240 )
220 ])?; 241 .sign_with_keys(&TEST_KEY_1_KEYS)
242 .unwrap(),
243 generate_test_key_1_relay_list_event_same_as_fallback(),
244 ],
245 )?;
221 Ok(()) 246 Ok(())
222 }), 247 }),
223 None, 248 None,
@@ -232,10 +257,14 @@ mod with_relays {
232 -> Result<()> { 257 -> Result<()> {
233 run_test_displays_correct_name( 258 run_test_displays_correct_name(
234 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 259 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
235 relay.respond_events(client_id, &subscription_id, &vec![ 260 relay.respond_events(
236 generate_test_key_1_metadata_event("fred"), 261 client_id,
237 generate_test_key_1_relay_list_event_same_as_fallback(), 262 &subscription_id,
238 ])?; 263 &vec![
264 generate_test_key_1_metadata_event("fred"),
265 generate_test_key_1_relay_list_event_same_as_fallback(),
266 ],
267 )?;
239 Ok(()) 268 Ok(())
240 }), 269 }),
241 None, 270 None,
@@ -249,15 +278,19 @@ mod with_relays {
249 { 278 {
250 run_test_displays_correct_name( 279 run_test_displays_correct_name(
251 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 280 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
252 relay.respond_events(client_id, &subscription_id, &vec![ 281 relay.respond_events(
253 generate_test_key_1_metadata_event("fred"), 282 client_id,
254 ])?; 283 &subscription_id,
284 &vec![generate_test_key_1_metadata_event("fred")],
285 )?;
255 Ok(()) 286 Ok(())
256 }), 287 }),
257 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 288 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
258 relay.respond_events(client_id, &subscription_id, &vec![ 289 relay.respond_events(
259 generate_test_key_1_relay_list_event_same_as_fallback(), 290 client_id,
260 ])?; 291 &subscription_id,
292 &vec![generate_test_key_1_relay_list_event_same_as_fallback()],
293 )?;
261 Ok(()) 294 Ok(())
262 }), 295 }),
263 ) 296 )
@@ -269,16 +302,22 @@ mod with_relays {
269 async fn when_some_relays_return_old_metadata_event() -> Result<()> { 302 async fn when_some_relays_return_old_metadata_event() -> Result<()> {
270 run_test_displays_correct_name( 303 run_test_displays_correct_name(
271 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 304 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
272 relay.respond_events(client_id, &subscription_id, &vec![ 305 relay.respond_events(
273 generate_test_key_1_metadata_event("fred"), 306 client_id,
274 generate_test_key_1_relay_list_event_same_as_fallback(), 307 &subscription_id,
275 ])?; 308 &vec![
309 generate_test_key_1_metadata_event("fred"),
310 generate_test_key_1_relay_list_event_same_as_fallback(),
311 ],
312 )?;
276 Ok(()) 313 Ok(())
277 }), 314 }),
278 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 315 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
279 relay.respond_events(client_id, &subscription_id, &vec![ 316 relay.respond_events(
280 generate_test_key_1_metadata_event_old("fred old"), 317 client_id,
281 ])?; 318 &subscription_id,
319 &vec![generate_test_key_1_metadata_event_old("fred old")],
320 )?;
282 Ok(()) 321 Ok(())
283 }), 322 }),
284 ) 323 )
@@ -290,16 +329,22 @@ mod with_relays {
290 async fn when_some_relays_return_other_users_metadata() -> Result<()> { 329 async fn when_some_relays_return_other_users_metadata() -> Result<()> {
291 run_test_displays_correct_name( 330 run_test_displays_correct_name(
292 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 331 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
293 relay.respond_events(client_id, &subscription_id, &vec![ 332 relay.respond_events(
294 generate_test_key_2_metadata_event("carole"), 333 client_id,
295 ])?; 334 &subscription_id,
335 &vec![generate_test_key_2_metadata_event("carole")],
336 )?;
296 Ok(()) 337 Ok(())
297 }), 338 }),
298 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 339 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
299 relay.respond_events(client_id, &subscription_id, &vec![ 340 relay.respond_events(
300 generate_test_key_1_metadata_event_old("fred"), 341 client_id,
301 generate_test_key_1_relay_list_event_same_as_fallback(), 342 &subscription_id,
302 ])?; 343 &vec![
344 generate_test_key_1_metadata_event_old("fred"),
345 generate_test_key_1_relay_list_event_same_as_fallback(),
346 ],
347 )?;
303 Ok(()) 348 Ok(())
304 }), 349 }),
305 ) 350 )
@@ -312,16 +357,22 @@ mod with_relays {
312 run_test_displays_correct_name( 357 run_test_displays_correct_name(
313 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 358 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
314 let event = generate_test_key_1_kind_event(nostr::Kind::TextNote); 359 let event = generate_test_key_1_kind_event(nostr::Kind::TextNote);
315 relay.respond_events(client_id, &subscription_id, &vec![ 360 relay.respond_events(
316 make_event_old_or_change_user(event, &TEST_KEY_1_KEYS, 0), 361 client_id,
317 ])?; 362 &subscription_id,
363 &vec![make_event_old_or_change_user(event, &TEST_KEY_1_KEYS, 0)],
364 )?;
318 Ok(()) 365 Ok(())
319 }), 366 }),
320 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 367 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
321 relay.respond_events(client_id, &subscription_id, &vec![ 368 relay.respond_events(
322 generate_test_key_1_metadata_event_old("fred"), 369 client_id,
323 generate_test_key_1_relay_list_event_same_as_fallback(), 370 &subscription_id,
324 ])?; 371 &vec![
372 generate_test_key_1_metadata_event_old("fred"),
373 generate_test_key_1_relay_list_event_same_as_fallback(),
374 ],
375 )?;
325 Ok(()) 376 Ok(())
326 }), 377 }),
327 ) 378 )
@@ -336,10 +387,14 @@ mod with_relays {
336 async fn displays_correct_name() -> Result<()> { 387 async fn displays_correct_name() -> Result<()> {
337 run_test_when_specifying_command_line_nsec_only_displays_correct_name( 388 run_test_when_specifying_command_line_nsec_only_displays_correct_name(
338 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 389 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
339 relay.respond_events(client_id, &subscription_id, &vec![ 390 relay.respond_events(
340 generate_test_key_1_metadata_event("fred"), 391 client_id,
341 generate_test_key_1_relay_list_event_same_as_fallback(), 392 &subscription_id,
342 ])?; 393 &vec![
394 generate_test_key_1_metadata_event("fred"),
395 generate_test_key_1_relay_list_event_same_as_fallback(),
396 ],
397 )?;
343 Ok(()) 398 Ok(())
344 }), 399 }),
345 None, 400 None,
@@ -357,12 +412,10 @@ mod with_relays {
357 412
358 let cli_tester_handle = std::thread::spawn(move || -> Result<()> { 413 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
359 let test_repo = GitTestRepo::default(); 414 let test_repo = GitTestRepo::default();
360 let mut p = CliTester::new_from_dir(&test_repo.dir, [ 415 let mut p = CliTester::new_from_dir(
361 "account", 416 &test_repo.dir,
362 "login", 417 ["account", "login", "--nsec", TEST_KEY_1_NSEC],
363 "--nsec", 418 );
364 TEST_KEY_1_NSEC,
365 ]);
366 419
367 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?; 420 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?;
368 421
@@ -434,9 +487,11 @@ mod with_relays {
434 async fn warm_user_and_displays_name() -> Result<()> { 487 async fn warm_user_and_displays_name() -> Result<()> {
435 run_test_when_no_relay_list_found_warns_user_and_uses_npub( 488 run_test_when_no_relay_list_found_warns_user_and_uses_npub(
436 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 489 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
437 relay.respond_events(client_id, &subscription_id, &vec![ 490 relay.respond_events(
438 generate_test_key_1_metadata_event("fred"), 491 client_id,
439 ])?; 492 &subscription_id,
493 &vec![generate_test_key_1_metadata_event("fred")],
494 )?;
440 Ok(()) 495 Ok(())
441 }), 496 }),
442 None, 497 None,
@@ -527,17 +582,25 @@ mod with_relays {
527 async fn displays_correct_name() -> Result<()> { 582 async fn displays_correct_name() -> Result<()> {
528 run_test_displays_correct_name( 583 run_test_displays_correct_name(
529 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 584 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
530 relay.respond_events(client_id, &subscription_id, &vec![ 585 relay.respond_events(
531 generate_test_key_1_metadata_event_old("Fred"), 586 client_id,
532 generate_test_key_1_relay_list_event(), 587 &subscription_id,
533 ])?; 588 &vec![
589 generate_test_key_1_metadata_event_old("Fred"),
590 generate_test_key_1_relay_list_event(),
591 ],
592 )?;
534 Ok(()) 593 Ok(())
535 }), 594 }),
536 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 595 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
537 relay.respond_events(client_id, &subscription_id, &vec![ 596 relay.respond_events(
538 generate_test_key_1_metadata_event("fred"), 597 client_id,
539 generate_test_key_1_relay_list_event(), 598 &subscription_id,
540 ])?; 599 &vec![
600 generate_test_key_1_metadata_event("fred"),
601 generate_test_key_1_relay_list_event(),
602 ],
603 )?;
541 Ok(()) 604 Ok(())
542 }), 605 }),
543 ) 606 )
@@ -572,7 +635,7 @@ mod with_offline_flag {
572 635
573 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?; 636 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?;
574 637
575 p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) 638 p.expect_end_with(format!("logged in as {TEST_KEY_1_NPUB}\r\n").as_str())
576 } 639 }
577 640
578 #[test] 641 #[test]
@@ -587,7 +650,7 @@ mod with_offline_flag {
587 650
588 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?; 651 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?;
589 652
590 p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) 653 p.expect_end_with(format!("logged in as {TEST_KEY_1_NPUB}\r\n").as_str())
591 } 654 }
592 655
593 mod when_invalid_nsec { 656 mod when_invalid_nsec {
@@ -609,10 +672,10 @@ mod with_offline_flag {
609 true, 672 true,
610 )?; 673 )?;
611 674
612 p.expect_choice("login to nostr", vec![ 675 p.expect_choice(
613 "try again with nsec".to_string(), 676 "login to nostr",
614 "back".to_string(), 677 vec!["try again with nsec".to_string(), "back".to_string()],
615 ])? 678 )?
616 .succeeds_with(0, false, Some(0))?; 679 .succeeds_with(0, false, Some(0))?;
617 } 680 }
618 681
@@ -621,7 +684,7 @@ mod with_offline_flag {
621 684
622 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?; 685 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?;
623 686
624 p.expect_end_with(format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str()) 687 p.expect_end_with(format!("logged in as {TEST_KEY_1_NPUB}\r\n").as_str())
625 } 688 }
626 } 689 }
627 } 690 }
@@ -632,31 +695,25 @@ mod with_offline_flag {
632 #[test] 695 #[test]
633 fn valid_nsec_param_succeeds_without_prompts() -> Result<()> { 696 fn valid_nsec_param_succeeds_without_prompts() -> Result<()> {
634 let test_repo = GitTestRepo::default(); 697 let test_repo = GitTestRepo::default();
635 let mut p = CliTester::new_from_dir(&test_repo.dir, [ 698 let mut p = CliTester::new_from_dir(
636 "account", 699 &test_repo.dir,
637 "login", 700 ["account", "login", "--offline", "--nsec", TEST_KEY_1_NSEC],
638 "--offline", 701 );
639 "--nsec",
640 TEST_KEY_1_NSEC,
641 ]);
642 702
643 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?; 703 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?;
644 704
645 p.expect_end_with( 705 p.expect_end_with(
646 format!("logged in as {} via cli arguments\r\n", TEST_KEY_1_NPUB).as_str(), 706 format!("logged in as {TEST_KEY_1_NPUB} via cli arguments\r\n").as_str(),
647 ) 707 )
648 } 708 }
649 709
650 #[test] 710 #[test]
651 fn invalid_nsec_param_fails_without_prompts() -> Result<()> { 711 fn invalid_nsec_param_fails_without_prompts() -> Result<()> {
652 let test_repo = GitTestRepo::default(); 712 let test_repo = GitTestRepo::default();
653 let mut p = CliTester::new_from_dir(&test_repo.dir, [ 713 let mut p = CliTester::new_from_dir(
654 "account", 714 &test_repo.dir,
655 "login", 715 ["account", "login", "--offline", "--nsec", TEST_INVALID_NSEC],
656 "--offline", 716 );
657 "--nsec",
658 TEST_INVALID_NSEC,
659 ]);
660 717
661 p.expect_end_with( 718 p.expect_end_with(
662 "Error: invalid nsec parameter\r\n\r\nCaused by:\r\n Invalid secret key\r\n", 719 "Error: invalid nsec parameter\r\n\r\nCaused by:\r\n Invalid secret key\r\n",
@@ -670,38 +727,44 @@ mod with_offline_flag {
670 #[test] 727 #[test]
671 fn valid_nsec_param_succeeds_without_prompts() -> Result<()> { 728 fn valid_nsec_param_succeeds_without_prompts() -> Result<()> {
672 let test_repo = GitTestRepo::default(); 729 let test_repo = GitTestRepo::default();
673 let mut p = CliTester::new_from_dir(&test_repo.dir, [ 730 let mut p = CliTester::new_from_dir(
674 "account", 731 &test_repo.dir,
675 "login", 732 [
676 "--offline", 733 "account",
677 "--nsec", 734 "login",
678 TEST_KEY_1_NSEC, 735 "--offline",
679 "--password", 736 "--nsec",
680 TEST_PASSWORD, 737 TEST_KEY_1_NSEC,
681 ]); 738 "--password",
739 TEST_PASSWORD,
740 ],
741 );
682 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?; 742 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?;
683 743
684 p.expect_end_with( 744 p.expect_end_with(
685 format!("logged in as {} via cli arguments\r\n", TEST_KEY_1_NPUB).as_str(), 745 format!("logged in as {TEST_KEY_1_NPUB} via cli arguments\r\n").as_str(),
686 ) 746 )
687 } 747 }
688 748
689 #[test] 749 #[test]
690 fn parameters_can_be_called_globally() -> Result<()> { 750 fn parameters_can_be_called_globally() -> Result<()> {
691 let test_repo = GitTestRepo::default(); 751 let test_repo = GitTestRepo::default();
692 let mut p = CliTester::new_from_dir(&test_repo.dir, [ 752 let mut p = CliTester::new_from_dir(
693 "--nsec", 753 &test_repo.dir,
694 TEST_KEY_1_NSEC, 754 [
695 "--password", 755 "--nsec",
696 TEST_PASSWORD, 756 TEST_KEY_1_NSEC,
697 "account", 757 "--password",
698 "login", 758 TEST_PASSWORD,
699 "--offline", 759 "account",
700 ]); 760 "login",
761 "--offline",
762 ],
763 );
701 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?; 764 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?;
702 765
703 p.expect_end_with( 766 p.expect_end_with(
704 format!("logged in as {} via cli arguments\r\n", TEST_KEY_1_NPUB).as_str(), 767 format!("logged in as {TEST_KEY_1_NPUB} via cli arguments\r\n").as_str(),
705 ) 768 )
706 } 769 }
707 770
@@ -712,19 +775,22 @@ mod with_offline_flag {
712 fn valid_nsec_param_succeeds_without_prompts_and_logs_in() -> Result<()> { 775 fn valid_nsec_param_succeeds_without_prompts_and_logs_in() -> Result<()> {
713 standard_first_time_login_with_nsec()?.exit()?; 776 standard_first_time_login_with_nsec()?.exit()?;
714 let test_repo = GitTestRepo::default(); 777 let test_repo = GitTestRepo::default();
715 let mut p = CliTester::new_from_dir(&test_repo.dir, [ 778 let mut p = CliTester::new_from_dir(
716 "account", 779 &test_repo.dir,
717 "login", 780 [
718 "--offline", 781 "account",
719 "--nsec", 782 "login",
720 TEST_KEY_2_NSEC, 783 "--offline",
721 "--password", 784 "--nsec",
722 TEST_PASSWORD, 785 TEST_KEY_2_NSEC,
723 ]); 786 "--password",
787 TEST_PASSWORD,
788 ],
789 );
724 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?; 790 p.expect("saved login details to local git config. you are only logged in to this local repository.\r\n")?;
725 791
726 p.expect_end_with( 792 p.expect_end_with(
727 format!("logged in as {} via cli arguments\r\n", TEST_KEY_2_NPUB).as_str(), 793 format!("logged in as {TEST_KEY_2_NPUB} via cli arguments\r\n").as_str(),
728 ) 794 )
729 } 795 }
730 } 796 }
diff --git a/tests/ngit_send.rs b/tests/ngit_send.rs
index 629454b..2cd5956 100644
--- a/tests/ngit_send.rs
+++ b/tests/ngit_send.rs
@@ -181,10 +181,14 @@ async fn prep_run_create_proposal(
181 8051, 181 8051,
182 None, 182 None,
183 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 183 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
184 relay.respond_events(client_id, &subscription_id, &vec![ 184 relay.respond_events(
185 generate_test_key_1_metadata_event("fred"), 185 client_id,
186 generate_test_key_1_relay_list_event(), 186 &subscription_id,
187 ])?; 187 &vec![
188 generate_test_key_1_metadata_event("fred"),
189 generate_test_key_1_relay_list_event(),
190 ],
191 )?;
188 Ok(()) 192 Ok(())
189 }), 193 }),
190 ), 194 ),
@@ -194,9 +198,11 @@ async fn prep_run_create_proposal(
194 8055, 198 8055,
195 None, 199 None,
196 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 200 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
197 relay.respond_events(client_id, &subscription_id, &vec![ 201 relay.respond_events(
198 generate_repo_ref_event(), 202 client_id,
199 ])?; 203 &subscription_id,
204 &vec![generate_repo_ref_event()],
205 )?;
200 Ok(()) 206 Ok(())
201 }), 207 }),
202 ), 208 ),
@@ -321,7 +327,7 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
321 +some content\n\\ \ 327 +some content\n\\ \
322 No newline at end of file\n\ 328 No newline at end of file\n\
323 --\n\ 329 --\n\
324 libgit2 1.9.0\n\ 330 libgit2 1.9.1\n\
325 \n\ 331 \n\
326 ", 332 ",
327 ); 333 );
@@ -347,7 +353,7 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
347 +some content\n\\ \ 353 +some content\n\\ \
348 No newline at end of file\n\ 354 No newline at end of file\n\
349 --\n\ 355 --\n\
350 libgit2 1.9.0\n\ 356 libgit2 1.9.1\n\
351 \n\ 357 \n\
352 ", 358 ",
353 ); 359 );
@@ -762,10 +768,14 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
762 8051, 768 8051,
763 None, 769 None,
764 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 770 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
765 relay.respond_events(client_id, &subscription_id, &vec![ 771 relay.respond_events(
766 generate_test_key_1_metadata_event("fred"), 772 client_id,
767 generate_test_key_1_relay_list_event(), 773 &subscription_id,
768 ])?; 774 &vec![
775 generate_test_key_1_metadata_event("fred"),
776 generate_test_key_1_relay_list_event(),
777 ],
778 )?;
769 Ok(()) 779 Ok(())
770 }), 780 }),
771 ), 781 ),
@@ -775,9 +785,11 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
775 8055, 785 8055,
776 None, 786 None,
777 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 787 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
778 relay.respond_events(client_id, &subscription_id, &vec![ 788 relay.respond_events(
779 generate_repo_ref_event(), 789 client_id,
780 ])?; 790 &subscription_id,
791 &vec![generate_repo_ref_event()],
792 )?;
781 Ok(()) 793 Ok(())
782 }), 794 }),
783 ), 795 ),
@@ -836,10 +848,14 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
836 8051, 848 8051,
837 None, 849 None,
838 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 850 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
839 relay.respond_events(client_id, &subscription_id, &vec![ 851 relay.respond_events(
840 generate_test_key_1_metadata_event("fred"), 852 client_id,
841 generate_test_key_1_relay_list_event(), 853 &subscription_id,
842 ])?; 854 &vec![
855 generate_test_key_1_metadata_event("fred"),
856 generate_test_key_1_relay_list_event(),
857 ],
858 )?;
843 Ok(()) 859 Ok(())
844 }), 860 }),
845 ), 861 ),
@@ -849,9 +865,11 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
849 8055, 865 8055,
850 None, 866 None,
851 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 867 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
852 relay.respond_events(client_id, &subscription_id, &vec![ 868 relay.respond_events(
853 generate_repo_ref_event(), 869 client_id,
854 ])?; 870 &subscription_id,
871 &vec![generate_repo_ref_event()],
872 )?;
855 Ok(()) 873 Ok(())
856 }), 874 }),
857 ), 875 ),
@@ -904,10 +922,14 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
904 8051, 922 8051,
905 None, 923 None,
906 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 924 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
907 relay.respond_events(client_id, &subscription_id, &vec![ 925 relay.respond_events(
908 generate_test_key_1_metadata_event("fred"), 926 client_id,
909 generate_test_key_1_relay_list_event(), 927 &subscription_id,
910 ])?; 928 &vec![
929 generate_test_key_1_metadata_event("fred"),
930 generate_test_key_1_relay_list_event(),
931 ],
932 )?;
911 Ok(()) 933 Ok(())
912 }), 934 }),
913 ), 935 ),
@@ -917,9 +939,11 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
917 8055, 939 8055,
918 None, 940 None,
919 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 941 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
920 relay.respond_events(client_id, &subscription_id, &vec![ 942 relay.respond_events(
921 generate_repo_ref_event(), 943 client_id,
922 ])?; 944 &subscription_id,
945 &vec![generate_repo_ref_event()],
946 )?;
923 Ok(()) 947 Ok(())
924 }), 948 }),
925 ), 949 ),
@@ -992,10 +1016,14 @@ mod when_no_cover_letter_flag_set_with_range_of_head_2_sends_2_patches_without_c
992 8051, 1016 8051,
993 None, 1017 None,
994 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1018 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
995 relay.respond_events(client_id, &subscription_id, &vec![ 1019 relay.respond_events(
996 generate_test_key_1_metadata_event("fred"), 1020 client_id,
997 generate_test_key_1_relay_list_event(), 1021 &subscription_id,
998 ])?; 1022 &vec![
1023 generate_test_key_1_metadata_event("fred"),
1024 generate_test_key_1_relay_list_event(),
1025 ],
1026 )?;
999 Ok(()) 1027 Ok(())
1000 }), 1028 }),
1001 ), 1029 ),
@@ -1005,9 +1033,11 @@ mod when_no_cover_letter_flag_set_with_range_of_head_2_sends_2_patches_without_c
1005 8055, 1033 8055,
1006 None, 1034 None,
1007 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1035 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
1008 relay.respond_events(client_id, &subscription_id, &vec![ 1036 relay.respond_events(
1009 generate_repo_ref_event(), 1037 client_id,
1010 ])?; 1038 &subscription_id,
1039 &vec![generate_repo_ref_event()],
1040 )?;
1011 Ok(()) 1041 Ok(())
1012 }), 1042 }),
1013 ), 1043 ),
@@ -1174,13 +1204,16 @@ mod when_range_ommited_prompts_for_selection_defaulting_ahead_of_main {
1174 fn expect_msgs_first(p: &mut CliTester) -> Result<()> { 1204 fn expect_msgs_first(p: &mut CliTester) -> Result<()> {
1175 p.expect("fetching updates...\r\n")?; 1205 p.expect("fetching updates...\r\n")?;
1176 p.expect_eventually("\r\n")?; // may be 'no updates' or some updates 1206 p.expect_eventually("\r\n")?; // may be 'no updates' or some updates
1177 let mut selector = p.expect_multi_select("select commits for proposal", vec![ 1207 let mut selector = p.expect_multi_select(
1178 "(Joe Bloggs) add t4.md [feature] fe973a8".to_string(), 1208 "select commits for proposal",
1179 "(Joe Bloggs) add t3.md 232efb3".to_string(), 1209 vec![
1180 "(Joe Bloggs) add t2.md [main] 431b84e".to_string(), 1210 "(Joe Bloggs) add t4.md [feature] fe973a8".to_string(),
1181 "(Joe Bloggs) add t1.md af474d8".to_string(), 1211 "(Joe Bloggs) add t3.md 232efb3".to_string(),
1182 "(Joe Bloggs) Initial commit 9ee507f".to_string(), 1212 "(Joe Bloggs) add t2.md [main] 431b84e".to_string(),
1183 ])?; 1213 "(Joe Bloggs) add t1.md af474d8".to_string(),
1214 "(Joe Bloggs) Initial commit 9ee507f".to_string(),
1215 ],
1216 )?;
1184 selector.succeeds_with(vec![0, 1], false, vec![0, 1])?; 1217 selector.succeeds_with(vec![0, 1], false, vec![0, 1])?;
1185 p.expect("creating proposal from 2 commits:\r\n")?; 1218 p.expect("creating proposal from 2 commits:\r\n")?;
1186 p.expect("fe973a8 add t4.md\r\n")?; 1219 p.expect("fe973a8 add t4.md\r\n")?;
@@ -1205,10 +1238,14 @@ mod when_range_ommited_prompts_for_selection_defaulting_ahead_of_main {
1205 8051, 1238 8051,
1206 None, 1239 None,
1207 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1240 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
1208 relay.respond_events(client_id, &subscription_id, &vec![ 1241 relay.respond_events(
1209 generate_test_key_1_metadata_event("fred"), 1242 client_id,
1210 generate_test_key_1_relay_list_event(), 1243 &subscription_id,
1211 ])?; 1244 &vec![
1245 generate_test_key_1_metadata_event("fred"),
1246 generate_test_key_1_relay_list_event(),
1247 ],
1248 )?;
1212 Ok(()) 1249 Ok(())
1213 }), 1250 }),
1214 ), 1251 ),
@@ -1218,9 +1255,11 @@ mod when_range_ommited_prompts_for_selection_defaulting_ahead_of_main {
1218 8055, 1255 8055,
1219 None, 1256 None,
1220 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1257 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
1221 relay.respond_events(client_id, &subscription_id, &vec![ 1258 relay.respond_events(
1222 generate_repo_ref_event(), 1259 client_id,
1223 ])?; 1260 &subscription_id,
1261 &vec![generate_repo_ref_event()],
1262 )?;
1224 Ok(()) 1263 Ok(())
1225 }), 1264 }),
1226 ), 1265 ),
@@ -1262,10 +1301,14 @@ mod when_range_ommited_prompts_for_selection_defaulting_ahead_of_main {
1262 8051, 1301 8051,
1263 None, 1302 None,
1264 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1303 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
1265 relay.respond_events(client_id, &subscription_id, &vec![ 1304 relay.respond_events(
1266 generate_test_key_1_metadata_event("fred"), 1305 client_id,
1267 generate_test_key_1_relay_list_event(), 1306 &subscription_id,
1268 ])?; 1307 &vec![
1308 generate_test_key_1_metadata_event("fred"),
1309 generate_test_key_1_relay_list_event(),
1310 ],
1311 )?;
1269 Ok(()) 1312 Ok(())
1270 }), 1313 }),
1271 ), 1314 ),
@@ -1275,9 +1318,11 @@ mod when_range_ommited_prompts_for_selection_defaulting_ahead_of_main {
1275 8055, 1318 8055,
1276 None, 1319 None,
1277 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1320 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
1278 relay.respond_events(client_id, &subscription_id, &vec![ 1321 relay.respond_events(
1279 generate_repo_ref_event(), 1322 client_id,
1280 ])?; 1323 &subscription_id,
1324 &vec![generate_repo_ref_event()],
1325 )?;
1281 Ok(()) 1326 Ok(())
1282 }), 1327 }),
1283 ), 1328 ),
@@ -1361,8 +1406,7 @@ mod root_proposal_specified_using_in_reply_to_with_range_of_head_2_and_cover_let
1361 p.expect("updates: 1 new maintainer, 1 announcement update, 1 proposal\r\n")?; 1406 p.expect("updates: 1 new maintainer, 1 announcement update, 1 proposal\r\n")?;
1362 let proposal_root_bech32 = get_pretend_proposal_root_event().id.to_bech32().unwrap(); 1407 let proposal_root_bech32 = get_pretend_proposal_root_event().id.to_bech32().unwrap();
1363 p.expect(format!( 1408 p.expect(format!(
1364 "creating proposal revision for: {}\r\n", 1409 "creating proposal revision for: {proposal_root_bech32}\r\n",
1365 proposal_root_bech32,
1366 ))?; 1410 ))?;
1367 p.expect("creating proposal from 2 commits:\r\n")?; 1411 p.expect("creating proposal from 2 commits:\r\n")?;
1368 p.expect("fe973a8 add t4.md\r\n")?; 1412 p.expect("fe973a8 add t4.md\r\n")?;
@@ -1394,11 +1438,15 @@ mod root_proposal_specified_using_in_reply_to_with_range_of_head_2_and_cover_let
1394 8051, 1438 8051,
1395 None, 1439 None,
1396 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1440 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
1397 relay.respond_events(client_id, &subscription_id, &vec![ 1441 relay.respond_events(
1398 generate_test_key_1_metadata_event("fred"), 1442 client_id,
1399 generate_test_key_1_relay_list_event(), 1443 &subscription_id,
1400 get_pretend_proposal_root_event(), 1444 &vec![
1401 ])?; 1445 generate_test_key_1_metadata_event("fred"),
1446 generate_test_key_1_relay_list_event(),
1447 get_pretend_proposal_root_event(),
1448 ],
1449 )?;
1402 Ok(()) 1450 Ok(())
1403 }), 1451 }),
1404 ), 1452 ),
@@ -1408,10 +1456,11 @@ mod root_proposal_specified_using_in_reply_to_with_range_of_head_2_and_cover_let
1408 8055, 1456 8055,
1409 None, 1457 None,
1410 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1458 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
1411 relay.respond_events(client_id, &subscription_id, &vec![ 1459 relay.respond_events(
1412 generate_repo_ref_event(), 1460 client_id,
1413 get_pretend_proposal_root_event(), 1461 &subscription_id,
1414 ])?; 1462 &vec![generate_repo_ref_event(), get_pretend_proposal_root_event()],
1463 )?;
1415 Ok(()) 1464 Ok(())
1416 }), 1465 }),
1417 ), 1466 ),
@@ -1452,11 +1501,15 @@ mod root_proposal_specified_using_in_reply_to_with_range_of_head_2_and_cover_let
1452 8051, 1501 8051,
1453 None, 1502 None,
1454 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1503 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
1455 relay.respond_events(client_id, &subscription_id, &vec![ 1504 relay.respond_events(
1456 generate_test_key_1_metadata_event("fred"), 1505 client_id,
1457 generate_test_key_1_relay_list_event(), 1506 &subscription_id,
1458 get_pretend_proposal_root_event(), 1507 &vec![
1459 ])?; 1508 generate_test_key_1_metadata_event("fred"),
1509 generate_test_key_1_relay_list_event(),
1510 get_pretend_proposal_root_event(),
1511 ],
1512 )?;
1460 Ok(()) 1513 Ok(())
1461 }), 1514 }),
1462 ), 1515 ),
@@ -1466,10 +1519,11 @@ mod root_proposal_specified_using_in_reply_to_with_range_of_head_2_and_cover_let
1466 8055, 1519 8055,
1467 None, 1520 None,
1468 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1521 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
1469 relay.respond_events(client_id, &subscription_id, &vec![ 1522 relay.respond_events(
1470 generate_repo_ref_event(), 1523 client_id,
1471 get_pretend_proposal_root_event(), 1524 &subscription_id,
1472 ])?; 1525 &vec![generate_repo_ref_event(), get_pretend_proposal_root_event()],
1526 )?;
1473 Ok(()) 1527 Ok(())
1474 }), 1528 }),
1475 ), 1529 ),
@@ -1646,11 +1700,15 @@ mod in_reply_to_mentions_issue {
1646 8051, 1700 8051,
1647 None, 1701 None,
1648 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1702 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
1649 relay.respond_events(client_id, &subscription_id, &vec![ 1703 relay.respond_events(
1650 generate_test_key_1_metadata_event("fred"), 1704 client_id,
1651 generate_test_key_1_relay_list_event(), 1705 &subscription_id,
1652 get_pretend_issue_event(), 1706 &vec![
1653 ])?; 1707 generate_test_key_1_metadata_event("fred"),
1708 generate_test_key_1_relay_list_event(),
1709 get_pretend_issue_event(),
1710 ],
1711 )?;
1654 Ok(()) 1712 Ok(())
1655 }), 1713 }),
1656 ), 1714 ),
@@ -1660,10 +1718,11 @@ mod in_reply_to_mentions_issue {
1660 8055, 1718 8055,
1661 None, 1719 None,
1662 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1720 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
1663 relay.respond_events(client_id, &subscription_id, &vec![ 1721 relay.respond_events(
1664 generate_repo_ref_event(), 1722 client_id,
1665 get_pretend_issue_event(), 1723 &subscription_id,
1666 ])?; 1724 &vec![generate_repo_ref_event(), get_pretend_issue_event()],
1725 )?;
1667 Ok(()) 1726 Ok(())
1668 }), 1727 }),
1669 ), 1728 ),
@@ -1765,10 +1824,14 @@ mod in_reply_to_mentions_npub_and_nprofile_which_get_mentioned_in_proposal_root
1765 8051, 1824 8051,
1766 None, 1825 None,
1767 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1826 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
1768 relay.respond_events(client_id, &subscription_id, &vec![ 1827 relay.respond_events(
1769 generate_test_key_1_metadata_event("fred"), 1828 client_id,
1770 generate_test_key_1_relay_list_event(), 1829 &subscription_id,
1771 ])?; 1830 &vec![
1831 generate_test_key_1_metadata_event("fred"),
1832 generate_test_key_1_relay_list_event(),
1833 ],
1834 )?;
1772 Ok(()) 1835 Ok(())
1773 }), 1836 }),
1774 ), 1837 ),
@@ -1778,9 +1841,11 @@ mod in_reply_to_mentions_npub_and_nprofile_which_get_mentioned_in_proposal_root
1778 8055, 1841 8055,
1779 None, 1842 None,
1780 Some(&|relay, client_id, subscription_id, _| -> Result<()> { 1843 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
1781 relay.respond_events(client_id, &subscription_id, &vec![ 1844 relay.respond_events(
1782 generate_repo_ref_event(), 1845 client_id,
1783 ])?; 1846 &subscription_id,
1847 &vec![generate_repo_ref_event()],
1848 )?;
1784 Ok(()) 1849 Ok(())
1785 }), 1850 }),
1786 ), 1851 ),