diff options
| -rw-r--r-- | Cargo.lock | 157 | ||||
| -rw-r--r-- | Cargo.toml | 10 | ||||
| -rw-r--r-- | src/bin/git_remote_nostr/fetch.rs | 6 | ||||
| -rw-r--r-- | src/bin/git_remote_nostr/list.rs | 2 | ||||
| -rw-r--r-- | src/bin/git_remote_nostr/push.rs | 38 | ||||
| -rw-r--r-- | src/bin/git_remote_nostr/utils.rs | 14 | ||||
| -rw-r--r-- | src/bin/ngit/sub_commands/list.rs | 14 | ||||
| -rw-r--r-- | src/bin/ngit/sub_commands/pull.rs | 9 | ||||
| -rw-r--r-- | src/bin/ngit/sub_commands/push.rs | 11 | ||||
| -rw-r--r-- | src/bin/ngit/sub_commands/send.rs | 4 | ||||
| -rw-r--r-- | src/lib/client.rs | 75 | ||||
| -rw-r--r-- | src/lib/git/mod.rs | 4 | ||||
| -rw-r--r-- | src/lib/git_events.rs | 36 | ||||
| -rw-r--r-- | src/lib/login/key_encryption.rs | 30 | ||||
| -rw-r--r-- | src/lib/login/mod.rs | 10 | ||||
| -rw-r--r-- | src/lib/repo_ref.rs | 103 | ||||
| -rw-r--r-- | src/lib/repo_state.rs | 4 | ||||
| -rw-r--r-- | test_utils/Cargo.toml | 8 | ||||
| -rw-r--r-- | test_utils/src/git.rs | 2 | ||||
| -rw-r--r-- | test_utils/src/lib.rs | 14 | ||||
| -rw-r--r-- | tests/git_remote_nostr/main.rs | 6 | ||||
| -rw-r--r-- | tests/git_remote_nostr/push.rs | 98 | ||||
| -rw-r--r-- | tests/ngit_init.rs | 41 | ||||
| -rw-r--r-- | tests/ngit_push.rs | 2 | ||||
| -rw-r--r-- | tests/ngit_send.rs | 200 |
25 files changed, 477 insertions, 421 deletions
| @@ -121,6 +121,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | |||
| 121 | checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" | 121 | checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" |
| 122 | 122 | ||
| 123 | [[package]] | 123 | [[package]] |
| 124 | name = "arrayvec" | ||
| 125 | version = "0.7.6" | ||
| 126 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 127 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" | ||
| 128 | |||
| 129 | [[package]] | ||
| 124 | name = "assert_cmd" | 130 | name = "assert_cmd" |
| 125 | version = "2.0.16" | 131 | version = "2.0.16" |
| 126 | source = "registry+https://github.com/rust-lang/crates.io-index" | 132 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| @@ -319,9 +325,9 @@ dependencies = [ | |||
| 319 | 325 | ||
| 320 | [[package]] | 326 | [[package]] |
| 321 | name = "async-wsocket" | 327 | name = "async-wsocket" |
| 322 | version = "0.7.1" | 328 | version = "0.9.0" |
| 323 | source = "registry+https://github.com/rust-lang/crates.io-index" | 329 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 324 | checksum = "1eee6fcc818b89848df37050215603de0e2e072734e4730c03060feb2d0abebb" | 330 | checksum = "5c0984bead67f20366bc8dd46018dfbe189b67eeefb0e5b86b9eade18d7c3c3b" |
| 325 | dependencies = [ | 331 | dependencies = [ |
| 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]] |
| 388 | name = "base64" | 394 | name = "base58ck" |
| 389 | version = "0.21.7" | 395 | version = "0.1.0" |
| 390 | source = "registry+https://github.com/rust-lang/crates.io-index" | 396 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 391 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" | 397 | checksum = "2c8d66485a3a2ea485c1913c4572ce0256067a5377ac8c75c4960e1cda98605f" |
| 398 | dependencies = [ | ||
| 399 | "bitcoin-internals 0.3.0", | ||
| 400 | "bitcoin_hashes 0.14.0", | ||
| 401 | ] | ||
| 392 | 402 | ||
| 393 | [[package]] | 403 | [[package]] |
| 394 | name = "base64" | 404 | name = "base64" |
| @@ -404,9 +414,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" | |||
| 404 | 414 | ||
| 405 | [[package]] | 415 | [[package]] |
| 406 | name = "bech32" | 416 | name = "bech32" |
| 407 | version = "0.10.0-beta" | 417 | version = "0.11.0" |
| 408 | source = "registry+https://github.com/rust-lang/crates.io-index" | 418 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 409 | checksum = "98f7eed2b2781a6f0b5c903471d48e15f56fb4e1165df8a9a2337fd1a59d45ea" | 419 | checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" |
| 410 | 420 | ||
| 411 | [[package]] | 421 | [[package]] |
| 412 | name = "bip39" | 422 | name = "bip39" |
| @@ -421,14 +431,17 @@ dependencies = [ | |||
| 421 | 431 | ||
| 422 | [[package]] | 432 | [[package]] |
| 423 | name = "bitcoin" | 433 | name = "bitcoin" |
| 424 | version = "0.31.2" | 434 | version = "0.32.2" |
| 425 | source = "registry+https://github.com/rust-lang/crates.io-index" | 435 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 426 | checksum = "6c85783c2fe40083ea54a33aa2f0ba58831d90fcd190f5bdc47e74e84d2a96ae" | 436 | checksum = "ea507acc1cd80fc084ace38544bbcf7ced7c2aa65b653b102de0ce718df668f6" |
| 427 | dependencies = [ | 437 | dependencies = [ |
| 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" | |||
| 439 | version = "0.2.0" | 452 | version = "0.2.0" |
| 440 | source = "registry+https://github.com/rust-lang/crates.io-index" | 453 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 441 | checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" | 454 | checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" |
| 455 | |||
| 456 | [[package]] | ||
| 457 | name = "bitcoin-internals" | ||
| 458 | version = "0.3.0" | ||
| 459 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 460 | checksum = "30bdbe14aa07b06e6cfeffc529a1f099e5fbe249524f8125358604df99a4bed2" | ||
| 442 | dependencies = [ | 461 | dependencies = [ |
| 443 | "serde", | 462 | "serde", |
| 444 | ] | 463 | ] |
| 445 | 464 | ||
| 446 | [[package]] | 465 | [[package]] |
| 466 | name = "bitcoin-io" | ||
| 467 | version = "0.1.2" | ||
| 468 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 469 | checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" | ||
| 470 | |||
| 471 | [[package]] | ||
| 472 | name = "bitcoin-units" | ||
| 473 | version = "0.1.2" | ||
| 474 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 475 | checksum = "5285c8bcaa25876d07f37e3d30c303f2609179716e11d688f51e8f1fe70063e2" | ||
| 476 | dependencies = [ | ||
| 477 | "bitcoin-internals 0.3.0", | ||
| 478 | "serde", | ||
| 479 | ] | ||
| 480 | |||
| 481 | [[package]] | ||
| 447 | name = "bitcoin_hashes" | 482 | name = "bitcoin_hashes" |
| 448 | version = "0.11.0" | 483 | version = "0.11.0" |
| 449 | source = "registry+https://github.com/rust-lang/crates.io-index" | 484 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| @@ -455,8 +490,18 @@ version = "0.13.0" | |||
| 455 | source = "registry+https://github.com/rust-lang/crates.io-index" | 490 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 456 | checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" | 491 | checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" |
| 457 | dependencies = [ | 492 | dependencies = [ |
| 458 | "bitcoin-internals", | 493 | "bitcoin-internals 0.2.0", |
| 459 | "hex-conservative", | 494 | "hex-conservative 0.1.2", |
| 495 | ] | ||
| 496 | |||
| 497 | [[package]] | ||
| 498 | name = "bitcoin_hashes" | ||
| 499 | version = "0.14.0" | ||
| 500 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 501 | checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" | ||
| 502 | dependencies = [ | ||
| 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" | |||
| 1216 | checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" | 1261 | checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" |
| 1217 | 1262 | ||
| 1218 | [[package]] | 1263 | [[package]] |
| 1264 | name = "hex-conservative" | ||
| 1265 | version = "0.2.1" | ||
| 1266 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1267 | checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" | ||
| 1268 | dependencies = [ | ||
| 1269 | "arrayvec", | ||
| 1270 | ] | ||
| 1271 | |||
| 1272 | [[package]] | ||
| 1219 | name = "hex_lit" | 1273 | name = "hex_lit" |
| 1220 | version = "0.1.1" | 1274 | version = "0.1.1" |
| 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" | 1275 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| @@ -1569,9 +1623,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" | |||
| 1569 | 1623 | ||
| 1570 | [[package]] | 1624 | [[package]] |
| 1571 | name = "lnurl-pay" | 1625 | name = "lnurl-pay" |
| 1572 | version = "0.5.0" | 1626 | version = "0.6.0" |
| 1573 | source = "registry+https://github.com/rust-lang/crates.io-index" | 1627 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 1574 | checksum = "02c042191c2e3f27147decfad8182eea2c7dd1c6c1733562e25d3d401369669d" | 1628 | checksum = "536e7c782167a2d48346ca0b2677fad19eaef20f19a4ab868e4d5b96ca879def" |
| 1575 | dependencies = [ | 1629 | dependencies = [ |
| 1576 | "bech32", | 1630 | "bech32", |
| 1577 | "reqwest", | 1631 | "reqwest", |
| @@ -1698,6 +1752,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | |||
| 1698 | checksum = "e664971378a3987224f7a0e10059782035e89899ae403718ee07de85bec42afe" | 1752 | checksum = "e664971378a3987224f7a0e10059782035e89899ae403718ee07de85bec42afe" |
| 1699 | 1753 | ||
| 1700 | [[package]] | 1754 | [[package]] |
| 1755 | name = "negentropy" | ||
| 1756 | version = "0.4.3" | ||
| 1757 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1758 | checksum = "43a88da9dd148bbcdce323dd6ac47d369b4769d4a3b78c6c52389b9269f77932" | ||
| 1759 | |||
| 1760 | [[package]] | ||
| 1701 | name = "ngit" | 1761 | name = "ngit" |
| 1702 | version = "1.5.2" | 1762 | version = "1.5.2" |
| 1703 | dependencies = [ | 1763 | dependencies = [ |
| @@ -1766,12 +1826,13 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" | |||
| 1766 | 1826 | ||
| 1767 | [[package]] | 1827 | [[package]] |
| 1768 | name = "nostr" | 1828 | name = "nostr" |
| 1769 | version = "0.34.1" | 1829 | version = "0.35.0" |
| 1770 | source = "registry+https://github.com/rust-lang/crates.io-index" | 1830 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 1771 | checksum = "a1c3c32439eef3ea4d9079b2a8f557992d27259c26527e43d4228dd321e43a77" | 1831 | checksum = "56db234b2e07901e372f34e9463f91590579cd8e6dbd34ed2ccc7e461e4ba639" |
| 1772 | dependencies = [ | 1832 | dependencies = [ |
| 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]] |
| 1798 | name = "nostr-database" | 1859 | name = "nostr-database" |
| 1799 | version = "0.34.0" | 1860 | version = "0.35.0" |
| 1800 | source = "registry+https://github.com/rust-lang/crates.io-index" | 1861 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 1801 | checksum = "1926ef55392f3eea1bbe4a1358b64bbf12dd6eb554f40f483941a102c6263fc6" | 1862 | checksum = "50de8cc5e77e7dafa7e2e0d0d67187ef19e191dcd1a68efffd3e05152d91b3c3" |
| 1802 | dependencies = [ | 1863 | dependencies = [ |
| 1803 | "async-trait", | 1864 | "async-trait", |
| 1804 | "flatbuffers", | 1865 | "flatbuffers", |
| @@ -1811,13 +1872,15 @@ dependencies = [ | |||
| 1811 | 1872 | ||
| 1812 | [[package]] | 1873 | [[package]] |
| 1813 | name = "nostr-relay-pool" | 1874 | name = "nostr-relay-pool" |
| 1814 | version = "0.34.1" | 1875 | version = "0.35.0" |
| 1815 | source = "registry+https://github.com/rust-lang/crates.io-index" | 1876 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 1816 | checksum = "d0e37c5ea991802a91728d4c09d5a7276938104ead8bf140a63a60acabc5c756" | 1877 | checksum = "800b9ca169902977366f8243ec645b1fa4a128ab621331796d4a26bd7bc22a88" |
| 1817 | dependencies = [ | 1878 | dependencies = [ |
| 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]] |
| 1830 | name = "nostr-sdk" | 1893 | name = "nostr-sdk" |
| 1831 | version = "0.34.0" | 1894 | version = "0.35.0" |
| 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" | 1895 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 1833 | checksum = "ca0c0c5f8ddbdfc064ea71883191ec53de6ed52b5dca10ab07f0810b99e91acc" | 1896 | checksum = "d93036bf4c1e35145ca2cd6ee4cb7bb9c74f41cbca9cc4caff1e87b5e192f253" |
| 1834 | dependencies = [ | 1897 | dependencies = [ |
| 1835 | "async-utility", | 1898 | "async-utility", |
| 1836 | "atomic-destructor", | 1899 | "atomic-destructor", |
| @@ -1848,9 +1911,9 @@ dependencies = [ | |||
| 1848 | 1911 | ||
| 1849 | [[package]] | 1912 | [[package]] |
| 1850 | name = "nostr-signer" | 1913 | name = "nostr-signer" |
| 1851 | version = "0.34.0" | 1914 | version = "0.35.0" |
| 1852 | source = "registry+https://github.com/rust-lang/crates.io-index" | 1915 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 1853 | checksum = "5c30294a7be7d9d5ac777954812f5c7b4ae2a1e583a62e33537f87d98ab23729" | 1916 | checksum = "c1e132975a677a1c97a7695ef1161291dc06517a588b6e17e3aa05d3fb4056a0" |
| 1854 | dependencies = [ | 1917 | dependencies = [ |
| 1855 | "async-utility", | 1918 | "async-utility", |
| 1856 | "nostr", | 1919 | "nostr", |
| @@ -1862,9 +1925,9 @@ dependencies = [ | |||
| 1862 | 1925 | ||
| 1863 | [[package]] | 1926 | [[package]] |
| 1864 | name = "nostr-sqlite" | 1927 | name = "nostr-sqlite" |
| 1865 | version = "0.34.0" | 1928 | version = "0.35.0" |
| 1866 | source = "registry+https://github.com/rust-lang/crates.io-index" | 1929 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 1867 | checksum = "0b634d2a908feccd7b6b2e8d2cea47bc4061b350b7a120cd6c6f2520e4e1fc1a" | 1930 | checksum = "7b194128279dd0fa77a2be085652b17a10f70b76ec73142f0534e69a23aaf5aa" |
| 1868 | dependencies = [ | 1931 | dependencies = [ |
| 1869 | "async-trait", | 1932 | "async-trait", |
| 1870 | "nostr", | 1933 | "nostr", |
| @@ -1877,9 +1940,9 @@ dependencies = [ | |||
| 1877 | 1940 | ||
| 1878 | [[package]] | 1941 | [[package]] |
| 1879 | name = "nostr-zapper" | 1942 | name = "nostr-zapper" |
| 1880 | version = "0.34.0" | 1943 | version = "0.35.0" |
| 1881 | source = "registry+https://github.com/rust-lang/crates.io-index" | 1944 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 1882 | checksum = "dcf3ba30e807145e9cb924faf8fb0719e460f613088e99c753b67c2a9929c5b7" | 1945 | checksum = "b60e7a3ecc9881ca418e772a6fc4410920653a9f0bf9457b6ddd732d2a3f64f1" |
| 1883 | dependencies = [ | 1946 | dependencies = [ |
| 1884 | "async-trait", | 1947 | "async-trait", |
| 1885 | "nostr", | 1948 | "nostr", |
| @@ -1967,9 +2030,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" | |||
| 1967 | 2030 | ||
| 1968 | [[package]] | 2031 | [[package]] |
| 1969 | name = "nwc" | 2032 | name = "nwc" |
| 1970 | version = "0.34.1" | 2033 | version = "0.35.0" |
| 1971 | source = "registry+https://github.com/rust-lang/crates.io-index" | 2034 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 1972 | checksum = "9a16ac06bc273fcd4ead47c0c5a58b6cc7db2247fc7a64dd9bc11cf18e3efeb4" | 2035 | checksum = "2e962f52732a6d91c1e76d4de3f1daa186e77a849e98e5abe53ca7fe9796d04e" |
| 1973 | dependencies = [ | 2036 | dependencies = [ |
| 1974 | "async-utility", | 2037 | "async-utility", |
| 1975 | "nostr", | 2038 | "nostr", |
| @@ -2474,7 +2537,7 @@ version = "0.12.7" | |||
| 2474 | source = "registry+https://github.com/rust-lang/crates.io-index" | 2537 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 2475 | checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" | 2538 | checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" |
| 2476 | dependencies = [ | 2539 | dependencies = [ |
| 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" | |||
| 2620 | source = "registry+https://github.com/rust-lang/crates.io-index" | 2683 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 2621 | checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" | 2684 | checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" |
| 2622 | dependencies = [ | 2685 | dependencies = [ |
| 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]] |
| 2678 | name = "secp256k1" | 2741 | name = "secp256k1" |
| 2679 | version = "0.28.2" | 2742 | version = "0.29.1" |
| 2680 | source = "registry+https://github.com/rust-lang/crates.io-index" | 2743 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 2681 | checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" | 2744 | checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" |
| 2682 | dependencies = [ | 2745 | dependencies = [ |
| 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]] |
| 2690 | name = "secp256k1-sys" | 2753 | name = "secp256k1-sys" |
| 2691 | version = "0.9.2" | 2754 | version = "0.10.1" |
| 2692 | source = "registry+https://github.com/rust-lang/crates.io-index" | 2755 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 2693 | checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb" | 2756 | checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" |
| 2694 | dependencies = [ | 2757 | dependencies = [ |
| 2695 | "cc", | 2758 | "cc", |
| 2696 | ] | 2759 | ] |
| @@ -3157,9 +3220,9 @@ dependencies = [ | |||
| 3157 | 3220 | ||
| 3158 | [[package]] | 3221 | [[package]] |
| 3159 | name = "tokio-tungstenite" | 3222 | name = "tokio-tungstenite" |
| 3160 | version = "0.23.1" | 3223 | version = "0.24.0" |
| 3161 | source = "registry+https://github.com/rust-lang/crates.io-index" | 3224 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 3162 | checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" | 3225 | checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" |
| 3163 | dependencies = [ | 3226 | dependencies = [ |
| 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]] |
| 3275 | name = "tungstenite" | 3338 | name = "tungstenite" |
| 3276 | version = "0.23.0" | 3339 | version = "0.24.0" |
| 3277 | source = "registry+https://github.com/rust-lang/crates.io-index" | 3340 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 3278 | checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" | 3341 | checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" |
| 3279 | dependencies = [ | 3342 | dependencies = [ |
| 3280 | "byteorder", | 3343 | "byteorder", |
| 3281 | "bytes", | 3344 | "bytes", |
| @@ -24,11 +24,11 @@ futures = "0.3.28" | |||
| 24 | git2 = "0.19.0" | 24 | git2 = "0.19.0" |
| 25 | indicatif = "0.17.7" | 25 | indicatif = "0.17.7" |
| 26 | keyring = "2.0.5" | 26 | keyring = "2.0.5" |
| 27 | nostr = "0.34.1" | 27 | nostr = "0.35.0" |
| 28 | nostr-database = "0.34.0" | 28 | nostr-database = "0.35.0" |
| 29 | nostr-sdk = "0.34.0" | 29 | nostr-sdk = "0.35.0" |
| 30 | nostr-signer = "0.34.0" | 30 | nostr-signer = "0.35.0" |
| 31 | nostr-sqlite = "0.34.0" | 31 | nostr-sqlite = "0.35.0" |
| 32 | passwords = "3.1.13" | 32 | passwords = "3.1.13" |
| 33 | qrcode = { version = "0.14.1", default-features = false } | 33 | qrcode = { version = "0.14.1", default-features = false } |
| 34 | scrypt = "0.11.0" | 34 | scrypt = "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, ¤t_user) | 185 | find_proposal_and_patches_by_branch_name(to, &all_proposals, ¤t_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)] |
| 30 | use mockall::*; | 30 | use mockall::*; |
| 31 | use nostr::{nips::nip01::Coordinate, Event}; | 31 | use nostr::{nips::nip01::Coordinate, Event}; |
| 32 | use nostr_database::{NostrDatabase, Order}; | 32 | use nostr_database::NostrDatabase; |
| 33 | use nostr_sdk::{ | 33 | use 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> { | |||
| 40 | pub fn get_event_root(event: &nostr::Event) -> Result<EventId> { | 40 | pub 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 | ||
| 62 | pub fn event_is_patch_set_root(event: &Event) -> bool { | 62 | pub 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 | ||
| 66 | pub fn event_is_revision_root(event: &Event) -> bool { | 66 | pub 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 | ||
| 74 | pub fn patch_supports_commit_ids(event: &Event) -> bool { | 74 | pub 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 | ||
| 471 | pub fn commit_msg_from_patch(patch: &nostr::Event) -> Result<String> { | 471 | pub 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" | |||
| 10 | directories = "5.0.1" | 10 | directories = "5.0.1" |
| 11 | futures = "0.3.28" | 11 | futures = "0.3.28" |
| 12 | git2 = "0.19.0" | 12 | git2 = "0.19.0" |
| 13 | nostr = "0.34.1" | 13 | nostr = "0.35.0" |
| 14 | nostr-database = "0.34.0" | 14 | nostr-database = "0.35.0" |
| 15 | nostr-sdk = "0.34.0" | 15 | nostr-sdk = "0.35.0" |
| 16 | nostr-sqlite = "0.34.0" | 16 | nostr-sqlite = "0.35.0" |
| 17 | once_cell = "1.18.0" | 17 | once_cell = "1.18.0" |
| 18 | rand = "0.8" | 18 | rand = "0.8" |
| 19 | rexpect = { git = "https://github.com/rust-cli/rexpect.git", rev = "9eb61dd" } | 19 | rexpect = { 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}; | |||
| 10 | use futures::executor::block_on; | 10 | use futures::executor::block_on; |
| 11 | use git::GitTestRepo; | 11 | use git::GitTestRepo; |
| 12 | use nostr::{self, nips::nip65::RelayMetadata, Kind, Tag}; | 12 | use nostr::{self, nips::nip65::RelayMetadata, Kind, Tag}; |
| 13 | use nostr_database::{NostrDatabase, Order}; | 13 | use nostr_database::NostrDatabase; |
| 14 | use nostr_sdk::{serde_json, Client, NostrSigner, TagStandard}; | 14 | use nostr_sdk::{serde_json, Client, NostrSigner, TagStandard}; |
| 15 | use nostr_sqlite::SQLiteDatabase; | 15 | use nostr_sqlite::SQLiteDatabase; |
| 16 | use once_cell::sync::Lazy; | 16 | use 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 { | |||
| 87 | fn is_cover_letter(event: &nostr::Event) -> bool { | 87 | fn 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 | ||
| 95 | fn is_patch(event: &nostr::Event) -> bool { | 95 | fn 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 | ||
| 103 | fn prep_git_repo() -> Result<GitTestRepo> { | 103 | fn 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() |