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.lock157
-rw-r--r--Cargo.toml10
-rw-r--r--src/bin/git_remote_nostr/fetch.rs6
-rw-r--r--src/bin/git_remote_nostr/list.rs2
-rw-r--r--src/bin/git_remote_nostr/push.rs38
-rw-r--r--src/bin/git_remote_nostr/utils.rs14
-rw-r--r--src/bin/ngit/sub_commands/list.rs14
-rw-r--r--src/bin/ngit/sub_commands/pull.rs9
-rw-r--r--src/bin/ngit/sub_commands/push.rs11
-rw-r--r--src/bin/ngit/sub_commands/send.rs4
-rw-r--r--src/lib/client.rs75
-rw-r--r--src/lib/git/mod.rs4
-rw-r--r--src/lib/git_events.rs36
-rw-r--r--src/lib/login/key_encryption.rs30
-rw-r--r--src/lib/login/mod.rs10
-rw-r--r--src/lib/repo_ref.rs103
-rw-r--r--src/lib/repo_state.rs4
-rw-r--r--test_utils/Cargo.toml8
-rw-r--r--test_utils/src/git.rs2
-rw-r--r--test_utils/src/lib.rs14
-rw-r--r--tests/git_remote_nostr/main.rs6
-rw-r--r--tests/git_remote_nostr/push.rs98
-rw-r--r--tests/ngit_init.rs41
-rw-r--r--tests/ngit_push.rs2
-rw-r--r--tests/ngit_send.rs200
25 files changed, 477 insertions, 421 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 7f9a683..39ed5e9 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -121,6 +121,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
121checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" 121checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6"
122 122
123[[package]] 123[[package]]
124name = "arrayvec"
125version = "0.7.6"
126source = "registry+https://github.com/rust-lang/crates.io-index"
127checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
128
129[[package]]
124name = "assert_cmd" 130name = "assert_cmd"
125version = "2.0.16" 131version = "2.0.16"
126source = "registry+https://github.com/rust-lang/crates.io-index" 132source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -319,9 +325,9 @@ dependencies = [
319 325
320[[package]] 326[[package]]
321name = "async-wsocket" 327name = "async-wsocket"
322version = "0.7.1" 328version = "0.9.0"
323source = "registry+https://github.com/rust-lang/crates.io-index" 329source = "registry+https://github.com/rust-lang/crates.io-index"
324checksum = "1eee6fcc818b89848df37050215603de0e2e072734e4730c03060feb2d0abebb" 330checksum = "5c0984bead67f20366bc8dd46018dfbe189b67eeefb0e5b86b9eade18d7c3c3b"
325dependencies = [ 331dependencies = [
326 "async-utility", 332 "async-utility",
327 "futures", 333 "futures",
@@ -331,7 +337,7 @@ dependencies = [
331 "tokio", 337 "tokio",
332 "tokio-rustls", 338 "tokio-rustls",
333 "tokio-socks", 339 "tokio-socks",
334 "tokio-tungstenite 0.23.1", 340 "tokio-tungstenite 0.24.0",
335 "url", 341 "url",
336 "wasm-bindgen", 342 "wasm-bindgen",
337 "web-sys", 343 "web-sys",
@@ -385,10 +391,14 @@ dependencies = [
385] 391]
386 392
387[[package]] 393[[package]]
388name = "base64" 394name = "base58ck"
389version = "0.21.7" 395version = "0.1.0"
390source = "registry+https://github.com/rust-lang/crates.io-index" 396source = "registry+https://github.com/rust-lang/crates.io-index"
391checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 397checksum = "2c8d66485a3a2ea485c1913c4572ce0256067a5377ac8c75c4960e1cda98605f"
398dependencies = [
399 "bitcoin-internals 0.3.0",
400 "bitcoin_hashes 0.14.0",
401]
392 402
393[[package]] 403[[package]]
394name = "base64" 404name = "base64"
@@ -404,9 +414,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
404 414
405[[package]] 415[[package]]
406name = "bech32" 416name = "bech32"
407version = "0.10.0-beta" 417version = "0.11.0"
408source = "registry+https://github.com/rust-lang/crates.io-index" 418source = "registry+https://github.com/rust-lang/crates.io-index"
409checksum = "98f7eed2b2781a6f0b5c903471d48e15f56fb4e1165df8a9a2337fd1a59d45ea" 419checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d"
410 420
411[[package]] 421[[package]]
412name = "bip39" 422name = "bip39"
@@ -421,14 +431,17 @@ dependencies = [
421 431
422[[package]] 432[[package]]
423name = "bitcoin" 433name = "bitcoin"
424version = "0.31.2" 434version = "0.32.2"
425source = "registry+https://github.com/rust-lang/crates.io-index" 435source = "registry+https://github.com/rust-lang/crates.io-index"
426checksum = "6c85783c2fe40083ea54a33aa2f0ba58831d90fcd190f5bdc47e74e84d2a96ae" 436checksum = "ea507acc1cd80fc084ace38544bbcf7ced7c2aa65b653b102de0ce718df668f6"
427dependencies = [ 437dependencies = [
438 "base58ck",
428 "bech32", 439 "bech32",
429 "bitcoin-internals", 440 "bitcoin-internals 0.3.0",
430 "bitcoin_hashes 0.13.0", 441 "bitcoin-io",
431 "hex-conservative", 442 "bitcoin-units",
443 "bitcoin_hashes 0.14.0",
444 "hex-conservative 0.2.1",
432 "hex_lit", 445 "hex_lit",
433 "secp256k1", 446 "secp256k1",
434 "serde", 447 "serde",
@@ -439,11 +452,33 @@ name = "bitcoin-internals"
439version = "0.2.0" 452version = "0.2.0"
440source = "registry+https://github.com/rust-lang/crates.io-index" 453source = "registry+https://github.com/rust-lang/crates.io-index"
441checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" 454checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb"
455
456[[package]]
457name = "bitcoin-internals"
458version = "0.3.0"
459source = "registry+https://github.com/rust-lang/crates.io-index"
460checksum = "30bdbe14aa07b06e6cfeffc529a1f099e5fbe249524f8125358604df99a4bed2"
442dependencies = [ 461dependencies = [
443 "serde", 462 "serde",
444] 463]
445 464
446[[package]] 465[[package]]
466name = "bitcoin-io"
467version = "0.1.2"
468source = "registry+https://github.com/rust-lang/crates.io-index"
469checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56"
470
471[[package]]
472name = "bitcoin-units"
473version = "0.1.2"
474source = "registry+https://github.com/rust-lang/crates.io-index"
475checksum = "5285c8bcaa25876d07f37e3d30c303f2609179716e11d688f51e8f1fe70063e2"
476dependencies = [
477 "bitcoin-internals 0.3.0",
478 "serde",
479]
480
481[[package]]
447name = "bitcoin_hashes" 482name = "bitcoin_hashes"
448version = "0.11.0" 483version = "0.11.0"
449source = "registry+https://github.com/rust-lang/crates.io-index" 484source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -455,8 +490,18 @@ version = "0.13.0"
455source = "registry+https://github.com/rust-lang/crates.io-index" 490source = "registry+https://github.com/rust-lang/crates.io-index"
456checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" 491checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b"
457dependencies = [ 492dependencies = [
458 "bitcoin-internals", 493 "bitcoin-internals 0.2.0",
459 "hex-conservative", 494 "hex-conservative 0.1.2",
495]
496
497[[package]]
498name = "bitcoin_hashes"
499version = "0.14.0"
500source = "registry+https://github.com/rust-lang/crates.io-index"
501checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16"
502dependencies = [
503 "bitcoin-io",
504 "hex-conservative 0.2.1",
460 "serde", 505 "serde",
461] 506]
462 507
@@ -1216,6 +1261,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1216checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" 1261checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20"
1217 1262
1218[[package]] 1263[[package]]
1264name = "hex-conservative"
1265version = "0.2.1"
1266source = "registry+https://github.com/rust-lang/crates.io-index"
1267checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd"
1268dependencies = [
1269 "arrayvec",
1270]
1271
1272[[package]]
1219name = "hex_lit" 1273name = "hex_lit"
1220version = "0.1.1" 1274version = "0.1.1"
1221source = "registry+https://github.com/rust-lang/crates.io-index" 1275source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1569,9 +1623,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
1569 1623
1570[[package]] 1624[[package]]
1571name = "lnurl-pay" 1625name = "lnurl-pay"
1572version = "0.5.0" 1626version = "0.6.0"
1573source = "registry+https://github.com/rust-lang/crates.io-index" 1627source = "registry+https://github.com/rust-lang/crates.io-index"
1574checksum = "02c042191c2e3f27147decfad8182eea2c7dd1c6c1733562e25d3d401369669d" 1628checksum = "536e7c782167a2d48346ca0b2677fad19eaef20f19a4ab868e4d5b96ca879def"
1575dependencies = [ 1629dependencies = [
1576 "bech32", 1630 "bech32",
1577 "reqwest", 1631 "reqwest",
@@ -1698,6 +1752,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1698checksum = "e664971378a3987224f7a0e10059782035e89899ae403718ee07de85bec42afe" 1752checksum = "e664971378a3987224f7a0e10059782035e89899ae403718ee07de85bec42afe"
1699 1753
1700[[package]] 1754[[package]]
1755name = "negentropy"
1756version = "0.4.3"
1757source = "registry+https://github.com/rust-lang/crates.io-index"
1758checksum = "43a88da9dd148bbcdce323dd6ac47d369b4769d4a3b78c6c52389b9269f77932"
1759
1760[[package]]
1701name = "ngit" 1761name = "ngit"
1702version = "1.5.2" 1762version = "1.5.2"
1703dependencies = [ 1763dependencies = [
@@ -1766,12 +1826,13 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
1766 1826
1767[[package]] 1827[[package]]
1768name = "nostr" 1828name = "nostr"
1769version = "0.34.1" 1829version = "0.35.0"
1770source = "registry+https://github.com/rust-lang/crates.io-index" 1830source = "registry+https://github.com/rust-lang/crates.io-index"
1771checksum = "a1c3c32439eef3ea4d9079b2a8f557992d27259c26527e43d4228dd321e43a77" 1831checksum = "56db234b2e07901e372f34e9463f91590579cd8e6dbd34ed2ccc7e461e4ba639"
1772dependencies = [ 1832dependencies = [
1773 "aes", 1833 "aes",
1774 "base64 0.21.7", 1834 "base64",
1835 "bech32",
1775 "bip39", 1836 "bip39",
1776 "bitcoin", 1837 "bitcoin",
1777 "cbc", 1838 "cbc",
@@ -1780,13 +1841,13 @@ dependencies = [
1780 "getrandom", 1841 "getrandom",
1781 "instant", 1842 "instant",
1782 "js-sys", 1843 "js-sys",
1783 "negentropy", 1844 "negentropy 0.3.1",
1845 "negentropy 0.4.3",
1784 "once_cell", 1846 "once_cell",
1785 "reqwest", 1847 "reqwest",
1786 "scrypt", 1848 "scrypt",
1787 "serde", 1849 "serde",
1788 "serde_json", 1850 "serde_json",
1789 "tracing",
1790 "unicode-normalization", 1851 "unicode-normalization",
1791 "url", 1852 "url",
1792 "wasm-bindgen", 1853 "wasm-bindgen",
@@ -1796,9 +1857,9 @@ dependencies = [
1796 1857
1797[[package]] 1858[[package]]
1798name = "nostr-database" 1859name = "nostr-database"
1799version = "0.34.0" 1860version = "0.35.0"
1800source = "registry+https://github.com/rust-lang/crates.io-index" 1861source = "registry+https://github.com/rust-lang/crates.io-index"
1801checksum = "1926ef55392f3eea1bbe4a1358b64bbf12dd6eb554f40f483941a102c6263fc6" 1862checksum = "50de8cc5e77e7dafa7e2e0d0d67187ef19e191dcd1a68efffd3e05152d91b3c3"
1802dependencies = [ 1863dependencies = [
1803 "async-trait", 1864 "async-trait",
1804 "flatbuffers", 1865 "flatbuffers",
@@ -1811,13 +1872,15 @@ dependencies = [
1811 1872
1812[[package]] 1873[[package]]
1813name = "nostr-relay-pool" 1874name = "nostr-relay-pool"
1814version = "0.34.1" 1875version = "0.35.0"
1815source = "registry+https://github.com/rust-lang/crates.io-index" 1876source = "registry+https://github.com/rust-lang/crates.io-index"
1816checksum = "d0e37c5ea991802a91728d4c09d5a7276938104ead8bf140a63a60acabc5c756" 1877checksum = "800b9ca169902977366f8243ec645b1fa4a128ab621331796d4a26bd7bc22a88"
1817dependencies = [ 1878dependencies = [
1818 "async-utility", 1879 "async-utility",
1819 "async-wsocket", 1880 "async-wsocket",
1820 "atomic-destructor", 1881 "atomic-destructor",
1882 "negentropy 0.3.1",
1883 "negentropy 0.4.3",
1821 "nostr", 1884 "nostr",
1822 "nostr-database", 1885 "nostr-database",
1823 "thiserror", 1886 "thiserror",
@@ -1828,9 +1891,9 @@ dependencies = [
1828 1891
1829[[package]] 1892[[package]]
1830name = "nostr-sdk" 1893name = "nostr-sdk"
1831version = "0.34.0" 1894version = "0.35.0"
1832source = "registry+https://github.com/rust-lang/crates.io-index" 1895source = "registry+https://github.com/rust-lang/crates.io-index"
1833checksum = "ca0c0c5f8ddbdfc064ea71883191ec53de6ed52b5dca10ab07f0810b99e91acc" 1896checksum = "d93036bf4c1e35145ca2cd6ee4cb7bb9c74f41cbca9cc4caff1e87b5e192f253"
1834dependencies = [ 1897dependencies = [
1835 "async-utility", 1898 "async-utility",
1836 "atomic-destructor", 1899 "atomic-destructor",
@@ -1848,9 +1911,9 @@ dependencies = [
1848 1911
1849[[package]] 1912[[package]]
1850name = "nostr-signer" 1913name = "nostr-signer"
1851version = "0.34.0" 1914version = "0.35.0"
1852source = "registry+https://github.com/rust-lang/crates.io-index" 1915source = "registry+https://github.com/rust-lang/crates.io-index"
1853checksum = "5c30294a7be7d9d5ac777954812f5c7b4ae2a1e583a62e33537f87d98ab23729" 1916checksum = "c1e132975a677a1c97a7695ef1161291dc06517a588b6e17e3aa05d3fb4056a0"
1854dependencies = [ 1917dependencies = [
1855 "async-utility", 1918 "async-utility",
1856 "nostr", 1919 "nostr",
@@ -1862,9 +1925,9 @@ dependencies = [
1862 1925
1863[[package]] 1926[[package]]
1864name = "nostr-sqlite" 1927name = "nostr-sqlite"
1865version = "0.34.0" 1928version = "0.35.0"
1866source = "registry+https://github.com/rust-lang/crates.io-index" 1929source = "registry+https://github.com/rust-lang/crates.io-index"
1867checksum = "0b634d2a908feccd7b6b2e8d2cea47bc4061b350b7a120cd6c6f2520e4e1fc1a" 1930checksum = "7b194128279dd0fa77a2be085652b17a10f70b76ec73142f0534e69a23aaf5aa"
1868dependencies = [ 1931dependencies = [
1869 "async-trait", 1932 "async-trait",
1870 "nostr", 1933 "nostr",
@@ -1877,9 +1940,9 @@ dependencies = [
1877 1940
1878[[package]] 1941[[package]]
1879name = "nostr-zapper" 1942name = "nostr-zapper"
1880version = "0.34.0" 1943version = "0.35.0"
1881source = "registry+https://github.com/rust-lang/crates.io-index" 1944source = "registry+https://github.com/rust-lang/crates.io-index"
1882checksum = "dcf3ba30e807145e9cb924faf8fb0719e460f613088e99c753b67c2a9929c5b7" 1945checksum = "b60e7a3ecc9881ca418e772a6fc4410920653a9f0bf9457b6ddd732d2a3f64f1"
1883dependencies = [ 1946dependencies = [
1884 "async-trait", 1947 "async-trait",
1885 "nostr", 1948 "nostr",
@@ -1967,9 +2030,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
1967 2030
1968[[package]] 2031[[package]]
1969name = "nwc" 2032name = "nwc"
1970version = "0.34.1" 2033version = "0.35.0"
1971source = "registry+https://github.com/rust-lang/crates.io-index" 2034source = "registry+https://github.com/rust-lang/crates.io-index"
1972checksum = "9a16ac06bc273fcd4ead47c0c5a58b6cc7db2247fc7a64dd9bc11cf18e3efeb4" 2035checksum = "2e962f52732a6d91c1e76d4de3f1daa186e77a849e98e5abe53ca7fe9796d04e"
1973dependencies = [ 2036dependencies = [
1974 "async-utility", 2037 "async-utility",
1975 "nostr", 2038 "nostr",
@@ -2474,7 +2537,7 @@ version = "0.12.7"
2474source = "registry+https://github.com/rust-lang/crates.io-index" 2537source = "registry+https://github.com/rust-lang/crates.io-index"
2475checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" 2538checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63"
2476dependencies = [ 2539dependencies = [
2477 "base64 0.22.1", 2540 "base64",
2478 "bytes", 2541 "bytes",
2479 "futures-core", 2542 "futures-core",
2480 "futures-util", 2543 "futures-util",
@@ -2620,7 +2683,7 @@ version = "2.1.3"
2620source = "registry+https://github.com/rust-lang/crates.io-index" 2683source = "registry+https://github.com/rust-lang/crates.io-index"
2621checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" 2684checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425"
2622dependencies = [ 2685dependencies = [
2623 "base64 0.22.1", 2686 "base64",
2624 "rustls-pki-types", 2687 "rustls-pki-types",
2625] 2688]
2626 2689
@@ -2676,9 +2739,9 @@ dependencies = [
2676 2739
2677[[package]] 2740[[package]]
2678name = "secp256k1" 2741name = "secp256k1"
2679version = "0.28.2" 2742version = "0.29.1"
2680source = "registry+https://github.com/rust-lang/crates.io-index" 2743source = "registry+https://github.com/rust-lang/crates.io-index"
2681checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" 2744checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113"
2682dependencies = [ 2745dependencies = [
2683 "bitcoin_hashes 0.13.0", 2746 "bitcoin_hashes 0.13.0",
2684 "rand", 2747 "rand",
@@ -2688,9 +2751,9 @@ dependencies = [
2688 2751
2689[[package]] 2752[[package]]
2690name = "secp256k1-sys" 2753name = "secp256k1-sys"
2691version = "0.9.2" 2754version = "0.10.1"
2692source = "registry+https://github.com/rust-lang/crates.io-index" 2755source = "registry+https://github.com/rust-lang/crates.io-index"
2693checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb" 2756checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9"
2694dependencies = [ 2757dependencies = [
2695 "cc", 2758 "cc",
2696] 2759]
@@ -3157,9 +3220,9 @@ dependencies = [
3157 3220
3158[[package]] 3221[[package]]
3159name = "tokio-tungstenite" 3222name = "tokio-tungstenite"
3160version = "0.23.1" 3223version = "0.24.0"
3161source = "registry+https://github.com/rust-lang/crates.io-index" 3224source = "registry+https://github.com/rust-lang/crates.io-index"
3162checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" 3225checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9"
3163dependencies = [ 3226dependencies = [
3164 "futures-util", 3227 "futures-util",
3165 "log", 3228 "log",
@@ -3167,7 +3230,7 @@ dependencies = [
3167 "rustls-pki-types", 3230 "rustls-pki-types",
3168 "tokio", 3231 "tokio",
3169 "tokio-rustls", 3232 "tokio-rustls",
3170 "tungstenite 0.23.0", 3233 "tungstenite 0.24.0",
3171 "webpki-roots", 3234 "webpki-roots",
3172] 3235]
3173 3236
@@ -3273,9 +3336,9 @@ dependencies = [
3273 3336
3274[[package]] 3337[[package]]
3275name = "tungstenite" 3338name = "tungstenite"
3276version = "0.23.0" 3339version = "0.24.0"
3277source = "registry+https://github.com/rust-lang/crates.io-index" 3340source = "registry+https://github.com/rust-lang/crates.io-index"
3278checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" 3341checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a"
3279dependencies = [ 3342dependencies = [
3280 "byteorder", 3343 "byteorder",
3281 "bytes", 3344 "bytes",
diff --git a/Cargo.toml b/Cargo.toml
index 976c117..0d54047 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -24,11 +24,11 @@ futures = "0.3.28"
24git2 = "0.19.0" 24git2 = "0.19.0"
25indicatif = "0.17.7" 25indicatif = "0.17.7"
26keyring = "2.0.5" 26keyring = "2.0.5"
27nostr = "0.34.1" 27nostr = "0.35.0"
28nostr-database = "0.34.0" 28nostr-database = "0.35.0"
29nostr-sdk = "0.34.0" 29nostr-sdk = "0.35.0"
30nostr-signer = "0.34.0" 30nostr-signer = "0.35.0"
31nostr-sqlite = "0.34.0" 31nostr-sqlite = "0.35.0"
32passwords = "3.1.13" 32passwords = "3.1.13"
33qrcode = { version = "0.14.1", default-features = false } 33qrcode = { version = "0.14.1", default-features = false }
34scrypt = "0.11.0" 34scrypt = "0.11.0"
diff --git a/src/bin/git_remote_nostr/fetch.rs b/src/bin/git_remote_nostr/fetch.rs
index ff55d6f..a972a2f 100644
--- a/src/bin/git_remote_nostr/fetch.rs
+++ b/src/bin/git_remote_nostr/fetch.rs
@@ -112,9 +112,9 @@ pub fn make_commits_for_proposal(
112 .context(format!( 112 .context(format!(
113 "cannot create commit for patch {}", 113 "cannot create commit for patch {}",
114 nip19::Nip19Event { 114 nip19::Nip19Event {
115 event_id: patch.id(), 115 event_id: patch.id,
116 author: Some(patch.author()), 116 author: Some(patch.pubkey),
117 kind: Some(patch.kind()), 117 kind: Some(patch.kind),
118 relays: if let Some(relay) = repo_ref.relays.first() { 118 relays: if let Some(relay) = repo_ref.relays.first() {
119 vec![relay.to_string()] 119 vec![relay.to_string()]
120 } else { 120 } else {
diff --git a/src/bin/git_remote_nostr/list.rs b/src/bin/git_remote_nostr/list.rs
index 378a124..2f2977e 100644
--- a/src/bin/git_remote_nostr/list.rs
+++ b/src/bin/git_remote_nostr/list.rs
@@ -149,7 +149,7 @@ async fn get_open_proposals_state(
149 if let Ok(cl) = event_to_cover_letter(&proposal) { 149 if let Ok(cl) = event_to_cover_letter(&proposal) {
150 if let Ok(mut branch_name) = cl.get_branch_name() { 150 if let Ok(mut branch_name) = cl.get_branch_name() {
151 branch_name = if let Some(public_key) = current_user { 151 branch_name = if let Some(public_key) = current_user {
152 if proposal.author().eq(&public_key) { 152 if proposal.pubkey.eq(&public_key) {
153 cl.branch_name.to_string() 153 cl.branch_name.to_string()
154 } else { 154 } else {
155 branch_name 155 branch_name
diff --git a/src/bin/git_remote_nostr/push.rs b/src/bin/git_remote_nostr/push.rs
index 0f4e792..db86c04 100644
--- a/src/bin/git_remote_nostr/push.rs
+++ b/src/bin/git_remote_nostr/push.rs
@@ -184,7 +184,7 @@ pub async fn run_push(
184 if let Some((_, (proposal, patches))) = 184 if let Some((_, (proposal, patches))) =
185 find_proposal_and_patches_by_branch_name(to, &all_proposals, &current_user) 185 find_proposal_and_patches_by_branch_name(to, &all_proposals, &current_user)
186 { 186 {
187 if [repo_ref.maintainers.clone(), vec![proposal.author()]] 187 if [repo_ref.maintainers.clone(), vec![proposal.pubkey]]
188 .concat() 188 .concat()
189 .contains(&user_ref.public_key) 189 .contains(&user_ref.public_key)
190 { 190 {
@@ -200,7 +200,7 @@ pub async fn run_push(
200 &ahead, 200 &ahead,
201 &signer, 201 &signer,
202 repo_ref, 202 repo_ref,
203 &Some(proposal.id().to_string()), 203 &Some(proposal.id.to_string()),
204 &[], 204 &[],
205 ) 205 )
206 .await? 206 .await?
@@ -223,7 +223,7 @@ pub async fn run_push(
223 root_event_id 223 root_event_id
224 } else { 224 } else {
225 // tip patch is the root proposal 225 // tip patch is the root proposal
226 tip_patch.id() 226 tip_patch.id
227 }; 227 };
228 let mut parent_patch = tip_patch.clone(); 228 let mut parent_patch = tip_patch.clone();
229 ahead.reverse(); 229 ahead.reverse();
@@ -235,7 +235,7 @@ pub async fn run_push(
235 Some(thread_id), 235 Some(thread_id),
236 &signer, 236 &signer,
237 repo_ref, 237 repo_ref,
238 Some(parent_patch.id()), 238 Some(parent_patch.id),
239 Some(( 239 Some((
240 (patches.len() + i + 1).try_into().unwrap(), 240 (patches.len() + i + 1).try_into().unwrap(),
241 (patches.len() + ahead.len()).try_into().unwrap(), 241 (patches.len() + ahead.len()).try_into().unwrap(),
@@ -901,8 +901,8 @@ async fn get_merged_status_events(
901 .await?; 901 .await?;
902 if let Some(commit_event) = commit_events.iter().find(|e| { 902 if let Some(commit_event) = commit_events.iter().find(|e| {
903 e.tags.iter().any(|t| { 903 e.tags.iter().any(|t| {
904 t.as_vec()[0].eq("commit") 904 t.as_slice()[0].eq("commit")
905 && t.as_vec()[1].eq(&parent.id().to_string()) 905 && t.as_slice()[1].eq(&parent.id().to_string())
906 }) 906 })
907 }) { 907 }) {
908 let (proposal_id, revision_id) = 908 let (proposal_id, revision_id) =
@@ -930,7 +930,7 @@ async fn get_merged_status_events(
930 None 930 None
931 }, 931 },
932 &commit_hash, 932 &commit_hash,
933 commit_event.id(), 933 commit_event.id,
934 ) 934 )
935 .await?, 935 .await?,
936 ); 936 );
@@ -956,9 +956,9 @@ async fn create_merge_status(
956 .iter() 956 .iter()
957 .copied() 957 .copied()
958 .collect::<HashSet<PublicKey>>(); 958 .collect::<HashSet<PublicKey>>();
959 public_keys.insert(proposal.author()); 959 public_keys.insert(proposal.pubkey);
960 if let Some(revision) = revision { 960 if let Some(revision) = revision {
961 public_keys.insert(revision.author()); 961 public_keys.insert(revision.pubkey);
962 } 962 }
963 sign_event( 963 sign_event(
964 EventBuilder::new( 964 EventBuilder::new(
@@ -971,7 +971,7 @@ async fn create_merge_status(
971 vec!["git proposal merged / applied".to_string()], 971 vec!["git proposal merged / applied".to_string()],
972 ), 972 ),
973 Tag::from_standardized(nostr::TagStandard::Event { 973 Tag::from_standardized(nostr::TagStandard::Event {
974 event_id: proposal.id(), 974 event_id: proposal.id,
975 relay_url: repo_ref.relays.first().map(nostr::UncheckedUrl::new), 975 relay_url: repo_ref.relays.first().map(nostr::UncheckedUrl::new),
976 marker: Some(Marker::Root), 976 marker: Some(Marker::Root),
977 public_key: None, 977 public_key: None,
@@ -985,7 +985,7 @@ async fn create_merge_status(
985 ], 985 ],
986 if let Some(revision) = revision { 986 if let Some(revision) = revision {
987 vec![Tag::from_standardized(nostr::TagStandard::Event { 987 vec![Tag::from_standardized(nostr::TagStandard::Event {
988 event_id: revision.id(), 988 event_id: revision.id,
989 relay_url: repo_ref.relays.first().map(nostr::UncheckedUrl::new), 989 relay_url: repo_ref.relays.first().map(nostr::UncheckedUrl::new),
990 marker: Some(Marker::Root), 990 marker: Some(Marker::Root),
991 public_key: None, 991 public_key: None,
@@ -1023,7 +1023,7 @@ async fn get_proposal_and_revision_root_from_patch(
1023 git_repo: &Repo, 1023 git_repo: &Repo,
1024 patch: &Event, 1024 patch: &Event,
1025) -> Result<(EventId, Option<EventId>)> { 1025) -> Result<(EventId, Option<EventId>)> {
1026 let proposal_or_revision = if patch.tags.iter().any(|t| t.as_vec()[1].eq("root")) { 1026 let proposal_or_revision = if patch.tags.iter().any(|t| t.as_slice()[1].eq("root")) {
1027 patch.clone() 1027 patch.clone()
1028 } else { 1028 } else {
1029 let proposal_or_revision_id = EventId::parse( 1029 let proposal_or_revision_id = EventId::parse(
@@ -1032,9 +1032,9 @@ async fn get_proposal_and_revision_root_from_patch(
1032 } else if let Some(t) = patch.tags.iter().find(|t| t.is_reply()) { 1032 } else if let Some(t) = patch.tags.iter().find(|t| t.is_reply()) {
1033 t.clone() 1033 t.clone()
1034 } else { 1034 } else {
1035 Tag::event(patch.id()) 1035 Tag::event(patch.id)
1036 } 1036 }
1037 .as_vec()[1] 1037 .as_slice()[1]
1038 .clone(), 1038 .clone(),
1039 )?; 1039 )?;
1040 1040
@@ -1048,14 +1048,14 @@ async fn get_proposal_and_revision_root_from_patch(
1048 .clone() 1048 .clone()
1049 }; 1049 };
1050 1050
1051 if !proposal_or_revision.kind().eq(&Kind::GitPatch) { 1051 if !proposal_or_revision.kind.eq(&Kind::GitPatch) {
1052 bail!("thread root is not a git patch"); 1052 bail!("thread root is not a git patch");
1053 } 1053 }
1054 1054
1055 if proposal_or_revision 1055 if proposal_or_revision
1056 .tags 1056 .tags
1057 .iter() 1057 .iter()
1058 .any(|t| t.as_vec()[1].eq("revision-root")) 1058 .any(|t| t.as_slice()[1].eq("revision-root"))
1059 { 1059 {
1060 Ok(( 1060 Ok((
1061 EventId::parse( 1061 EventId::parse(
@@ -1064,13 +1064,13 @@ async fn get_proposal_and_revision_root_from_patch(
1064 .iter() 1064 .iter()
1065 .find(|t| t.is_reply()) 1065 .find(|t| t.is_reply())
1066 .unwrap() 1066 .unwrap()
1067 .as_vec()[1] 1067 .as_slice()[1]
1068 .clone(), 1068 .clone(),
1069 )?, 1069 )?,
1070 Some(proposal_or_revision.id()), 1070 Some(proposal_or_revision.id),
1071 )) 1071 ))
1072 } else { 1072 } else {
1073 Ok((proposal_or_revision.id(), None)) 1073 Ok((proposal_or_revision.id, None))
1074 } 1074 }
1075} 1075}
1076 1076
diff --git a/src/bin/git_remote_nostr/utils.rs b/src/bin/git_remote_nostr/utils.rs
index 3ae1bab..a8bbd6f 100644
--- a/src/bin/git_remote_nostr/utils.rs
+++ b/src/bin/git_remote_nostr/utils.rs
@@ -113,7 +113,7 @@ pub async fn get_open_proposals(
113 vec![ 113 vec![
114 nostr::Filter::default() 114 nostr::Filter::default()
115 .kinds(status_kinds().clone()) 115 .kinds(status_kinds().clone())
116 .events(proposals.iter().map(nostr::Event::id)), 116 .events(proposals.iter().map(|e| e.id)),
117 ], 117 ],
118 ) 118 )
119 .await?; 119 .await?;
@@ -127,15 +127,15 @@ pub async fn get_open_proposals(
127 let status = if let Some(e) = statuses 127 let status = if let Some(e) = statuses
128 .iter() 128 .iter()
129 .filter(|e| { 129 .filter(|e| {
130 status_kinds().contains(&e.kind()) 130 status_kinds().contains(&e.kind)
131 && e.tags() 131 && e.tags
132 .iter() 132 .iter()
133 .any(|t| t.as_vec()[1].eq(&proposal.id.to_string())) 133 .any(|t| t.as_slice()[1].eq(&proposal.id.to_string()))
134 }) 134 })
135 .collect::<Vec<&nostr::Event>>() 135 .collect::<Vec<&nostr::Event>>()
136 .first() 136 .first()
137 { 137 {
138 e.kind() 138 e.kind
139 } else { 139 } else {
140 Kind::GitStatusOpen 140 Kind::GitStatusOpen
141 }; 141 };
@@ -148,7 +148,7 @@ pub async fn get_open_proposals(
148 get_most_recent_patch_with_ancestors(commits_events.clone()) 148 get_most_recent_patch_with_ancestors(commits_events.clone())
149 { 149 {
150 open_proposals 150 open_proposals
151 .insert(proposal.id(), (proposal, most_recent_proposal_patch_chain)); 151 .insert(proposal.id, (proposal, most_recent_proposal_patch_chain));
152 } 152 }
153 } 153 }
154 } 154 }
@@ -178,7 +178,7 @@ pub async fn get_all_proposals(
178 if let Ok(most_recent_proposal_patch_chain) = 178 if let Ok(most_recent_proposal_patch_chain) =
179 get_most_recent_patch_with_ancestors(commits_events.clone()) 179 get_most_recent_patch_with_ancestors(commits_events.clone())
180 { 180 {
181 all_proposals.insert(proposal.id(), (proposal, most_recent_proposal_patch_chain)); 181 all_proposals.insert(proposal.id, (proposal, most_recent_proposal_patch_chain));
182 } 182 }
183 } 183 }
184 } 184 }
diff --git a/src/bin/ngit/sub_commands/list.rs b/src/bin/ngit/sub_commands/list.rs
index 0755e3b..351896a 100644
--- a/src/bin/ngit/sub_commands/list.rs
+++ b/src/bin/ngit/sub_commands/list.rs
@@ -52,7 +52,7 @@ pub async fn launch() -> Result<()> {
52 vec![ 52 vec![
53 nostr::Filter::default() 53 nostr::Filter::default()
54 .kinds(status_kinds().clone()) 54 .kinds(status_kinds().clone())
55 .events(proposals_and_revisions.iter().map(nostr::Event::id)), 55 .events(proposals_and_revisions.iter().map(|e| e.id)),
56 ], 56 ],
57 ) 57 )
58 .await?; 58 .await?;
@@ -76,15 +76,15 @@ pub async fn launch() -> Result<()> {
76 let status = if let Some(e) = statuses 76 let status = if let Some(e) = statuses
77 .iter() 77 .iter()
78 .filter(|e| { 78 .filter(|e| {
79 status_kinds().contains(&e.kind()) 79 status_kinds().contains(&e.kind)
80 && e.tags() 80 && e.tags
81 .iter() 81 .iter()
82 .any(|t| t.as_vec()[1].eq(&proposal.id.to_string())) 82 .any(|t| t.as_slice()[1].eq(&proposal.id.to_string()))
83 }) 83 })
84 .collect::<Vec<&nostr::Event>>() 84 .collect::<Vec<&nostr::Event>>()
85 .first() 85 .first()
86 { 86 {
87 e.kind() 87 e.kind
88 } else { 88 } else {
89 Kind::GitStatusOpen 89 Kind::GitStatusOpen
90 }; 90 };
@@ -184,7 +184,7 @@ pub async fn launch() -> Result<()> {
184 let commits_events: Vec<nostr::Event> = get_all_proposal_patch_events_from_cache( 184 let commits_events: Vec<nostr::Event> = get_all_proposal_patch_events_from_cache(
185 git_repo_path, 185 git_repo_path,
186 &repo_ref, 186 &repo_ref,
187 &proposals_for_status[selected_index].id(), 187 &proposals_for_status[selected_index].id,
188 ) 188 )
189 .await?; 189 .await?;
190 190
@@ -704,7 +704,7 @@ fn save_patches_to_dir(mut patches: Vec<nostr::Event>, git_repo: &Repo) -> Resul
704 .truncate(true) 704 .truncate(true)
705 .open(path) 705 .open(path)
706 .context("open new patch file with write and truncate options")?; 706 .context("open new patch file with write and truncate options")?;
707 file.write_all(patch.content().as_bytes())?; 707 file.write_all(patch.content.as_bytes())?;
708 file.write_all("\n\n".as_bytes())?; 708 file.write_all("\n\n".as_bytes())?;
709 file.flush()?; 709 file.flush()?;
710 } 710 }
diff --git a/src/bin/ngit/sub_commands/pull.rs b/src/bin/ngit/sub_commands/pull.rs
index 9a3d911..d79b7b1 100644
--- a/src/bin/ngit/sub_commands/pull.rs
+++ b/src/bin/ngit/sub_commands/pull.rs
@@ -53,12 +53,9 @@ pub async fn launch() -> Result<()> {
53 .context("cannot find proposal that matches the current branch name")? 53 .context("cannot find proposal that matches the current branch name")?
54 .clone(); 54 .clone();
55 55
56 let commit_events = get_all_proposal_patch_events_from_cache( 56 let commit_events =
57 git_repo_path, 57 get_all_proposal_patch_events_from_cache(git_repo_path, &repo_ref, &proposal_root_event.id)
58 &repo_ref, 58 .await?;
59 &proposal_root_event.id(),
60 )
61 .await?;
62 59
63 let most_recent_proposal_patch_chain = 60 let most_recent_proposal_patch_chain =
64 get_most_recent_patch_with_ancestors(commit_events.clone()) 61 get_most_recent_patch_with_ancestors(commit_events.clone())
diff --git a/src/bin/ngit/sub_commands/push.rs b/src/bin/ngit/sub_commands/push.rs
index 66edfb4..a77f356 100644
--- a/src/bin/ngit/sub_commands/push.rs
+++ b/src/bin/ngit/sub_commands/push.rs
@@ -73,12 +73,9 @@ pub async fn launch(cli_args: &Cli, args: &SubCommandArgs) -> Result<()> {
73 .context("cannot find proposal that matches the current branch name")? 73 .context("cannot find proposal that matches the current branch name")?
74 .clone(); 74 .clone();
75 75
76 let commit_events = get_all_proposal_patch_events_from_cache( 76 let commit_events =
77 git_repo_path, 77 get_all_proposal_patch_events_from_cache(git_repo_path, &repo_ref, &proposal_root_event.id)
78 &repo_ref, 78 .await?;
79 &proposal_root_event.id(),
80 )
81 .await?;
82 79
83 let most_recent_proposal_patch_chain = get_most_recent_patch_with_ancestors(commit_events) 80 let most_recent_proposal_patch_chain = get_most_recent_patch_with_ancestors(commit_events)
84 .context("cannot get most recent patch for proposal")?; 81 .context("cannot get most recent patch for proposal")?;
@@ -191,7 +188,7 @@ pub async fn launch(cli_args: &Cli, args: &SubCommandArgs) -> Result<()> {
191 Some(proposal_root_event.id), 188 Some(proposal_root_event.id),
192 &signer, 189 &signer,
193 &repo_ref, 190 &repo_ref,
194 patch_events.last().map(nostr::Event::id), 191 patch_events.last().map(|e| e.id),
195 None, 192 None,
196 None, 193 None,
197 &None, 194 &None,
diff --git a/src/bin/ngit/sub_commands/send.rs b/src/bin/ngit/sub_commands/send.rs
index a807305..fe2952f 100644
--- a/src/bin/ngit/sub_commands/send.rs
+++ b/src/bin/ngit/sub_commands/send.rs
@@ -240,9 +240,9 @@ pub async fn launch(cli_args: &Cli, args: &SubCommandArgs, no_fetch: bool) -> Re
240 if root_proposal_id.is_none() { 240 if root_proposal_id.is_none() {
241 if let Some(event) = events.first() { 241 if let Some(event) = events.first() {
242 let event_bech32 = if let Some(relay) = repo_ref.relays.first() { 242 let event_bech32 = if let Some(relay) = repo_ref.relays.first() {
243 Nip19Event::new(event.id(), vec![relay]).to_bech32()? 243 Nip19Event::new(event.id, vec![relay]).to_bech32()?
244 } else { 244 } else {
245 event.id().to_bech32()? 245 event.id.to_bech32()?
246 }; 246 };
247 println!( 247 println!(
248 "{}", 248 "{}",
diff --git a/src/lib/client.rs b/src/lib/client.rs
index 59e17f2..5f9e996 100644
--- a/src/lib/client.rs
+++ b/src/lib/client.rs
@@ -29,7 +29,7 @@ use indicatif::{MultiProgress, ProgressBar, ProgressDrawTarget, ProgressState, P
29#[cfg(test)] 29#[cfg(test)]
30use mockall::*; 30use mockall::*;
31use nostr::{nips::nip01::Coordinate, Event}; 31use nostr::{nips::nip01::Coordinate, Event};
32use nostr_database::{NostrDatabase, Order}; 32use nostr_database::NostrDatabase;
33use nostr_sdk::{ 33use nostr_sdk::{
34 prelude::RelayLimits, EventBuilder, EventId, Kind, NostrSigner, Options, PublicKey, 34 prelude::RelayLimits, EventBuilder, EventId, Kind, NostrSigner, Options, PublicKey,
35 SingleLetterTag, Timestamp, Url, 35 SingleLetterTag, Timestamp, Url,
@@ -231,10 +231,10 @@ impl Connect for Client {
231 }); 231 });
232 } 232 }
233 save_event_in_cache(git_repo_path, &event).await?; 233 save_event_in_cache(git_repo_path, &event).await?;
234 if event.kind().eq(&Kind::GitRepoAnnouncement) { 234 if event.kind.eq(&Kind::GitRepoAnnouncement) {
235 save_event_in_global_cache(git_repo_path, &event).await?; 235 save_event_in_global_cache(git_repo_path, &event).await?;
236 } 236 }
237 Ok(event.id()) 237 Ok(event.id)
238 } 238 }
239 239
240 async fn get_events( 240 async fn get_events(
@@ -758,7 +758,7 @@ pub async fn get_events_from_cache(
758) -> Result<Vec<nostr::Event>> { 758) -> Result<Vec<nostr::Event>> {
759 get_local_cache_database(git_repo_path) 759 get_local_cache_database(git_repo_path)
760 .await? 760 .await?
761 .query(filters.clone(), Order::Asc) 761 .query(filters.clone())
762 .await 762 .await
763 .context( 763 .context(
764 "cannot execute query on opened git repo nostr cache database .git/nostr-cache.sqlite", 764 "cannot execute query on opened git repo nostr cache database .git/nostr-cache.sqlite",
@@ -771,7 +771,7 @@ pub async fn get_event_from_global_cache(
771) -> Result<Vec<nostr::Event>> { 771) -> Result<Vec<nostr::Event>> {
772 get_global_cache_database(git_repo_path) 772 get_global_cache_database(git_repo_path)
773 .await? 773 .await?
774 .query(filters.clone(), Order::Asc) 774 .query(filters.clone())
775 .await 775 .await
776 .context("cannot execute query on opened ngit nostr cache database") 776 .context("cannot execute query on opened ngit nostr cache database")
777} 777}
@@ -839,12 +839,12 @@ pub async fn get_repo_ref_from_cache(
839 839
840 let mut events: HashMap<Coordinate, nostr::Event> = HashMap::new(); 840 let mut events: HashMap<Coordinate, nostr::Event> = HashMap::new();
841 for m in &maintainers { 841 for m in &maintainers {
842 if let Some(e) = repo_events.iter().find(|e| e.author().eq(m)) { 842 if let Some(e) = repo_events.iter().find(|e| e.pubkey.eq(m)) {
843 events.insert( 843 events.insert(
844 Coordinate { 844 Coordinate {
845 kind: e.kind, 845 kind: e.kind,
846 identifier: e.identifier().unwrap().to_string(), 846 identifier: e.identifier().unwrap().to_string(),
847 public_key: e.author(), 847 public_key: e.pubkey,
848 relays: vec![], 848 relays: vec![],
849 }, 849 },
850 e.clone(), 850 e.clone(),
@@ -938,8 +938,8 @@ async fn create_relays_request(
938 .await? 938 .await?
939 { 939 {
940 if event_is_patch_set_root(event) || event_is_revision_root(event) { 940 if event_is_patch_set_root(event) || event_is_revision_root(event) {
941 proposals.insert(event.id()); 941 proposals.insert(event.id);
942 contributors.insert(event.author()); 942 contributors.insert(event.pubkey);
943 } 943 }
944 } 944 }
945 945
@@ -951,7 +951,7 @@ async fn create_relays_request(
951 for c in &contributors { 951 for c in &contributors {
952 if let Some(event) = profile_events 952 if let Some(event) = profile_events
953 .iter() 953 .iter()
954 .find(|e| e.kind() == Kind::Metadata && e.author().eq(c)) 954 .find(|e| e.kind == Kind::Metadata && e.pubkey.eq(c))
955 { 955 {
956 save_event_in_cache(git_repo_path, event).await?; 956 save_event_in_cache(git_repo_path, event).await?;
957 } else { 957 } else {
@@ -1109,7 +1109,7 @@ async fn process_fetched_events(
1109 for event in &events { 1109 for event in &events {
1110 if !request.existing_events.contains(&event.id) { 1110 if !request.existing_events.contains(&event.id) {
1111 save_event_in_cache(git_repo_path, event).await?; 1111 save_event_in_cache(git_repo_path, event).await?;
1112 if event.kind().eq(&Kind::GitRepoAnnouncement) { 1112 if event.kind.eq(&Kind::GitRepoAnnouncement) {
1113 save_event_in_global_cache(git_repo_path, event).await?; 1113 save_event_in_global_cache(git_repo_path, event).await?;
1114 let new_coordinate = !request 1114 let new_coordinate = !request
1115 .repo_coordinates_without_relays 1115 .repo_coordinates_without_relays
@@ -1135,8 +1135,8 @@ async fn process_fetched_events(
1135 if update_to_existing { 1135 if update_to_existing {
1136 report.updated_repo_announcements.push(( 1136 report.updated_repo_announcements.push((
1137 Coordinate { 1137 Coordinate {
1138 kind: event.kind(), 1138 kind: event.kind,
1139 public_key: event.author(), 1139 public_key: event.pubkey,
1140 identifier: event.identifier().unwrap().to_owned(), 1140 identifier: event.identifier().unwrap().to_owned(),
1141 relays: vec![], 1141 relays: vec![],
1142 }, 1142 },
@@ -1155,7 +1155,7 @@ async fn process_fetched_events(
1155 .any(|c| c.identifier.eq(&repo_ref.identifier) && m.eq(&c.public_key)) 1155 .any(|c| c.identifier.eq(&repo_ref.identifier) && m.eq(&c.public_key))
1156 { 1156 {
1157 let c = Coordinate { 1157 let c = Coordinate {
1158 kind: event.kind(), 1158 kind: event.kind,
1159 public_key: *m, 1159 public_key: *m,
1160 identifier: repo_ref.identifier.clone(), 1160 identifier: repo_ref.identifier.clone(),
1161 relays: vec![], 1161 relays: vec![],
@@ -1177,7 +1177,7 @@ async fn process_fetched_events(
1177 } 1177 }
1178 } 1178 }
1179 } 1179 }
1180 } else if event.kind().eq(&STATE_KIND) { 1180 } else if event.kind.eq(&STATE_KIND) {
1181 let existing_state = if report.updated_state.is_some() { 1181 let existing_state = if report.updated_state.is_some() {
1182 report.updated_state 1182 report.updated_state
1183 } else { 1183 } else {
@@ -1193,27 +1193,23 @@ async fn process_fetched_events(
1193 } else if event_is_patch_set_root(event) { 1193 } else if event_is_patch_set_root(event) {
1194 fresh_proposal_roots.insert(event.id); 1194 fresh_proposal_roots.insert(event.id);
1195 report.proposals.insert(event.id); 1195 report.proposals.insert(event.id);
1196 if !request.contributors.contains(&event.author()) 1196 if !request.contributors.contains(&event.pubkey)
1197 && !fresh_profiles.contains(&event.author()) 1197 && !fresh_profiles.contains(&event.pubkey)
1198 { 1198 {
1199 fresh_profiles.insert(event.author()); 1199 fresh_profiles.insert(event.pubkey);
1200 } 1200 }
1201 } else if [Kind::RelayList, Kind::Metadata].contains(&event.kind()) { 1201 } else if [Kind::RelayList, Kind::Metadata].contains(&event.kind) {
1202 if request 1202 if request.missing_contributor_profiles.contains(&event.pubkey) {
1203 .missing_contributor_profiles 1203 report.contributor_profiles.insert(event.pubkey);
1204 .contains(&event.author())
1205 {
1206 report.contributor_profiles.insert(event.author());
1207 } else if let Some((_, (metadata_timestamp, relay_list_timestamp))) = request 1204 } else if let Some((_, (metadata_timestamp, relay_list_timestamp))) = request
1208 .profiles_to_fetch_from_user_relays 1205 .profiles_to_fetch_from_user_relays
1209 .get_key_value(&event.author()) 1206 .get_key_value(&event.pubkey)
1210 { 1207 {
1211 if (Kind::Metadata.eq(&event.kind()) 1208 if (Kind::Metadata.eq(&event.kind) && event.created_at.gt(metadata_timestamp))
1212 && event.created_at().gt(metadata_timestamp)) 1209 || (Kind::RelayList.eq(&event.kind)
1213 || (Kind::RelayList.eq(&event.kind()) 1210 && event.created_at.gt(relay_list_timestamp))
1214 && event.created_at().gt(relay_list_timestamp))
1215 { 1211 {
1216 report.profile_updates.insert(event.author()); 1212 report.profile_updates.insert(event.pubkey);
1217 } 1213 }
1218 } 1214 }
1219 save_event_in_global_cache(git_repo_path, event).await?; 1215 save_event_in_global_cache(git_repo_path, event).await?;
@@ -1224,9 +1220,9 @@ async fn process_fetched_events(
1224 if !request.existing_events.contains(&event.id) 1220 if !request.existing_events.contains(&event.id)
1225 && !event.event_ids().any(|id| report.proposals.contains(id)) 1221 && !event.event_ids().any(|id| report.proposals.contains(id))
1226 { 1222 {
1227 if event.kind().eq(&Kind::GitPatch) && !event_is_patch_set_root(event) { 1223 if event.kind.eq(&Kind::GitPatch) && !event_is_patch_set_root(event) {
1228 report.commits.insert(event.id); 1224 report.commits.insert(event.id);
1229 } else if status_kinds().contains(&event.kind()) { 1225 } else if status_kinds().contains(&event.kind) {
1230 report.statuses.insert(event.id); 1226 report.statuses.insert(event.id);
1231 } 1227 }
1232 } 1228 }
@@ -1549,21 +1545,21 @@ pub async fn get_all_proposal_patch_events_from_cache(
1549 vec![ 1545 vec![
1550 commit_events 1546 commit_events
1551 .iter() 1547 .iter()
1552 .find(|e| e.id().eq(proposal_id)) 1548 .find(|e| e.id.eq(proposal_id))
1553 .context("proposal not in cache")? 1549 .context("proposal not in cache")?
1554 .author(), 1550 .pubkey,
1555 ], 1551 ],
1556 ] 1552 ]
1557 .concat() 1553 .concat()
1558 .iter() 1554 .iter()
1559 .copied() 1555 .copied()
1560 .collect(); 1556 .collect();
1561 commit_events.retain(|e| permissioned_users.contains(&e.author())); 1557 commit_events.retain(|e| permissioned_users.contains(&e.pubkey));
1562 1558
1563 let revision_roots: HashSet<nostr::EventId> = commit_events 1559 let revision_roots: HashSet<nostr::EventId> = commit_events
1564 .iter() 1560 .iter()
1565 .filter(|e| event_is_revision_root(e)) 1561 .filter(|e| event_is_revision_root(e))
1566 .map(nostr::Event::id) 1562 .map(|e| e.id)
1567 .collect(); 1563 .collect();
1568 1564
1569 if !revision_roots.is_empty() { 1565 if !revision_roots.is_empty() {
@@ -1584,7 +1580,7 @@ pub async fn get_all_proposal_patch_events_from_cache(
1584 1580
1585 Ok(commit_events 1581 Ok(commit_events
1586 .iter() 1582 .iter()
1587 .filter(|e| !event_is_cover_letter(e) && permissioned_users.contains(&e.author())) 1583 .filter(|e| !event_is_cover_letter(e) && permissioned_users.contains(&e.pubkey))
1588 .cloned() 1584 .cloned()
1589 .collect()) 1585 .collect())
1590} 1586}
@@ -1614,10 +1610,7 @@ pub async fn send_events(
1614) -> Result<()> { 1610) -> Result<()> {
1615 let fallback = [ 1611 let fallback = [
1616 client.get_fallback_relays().clone(), 1612 client.get_fallback_relays().clone(),
1617 if events 1613 if events.iter().any(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) {
1618 .iter()
1619 .any(|e| e.kind().eq(&Kind::GitRepoAnnouncement))
1620 {
1621 client.get_blaster_relays().clone() 1614 client.get_blaster_relays().clone()
1622 } else { 1615 } else {
1623 vec![] 1616 vec![]
diff --git a/src/lib/git/mod.rs b/src/lib/git/mod.rs
index b0576fd..875a336 100644
--- a/src/lib/git/mod.rs
+++ b/src/lib/git/mod.rs
@@ -842,9 +842,9 @@ fn extract_sig_from_patch_tags<'a>(
842) -> Result<git2::Signature<'a>> { 842) -> Result<git2::Signature<'a>> {
843 let v = tags 843 let v = tags
844 .iter() 844 .iter()
845 .find(|t| t.as_vec()[0].eq(tag_name)) 845 .find(|t| t.as_slice()[0].eq(tag_name))
846 .context(format!("tag '{tag_name}' not present in patch"))? 846 .context(format!("tag '{tag_name}' not present in patch"))?
847 .as_vec(); 847 .as_slice();
848 if v.len() != 5 { 848 if v.len() != 5 {
849 bail!("tag '{tag_name}' is incorrectly formatted") 849 bail!("tag '{tag_name}' is incorrectly formatted")
850 } 850 }
diff --git a/src/lib/git_events.rs b/src/lib/git_events.rs
index d818f4c..2adc205 100644
--- a/src/lib/git_events.rs
+++ b/src/lib/git_events.rs
@@ -19,9 +19,9 @@ pub fn tag_value(event: &Event, tag_name: &str) -> Result<String> {
19 Ok(event 19 Ok(event
20 .tags 20 .tags
21 .iter() 21 .iter()
22 .find(|t| t.as_vec()[0].eq(tag_name)) 22 .find(|t| t.as_slice()[0].eq(tag_name))
23 .context(format!("tag '{tag_name}'not present"))? 23 .context(format!("tag '{tag_name}'not present"))?
24 .as_vec()[1] 24 .as_slice()[1]
25 .clone()) 25 .clone())
26} 26}
27 27
@@ -40,11 +40,11 @@ pub fn get_commit_id_from_patch(event: &Event) -> Result<String> {
40pub fn get_event_root(event: &nostr::Event) -> Result<EventId> { 40pub fn get_event_root(event: &nostr::Event) -> Result<EventId> {
41 Ok(EventId::parse( 41 Ok(EventId::parse(
42 event 42 event
43 .tags() 43 .tags
44 .iter() 44 .iter()
45 .find(|t| t.is_root()) 45 .find(|t| t.is_root())
46 .context("no thread root in event")? 46 .context("no thread root in event")?
47 .as_vec() 47 .as_slice()
48 .get(1) 48 .get(1)
49 .unwrap(), 49 .unwrap(),
50 )?) 50 )?)
@@ -60,23 +60,23 @@ pub fn status_kinds() -> Vec<Kind> {
60} 60}
61 61
62pub fn event_is_patch_set_root(event: &Event) -> bool { 62pub fn event_is_patch_set_root(event: &Event) -> bool {
63 event.kind.eq(&Kind::GitPatch) && event.tags().iter().any(|t| t.as_vec()[1].eq("root")) 63 event.kind.eq(&Kind::GitPatch) && event.tags.iter().any(|t| t.as_slice()[1].eq("root"))
64} 64}
65 65
66pub fn event_is_revision_root(event: &Event) -> bool { 66pub fn event_is_revision_root(event: &Event) -> bool {
67 event.kind.eq(&Kind::GitPatch) 67 event.kind.eq(&Kind::GitPatch)
68 && event 68 && event
69 .tags() 69 .tags
70 .iter() 70 .iter()
71 .any(|t| t.as_vec()[1].eq("revision-root")) 71 .any(|t| t.as_slice()[1].eq("revision-root"))
72} 72}
73 73
74pub fn patch_supports_commit_ids(event: &Event) -> bool { 74pub fn patch_supports_commit_ids(event: &Event) -> bool {
75 event.kind.eq(&Kind::GitPatch) 75 event.kind.eq(&Kind::GitPatch)
76 && event 76 && event
77 .tags() 77 .tags
78 .iter() 78 .iter()
79 .any(|t| t.as_vec()[0].eq("commit-pgp-sig")) 79 .any(|t| t.as_slice()[0].eq("commit-pgp-sig"))
80} 80}
81 81
82#[allow(clippy::too_many_arguments)] 82#[allow(clippy::too_many_arguments)]
@@ -399,7 +399,7 @@ pub async fn generate_cover_letter_and_patch_events(
399 events.first().map(|event| event.id), 399 events.first().map(|event| event.id),
400 signer, 400 signer,
401 repo_ref, 401 repo_ref,
402 events.last().map(nostr::Event::id), 402 events.last().map(|e| e.id),
403 if events.is_empty() && commits.len().eq(&1) { 403 if events.is_empty() && commits.len().eq(&1) {
404 None 404 None
405 } else { 405 } else {
@@ -461,11 +461,11 @@ pub fn event_is_cover_letter(event: &nostr::Event) -> bool {
461 // [PATCH v1 0/n ] or 461 // [PATCH v1 0/n ] or
462 // [PATCH subsystem v2 0/n ] 462 // [PATCH subsystem v2 0/n ]
463 event.kind.eq(&Kind::GitPatch) 463 event.kind.eq(&Kind::GitPatch)
464 && event.tags().iter().any(|t| t.as_vec()[1].eq("root")) 464 && event.tags.iter().any(|t| t.as_slice()[1].eq("root"))
465 && event 465 && event
466 .tags() 466 .tags
467 .iter() 467 .iter()
468 .any(|t| t.as_vec()[1].eq("cover-letter")) 468 .any(|t| t.as_slice()[1].eq("cover-letter"))
469} 469}
470 470
471pub fn commit_msg_from_patch(patch: &nostr::Event) -> Result<String> { 471pub fn commit_msg_from_patch(patch: &nostr::Event) -> Result<String> {
@@ -529,7 +529,7 @@ pub fn event_to_cover_letter(event: &nostr::Event) -> Result<CoverLetter> {
529 .collect(); 529 .collect();
530 s 530 s
531 }, 531 },
532 event_id: Some(event.id()), 532 event_id: Some(event.id),
533 }) 533 })
534} 534}
535 535
@@ -580,17 +580,17 @@ fn get_event_parent_id(event: &nostr::Event) -> Result<String> {
580 Ok(if let Some(reply_tag) = event 580 Ok(if let Some(reply_tag) = event
581 .tags 581 .tags
582 .iter() 582 .iter()
583 .find(|t| t.as_vec().len().gt(&3) && t.as_vec()[3].eq("reply")) 583 .find(|t| t.as_slice().len().gt(&3) && t.as_slice()[3].eq("reply"))
584 { 584 {
585 reply_tag 585 reply_tag
586 } else { 586 } else {
587 event 587 event
588 .tags 588 .tags
589 .iter() 589 .iter()
590 .find(|t| t.as_vec().len().gt(&3) && t.as_vec()[3].eq("root")) 590 .find(|t| t.as_slice().len().gt(&3) && t.as_slice()[3].eq("root"))
591 .context("no reply or root e tag present".to_string())? 591 .context("no reply or root e tag present".to_string())?
592 } 592 }
593 .as_vec()[1] 593 .as_slice()[1]
594 .clone()) 594 .clone())
595} 595}
596 596
@@ -601,7 +601,7 @@ pub fn is_event_proposal_root_for_branch(
601) -> Result<bool> { 601) -> Result<bool> {
602 let branch_name = branch_name_or_refstr.replace("refs/heads/", ""); 602 let branch_name = branch_name_or_refstr.replace("refs/heads/", "");
603 Ok(event_to_cover_letter(e).is_ok_and(|cl| { 603 Ok(event_to_cover_letter(e).is_ok_and(|cl| {
604 (logged_in_user.is_some_and(|public_key| e.author().eq(&public_key)) 604 (logged_in_user.is_some_and(|public_key| e.pubkey.eq(&public_key))
605 && (branch_name.eq(&format!("pr/{}", cl.branch_name)) 605 && (branch_name.eq(&format!("pr/{}", cl.branch_name))
606 || cl.branch_name.eq(&branch_name))) 606 || cl.branch_name.eq(&branch_name)))
607 || cl.get_branch_name().is_ok_and(|s| s.eq(&branch_name)) 607 || cl.get_branch_name().is_ok_and(|s| s.eq(&branch_name))
diff --git a/src/lib/login/key_encryption.rs b/src/lib/login/key_encryption.rs
index 3841d50..b50b507 100644
--- a/src/lib/login/key_encryption.rs
+++ b/src/lib/login/key_encryption.rs
@@ -11,7 +11,7 @@ pub fn encrypt_key(keys: &Keys, password: &str) -> Result<String> {
11 15 11 15
12 }; 12 };
13 Ok(nostr::nips::nip49::EncryptedSecretKey::new( 13 Ok(nostr::nips::nip49::EncryptedSecretKey::new(
14 keys.secret_key()?, 14 keys.secret_key(),
15 password, 15 password,
16 log2_rounds, 16 log2_rounds,
17 KeySecurity::Medium, 17 KeySecurity::Medium,
@@ -47,14 +47,8 @@ mod tests {
47 let decrypted_key = decrypt_key(TEST_KEY_1_ENCRYPTED, TEST_PASSWORD)?; 47 let decrypted_key = decrypt_key(TEST_KEY_1_ENCRYPTED, TEST_PASSWORD)?;
48 48
49 assert_eq!( 49 assert_eq!(
50 format!( 50 format!("{}", TEST_KEY_1_KEYS.secret_key().to_bech32().unwrap()),
51 "{}", 51 format!("{}", decrypted_key.secret_key().to_bech32().unwrap()),
52 TEST_KEY_1_KEYS.secret_key().unwrap().to_bech32().unwrap()
53 ),
54 format!(
55 "{}",
56 decrypted_key.secret_key().unwrap().to_bech32().unwrap()
57 ),
58 ); 52 );
59 Ok(()) 53 Ok(())
60 } 54 }
@@ -65,14 +59,8 @@ mod tests {
65 let decrypted_key = decrypt_key(TEST_KEY_1_ENCRYPTED_WEAK, TEST_WEAK_PASSWORD)?; 59 let decrypted_key = decrypt_key(TEST_KEY_1_ENCRYPTED_WEAK, TEST_WEAK_PASSWORD)?;
66 60
67 assert_eq!( 61 assert_eq!(
68 format!( 62 format!("{}", TEST_KEY_1_KEYS.secret_key().to_bech32().unwrap()),
69 "{}", 63 format!("{}", decrypted_key.secret_key().to_bech32().unwrap()),
70 TEST_KEY_1_KEYS.secret_key().unwrap().to_bech32().unwrap()
71 ),
72 format!(
73 "{}",
74 decrypted_key.secret_key().unwrap().to_bech32().unwrap()
75 ),
76 ); 64 );
77 Ok(()) 65 Ok(())
78 } 66 }
@@ -84,8 +72,8 @@ mod tests {
84 let newkey = decrypt_key(s.as_str(), TEST_PASSWORD)?; 72 let newkey = decrypt_key(s.as_str(), TEST_PASSWORD)?;
85 73
86 assert_eq!( 74 assert_eq!(
87 format!("{}", key.secret_key().unwrap().to_bech32().unwrap()), 75 format!("{}", key.secret_key().to_bech32().unwrap()),
88 format!("{}", newkey.secret_key().unwrap().to_bech32().unwrap()), 76 format!("{}", newkey.secret_key().to_bech32().unwrap()),
89 ); 77 );
90 Ok(()) 78 Ok(())
91 } 79 }
@@ -97,8 +85,8 @@ mod tests {
97 let newkey = decrypt_key(s.as_str(), TEST_PASSWORD)?; 85 let newkey = decrypt_key(s.as_str(), TEST_PASSWORD)?;
98 86
99 assert_eq!( 87 assert_eq!(
100 format!("{}", key.secret_key().unwrap().to_bech32().unwrap()), 88 format!("{}", key.secret_key().to_bech32().unwrap()),
101 format!("{}", newkey.secret_key().unwrap().to_bech32().unwrap()), 89 format!("{}", newkey.secret_key().to_bech32().unwrap()),
102 ); 90 );
103 Ok(()) 91 Ok(())
104 } 92 }
diff --git a/src/lib/login/mod.rs b/src/lib/login/mod.rs
index 825ec30..f262bda 100644
--- a/src/lib/login/mod.rs
+++ b/src/lib/login/mod.rs
@@ -363,7 +363,7 @@ async fn fresh_login(
363 always_save: bool, 363 always_save: bool,
364) -> Result<(NostrSigner, UserRef)> { 364) -> Result<(NostrSigner, UserRef)> {
365 let app_key = Keys::generate(); 365 let app_key = Keys::generate();
366 let app_key_secret = app_key.secret_key()?.to_secret_hex(); 366 let app_key_secret = app_key.secret_key().to_secret_hex();
367 let relays = if let Some(client) = client { 367 let relays = if let Some(client) = client {
368 client 368 client
369 .get_fallback_signer_relays() 369 .get_fallback_signer_relays()
@@ -652,7 +652,7 @@ fn save_keys(git_repo: &Repo, keys: &nostr::Keys, always_save: bool) -> Result<(
652 .context("failed to get password input from interactor.password")?; 652 .context("failed to get password input from interactor.password")?;
653 encrypt_key(keys, &password)? 653 encrypt_key(keys, &password)?
654 } else { 654 } else {
655 keys.secret_key()?.to_bech32()? 655 keys.secret_key().to_bech32()?
656 }; 656 };
657 657
658 if let Err(error) = 658 if let Err(error) =
@@ -745,9 +745,9 @@ fn extract_user_relays(public_key: &nostr::PublicKey, events: &[nostr::Event]) -
745 ))) 745 )))
746 }) 746 })
747 .map(|t| UserRelayRef { 747 .map(|t| UserRelayRef {
748 url: t.as_vec()[1].clone(), 748 url: t.as_slice()[1].clone(),
749 read: t.as_vec().len() == 2 || t.as_vec()[2].eq("read"), 749 read: t.as_slice().len() == 2 || t.as_slice()[2].eq("read"),
750 write: t.as_vec().len() == 2 || t.as_vec()[2].eq("write"), 750 write: t.as_slice().len() == 2 || t.as_slice()[2].eq("write"),
751 }) 751 })
752 .collect() 752 .collect()
753 } else { 753 } else {
diff --git a/src/lib/repo_ref.rs b/src/lib/repo_ref.rs
index e498c86..2468d4d 100644
--- a/src/lib/repo_ref.rs
+++ b/src/lib/repo_ref.rs
@@ -42,42 +42,50 @@ impl TryFrom<nostr::Event> for RepoRef {
42 } 42 }
43 let mut r = Self::default(); 43 let mut r = Self::default();
44 44
45 if let Some(t) = event.tags.iter().find(|t| t.as_vec()[0].eq("d")) { 45 if let Some(t) = event.tags.iter().find(|t| t.as_slice()[0].eq("d")) {
46 r.identifier = t.as_vec()[1].clone(); 46 r.identifier = t.as_slice()[1].clone();
47 } 47 }
48 48
49 if let Some(t) = event.tags.iter().find(|t| t.as_vec()[0].eq("name")) { 49 if let Some(t) = event.tags.iter().find(|t| t.as_slice()[0].eq("name")) {
50 r.name = t.as_vec()[1].clone(); 50 r.name = t.as_slice()[1].clone();
51 } 51 }
52 52
53 if let Some(t) = event.tags.iter().find(|t| t.as_vec()[0].eq("description")) { 53 if let Some(t) = event
54 r.description = t.as_vec()[1].clone(); 54 .tags
55 .iter()
56 .find(|t| t.as_slice()[0].eq("description"))
57 {
58 r.description = t.as_slice()[1].clone();
55 } 59 }
56 60
57 if let Some(t) = event.tags.iter().find(|t| t.as_vec()[0].eq("clone")) { 61 if let Some(t) = event.tags.iter().find(|t| t.as_slice()[0].eq("clone")) {
58 r.git_server = t.clone().to_vec(); 62 r.git_server = t.clone().to_vec();
59 r.git_server.remove(0); 63 r.git_server.remove(0);
60 } 64 }
61 65
62 if let Some(t) = event.tags.iter().find(|t| t.as_vec()[0].eq("web")) { 66 if let Some(t) = event.tags.iter().find(|t| t.as_slice()[0].eq("web")) {
63 r.web = t.clone().to_vec(); 67 r.web = t.clone().to_vec();
64 r.web.remove(0); 68 r.web.remove(0);
65 } 69 }
66 70
67 if let Some(t) = event.tags.iter().find(|t| { 71 if let Some(t) = event.tags.iter().find(|t| {
68 t.as_vec()[0].eq("r") 72 t.as_slice()[0].eq("r")
69 && t.as_vec()[1].len().eq(&40) 73 && t.as_slice()[1].len().eq(&40)
70 && git2::Oid::from_str(t.as_vec()[1].as_str()).is_ok() 74 && git2::Oid::from_str(t.as_slice()[1].as_str()).is_ok()
71 }) { 75 }) {
72 r.root_commit = t.as_vec()[1].clone(); 76 r.root_commit = t.as_slice()[1].clone();
73 } 77 }
74 78
75 if let Some(t) = event.tags.iter().find(|t| t.as_vec()[0].eq("relays")) { 79 if let Some(t) = event.tags.iter().find(|t| t.as_slice()[0].eq("relays")) {
76 r.relays = t.clone().to_vec(); 80 r.relays = t.clone().to_vec();
77 r.relays.remove(0); 81 r.relays.remove(0);
78 } 82 }
79 83
80 if let Some(t) = event.tags.iter().find(|t| t.as_vec()[0].eq("maintainers")) { 84 if let Some(t) = event
85 .tags
86 .iter()
87 .find(|t| t.as_slice()[0].eq("maintainers"))
88 {
81 let mut maintainers = t.clone().to_vec(); 89 let mut maintainers = t.clone().to_vec();
82 maintainers.remove(0); 90 maintainers.remove(0);
83 if !maintainers.contains(&event.pubkey.to_string()) { 91 if !maintainers.contains(&event.pubkey.to_string()) {
@@ -98,7 +106,7 @@ impl TryFrom<nostr::Event> for RepoRef {
98 Coordinate { 106 Coordinate {
99 kind: event.kind, 107 kind: event.kind,
100 identifier: event.identifier().unwrap().to_string(), 108 identifier: event.identifier().unwrap().to_string(),
101 public_key: event.author(), 109 public_key: event.pubkey,
102 relays: vec![], 110 relays: vec![],
103 }, 111 },
104 event, 112 event,
@@ -606,7 +614,7 @@ mod tests {
606 .await 614 .await
607 .tags 615 .tags
608 .iter() 616 .iter()
609 .any(|t| t.as_vec()[0].eq("d") && t.as_vec()[1].eq("123412341")) 617 .any(|t| t.as_slice()[0].eq("d") && t.as_slice()[1].eq("123412341"))
610 ) 618 )
611 } 619 }
612 620
@@ -617,36 +625,44 @@ mod tests {
617 .await 625 .await
618 .tags 626 .tags
619 .iter() 627 .iter()
620 .any(|t| t.as_vec()[0].eq("name") && t.as_vec()[1].eq("test name")) 628 .any(|t| t.as_slice()[0].eq("name") && t.as_slice()[1].eq("test name"))
621 ) 629 )
622 } 630 }
623 631
624 #[tokio::test] 632 #[tokio::test]
625 async fn alt() { 633 async fn alt() {
626 assert!( 634 assert!(create().await.tags.iter().any(|t| t.as_slice()[0].eq("alt")
627 create().await.tags.iter().any(|t| t.as_vec()[0].eq("alt") 635 && t.as_slice()[1].eq("git repository: test name")))
628 && t.as_vec()[1].eq("git repository: test name"))
629 )
630 } 636 }
631 637
632 #[tokio::test] 638 #[tokio::test]
633 async fn description() { 639 async fn description() {
634 assert!(create().await.tags.iter().any( 640 assert!(
635 |t| t.as_vec()[0].eq("description") && t.as_vec()[1].eq("test description") 641 create()
636 )) 642 .await
643 .tags
644 .iter()
645 .any(|t| t.as_slice()[0].eq("description")
646 && t.as_slice()[1].eq("test description"))
647 )
637 } 648 }
638 649
639 #[tokio::test] 650 #[tokio::test]
640 async fn root_commit_as_reference() { 651 async fn root_commit_as_reference() {
641 assert!(create().await.tags.iter().any(|t| t.as_vec()[0].eq("r") 652 assert!(create().await.tags.iter().any(|t| t.as_slice()[0].eq("r")
642 && t.as_vec()[1].eq("5e664e5a7845cd1373c79f580ca4fe29ab5b34d2"))) 653 && t.as_slice()[1].eq("5e664e5a7845cd1373c79f580ca4fe29ab5b34d2")))
643 } 654 }
644 655
645 #[tokio::test] 656 #[tokio::test]
646 async fn git_server() { 657 async fn git_server() {
647 assert!(create().await.tags.iter().any( 658 assert!(
648 |t| t.as_vec()[0].eq("clone") && t.as_vec()[1].eq("https://localhost:1000") 659 create()
649 )) 660 .await
661 .tags
662 .iter()
663 .any(|t| t.as_slice()[0].eq("clone")
664 && t.as_slice()[1].eq("https://localhost:1000"))
665 )
650 } 666 }
651 667
652 #[tokio::test] 668 #[tokio::test]
@@ -655,21 +671,24 @@ mod tests {
655 let relays_tag: &nostr::Tag = event 671 let relays_tag: &nostr::Tag = event
656 .tags 672 .tags
657 .iter() 673 .iter()
658 .find(|t| t.as_vec()[0].eq("relays")) 674 .find(|t| t.as_slice()[0].eq("relays"))
659 .unwrap(); 675 .unwrap();
660 assert_eq!(relays_tag.as_vec().len(), 3); 676 assert_eq!(relays_tag.as_slice().len(), 3);
661 assert_eq!(relays_tag.as_vec()[1], "ws://relay1.io"); 677 assert_eq!(relays_tag.as_slice()[1], "ws://relay1.io");
662 assert_eq!(relays_tag.as_vec()[2], "ws://relay2.io"); 678 assert_eq!(relays_tag.as_slice()[2], "ws://relay2.io");
663 } 679 }
664 680
665 #[tokio::test] 681 #[tokio::test]
666 async fn web() { 682 async fn web() {
667 let event = create().await; 683 let event = create().await;
668 let web_tag: &nostr::Tag = 684 let web_tag: &nostr::Tag = event
669 event.tags.iter().find(|t| t.as_vec()[0].eq("web")).unwrap(); 685 .tags
670 assert_eq!(web_tag.as_vec().len(), 3); 686 .iter()
671 assert_eq!(web_tag.as_vec()[1], "https://exampleproject.xyz"); 687 .find(|t| t.as_slice()[0].eq("web"))
672 assert_eq!(web_tag.as_vec()[2], "https://gitworkshop.dev/123"); 688 .unwrap();
689 assert_eq!(web_tag.as_slice().len(), 3);
690 assert_eq!(web_tag.as_slice()[1], "https://exampleproject.xyz");
691 assert_eq!(web_tag.as_slice()[2], "https://gitworkshop.dev/123");
673 } 692 }
674 693
675 #[tokio::test] 694 #[tokio::test]
@@ -678,15 +697,15 @@ mod tests {
678 let maintainers_tag: &nostr::Tag = event 697 let maintainers_tag: &nostr::Tag = event
679 .tags 698 .tags
680 .iter() 699 .iter()
681 .find(|t| t.as_vec()[0].eq("maintainers")) 700 .find(|t| t.as_slice()[0].eq("maintainers"))
682 .unwrap(); 701 .unwrap();
683 assert_eq!(maintainers_tag.as_vec().len(), 3); 702 assert_eq!(maintainers_tag.as_slice().len(), 3);
684 assert_eq!( 703 assert_eq!(
685 maintainers_tag.as_vec()[1], 704 maintainers_tag.as_slice()[1],
686 TEST_KEY_1_KEYS.public_key().to_string() 705 TEST_KEY_1_KEYS.public_key().to_string()
687 ); 706 );
688 assert_eq!( 707 assert_eq!(
689 maintainers_tag.as_vec()[2], 708 maintainers_tag.as_slice()[2],
690 TEST_KEY_2_KEYS.public_key().to_string() 709 TEST_KEY_2_KEYS.public_key().to_string()
691 ); 710 );
692 } 711 }
diff --git a/src/lib/repo_state.rs b/src/lib/repo_state.rs
index a5cebab..c39db34 100644
--- a/src/lib/repo_state.rs
+++ b/src/lib/repo_state.rs
@@ -15,12 +15,12 @@ impl RepoState {
15 let event = state_events.first().context("no state events")?; 15 let event = state_events.first().context("no state events")?;
16 let mut state = HashMap::new(); 16 let mut state = HashMap::new();
17 for tag in &event.tags { 17 for tag in &event.tags {
18 if let Some(name) = tag.as_vec().first() { 18 if let Some(name) = tag.as_slice().first() {
19 if ["refs/heads/", "refs/tags", "HEAD"] 19 if ["refs/heads/", "refs/tags", "HEAD"]
20 .iter() 20 .iter()
21 .any(|s| name.starts_with(*s)) 21 .any(|s| name.starts_with(*s))
22 { 22 {
23 if let Some(value) = tag.as_vec().get(1) { 23 if let Some(value) = tag.as_slice().get(1) {
24 if Oid::from_str(value).is_ok() || value.contains("ref: refs/") { 24 if Oid::from_str(value).is_ok() || value.contains("ref: refs/") {
25 state.insert(name.to_owned(), value.to_owned()); 25 state.insert(name.to_owned(), value.to_owned());
26 } 26 }
diff --git a/test_utils/Cargo.toml b/test_utils/Cargo.toml
index d0442ac..baed990 100644
--- a/test_utils/Cargo.toml
+++ b/test_utils/Cargo.toml
@@ -10,10 +10,10 @@ dialoguer = "0.10.4"
10directories = "5.0.1" 10directories = "5.0.1"
11futures = "0.3.28" 11futures = "0.3.28"
12git2 = "0.19.0" 12git2 = "0.19.0"
13nostr = "0.34.1" 13nostr = "0.35.0"
14nostr-database = "0.34.0" 14nostr-database = "0.35.0"
15nostr-sdk = "0.34.0" 15nostr-sdk = "0.35.0"
16nostr-sqlite = "0.34.0" 16nostr-sqlite = "0.35.0"
17once_cell = "1.18.0" 17once_cell = "1.18.0"
18rand = "0.8" 18rand = "0.8"
19rexpect = { git = "https://github.com/rust-cli/rexpect.git", rev = "9eb61dd" } 19rexpect = { git = "https://github.com/rust-cli/rexpect.git", rev = "9eb61dd" }
diff --git a/test_utils/src/git.rs b/test_utils/src/git.rs
index 2a3d566..3c19a2c 100644
--- a/test_utils/src/git.rs
+++ b/test_utils/src/git.rs
@@ -25,7 +25,7 @@ impl Default for GitTestRepo {
25 let repo_event = generate_repo_ref_event(); 25 let repo_event = generate_repo_ref_event();
26 let coordinate = Coordinate { 26 let coordinate = Coordinate {
27 kind: Kind::GitRepoAnnouncement, 27 kind: Kind::GitRepoAnnouncement,
28 public_key: repo_event.author(), 28 public_key: repo_event.pubkey,
29 identifier: repo_event.identifier().unwrap().to_string(), 29 identifier: repo_event.identifier().unwrap().to_string(),
30 relays: vec![ 30 relays: vec![
31 "ws://localhost:8055".to_string(), 31 "ws://localhost:8055".to_string(),
diff --git a/test_utils/src/lib.rs b/test_utils/src/lib.rs
index be51ed9..f329681 100644
--- a/test_utils/src/lib.rs
+++ b/test_utils/src/lib.rs
@@ -10,7 +10,7 @@ use dialoguer::theme::{ColorfulTheme, Theme};
10use futures::executor::block_on; 10use futures::executor::block_on;
11use git::GitTestRepo; 11use git::GitTestRepo;
12use nostr::{self, nips::nip65::RelayMetadata, Kind, Tag}; 12use nostr::{self, nips::nip65::RelayMetadata, Kind, Tag};
13use nostr_database::{NostrDatabase, Order}; 13use nostr_database::NostrDatabase;
14use nostr_sdk::{serde_json, Client, NostrSigner, TagStandard}; 14use nostr_sdk::{serde_json, Client, NostrSigner, TagStandard};
15use nostr_sqlite::SQLiteDatabase; 15use nostr_sqlite::SQLiteDatabase;
16use once_cell::sync::Lazy; 16use once_cell::sync::Lazy;
@@ -1064,7 +1064,7 @@ pub async fn get_events_from_cache(
1064) -> Result<Vec<nostr::Event>> { 1064) -> Result<Vec<nostr::Event>> {
1065 get_local_cache_database(git_repo_path) 1065 get_local_cache_database(git_repo_path)
1066 .await? 1066 .await?
1067 .query(filters.clone(), Order::Asc) 1067 .query(filters.clone())
1068 .await 1068 .await
1069 .context( 1069 .context(
1070 "cannot execute query on opened git repo nostr cache database .git/nostr-cache.sqlite", 1070 "cannot execute query on opened git repo nostr cache database .git/nostr-cache.sqlite",
@@ -1091,10 +1091,10 @@ pub fn get_proposal_branch_name_from_events(
1091 branch_name_in_event: &str, 1091 branch_name_in_event: &str,
1092) -> Result<String> { 1092) -> Result<String> {
1093 for event in events { 1093 for event in events {
1094 if event.tags().iter().any(|t| { 1094 if event.tags.iter().any(|t| {
1095 !t.as_vec()[1].eq("revision-root") 1095 !t.as_slice()[1].eq("revision-root")
1096 && event.tags().iter().any(|t| { 1096 && event.tags.iter().any(|t| {
1097 t.as_vec()[0].eq("branch-name") && t.as_vec()[1].eq(branch_name_in_event) 1097 t.as_slice()[0].eq("branch-name") && t.as_slice()[1].eq(branch_name_in_event)
1098 }) 1098 })
1099 }) { 1099 }) {
1100 return Ok(format!( 1100 return Ok(format!(
@@ -1379,7 +1379,7 @@ fn get_first_proposal_event_id() -> Result<nostr::EventId> {
1379 .find(|e| { 1379 .find(|e| {
1380 e.tags 1380 e.tags
1381 .iter() 1381 .iter()
1382 .any(|t| t.as_vec()[1].eq(&FEATURE_BRANCH_NAME_1)) 1382 .any(|t| t.as_slice()[1].eq(&FEATURE_BRANCH_NAME_1))
1383 }) 1383 })
1384 .unwrap() 1384 .unwrap()
1385 .id; 1385 .id;
diff --git a/tests/git_remote_nostr/main.rs b/tests/git_remote_nostr/main.rs
index 5d2dcbb..189d82d 100644
--- a/tests/git_remote_nostr/main.rs
+++ b/tests/git_remote_nostr/main.rs
@@ -20,7 +20,7 @@ fn get_nostr_remote_url() -> Result<String> {
20 let repo_event = generate_repo_ref_event(); 20 let repo_event = generate_repo_ref_event();
21 let naddr = Coordinate { 21 let naddr = Coordinate {
22 kind: Kind::GitRepoAnnouncement, 22 kind: Kind::GitRepoAnnouncement,
23 public_key: repo_event.author(), 23 public_key: repo_event.pubkey,
24 identifier: repo_event.identifier().unwrap().to_string(), 24 identifier: repo_event.identifier().unwrap().to_string(),
25 relays: vec![ 25 relays: vec![
26 "ws://localhost:8055".to_string(), 26 "ws://localhost:8055".to_string(),
@@ -156,7 +156,7 @@ async fn generate_repo_with_state_event() -> Result<(nostr::Event, GitTestRepo)>
156 let state_event = r56 156 let state_event = r56
157 .events 157 .events
158 .iter() 158 .iter()
159 .find(|e| e.kind().eq(&STATE_KIND)) 159 .find(|e| e.kind.eq(&STATE_KIND))
160 .context("state event not created")?; 160 .context("state event not created")?;
161 161
162 assert_eq!( 162 assert_eq!(
@@ -164,7 +164,7 @@ async fn generate_repo_with_state_event() -> Result<(nostr::Event, GitTestRepo)>
164 .tags 164 .tags
165 .iter() 165 .iter()
166 .filter(|t| t.kind().to_string().as_str().ne("d")) 166 .filter(|t| t.kind().to_string().as_str().ne("d"))
167 .map(|t| t.as_vec().to_vec()) 167 .map(|t| t.as_slice().to_vec())
168 .collect::<HashSet<Vec<String>>>(), 168 .collect::<HashSet<Vec<String>>>(),
169 HashSet::from([ 169 HashSet::from([
170 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()], 170 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()],
diff --git a/tests/git_remote_nostr/push.rs b/tests/git_remote_nostr/push.rs
index f552ee5..e0a4e93 100644
--- a/tests/git_remote_nostr/push.rs
+++ b/tests/git_remote_nostr/push.rs
@@ -298,7 +298,7 @@ mod two_branches_in_batch_one_added_one_updated {
298 let state_event = r56 298 let state_event = r56
299 .events 299 .events
300 .iter() 300 .iter()
301 .find(|e| e.kind().eq(&STATE_KIND)) 301 .find(|e| e.kind.eq(&STATE_KIND))
302 .context("state event not created")?; 302 .context("state event not created")?;
303 303
304 assert_eq!( 304 assert_eq!(
@@ -311,7 +311,7 @@ mod two_branches_in_batch_one_added_one_updated {
311 .tags 311 .tags
312 .iter() 312 .iter()
313 .filter(|t| t.kind().to_string().as_str().ne("d")) 313 .filter(|t| t.kind().to_string().as_str().ne("d"))
314 .map(|t| t.as_vec().to_vec()) 314 .map(|t| t.as_slice().to_vec())
315 .collect::<HashSet<Vec<String>>>(), 315 .collect::<HashSet<Vec<String>>>(),
316 HashSet::from([ 316 HashSet::from([
317 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()], 317 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()],
@@ -415,7 +415,7 @@ mod two_branches_in_batch_one_added_one_updated {
415 let state_event = r56 415 let state_event = r56
416 .events 416 .events
417 .iter() 417 .iter()
418 .find(|e| e.kind().eq(&STATE_KIND)) 418 .find(|e| e.kind.eq(&STATE_KIND))
419 .context("state event not created")?; 419 .context("state event not created")?;
420 420
421 // println!("{:#?}", state_event); 421 // println!("{:#?}", state_event);
@@ -424,7 +424,7 @@ mod two_branches_in_batch_one_added_one_updated {
424 .tags 424 .tags
425 .iter() 425 .iter()
426 .filter(|t| t.kind().to_string().as_str().ne("d")) 426 .filter(|t| t.kind().to_string().as_str().ne("d"))
427 .map(|t| t.as_vec().to_vec()) 427 .map(|t| t.as_slice().to_vec())
428 .collect::<HashSet<Vec<String>>>(), 428 .collect::<HashSet<Vec<String>>>(),
429 HashSet::from([ 429 HashSet::from([
430 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()], 430 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()],
@@ -710,7 +710,7 @@ mod delete_one_branch {
710 let state_event = r56 710 let state_event = r56
711 .events 711 .events
712 .iter() 712 .iter()
713 .find(|e| e.kind().eq(&STATE_KIND)) 713 .find(|e| e.kind.eq(&STATE_KIND))
714 .context("state event not created")?; 714 .context("state event not created")?;
715 715
716 // println!("{:#?}", state_event); 716 // println!("{:#?}", state_event);
@@ -719,7 +719,7 @@ mod delete_one_branch {
719 .tags 719 .tags
720 .iter() 720 .iter()
721 .filter(|t| t.kind().to_string().as_str().ne("d")) 721 .filter(|t| t.kind().to_string().as_str().ne("d"))
722 .map(|t| t.as_vec().to_vec()) 722 .map(|t| t.as_slice().to_vec())
723 .collect::<HashSet<Vec<String>>>(), 723 .collect::<HashSet<Vec<String>>>(),
724 HashSet::from([ 724 HashSet::from([
725 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()], 725 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()],
@@ -797,7 +797,7 @@ mod delete_one_branch {
797 let state_event = r56 797 let state_event = r56
798 .events 798 .events
799 .iter() 799 .iter()
800 .find(|e| e.kind().eq(&STATE_KIND)) 800 .find(|e| e.kind.eq(&STATE_KIND))
801 .context("state event not created")?; 801 .context("state event not created")?;
802 802
803 // println!("{:#?}", state_event); 803 // println!("{:#?}", state_event);
@@ -806,7 +806,7 @@ mod delete_one_branch {
806 .tags 806 .tags
807 .iter() 807 .iter()
808 .filter(|t| t.kind().to_string().as_str().ne("d")) 808 .filter(|t| t.kind().to_string().as_str().ne("d"))
809 .map(|t| t.as_vec().to_vec()) 809 .map(|t| t.as_slice().to_vec())
810 .collect::<HashSet<Vec<String>>>(), 810 .collect::<HashSet<Vec<String>>>(),
811 HashSet::from([ 811 HashSet::from([
812 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()], 812 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()],
@@ -980,16 +980,16 @@ async fn proposal_merge_commit_pushed_to_main_leads_to_status_event_issued() ->
980 .events 980 .events
981 .iter() 981 .iter()
982 .find(|e| { 982 .find(|e| {
983 e.tags() 983 e.tags
984 .iter() 984 .iter()
985 .find(|t| t.as_vec()[0].eq("branch-name")) 985 .find(|t| t.as_slice()[0].eq("branch-name"))
986 .is_some_and(|t| t.as_vec()[1].eq(FEATURE_BRANCH_NAME_1)) 986 .is_some_and(|t| t.as_slice()[1].eq(FEATURE_BRANCH_NAME_1))
987 }) 987 })
988 .unwrap(); 988 .unwrap();
989 989
990 let merge_status = new_events 990 let merge_status = new_events
991 .iter() 991 .iter()
992 .find(|e| e.kind().eq(&Kind::GitStatusApplied)) 992 .find(|e| e.kind.eq(&Kind::GitStatusApplied))
993 .unwrap(); 993 .unwrap();
994 994
995 assert_eq!( 995 assert_eq!(
@@ -997,9 +997,9 @@ async fn proposal_merge_commit_pushed_to_main_leads_to_status_event_issued() ->
997 merge_status 997 merge_status
998 .tags 998 .tags
999 .iter() 999 .iter()
1000 .find(|t| t.as_vec()[0].eq("merge-commit-id")) 1000 .find(|t| t.as_slice()[0].eq("merge-commit-id"))
1001 .unwrap() 1001 .unwrap()
1002 .as_vec()[1], 1002 .as_slice()[1],
1003 "status sets correct merge-commit-id tag" 1003 "status sets correct merge-commit-id tag"
1004 ); 1004 );
1005 1005
@@ -1007,35 +1007,35 @@ async fn proposal_merge_commit_pushed_to_main_leads_to_status_event_issued() ->
1007 .events 1007 .events
1008 .iter() 1008 .iter()
1009 .filter(|e| { 1009 .filter(|e| {
1010 e.tags() 1010 e.tags
1011 .iter() 1011 .iter()
1012 .any(|t| t.as_vec()[1].eq(&proposal.id().to_string())) 1012 .any(|t| t.as_slice()[1].eq(&proposal.id.to_string()))
1013 && e.kind().eq(&Kind::GitPatch) 1013 && e.kind.eq(&Kind::GitPatch)
1014 }) 1014 })
1015 .last() 1015 .last()
1016 .unwrap(); 1016 .unwrap();
1017 1017
1018 assert_eq!( 1018 assert_eq!(
1019 proposal_tip.id().to_string(), 1019 proposal_tip.id.to_string(),
1020 merge_status 1020 merge_status
1021 .tags 1021 .tags
1022 .iter() 1022 .iter()
1023 .find(|t| t.as_vec().len().eq(&4) && t.as_vec()[3].eq("mention")) 1023 .find(|t| t.as_slice().len().eq(&4) && t.as_slice()[3].eq("mention"))
1024 .unwrap() 1024 .unwrap()
1025 .as_vec()[1], 1025 .as_slice()[1],
1026 "status mentions proposal tip event \r\nmerge status:\r\n{}\r\nproposal tip:\r\n{}", 1026 "status mentions proposal tip event \r\nmerge status:\r\n{}\r\nproposal tip:\r\n{}",
1027 merge_status.as_json(), 1027 merge_status.as_json(),
1028 proposal_tip.as_json(), 1028 proposal_tip.as_json(),
1029 ); 1029 );
1030 1030
1031 assert_eq!( 1031 assert_eq!(
1032 proposal.id().to_string(), 1032 proposal.id.to_string(),
1033 merge_status 1033 merge_status
1034 .tags 1034 .tags
1035 .iter() 1035 .iter()
1036 .find(|t| t.is_root()) 1036 .find(|t| t.is_root())
1037 .unwrap() 1037 .unwrap()
1038 .as_vec()[1], 1038 .as_slice()[1],
1039 "status tags proposal id as root \r\nmerge status:\r\n{}\r\nproposal:\r\n{}", 1039 "status tags proposal id as root \r\nmerge status:\r\n{}\r\nproposal:\r\n{}",
1040 merge_status.as_json(), 1040 merge_status.as_json(),
1041 proposal.as_json(), 1041 proposal.as_json(),
@@ -1136,32 +1136,32 @@ async fn push_2_commits_to_existing_proposal() -> Result<()> {
1136 .events 1136 .events
1137 .iter() 1137 .iter()
1138 .find(|e| { 1138 .find(|e| {
1139 e.tags() 1139 e.tags
1140 .iter() 1140 .iter()
1141 .find(|t| t.as_vec()[0].eq("branch-name")) 1141 .find(|t| t.as_slice()[0].eq("branch-name"))
1142 .is_some_and(|t| t.as_vec()[1].eq(FEATURE_BRANCH_NAME_1)) 1142 .is_some_and(|t| t.as_slice()[1].eq(FEATURE_BRANCH_NAME_1))
1143 }) 1143 })
1144 .unwrap(); 1144 .unwrap();
1145 1145
1146 assert_eq!( 1146 assert_eq!(
1147 proposal.id().to_string(), 1147 proposal.id.to_string(),
1148 first_new_patch 1148 first_new_patch
1149 .tags 1149 .tags
1150 .iter() 1150 .iter()
1151 .find(|t| t.is_root()) 1151 .find(|t| t.is_root())
1152 .unwrap() 1152 .unwrap()
1153 .as_vec()[1], 1153 .as_slice()[1],
1154 "first patch sets proposal id as root" 1154 "first patch sets proposal id as root"
1155 ); 1155 );
1156 1156
1157 assert_eq!( 1157 assert_eq!(
1158 first_new_patch.id().to_string(), 1158 first_new_patch.id.to_string(),
1159 second_new_patch 1159 second_new_patch
1160 .tags 1160 .tags
1161 .iter() 1161 .iter()
1162 .find(|t| t.is_reply()) 1162 .find(|t| t.is_reply())
1163 .unwrap() 1163 .unwrap()
1164 .as_vec()[1], 1164 .as_slice()[1],
1165 "second new patch replies to the first new patch" 1165 "second new patch replies to the first new patch"
1166 ); 1166 );
1167 1167
@@ -1169,21 +1169,21 @@ async fn push_2_commits_to_existing_proposal() -> Result<()> {
1169 .events 1169 .events
1170 .iter() 1170 .iter()
1171 .find(|e| { 1171 .find(|e| {
1172 e.tags() 1172 e.tags
1173 .iter() 1173 .iter()
1174 .any(|t| t.as_vec()[1].eq(&proposal.id().to_string())) 1174 .any(|t| t.as_slice()[1].eq(&proposal.id.to_string()))
1175 && e.content.contains("[PATCH 2/2]") 1175 && e.content.contains("[PATCH 2/2]")
1176 }) 1176 })
1177 .unwrap(); 1177 .unwrap();
1178 1178
1179 assert_eq!( 1179 assert_eq!(
1180 previous_proposal_tip_event.id().to_string(), 1180 previous_proposal_tip_event.id.to_string(),
1181 first_new_patch 1181 first_new_patch
1182 .tags 1182 .tags
1183 .iter() 1183 .iter()
1184 .find(|t| t.is_reply()) 1184 .find(|t| t.is_reply())
1185 .unwrap() 1185 .unwrap()
1186 .as_vec()[1], 1186 .as_slice()[1],
1187 "first patch replies to the previous tip of proposal" 1187 "first patch replies to the previous tip of proposal"
1188 ); 1188 );
1189 1189
@@ -1275,26 +1275,26 @@ async fn force_push_creates_proposal_revision() -> Result<()> {
1275 .events 1275 .events
1276 .iter() 1276 .iter()
1277 .find(|e| { 1277 .find(|e| {
1278 e.tags() 1278 e.tags
1279 .iter() 1279 .iter()
1280 .find(|t| t.as_vec()[0].eq("branch-name")) 1280 .find(|t| t.as_slice()[0].eq("branch-name"))
1281 .is_some_and(|t| t.as_vec()[1].eq(FEATURE_BRANCH_NAME_1)) 1281 .is_some_and(|t| t.as_slice()[1].eq(FEATURE_BRANCH_NAME_1))
1282 }) 1282 })
1283 .unwrap(); 1283 .unwrap();
1284 1284
1285 let revision_root_patch = new_events 1285 let revision_root_patch = new_events
1286 .iter() 1286 .iter()
1287 .find(|e| e.tags().iter().any(|t| t.as_vec()[1].eq("revision-root"))) 1287 .find(|e| e.tags.iter().any(|t| t.as_slice()[1].eq("revision-root")))
1288 .unwrap(); 1288 .unwrap();
1289 1289
1290 assert_eq!( 1290 assert_eq!(
1291 proposal.id().to_string(), 1291 proposal.id.to_string(),
1292 revision_root_patch 1292 revision_root_patch
1293 .tags 1293 .tags
1294 .iter() 1294 .iter()
1295 .find(|t| t.is_reply()) 1295 .find(|t| t.is_reply())
1296 .unwrap() 1296 .unwrap()
1297 .as_vec()[1], 1297 .as_slice()[1],
1298 "revision root patch replies to original proposal" 1298 "revision root patch replies to original proposal"
1299 ); 1299 );
1300 1300
@@ -1321,24 +1321,24 @@ async fn force_push_creates_proposal_revision() -> Result<()> {
1321 ); 1321 );
1322 1322
1323 assert_eq!( 1323 assert_eq!(
1324 revision_root_patch.id().to_string(), 1324 revision_root_patch.id.to_string(),
1325 second_patch 1325 second_patch
1326 .tags 1326 .tags
1327 .iter() 1327 .iter()
1328 .find(|t| t.is_root()) 1328 .find(|t| t.is_root())
1329 .unwrap() 1329 .unwrap()
1330 .as_vec()[1], 1330 .as_slice()[1],
1331 "second patch sets revision id as root" 1331 "second patch sets revision id as root"
1332 ); 1332 );
1333 1333
1334 assert_eq!( 1334 assert_eq!(
1335 second_patch.id().to_string(), 1335 second_patch.id.to_string(),
1336 third_patch 1336 third_patch
1337 .tags 1337 .tags
1338 .iter() 1338 .iter()
1339 .find(|t| t.is_reply()) 1339 .find(|t| t.is_reply())
1340 .unwrap() 1340 .unwrap()
1341 .as_vec()[1], 1341 .as_slice()[1],
1342 "third patch replies to the second new patch" 1342 "third patch replies to the second new patch"
1343 ); 1343 );
1344 1344
@@ -1423,7 +1423,7 @@ async fn push_new_pr_branch_creates_proposal() -> Result<()> {
1423 1423
1424 let proposal = new_events 1424 let proposal = new_events
1425 .iter() 1425 .iter()
1426 .find(|e| e.tags().iter().any(|t| t.as_vec()[1].eq("root"))) 1426 .find(|e| e.tags.iter().any(|t| t.as_slice()[1].eq("root")))
1427 .unwrap(); 1427 .unwrap();
1428 1428
1429 assert!( 1429 assert!(
@@ -1438,11 +1438,11 @@ async fn push_new_pr_branch_creates_proposal() -> Result<()> {
1438 1438
1439 assert_eq!( 1439 assert_eq!(
1440 proposal 1440 proposal
1441 .tags() 1441 .tags
1442 .iter() 1442 .iter()
1443 .find(|t| t.as_vec()[0].eq("branch-name")) 1443 .find(|t| t.as_slice()[0].eq("branch-name"))
1444 .unwrap() 1444 .unwrap()
1445 .as_vec()[1], 1445 .as_slice()[1],
1446 branch_name.replace("pr/", ""), 1446 branch_name.replace("pr/", ""),
1447 ); 1447 );
1448 1448
@@ -1457,13 +1457,13 @@ async fn push_new_pr_branch_creates_proposal() -> Result<()> {
1457 ); 1457 );
1458 1458
1459 assert_eq!( 1459 assert_eq!(
1460 proposal.id().to_string(), 1460 proposal.id.to_string(),
1461 second_patch 1461 second_patch
1462 .tags 1462 .tags
1463 .iter() 1463 .iter()
1464 .find(|t| t.is_root()) 1464 .find(|t| t.is_root())
1465 .unwrap() 1465 .unwrap()
1466 .as_vec()[1], 1466 .as_slice()[1],
1467 "second patch sets proposal id as root" 1467 "second patch sets proposal id as root"
1468 ); 1468 );
1469 1469
diff --git a/tests/ngit_init.rs b/tests/ngit_init.rs
index c8390e3..34da16f 100644
--- a/tests/ngit_init.rs
+++ b/tests/ngit_init.rs
@@ -464,11 +464,9 @@ mod when_repo_not_previously_claimed {
464 .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) 464 .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement))
465 .unwrap(); 465 .unwrap();
466 466
467 assert!( 467 assert!(event.tags.iter().any(
468 event.tags.iter().any( 468 |t| t.as_slice()[0].eq("d") && t.as_slice()[1].eq("example-identifier")
469 |t| t.as_vec()[0].eq("d") && t.as_vec()[1].eq("example-identifier") 469 ));
470 )
471 );
472 } 470 }
473 Ok(()) 471 Ok(())
474 } 472 }
@@ -484,9 +482,9 @@ mod when_repo_not_previously_claimed {
484 .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) 482 .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement))
485 .unwrap(); 483 .unwrap();
486 484
487 assert!(event.tags.iter().any(|t| t.as_vec()[0].eq("r") 485 assert!(event.tags.iter().any(|t| t.as_slice()[0].eq("r")
488 && t.as_vec()[1].eq("9ee507fc4357d7ee16a5d8901bedcd103f23c17d") 486 && t.as_slice()[1].eq("9ee507fc4357d7ee16a5d8901bedcd103f23c17d")
489 && t.as_vec()[2].eq("euc"))); 487 && t.as_slice()[2].eq("euc")));
490 } 488 }
491 Ok(()) 489 Ok(())
492 } 490 }
@@ -506,7 +504,8 @@ mod when_repo_not_previously_claimed {
506 event 504 event
507 .tags 505 .tags
508 .iter() 506 .iter()
509 .any(|t| t.as_vec()[0].eq("name") && t.as_vec()[1].eq("example-name")) 507 .any(|t| t.as_slice()[0].eq("name")
508 && t.as_slice()[1].eq("example-name"))
510 ); 509 );
511 } 510 }
512 Ok(()) 511 Ok(())
@@ -523,8 +522,8 @@ mod when_repo_not_previously_claimed {
523 .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) 522 .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement))
524 .unwrap(); 523 .unwrap();
525 524
526 assert!(event.tags.iter().any(|t| t.as_vec()[0].eq("alt") 525 assert!(event.tags.iter().any(|t| t.as_slice()[0].eq("alt")
527 && t.as_vec()[1].eq("git repository: example-name"))); 526 && t.as_slice()[1].eq("git repository: example-name")));
528 } 527 }
529 Ok(()) 528 Ok(())
530 } 529 }
@@ -540,8 +539,8 @@ mod when_repo_not_previously_claimed {
540 .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) 539 .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement))
541 .unwrap(); 540 .unwrap();
542 541
543 assert!(event.tags.iter().any(|t| t.as_vec()[0].eq("description") 542 assert!(event.tags.iter().any(|t| t.as_slice()[0].eq("description")
544 && t.as_vec()[1].eq("example-description"))); 543 && t.as_slice()[1].eq("example-description")));
545 } 544 }
546 Ok(()) 545 Ok(())
547 } 546 }
@@ -558,8 +557,8 @@ mod when_repo_not_previously_claimed {
558 .unwrap(); 557 .unwrap();
559 558
560 assert!( 559 assert!(
561 event.tags.iter().any(|t| t.as_vec()[0].eq("clone") 560 event.tags.iter().any(|t| t.as_slice()[0].eq("clone")
562 && t.as_vec()[1].eq("https://git.myhosting.com/my-repo.git")) /* todo check it defaults to origin */ 561 && t.as_slice()[1].eq("https://git.myhosting.com/my-repo.git")) /* todo check it defaults to origin */
563 ); 562 );
564 } 563 }
565 Ok(()) 564 Ok(())
@@ -578,9 +577,9 @@ mod when_repo_not_previously_claimed {
578 let relays_tag = event 577 let relays_tag = event
579 .tags 578 .tags
580 .iter() 579 .iter()
581 .find(|t| t.as_vec()[0].eq("relays")) 580 .find(|t| t.as_slice()[0].eq("relays"))
582 .unwrap() 581 .unwrap()
583 .as_vec(); 582 .as_slice();
584 assert_eq!(relays_tag[1], "ws://localhost:8055",); 583 assert_eq!(relays_tag[1], "ws://localhost:8055",);
585 assert_eq!(relays_tag[2], "ws://localhost:8056",); 584 assert_eq!(relays_tag[2], "ws://localhost:8056",);
586 } 585 }
@@ -600,9 +599,9 @@ mod when_repo_not_previously_claimed {
600 let web_tag = event 599 let web_tag = event
601 .tags 600 .tags
602 .iter() 601 .iter()
603 .find(|t| t.as_vec()[0].eq("web")) 602 .find(|t| t.as_slice()[0].eq("web"))
604 .unwrap() 603 .unwrap()
605 .as_vec(); 604 .as_slice();
606 assert_eq!(web_tag[1], "https://exampleproject.xyz",); 605 assert_eq!(web_tag[1], "https://exampleproject.xyz",);
607 assert_eq!(web_tag[2], "https://gitworkshop.dev/123",); 606 assert_eq!(web_tag[2], "https://gitworkshop.dev/123",);
608 } 607 }
@@ -622,9 +621,9 @@ mod when_repo_not_previously_claimed {
622 let maintainers_tag = event 621 let maintainers_tag = event
623 .tags 622 .tags
624 .iter() 623 .iter()
625 .find(|t| t.as_vec()[0].eq("maintainers")) 624 .find(|t| t.as_slice()[0].eq("maintainers"))
626 .unwrap() 625 .unwrap()
627 .as_vec(); 626 .as_slice();
628 assert_eq!(maintainers_tag[1], TEST_KEY_1_KEYS.public_key().to_string()); 627 assert_eq!(maintainers_tag[1], TEST_KEY_1_KEYS.public_key().to_string());
629 } 628 }
630 Ok(()) 629 Ok(())
diff --git a/tests/ngit_push.rs b/tests/ngit_push.rs
index eb452cd..3d89f6b 100644
--- a/tests/ngit_push.rs
+++ b/tests/ngit_push.rs
@@ -359,7 +359,7 @@ mod when_branch_is_checked_out {
359 assert!(r55_events.iter().any(|e| { 359 assert!(r55_events.iter().any(|e| {
360 e.tags 360 e.tags
361 .iter() 361 .iter()
362 .any(|t| t.as_vec()[0].eq("commit") && t.as_vec()[1].eq(&commit_id)) 362 .any(|t| t.as_slice()[0].eq("commit") && t.as_slice()[1].eq(&commit_id))
363 })); 363 }));
364 Ok(()) 364 Ok(())
365 } 365 }
diff --git a/tests/ngit_send.rs b/tests/ngit_send.rs
index 2aad232..0fe7a86 100644
--- a/tests/ngit_send.rs
+++ b/tests/ngit_send.rs
@@ -87,17 +87,17 @@ mod when_commits_behind_ask_to_proceed {
87fn is_cover_letter(event: &nostr::Event) -> bool { 87fn is_cover_letter(event: &nostr::Event) -> bool {
88 event.kind.eq(&Kind::GitPatch) 88 event.kind.eq(&Kind::GitPatch)
89 && event 89 && event
90 .tags() 90 .tags
91 .iter() 91 .iter()
92 .any(|t| t.as_vec()[1].eq("cover-letter")) 92 .any(|t| t.as_slice()[1].eq("cover-letter"))
93} 93}
94 94
95fn is_patch(event: &nostr::Event) -> bool { 95fn is_patch(event: &nostr::Event) -> bool {
96 event.kind.eq(&Kind::GitPatch) 96 event.kind.eq(&Kind::GitPatch)
97 && !event 97 && !event
98 .tags() 98 .tags
99 .iter() 99 .iter()
100 .any(|t| t.as_vec()[1].eq("cover-letter")) 100 .any(|t| t.as_slice()[1].eq("cover-letter"))
101} 101}
102 102
103fn prep_git_repo() -> Result<GitTestRepo> { 103fn prep_git_repo() -> Result<GitTestRepo> {
@@ -374,11 +374,11 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
374 374
375 assert_eq!( 375 assert_eq!(
376 cover_letter_event 376 cover_letter_event
377 .tags() 377 .tags
378 .iter() 378 .iter()
379 .find(|t| t.as_vec()[0].eq("r")) 379 .find(|t| t.as_slice()[0].eq("r"))
380 .unwrap() 380 .unwrap()
381 .as_vec()[1], 381 .as_slice()[1],
382 "9ee507fc4357d7ee16a5d8901bedcd103f23c17d" 382 "9ee507fc4357d7ee16a5d8901bedcd103f23c17d"
383 ); 383 );
384 } 384 }
@@ -394,10 +394,10 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
394 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 394 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
395 assert!( 395 assert!(
396 cover_letter_event 396 cover_letter_event
397 .tags() 397 .tags
398 .iter() 398 .iter()
399 .any(|t| t.as_vec()[0].eq("a") 399 .any(|t| t.as_slice()[0].eq("a")
400 && t.as_vec()[1].eq(&format!( 400 && t.as_slice()[1].eq(&format!(
401 "{}:{TEST_KEY_1_PUBKEY_HEX}:{}", 401 "{}:{TEST_KEY_1_PUBKEY_HEX}:{}",
402 Kind::GitRepoAnnouncement, 402 Kind::GitRepoAnnouncement,
403 generate_repo_ref_event().identifier().unwrap() 403 generate_repo_ref_event().identifier().unwrap()
@@ -405,10 +405,10 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
405 ); 405 );
406 assert!( 406 assert!(
407 cover_letter_event 407 cover_letter_event
408 .tags() 408 .tags
409 .iter() 409 .iter()
410 .any(|t| t.as_vec()[0].eq("a") 410 .any(|t| t.as_slice()[0].eq("a")
411 && t.as_vec()[1].eq(&format!( 411 && t.as_slice()[1].eq(&format!(
412 "{}:{TEST_KEY_2_PUBKEY_HEX}:{}", 412 "{}:{TEST_KEY_2_PUBKEY_HEX}:{}",
413 Kind::GitRepoAnnouncement, 413 Kind::GitRepoAnnouncement,
414 generate_repo_ref_event().identifier().unwrap() 414 generate_repo_ref_event().identifier().unwrap()
@@ -423,11 +423,11 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
423 async fn p_tags_for_maintainers() -> Result<()> { 423 async fn p_tags_for_maintainers() -> Result<()> {
424 let event = generate_repo_ref_event(); 424 let event = generate_repo_ref_event();
425 let maintainers = &event 425 let maintainers = &event
426 .tags() 426 .tags
427 .iter() 427 .iter()
428 .find(|t| t.as_vec()[0].eq(&"maintainers")) 428 .find(|t| t.as_slice()[0].eq(&"maintainers"))
429 .unwrap() 429 .unwrap()
430 .as_vec()[1..]; 430 .as_slice()[1..];
431 let (_, _, r53, r55, r56) = prep_run_create_proposal(true).await?; 431 let (_, _, r53, r55, r56) = prep_run_create_proposal(true).await?;
432 for relay in [&r53, &r55, &r56] { 432 for relay in [&r53, &r55, &r56] {
433 for m in maintainers { 433 for m in maintainers {
@@ -435,9 +435,9 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
435 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 435 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
436 assert!( 436 assert!(
437 cover_letter_event 437 cover_letter_event
438 .tags() 438 .tags
439 .iter() 439 .iter()
440 .any(|t| { t.as_vec()[0].eq("p") && t.as_vec()[1].eq(m) }) 440 .any(|t| { t.as_slice()[0].eq("p") && t.as_slice()[1].eq(m) })
441 ); 441 );
442 } 442 }
443 } 443 }
@@ -452,10 +452,9 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
452 let cover_letter_event: &nostr::Event = 452 let cover_letter_event: &nostr::Event =
453 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 453 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
454 assert!( 454 assert!(
455 cover_letter_event 455 cover_letter_event.tags.iter().any(|t| {
456 .tags() 456 t.as_slice()[0].eq("t") && t.as_slice()[1].eq(&"cover-letter")
457 .iter() 457 })
458 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"cover-letter") })
459 ); 458 );
460 } 459 }
461 Ok(()) 460 Ok(())
@@ -470,9 +469,9 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
470 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 469 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
471 assert!( 470 assert!(
472 cover_letter_event 471 cover_letter_event
473 .tags() 472 .tags
474 .iter() 473 .iter()
475 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"root") }) 474 .any(|t| { t.as_slice()[0].eq("t") && t.as_slice()[1].eq(&"root") })
476 ); 475 );
477 } 476 }
478 Ok(()) 477 Ok(())
@@ -489,11 +488,11 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
489 // branch-name tag 488 // branch-name tag
490 assert_eq!( 489 assert_eq!(
491 cover_letter_event 490 cover_letter_event
492 .tags() 491 .tags
493 .iter() 492 .iter()
494 .find(|t| t.as_vec()[0].eq("branch-name")) 493 .find(|t| t.as_slice()[0].eq("branch-name"))
495 .unwrap() 494 .unwrap()
496 .as_vec()[1], 495 .as_slice()[1],
497 "feature" 496 "feature"
498 ); 497 );
499 } 498 }
@@ -511,11 +510,11 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
511 // branch-name tag 510 // branch-name tag
512 assert_eq!( 511 assert_eq!(
513 cover_letter_event 512 cover_letter_event
514 .tags() 513 .tags
515 .iter() 514 .iter()
516 .find(|t| t.as_vec()[0].eq("alt")) 515 .find(|t| t.as_slice()[0].eq("alt"))
517 .unwrap() 516 .unwrap()
518 .as_vec()[1], 517 .as_slice()[1],
519 "git patch cover letter: exampletitle" 518 "git patch cover letter: exampletitle"
520 ); 519 );
521 } 520 }
@@ -540,13 +539,13 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
540 most_recent_patch 539 most_recent_patch
541 .tags 540 .tags
542 .iter() 541 .iter()
543 .any(|t| t.as_vec()[0].eq("r") && t.as_vec()[1].eq(COMMIT_ID)) 542 .any(|t| t.as_slice()[0].eq("r") && t.as_slice()[1].eq(COMMIT_ID))
544 ); 543 );
545 assert!( 544 assert!(
546 most_recent_patch 545 most_recent_patch
547 .tags 546 .tags
548 .iter() 547 .iter()
549 .any(|t| t.as_vec()[0].eq("commit") && t.as_vec()[1].eq(COMMIT_ID)) 548 .any(|t| t.as_slice()[0].eq("commit") && t.as_slice()[1].eq(COMMIT_ID))
550 ); 549 );
551 Ok(()) 550 Ok(())
552 } 551 }
@@ -561,9 +560,9 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
561 most_recent_patch 560 most_recent_patch
562 .tags 561 .tags
563 .iter() 562 .iter()
564 .find(|t| t.as_vec()[0].eq("parent-commit")) 563 .find(|t| t.as_slice()[0].eq("parent-commit"))
565 .unwrap() 564 .unwrap()
566 .as_vec()[1], 565 .as_slice()[1],
567 COMMIT_PARENT_ID, 566 COMMIT_PARENT_ID,
568 ); 567 );
569 Ok(()) 568 Ok(())
@@ -572,8 +571,8 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
572 #[tokio::test] 571 #[tokio::test]
573 #[serial] 572 #[serial]
574 async fn root_commit_as_r() -> Result<()> { 573 async fn root_commit_as_r() -> Result<()> {
575 assert!(prep().await?.tags.iter().any(|t| t.as_vec()[0].eq("r") 574 assert!(prep().await?.tags.iter().any(|t| t.as_slice()[0].eq("r")
576 && t.as_vec()[1].eq("9ee507fc4357d7ee16a5d8901bedcd103f23c17d"))); 575 && t.as_slice()[1].eq("9ee507fc4357d7ee16a5d8901bedcd103f23c17d")));
577 Ok(()) 576 Ok(())
578 } 577 }
579 578
@@ -582,18 +581,18 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
582 async fn p_tags_for_maintainers() -> Result<()> { 581 async fn p_tags_for_maintainers() -> Result<()> {
583 let event = generate_repo_ref_event(); 582 let event = generate_repo_ref_event();
584 let maintainers = &event 583 let maintainers = &event
585 .tags() 584 .tags
586 .iter() 585 .iter()
587 .find(|t| t.as_vec()[0].eq(&"maintainers")) 586 .find(|t| t.as_slice()[0].eq(&"maintainers"))
588 .unwrap() 587 .unwrap()
589 .as_vec()[1..]; 588 .as_slice()[1..];
590 for m in maintainers { 589 for m in maintainers {
591 assert!( 590 assert!(
592 prep() 591 prep()
593 .await? 592 .await?
594 .tags() 593 .tags
595 .iter() 594 .iter()
596 .any(|t| { t.as_vec()[0].eq("p") && t.as_vec()[1].eq(m) }) 595 .any(|t| { t.as_slice()[0].eq("p") && t.as_slice()[1].eq(m) })
597 ); 596 );
598 } 597 }
599 Ok(()) 598 Ok(())
@@ -603,16 +602,16 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
603 #[serial] 602 #[serial]
604 async fn a_tag_for_repo_event_of_each_maintainer() -> Result<()> { 603 async fn a_tag_for_repo_event_of_each_maintainer() -> Result<()> {
605 assert!(prep().await?.tags.iter().any(|t| { 604 assert!(prep().await?.tags.iter().any(|t| {
606 t.as_vec()[0].eq("a") 605 t.as_slice()[0].eq("a")
607 && t.as_vec()[1].eq(&format!( 606 && t.as_slice()[1].eq(&format!(
608 "{}:{TEST_KEY_1_PUBKEY_HEX}:{}", 607 "{}:{TEST_KEY_1_PUBKEY_HEX}:{}",
609 Kind::GitRepoAnnouncement, 608 Kind::GitRepoAnnouncement,
610 generate_repo_ref_event().identifier().unwrap() 609 generate_repo_ref_event().identifier().unwrap()
611 )) 610 ))
612 })); 611 }));
613 assert!(prep().await?.tags.iter().any(|t| { 612 assert!(prep().await?.tags.iter().any(|t| {
614 t.as_vec()[0].eq("a") 613 t.as_slice()[0].eq("a")
615 && t.as_vec()[1].eq(&format!( 614 && t.as_slice()[1].eq(&format!(
616 "{}:{TEST_KEY_2_PUBKEY_HEX}:{}", 615 "{}:{TEST_KEY_2_PUBKEY_HEX}:{}",
617 Kind::GitRepoAnnouncement, 616 Kind::GitRepoAnnouncement,
618 generate_repo_ref_event().identifier().unwrap() 617 generate_repo_ref_event().identifier().unwrap()
@@ -629,9 +628,9 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
629 .await? 628 .await?
630 .tags 629 .tags
631 .iter() 630 .iter()
632 .find(|t| t.as_vec()[0].eq("description")) 631 .find(|t| t.as_slice()[0].eq("description"))
633 .unwrap() 632 .unwrap()
634 .as_vec()[1], 633 .as_slice()[1],
635 "add t3.md" 634 "add t3.md"
636 ); 635 );
637 Ok(()) 636 Ok(())
@@ -645,9 +644,9 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
645 .await? 644 .await?
646 .tags 645 .tags
647 .iter() 646 .iter()
648 .find(|t| t.as_vec()[0].eq("author")) 647 .find(|t| t.as_slice()[0].eq("author"))
649 .unwrap() 648 .unwrap()
650 .as_vec(), 649 .as_slice(),
651 vec!["author", "Joe Bloggs", "joe.bloggs@pm.me", "0", "0"], 650 vec!["author", "Joe Bloggs", "joe.bloggs@pm.me", "0", "0"],
652 ); 651 );
653 Ok(()) 652 Ok(())
@@ -661,9 +660,9 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
661 .await? 660 .await?
662 .tags 661 .tags
663 .iter() 662 .iter()
664 .find(|t| t.as_vec()[0].eq("committer")) 663 .find(|t| t.as_slice()[0].eq("committer"))
665 .unwrap() 664 .unwrap()
666 .as_vec(), 665 .as_slice(),
667 vec!["committer", "Joe Bloggs", "joe.bloggs@pm.me", "0", "0"], 666 vec!["committer", "Joe Bloggs", "joe.bloggs@pm.me", "0", "0"],
668 ); 667 );
669 Ok(()) 668 Ok(())
@@ -677,9 +676,9 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
677 .await? 676 .await?
678 .tags 677 .tags
679 .iter() 678 .iter()
680 .find(|t| t.as_vec()[0].eq("alt")) 679 .find(|t| t.as_slice()[0].eq("alt"))
681 .unwrap() 680 .unwrap()
682 .as_vec(), 681 .as_slice(),
683 vec!["alt", "git patch: add t3.md"], 682 vec!["alt", "git patch: add t3.md"],
684 ); 683 );
685 Ok(()) 684 Ok(())
@@ -700,12 +699,14 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
700 .tags 699 .tags
701 .iter() 700 .iter()
702 .find(|t| { 701 .find(|t| {
703 t.as_vec()[0].eq("e") && t.as_vec().len().eq(&4) && t.as_vec()[3].eq("root") 702 t.as_slice()[0].eq("e")
703 && t.as_slice().len().eq(&4)
704 && t.as_slice()[3].eq("root")
704 }) 705 })
705 .unwrap(); 706 .unwrap();
706 707
707 assert_eq!( 708 assert_eq!(
708 root_event_tag.as_vec()[1], 709 root_event_tag.as_slice()[1],
709 cover_letter_event.id.to_string() 710 cover_letter_event.id.to_string()
710 ); 711 );
711 } 712 }
@@ -724,13 +725,13 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
724 .collect::<Vec<&nostr::Event>>(); 725 .collect::<Vec<&nostr::Event>>();
725 assert_eq!( 726 assert_eq!(
726 patch_events[1] 727 patch_events[1]
727 .tags() 728 .tags
728 .iter() 729 .iter()
729 .find(|t| t.as_vec()[0].eq("e") 730 .find(|t| t.as_slice()[0].eq("e")
730 && t.as_vec().len().eq(&4) 731 && t.as_slice().len().eq(&4)
731 && t.as_vec()[3].eq("reply")) 732 && t.as_slice()[3].eq("reply"))
732 .unwrap() 733 .unwrap()
733 .as_vec()[1], 734 .as_slice()[1],
734 patch_events[0].id.to_string(), 735 patch_events[0].id.to_string(),
735 ); 736 );
736 } 737 }
@@ -745,7 +746,7 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
745 .await? 746 .await?
746 .tags 747 .tags
747 .iter() 748 .iter()
748 .any(|t| t.as_vec()[0].eq("t") && t.as_vec()[1].eq("root")) 749 .any(|t| t.as_slice()[0].eq("t") && t.as_slice()[1].eq("root"))
749 ); 750 );
750 Ok(()) 751 Ok(())
751 } 752 }
@@ -1114,16 +1115,16 @@ mod when_no_cover_letter_flag_set_with_range_of_head_2_sends_2_patches_without_c
1114 // first patch tagged as root 1115 // first patch tagged as root
1115 assert!( 1116 assert!(
1116 patch_events[0] 1117 patch_events[0]
1117 .tags() 1118 .tags
1118 .iter() 1119 .iter()
1119 .any(|t| t.as_vec()[0].eq("t") && t.as_vec()[1].eq("root")) 1120 .any(|t| t.as_slice()[0].eq("t") && t.as_slice()[1].eq("root"))
1120 ); 1121 );
1121 // second patch not tagged as root 1122 // second patch not tagged as root
1122 assert!( 1123 assert!(
1123 !patch_events[1] 1124 !patch_events[1]
1124 .tags() 1125 .tags
1125 .iter() 1126 .iter()
1126 .any(|t| t.as_vec()[0].eq("t") && t.as_vec()[1].eq("root")) 1127 .any(|t| t.as_slice()[0].eq("t") && t.as_slice()[1].eq("root"))
1127 ); 1128 );
1128 } 1129 }
1129 Ok(()) 1130 Ok(())
@@ -1143,11 +1144,11 @@ mod when_no_cover_letter_flag_set_with_range_of_head_2_sends_2_patches_without_c
1143 // branch-name tag 1144 // branch-name tag
1144 assert_eq!( 1145 assert_eq!(
1145 patch_events[0] 1146 patch_events[0]
1146 .tags() 1147 .tags
1147 .iter() 1148 .iter()
1148 .find(|t| t.as_vec()[0].eq("branch-name")) 1149 .find(|t| t.as_slice()[0].eq("branch-name"))
1149 .unwrap() 1150 .unwrap()
1150 .as_vec()[1], 1151 .as_slice()[1],
1151 "feature" 1152 "feature"
1152 ); 1153 );
1153 } 1154 }
@@ -1167,13 +1168,13 @@ mod when_no_cover_letter_flag_set_with_range_of_head_2_sends_2_patches_without_c
1167 1168
1168 assert_eq!( 1169 assert_eq!(
1169 patch_events[1] 1170 patch_events[1]
1170 .tags() 1171 .tags
1171 .iter() 1172 .iter()
1172 .find(|t| t.as_vec()[0].eq("e") 1173 .find(|t| t.as_slice()[0].eq("e")
1173 && t.as_vec().len().eq(&4) 1174 && t.as_slice().len().eq(&4)
1174 && t.as_vec()[3].eq("root")) 1175 && t.as_slice()[3].eq("root"))
1175 .unwrap() 1176 .unwrap()
1176 .as_vec()[1], 1177 .as_slice()[1],
1177 patch_events[0].id.to_string(), 1178 patch_events[0].id.to_string(),
1178 ); 1179 );
1179 } 1180 }
@@ -1572,9 +1573,9 @@ mod root_proposal_specified_using_in_reply_to_with_range_of_head_2_and_cover_let
1572 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 1573 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
1573 assert!( 1574 assert!(
1574 cover_letter_event 1575 cover_letter_event
1575 .tags() 1576 .tags
1576 .iter() 1577 .iter()
1577 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"root") }) 1578 .any(|t| { t.as_slice()[0].eq("t") && t.as_slice()[1].eq(&"root") })
1578 ); 1579 );
1579 } 1580 }
1580 Ok(()) 1581 Ok(())
@@ -1588,10 +1589,9 @@ mod root_proposal_specified_using_in_reply_to_with_range_of_head_2_and_cover_let
1588 let cover_letter_event: &nostr::Event = 1589 let cover_letter_event: &nostr::Event =
1589 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 1590 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
1590 assert!( 1591 assert!(
1591 cover_letter_event 1592 cover_letter_event.tags.iter().any(|t| {
1592 .tags() 1593 t.as_slice()[0].eq("t") && t.as_slice()[1].eq(&"revision-root")
1593 .iter() 1594 })
1594 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"revision-root") })
1595 ); 1595 );
1596 } 1596 }
1597 Ok(()) 1597 Ok(())
@@ -1606,15 +1606,15 @@ mod root_proposal_specified_using_in_reply_to_with_range_of_head_2_and_cover_let
1606 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 1606 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
1607 assert_eq!( 1607 assert_eq!(
1608 cover_letter_event 1608 cover_letter_event
1609 .tags() 1609 .tags
1610 .iter() 1610 .iter()
1611 .find(|t| { 1611 .find(|t| {
1612 t.as_vec()[0].eq("e") 1612 t.as_slice()[0].eq("e")
1613 && t.as_vec().len().eq(&4) 1613 && t.as_slice().len().eq(&4)
1614 && t.as_vec()[3].eq("reply") 1614 && t.as_slice()[3].eq("reply")
1615 }) 1615 })
1616 .unwrap() 1616 .unwrap()
1617 .as_vec()[1], 1617 .as_slice()[1],
1618 // id of state nevent 1618 // id of state nevent
1619 "431e58eb8e1b4e20292d1d5bbe81d5cfb042e1bc165de32eddfdd52245a4cce4", 1619 "431e58eb8e1b4e20292d1d5bbe81d5cfb042e1bc165de32eddfdd52245a4cce4",
1620 ); 1620 );
@@ -1639,12 +1639,12 @@ mod root_proposal_specified_using_in_reply_to_with_range_of_head_2_and_cover_let
1639 .tags 1639 .tags
1640 .iter() 1640 .iter()
1641 .find(|t| { 1641 .find(|t| {
1642 t.as_vec()[0].eq("e") 1642 t.as_slice()[0].eq("e")
1643 && t.as_vec().len().eq(&4) 1643 && t.as_slice().len().eq(&4)
1644 && t.as_vec()[3].eq("root") 1644 && t.as_slice()[3].eq("root")
1645 }) 1645 })
1646 .unwrap() 1646 .unwrap()
1647 .as_vec()[1], 1647 .as_slice()[1],
1648 cover_letter_event.id.to_string() 1648 cover_letter_event.id.to_string()
1649 ); 1649 );
1650 } 1650 }
@@ -1754,10 +1754,10 @@ mod in_reply_to_mentions_issue {
1754 for relay in [&r53, &r55, &r56] { 1754 for relay in [&r53, &r55, &r56] {
1755 let cover_letter_event: &nostr::Event = 1755 let cover_letter_event: &nostr::Event =
1756 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 1756 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
1757 assert!(cover_letter_event.tags().iter().any(|t| { 1757 assert!(cover_letter_event.tags.iter().any(|t| {
1758 t.as_vec()[0].eq("e") 1758 t.as_slice()[0].eq("e")
1759 && t.as_vec()[1].eq(&get_pretend_issue_event().id.to_hex()) 1759 && t.as_slice()[1].eq(&get_pretend_issue_event().id.to_hex())
1760 && t.as_vec()[3].eq(&"mention") 1760 && t.as_slice()[3].eq(&"mention")
1761 })); 1761 }));
1762 } 1762 }
1763 Ok(()) 1763 Ok(())
@@ -1772,9 +1772,9 @@ mod in_reply_to_mentions_issue {
1772 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 1772 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
1773 assert!( 1773 assert!(
1774 !cover_letter_event 1774 !cover_letter_event
1775 .tags() 1775 .tags
1776 .iter() 1776 .iter()
1777 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"revision-root") }) 1777 .any(|t| { t.as_slice()[0].eq("t") && t.as_slice()[1].eq(&"revision-root") })
1778 ); 1778 );
1779 } 1779 }
1780 Ok(()) 1780 Ok(())
@@ -1877,18 +1877,18 @@ mod in_reply_to_mentions_npub_and_nprofile_which_get_mentioned_in_proposal_root
1877 for relay in [&r53, &r55, &r56] { 1877 for relay in [&r53, &r55, &r56] {
1878 let cover_letter_event: &nostr::Event = 1878 let cover_letter_event: &nostr::Event =
1879 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 1879 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
1880 assert!(cover_letter_event.tags().iter().any(|t| { 1880 assert!(cover_letter_event.tags.iter().any(|t| {
1881 t.as_vec()[0].eq("p") 1881 t.as_slice()[0].eq("p")
1882 && t.as_vec()[1].eq(&nostr::Keys::parse( 1882 && t.as_slice()[1].eq(&nostr::Keys::parse(
1883 "nsec1q3c5xnsm5m4wgsrhwnz04p0d5mevkryyggqgdpa9jwulpq9gldhswgtxvq", 1883 "nsec1q3c5xnsm5m4wgsrhwnz04p0d5mevkryyggqgdpa9jwulpq9gldhswgtxvq",
1884 ) 1884 )
1885 .unwrap() 1885 .unwrap()
1886 .public_key() 1886 .public_key()
1887 .to_hex()) 1887 .to_hex())
1888 })); 1888 }));
1889 assert!(cover_letter_event.tags().iter().any(|t| { 1889 assert!(cover_letter_event.tags.iter().any(|t| {
1890 t.as_vec()[0].eq("p") 1890 t.as_slice()[0].eq("p")
1891 && t.as_vec()[1].eq(&nostr::Keys::parse( 1891 && t.as_slice()[1].eq(&nostr::Keys::parse(
1892 "nsec1nx5ulvcndhcuu8k6q8fenw50l6y75sec7pj8vr0r68l6a44w3lqspvj02k", 1892 "nsec1nx5ulvcndhcuu8k6q8fenw50l6y75sec7pj8vr0r68l6a44w3lqspvj02k",
1893 ) 1893 )
1894 .unwrap() 1894 .unwrap()