upleb.uk

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

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock98
-rw-r--r--Cargo.toml10
-rw-r--r--src/client.rs4
-rw-r--r--src/git_remote_helper.rs3
-rw-r--r--src/sub_commands/list.rs7
-rw-r--r--src/sub_commands/send.rs18
-rw-r--r--test_utils/Cargo.toml8
-rw-r--r--test_utils/src/lib.rs6
-rw-r--r--tests/git_remote_helper.rs26
-rw-r--r--tests/send.rs106
10 files changed, 156 insertions, 130 deletions
diff --git a/Cargo.lock b/Cargo.lock
index ad6fbdd..971cf6f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -330,31 +330,22 @@ dependencies = [
330 330
331[[package]] 331[[package]]
332name = "async-wsocket" 332name = "async-wsocket"
333version = "0.5.1" 333version = "0.7.1"
334source = "registry+https://github.com/rust-lang/crates.io-index" 334source = "registry+https://github.com/rust-lang/crates.io-index"
335checksum = "79c6465dab65a363da7353383af13a22fb05ce173d9b460c38322590e9245400" 335checksum = "1eee6fcc818b89848df37050215603de0e2e072734e4730c03060feb2d0abebb"
336dependencies = [ 336dependencies = [
337 "async-utility", 337 "async-utility",
338 "futures",
338 "futures-util", 339 "futures-util",
340 "js-sys",
339 "thiserror", 341 "thiserror",
340 "tokio", 342 "tokio",
341 "tokio-rustls 0.26.0", 343 "tokio-rustls 0.26.0",
342 "tokio-socks", 344 "tokio-socks",
343 "tokio-tungstenite 0.23.0", 345 "tokio-tungstenite 0.23.0",
344 "url", 346 "url",
345 "wasm-ws", 347 "wasm-bindgen",
346 "webpki-roots", 348 "web-sys",
347]
348
349[[package]]
350name = "async_io_stream"
351version = "0.3.3"
352source = "registry+https://github.com/rust-lang/crates.io-index"
353checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c"
354dependencies = [
355 "futures",
356 "pharos",
357 "rustc_version",
358] 349]
359 350
360[[package]] 351[[package]]
@@ -1843,9 +1834,9 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
1843 1834
1844[[package]] 1835[[package]]
1845name = "nostr" 1836name = "nostr"
1846version = "0.33.0" 1837version = "0.34.0"
1847source = "registry+https://github.com/rust-lang/crates.io-index" 1838source = "registry+https://github.com/rust-lang/crates.io-index"
1848checksum = "f08db214560a34bf7c4c1fea09a8461b9412bae58ba06e99ce3177d89fa1e0a6" 1839checksum = "5897e4142fcc33c4f1d58ad17f665e87dcba70de7e370c0bda1aa0fb73212c2a"
1849dependencies = [ 1840dependencies = [
1850 "aes 0.8.4", 1841 "aes 0.8.4",
1851 "base64 0.21.7", 1842 "base64 0.21.7",
@@ -1873,9 +1864,9 @@ dependencies = [
1873 1864
1874[[package]] 1865[[package]]
1875name = "nostr-database" 1866name = "nostr-database"
1876version = "0.33.1" 1867version = "0.34.0"
1877source = "registry+https://github.com/rust-lang/crates.io-index" 1868source = "registry+https://github.com/rust-lang/crates.io-index"
1878checksum = "50eebf5020d70891e3c229128de5fc73af632b651d02742383b314d3d0c7e953" 1869checksum = "1926ef55392f3eea1bbe4a1358b64bbf12dd6eb554f40f483941a102c6263fc6"
1879dependencies = [ 1870dependencies = [
1880 "async-trait", 1871 "async-trait",
1881 "flatbuffers", 1872 "flatbuffers",
@@ -1888,9 +1879,9 @@ dependencies = [
1888 1879
1889[[package]] 1880[[package]]
1890name = "nostr-relay-pool" 1881name = "nostr-relay-pool"
1891version = "0.33.0" 1882version = "0.34.0"
1892source = "registry+https://github.com/rust-lang/crates.io-index" 1883source = "registry+https://github.com/rust-lang/crates.io-index"
1893checksum = "afa5502a3df456790ca16d90cc688a677117d57ab56b079dcfa091390ac9f202" 1884checksum = "c6480cf60564957a2a64bd050d047ee0717e08dced7a389e22ef4e9fc104edd2"
1894dependencies = [ 1885dependencies = [
1895 "async-utility", 1886 "async-utility",
1896 "async-wsocket", 1887 "async-wsocket",
@@ -1899,14 +1890,15 @@ dependencies = [
1899 "nostr-database", 1890 "nostr-database",
1900 "thiserror", 1891 "thiserror",
1901 "tokio", 1892 "tokio",
1893 "tokio-stream",
1902 "tracing", 1894 "tracing",
1903] 1895]
1904 1896
1905[[package]] 1897[[package]]
1906name = "nostr-sdk" 1898name = "nostr-sdk"
1907version = "0.33.0" 1899version = "0.34.0"
1908source = "registry+https://github.com/rust-lang/crates.io-index" 1900source = "registry+https://github.com/rust-lang/crates.io-index"
1909checksum = "b427dceefbbb49a9dd98abb8c4e40d25fdd467e99821aaad88615252bdb915bd" 1901checksum = "ca0c0c5f8ddbdfc064ea71883191ec53de6ed52b5dca10ab07f0810b99e91acc"
1910dependencies = [ 1902dependencies = [
1911 "async-utility", 1903 "async-utility",
1912 "atomic-destructor", 1904 "atomic-destructor",
@@ -1924,9 +1916,9 @@ dependencies = [
1924 1916
1925[[package]] 1917[[package]]
1926name = "nostr-signer" 1918name = "nostr-signer"
1927version = "0.33.0" 1919version = "0.34.0"
1928source = "registry+https://github.com/rust-lang/crates.io-index" 1920source = "registry+https://github.com/rust-lang/crates.io-index"
1929checksum = "665268b316f41cd8fa791be54b6c7935c5a239461708c380a699d6677be9af38" 1921checksum = "5c30294a7be7d9d5ac777954812f5c7b4ae2a1e583a62e33537f87d98ab23729"
1930dependencies = [ 1922dependencies = [
1931 "async-utility", 1923 "async-utility",
1932 "nostr", 1924 "nostr",
@@ -1938,9 +1930,9 @@ dependencies = [
1938 1930
1939[[package]] 1931[[package]]
1940name = "nostr-sqlite" 1932name = "nostr-sqlite"
1941version = "0.33.0" 1933version = "0.34.0"
1942source = "registry+https://github.com/rust-lang/crates.io-index" 1934source = "registry+https://github.com/rust-lang/crates.io-index"
1943checksum = "31f643ba919864f3a9bb004244c0d5c958646b07fe760823fdc33aae1c8fc0fc" 1935checksum = "0b634d2a908feccd7b6b2e8d2cea47bc4061b350b7a120cd6c6f2520e4e1fc1a"
1944dependencies = [ 1936dependencies = [
1945 "async-trait", 1937 "async-trait",
1946 "nostr", 1938 "nostr",
@@ -1953,9 +1945,9 @@ dependencies = [
1953 1945
1954[[package]] 1946[[package]]
1955name = "nostr-zapper" 1947name = "nostr-zapper"
1956version = "0.33.0" 1948version = "0.34.0"
1957source = "registry+https://github.com/rust-lang/crates.io-index" 1949source = "registry+https://github.com/rust-lang/crates.io-index"
1958checksum = "69922e74f8eab1f9d287008c0c06acdec87277a2d8f44bd9d38e003422aea0ab" 1950checksum = "dcf3ba30e807145e9cb924faf8fb0719e460f613088e99c753b67c2a9929c5b7"
1959dependencies = [ 1951dependencies = [
1960 "async-trait", 1952 "async-trait",
1961 "nostr", 1953 "nostr",
@@ -2055,9 +2047,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
2055 2047
2056[[package]] 2048[[package]]
2057name = "nwc" 2049name = "nwc"
2058version = "0.33.0" 2050version = "0.34.1"
2059source = "registry+https://github.com/rust-lang/crates.io-index" 2051source = "registry+https://github.com/rust-lang/crates.io-index"
2060checksum = "bb2e04b3edb5e9572e95b62842430625f1718e8a4a3596a30aeb04e6734764ea" 2052checksum = "9a16ac06bc273fcd4ead47c0c5a58b6cc7db2247fc7a64dd9bc11cf18e3efeb4"
2061dependencies = [ 2053dependencies = [
2062 "async-utility", 2054 "async-utility",
2063 "nostr", 2055 "nostr",
@@ -2188,16 +2180,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2188checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 2180checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
2189 2181
2190[[package]] 2182[[package]]
2191name = "pharos"
2192version = "0.5.3"
2193source = "registry+https://github.com/rust-lang/crates.io-index"
2194checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414"
2195dependencies = [
2196 "futures",
2197 "rustc_version",
2198]
2199
2200[[package]]
2201name = "pin-project" 2183name = "pin-project"
2202version = "1.1.5" 2184version = "1.1.5"
2203source = "registry+https://github.com/rust-lang/crates.io-index" 2185source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2805,12 +2787,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2805checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" 2787checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca"
2806 2788
2807[[package]] 2789[[package]]
2808name = "send_wrapper"
2809version = "0.6.0"
2810source = "registry+https://github.com/rust-lang/crates.io-index"
2811checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73"
2812
2813[[package]]
2814name = "serde" 2790name = "serde"
2815version = "1.0.197" 2791version = "1.0.197"
2816source = "registry+https://github.com/rust-lang/crates.io-index" 2792source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3201,6 +3177,17 @@ dependencies = [
3201] 3177]
3202 3178
3203[[package]] 3179[[package]]
3180name = "tokio-stream"
3181version = "0.1.15"
3182source = "registry+https://github.com/rust-lang/crates.io-index"
3183checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af"
3184dependencies = [
3185 "futures-core",
3186 "pin-project-lite",
3187 "tokio",
3188]
3189
3190[[package]]
3204name = "tokio-tungstenite" 3191name = "tokio-tungstenite"
3205version = "0.20.1" 3192version = "0.20.1"
3206source = "registry+https://github.com/rust-lang/crates.io-index" 3193source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3575,23 +3562,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3575checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 3562checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
3576 3563
3577[[package]] 3564[[package]]
3578name = "wasm-ws"
3579version = "0.2.1"
3580source = "registry+https://github.com/rust-lang/crates.io-index"
3581checksum = "688c5806d1b06b4f3d90d015e23364dc5d3af412ee64abba6dde8fdc01637e33"
3582dependencies = [
3583 "async_io_stream",
3584 "futures",
3585 "js-sys",
3586 "pharos",
3587 "send_wrapper",
3588 "thiserror",
3589 "wasm-bindgen",
3590 "wasm-bindgen-futures",
3591 "web-sys",
3592]
3593
3594[[package]]
3595name = "web-sys" 3565name = "web-sys"
3596version = "0.3.69" 3566version = "0.3.69"
3597source = "registry+https://github.com/rust-lang/crates.io-index" 3567source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index 55494b0..15b7cec 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -24,11 +24,11 @@ futures = "0.3.28"
24git2 = "0.18.1" 24git2 = "0.18.1"
25indicatif = "0.17.7" 25indicatif = "0.17.7"
26keyring = "2.0.5" 26keyring = "2.0.5"
27nostr = "0.33.0" 27nostr = "0.34.0"
28nostr-database = "0.33.1" 28nostr-database = "0.34.0"
29nostr-sdk = "0.33.0" 29nostr-sdk = "0.34.0"
30nostr-signer = "0.33.0" 30nostr-signer = "0.34.0"
31nostr-sqlite = "0.33.0" 31nostr-sqlite = "0.34.0"
32passwords = "3.1.13" 32passwords = "3.1.13"
33scrypt = "0.11.0" 33scrypt = "0.11.0"
34serde = { version = "1.0.181", features = ["derive"] } 34serde = { version = "1.0.181", features = ["derive"] }
diff --git a/src/client.rs b/src/client.rs
index db41f99..abde217 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -1182,12 +1182,12 @@ async fn process_fetched_events(
1182 } else if [Kind::RelayList, Kind::Metadata].contains(&event.kind()) { 1182 } else if [Kind::RelayList, Kind::Metadata].contains(&event.kind()) {
1183 if request 1183 if request
1184 .missing_contributor_profiles 1184 .missing_contributor_profiles
1185 .contains(event.author_ref()) 1185 .contains(&event.author())
1186 { 1186 {
1187 report.contributor_profiles.insert(event.author()); 1187 report.contributor_profiles.insert(event.author());
1188 } else if let Some((_, (metadata_timestamp, relay_list_timestamp))) = request 1188 } else if let Some((_, (metadata_timestamp, relay_list_timestamp))) = request
1189 .profiles_to_fetch_from_user_relays 1189 .profiles_to_fetch_from_user_relays
1190 .get_key_value(event.author_ref()) 1190 .get_key_value(&event.author())
1191 { 1191 {
1192 if (Kind::Metadata.eq(&event.kind()) 1192 if (Kind::Metadata.eq(&event.kind())
1193 && event.created_at().gt(metadata_timestamp)) 1193 && event.created_at().gt(metadata_timestamp))
diff --git a/src/git_remote_helper.rs b/src/git_remote_helper.rs
index 2244383..4d34850 100644
--- a/src/git_remote_helper.rs
+++ b/src/git_remote_helper.rs
@@ -366,7 +366,8 @@ async fn get_open_proposals(
366 .iter() 366 .iter()
367 .filter(|e| { 367 .filter(|e| {
368 status_kinds().contains(&e.kind()) 368 status_kinds().contains(&e.kind())
369 && e.iter_tags() 369 && e.tags()
370 .iter()
370 .any(|t| t.as_vec()[1].eq(&proposal.id.to_string())) 371 .any(|t| t.as_vec()[1].eq(&proposal.id.to_string()))
371 }) 372 })
372 .collect::<Vec<&nostr::Event>>() 373 .collect::<Vec<&nostr::Event>>()
diff --git a/src/sub_commands/list.rs b/src/sub_commands/list.rs
index 73ef107..ac1f4ab 100644
--- a/src/sub_commands/list.rs
+++ b/src/sub_commands/list.rs
@@ -78,7 +78,8 @@ pub async fn launch() -> Result<()> {
78 .iter() 78 .iter()
79 .filter(|e| { 79 .filter(|e| {
80 status_kinds().contains(&e.kind()) 80 status_kinds().contains(&e.kind())
81 && e.iter_tags() 81 && e.tags()
82 .iter()
82 .any(|t| t.as_vec()[1].eq(&proposal.id.to_string())) 83 .any(|t| t.as_vec()[1].eq(&proposal.id.to_string()))
83 }) 84 })
84 .collect::<Vec<&nostr::Event>>() 85 .collect::<Vec<&nostr::Event>>()
@@ -873,7 +874,7 @@ pub async fn get_all_proposal_patch_events_from_cache(
873 .iter() 874 .iter()
874 .copied() 875 .copied()
875 .collect(); 876 .collect();
876 commit_events.retain(|e| permissioned_users.contains(e.author_ref())); 877 commit_events.retain(|e| permissioned_users.contains(&e.author()));
877 878
878 let revision_roots: HashSet<nostr::EventId> = commit_events 879 let revision_roots: HashSet<nostr::EventId> = commit_events
879 .iter() 880 .iter()
@@ -899,7 +900,7 @@ pub async fn get_all_proposal_patch_events_from_cache(
899 900
900 Ok(commit_events 901 Ok(commit_events
901 .iter() 902 .iter()
902 .filter(|e| !event_is_cover_letter(e) && permissioned_users.contains(e.author_ref())) 903 .filter(|e| !event_is_cover_letter(e) && permissioned_users.contains(&e.author()))
903 .cloned() 904 .cloned()
904 .collect()) 905 .collect())
905} 906}
diff --git a/src/sub_commands/send.rs b/src/sub_commands/send.rs
index 8369b10..3c4df9d 100644
--- a/src/sub_commands/send.rs
+++ b/src/sub_commands/send.rs
@@ -806,8 +806,11 @@ pub fn event_is_cover_letter(event: &nostr::Event) -> bool {
806 // [PATCH v1 0/n ] or 806 // [PATCH v1 0/n ] or
807 // [PATCH subsystem v2 0/n ] 807 // [PATCH subsystem v2 0/n ]
808 event.kind.eq(&Kind::GitPatch) 808 event.kind.eq(&Kind::GitPatch)
809 && event.iter_tags().any(|t| t.as_vec()[1].eq("root")) 809 && event.tags().iter().any(|t| t.as_vec()[1].eq("root"))
810 && event.iter_tags().any(|t| t.as_vec()[1].eq("cover-letter")) 810 && event
811 .tags()
812 .iter()
813 .any(|t| t.as_vec()[1].eq("cover-letter"))
811} 814}
812 815
813pub fn commit_msg_from_patch(patch: &nostr::Event) -> Result<String> { 816pub fn commit_msg_from_patch(patch: &nostr::Event) -> Result<String> {
@@ -876,17 +879,22 @@ pub fn event_to_cover_letter(event: &nostr::Event) -> Result<CoverLetter> {
876} 879}
877 880
878pub fn event_is_patch_set_root(event: &nostr::Event) -> bool { 881pub fn event_is_patch_set_root(event: &nostr::Event) -> bool {
879 event.kind.eq(&Kind::GitPatch) && event.iter_tags().any(|t| t.as_vec()[1].eq("root")) 882 event.kind.eq(&Kind::GitPatch) && event.tags().iter().any(|t| t.as_vec()[1].eq("root"))
880} 883}
881 884
882pub fn event_is_revision_root(event: &nostr::Event) -> bool { 885pub fn event_is_revision_root(event: &nostr::Event) -> bool {
883 event.kind.eq(&Kind::GitPatch) && event.iter_tags().any(|t| t.as_vec()[1].eq("revision-root")) 886 event.kind.eq(&Kind::GitPatch)
887 && event
888 .tags()
889 .iter()
890 .any(|t| t.as_vec()[1].eq("revision-root"))
884} 891}
885 892
886pub fn patch_supports_commit_ids(event: &nostr::Event) -> bool { 893pub fn patch_supports_commit_ids(event: &nostr::Event) -> bool {
887 event.kind.eq(&Kind::GitPatch) 894 event.kind.eq(&Kind::GitPatch)
888 && event 895 && event
889 .iter_tags() 896 .tags()
897 .iter()
890 .any(|t| t.as_vec()[0].eq("commit-pgp-sig")) 898 .any(|t| t.as_vec()[0].eq("commit-pgp-sig"))
891} 899}
892 900
diff --git a/test_utils/Cargo.toml b/test_utils/Cargo.toml
index c92fa56..ff07b45 100644
--- a/test_utils/Cargo.toml
+++ b/test_utils/Cargo.toml
@@ -10,10 +10,10 @@ dialoguer = "0.10.4"
10directories = "5.0.1" 10directories = "5.0.1"
11futures = "0.3.28" 11futures = "0.3.28"
12git2 = "0.18.1" 12git2 = "0.18.1"
13nostr = "0.33.0" 13nostr = "0.34.0"
14nostr-database = "0.33.1" 14nostr-database = "0.34.0"
15nostr-sdk = "0.33.0" 15nostr-sdk = "0.34.0"
16nostr-sqlite = "0.33.0" 16nostr-sqlite = "0.34.0"
17once_cell = "1.18.0" 17once_cell = "1.18.0"
18rand = "0.8" 18rand = "0.8"
19rexpect = { git = "https://github.com/rust-cli/rexpect.git", rev = "9eb61dd" } 19rexpect = { git = "https://github.com/rust-cli/rexpect.git", rev = "9eb61dd" }
diff --git a/test_utils/src/lib.rs b/test_utils/src/lib.rs
index 56e9b17..12cadeb 100644
--- a/test_utils/src/lib.rs
+++ b/test_utils/src/lib.rs
@@ -1091,9 +1091,9 @@ 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.iter_tags().any(|t| { 1094 if event.tags().iter().any(|t| {
1095 !t.as_vec()[1].eq("revision-root") 1095 !t.as_vec()[1].eq("revision-root")
1096 && event.iter_tags().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_vec()[0].eq("branch-name") && t.as_vec()[1].eq(branch_name_in_event)
1098 }) 1098 })
1099 }) { 1099 }) {
@@ -1370,7 +1370,7 @@ fn get_first_proposal_event_id() -> Result<nostr::EventId> {
1370 vec!["root"], 1370 vec!["root"],
1371 ), 1371 ),
1372 ], 1372 ],
1373 Some(Duration::from_millis(500)), 1373 nostr_sdk::EventSource::relays(Some(Duration::from_millis(1000))),
1374 ))?; 1374 ))?;
1375 Handle::current().block_on(client.disconnect())?; 1375 Handle::current().block_on(client.disconnect())?;
1376 1376
diff --git a/tests/git_remote_helper.rs b/tests/git_remote_helper.rs
index a44b141..07f9ec8 100644
--- a/tests/git_remote_helper.rs
+++ b/tests/git_remote_helper.rs
@@ -1730,6 +1730,7 @@ mod push {
1730 r51.events = events.clone(); 1730 r51.events = events.clone();
1731 r55.events = events.clone(); 1731 r55.events = events.clone();
1732 1732
1733 #[allow(clippy::mutable_key_type)]
1733 let before = r55.events.iter().cloned().collect::<HashSet<Event>>(); 1734 let before = r55.events.iter().cloned().collect::<HashSet<Event>>();
1734 1735
1735 let cli_tester_handle = std::thread::spawn(move || -> Result<(String, Oid)> { 1736 let cli_tester_handle = std::thread::spawn(move || -> Result<(String, Oid)> {
@@ -1798,7 +1799,8 @@ mod push {
1798 .events 1799 .events
1799 .iter() 1800 .iter()
1800 .find(|e| { 1801 .find(|e| {
1801 e.iter_tags() 1802 e.tags()
1803 .iter()
1802 .find(|t| t.as_vec()[0].eq("branch-name")) 1804 .find(|t| t.as_vec()[0].eq("branch-name"))
1803 .is_some_and(|t| t.as_vec()[1].eq(FEATURE_BRANCH_NAME_1)) 1805 .is_some_and(|t| t.as_vec()[1].eq(FEATURE_BRANCH_NAME_1))
1804 }) 1806 })
@@ -1824,7 +1826,8 @@ mod push {
1824 .events 1826 .events
1825 .iter() 1827 .iter()
1826 .filter(|e| { 1828 .filter(|e| {
1827 e.iter_tags() 1829 e.tags()
1830 .iter()
1828 .any(|t| t.as_vec()[1].eq(&proposal.id().to_string())) 1831 .any(|t| t.as_vec()[1].eq(&proposal.id().to_string()))
1829 && e.kind().eq(&Kind::GitPatch) 1832 && e.kind().eq(&Kind::GitPatch)
1830 }) 1833 })
@@ -1877,6 +1880,7 @@ mod push {
1877 r51.events = events.clone(); 1880 r51.events = events.clone();
1878 r55.events = events.clone(); 1881 r55.events = events.clone();
1879 1882
1883 #[allow(clippy::mutable_key_type)]
1880 let before = r55.events.iter().cloned().collect::<HashSet<Event>>(); 1884 let before = r55.events.iter().cloned().collect::<HashSet<Event>>();
1881 1885
1882 let cli_tester_handle = std::thread::spawn(move || -> Result<(String, String)> { 1886 let cli_tester_handle = std::thread::spawn(move || -> Result<(String, String)> {
@@ -1950,7 +1954,8 @@ mod push {
1950 .events 1954 .events
1951 .iter() 1955 .iter()
1952 .find(|e| { 1956 .find(|e| {
1953 e.iter_tags() 1957 e.tags()
1958 .iter()
1954 .find(|t| t.as_vec()[0].eq("branch-name")) 1959 .find(|t| t.as_vec()[0].eq("branch-name"))
1955 .is_some_and(|t| t.as_vec()[1].eq(FEATURE_BRANCH_NAME_1)) 1960 .is_some_and(|t| t.as_vec()[1].eq(FEATURE_BRANCH_NAME_1))
1956 }) 1961 })
@@ -1982,7 +1987,8 @@ mod push {
1982 .events 1987 .events
1983 .iter() 1988 .iter()
1984 .find(|e| { 1989 .find(|e| {
1985 e.iter_tags() 1990 e.tags()
1991 .iter()
1986 .any(|t| t.as_vec()[1].eq(&proposal.id().to_string())) 1992 .any(|t| t.as_vec()[1].eq(&proposal.id().to_string()))
1987 && e.content.contains("[PATCH 2/2]") 1993 && e.content.contains("[PATCH 2/2]")
1988 }) 1994 })
@@ -2019,6 +2025,7 @@ mod push {
2019 r51.events = events.clone(); 2025 r51.events = events.clone();
2020 r55.events = events.clone(); 2026 r55.events = events.clone();
2021 2027
2028 #[allow(clippy::mutable_key_type)]
2022 let before = r55.events.iter().cloned().collect::<HashSet<Event>>(); 2029 let before = r55.events.iter().cloned().collect::<HashSet<Event>>();
2023 2030
2024 let cli_tester_handle = std::thread::spawn(move || -> Result<(String, String)> { 2031 let cli_tester_handle = std::thread::spawn(move || -> Result<(String, String)> {
@@ -2086,7 +2093,8 @@ mod push {
2086 .events 2093 .events
2087 .iter() 2094 .iter()
2088 .find(|e| { 2095 .find(|e| {
2089 e.iter_tags() 2096 e.tags()
2097 .iter()
2090 .find(|t| t.as_vec()[0].eq("branch-name")) 2098 .find(|t| t.as_vec()[0].eq("branch-name"))
2091 .is_some_and(|t| t.as_vec()[1].eq(FEATURE_BRANCH_NAME_1)) 2099 .is_some_and(|t| t.as_vec()[1].eq(FEATURE_BRANCH_NAME_1))
2092 }) 2100 })
@@ -2094,7 +2102,7 @@ mod push {
2094 2102
2095 let revision_root_patch = new_events 2103 let revision_root_patch = new_events
2096 .iter() 2104 .iter()
2097 .find(|e| e.iter_tags().any(|t| t.as_vec()[1].eq("revision-root"))) 2105 .find(|e| e.tags().iter().any(|t| t.as_vec()[1].eq("revision-root")))
2098 .unwrap(); 2106 .unwrap();
2099 2107
2100 assert_eq!( 2108 assert_eq!(
@@ -2172,6 +2180,7 @@ mod push {
2172 r51.events = events.clone(); 2180 r51.events = events.clone();
2173 r55.events = events.clone(); 2181 r55.events = events.clone();
2174 2182
2183 #[allow(clippy::mutable_key_type)]
2175 let before = r55.events.iter().cloned().collect::<HashSet<Event>>(); 2184 let before = r55.events.iter().cloned().collect::<HashSet<Event>>();
2176 let branch_name = "pr/my-new-proposal"; 2185 let branch_name = "pr/my-new-proposal";
2177 2186
@@ -2231,7 +2240,7 @@ mod push {
2231 2240
2232 let proposal = new_events 2241 let proposal = new_events
2233 .iter() 2242 .iter()
2234 .find(|e| e.iter_tags().any(|t| t.as_vec()[1].eq("root"))) 2243 .find(|e| e.tags().iter().any(|t| t.as_vec()[1].eq("root")))
2235 .unwrap(); 2244 .unwrap();
2236 2245
2237 assert!( 2246 assert!(
@@ -2246,7 +2255,8 @@ mod push {
2246 2255
2247 assert_eq!( 2256 assert_eq!(
2248 proposal 2257 proposal
2249 .iter_tags() 2258 .tags()
2259 .iter()
2250 .find(|t| t.as_vec()[0].eq("branch-name")) 2260 .find(|t| t.as_vec()[0].eq("branch-name"))
2251 .unwrap() 2261 .unwrap()
2252 .as_vec()[1], 2262 .as_vec()[1],
diff --git a/tests/send.rs b/tests/send.rs
index 57987e3..ef09425 100644
--- a/tests/send.rs
+++ b/tests/send.rs
@@ -85,11 +85,19 @@ mod when_commits_behind_ask_to_proceed {
85} 85}
86 86
87fn is_cover_letter(event: &nostr::Event) -> bool { 87fn is_cover_letter(event: &nostr::Event) -> bool {
88 event.kind.eq(&Kind::GitPatch) && event.iter_tags().any(|t| t.as_vec()[1].eq("cover-letter")) 88 event.kind.eq(&Kind::GitPatch)
89 && event
90 .tags()
91 .iter()
92 .any(|t| t.as_vec()[1].eq("cover-letter"))
89} 93}
90 94
91fn is_patch(event: &nostr::Event) -> bool { 95fn is_patch(event: &nostr::Event) -> bool {
92 event.kind.eq(&Kind::GitPatch) && !event.iter_tags().any(|t| t.as_vec()[1].eq("cover-letter")) 96 event.kind.eq(&Kind::GitPatch)
97 && !event
98 .tags()
99 .iter()
100 .any(|t| t.as_vec()[1].eq("cover-letter"))
93} 101}
94 102
95fn prep_git_repo() -> Result<GitTestRepo> { 103fn prep_git_repo() -> Result<GitTestRepo> {
@@ -366,7 +374,8 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
366 374
367 assert_eq!( 375 assert_eq!(
368 cover_letter_event 376 cover_letter_event
369 .iter_tags() 377 .tags()
378 .iter()
370 .find(|t| t.as_vec()[0].eq("r")) 379 .find(|t| t.as_vec()[0].eq("r"))
371 .unwrap() 380 .unwrap()
372 .as_vec()[1], 381 .as_vec()[1],
@@ -383,18 +392,28 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
383 for relay in [&r53, &r55, &r56] { 392 for relay in [&r53, &r55, &r56] {
384 let cover_letter_event: &nostr::Event = 393 let cover_letter_event: &nostr::Event =
385 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 394 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
386 assert!(cover_letter_event.iter_tags().any(|t| t.as_vec()[0].eq("a") 395 assert!(
387 && t.as_vec()[1].eq(&format!( 396 cover_letter_event
388 "{}:{TEST_KEY_1_PUBKEY_HEX}:{}", 397 .tags()
389 Kind::GitRepoAnnouncement, 398 .iter()
390 generate_repo_ref_event().identifier().unwrap() 399 .any(|t| t.as_vec()[0].eq("a")
391 )))); 400 && t.as_vec()[1].eq(&format!(
392 assert!(cover_letter_event.iter_tags().any(|t| t.as_vec()[0].eq("a") 401 "{}:{TEST_KEY_1_PUBKEY_HEX}:{}",
393 && t.as_vec()[1].eq(&format!( 402 Kind::GitRepoAnnouncement,
394 "{}:{TEST_KEY_2_PUBKEY_HEX}:{}", 403 generate_repo_ref_event().identifier().unwrap()
395 Kind::GitRepoAnnouncement, 404 )))
396 generate_repo_ref_event().identifier().unwrap() 405 );
397 )))); 406 assert!(
407 cover_letter_event
408 .tags()
409 .iter()
410 .any(|t| t.as_vec()[0].eq("a")
411 && t.as_vec()[1].eq(&format!(
412 "{}:{TEST_KEY_2_PUBKEY_HEX}:{}",
413 Kind::GitRepoAnnouncement,
414 generate_repo_ref_event().identifier().unwrap()
415 )))
416 );
398 } 417 }
399 Ok(()) 418 Ok(())
400 } 419 }
@@ -404,7 +423,8 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
404 async fn p_tags_for_maintainers() -> Result<()> { 423 async fn p_tags_for_maintainers() -> Result<()> {
405 let event = generate_repo_ref_event(); 424 let event = generate_repo_ref_event();
406 let maintainers = &event 425 let maintainers = &event
407 .iter_tags() 426 .tags()
427 .iter()
408 .find(|t| t.as_vec()[0].eq(&"maintainers")) 428 .find(|t| t.as_vec()[0].eq(&"maintainers"))
409 .unwrap() 429 .unwrap()
410 .as_vec()[1..]; 430 .as_vec()[1..];
@@ -415,7 +435,8 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
415 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 435 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
416 assert!( 436 assert!(
417 cover_letter_event 437 cover_letter_event
418 .iter_tags() 438 .tags()
439 .iter()
419 .any(|t| { t.as_vec()[0].eq("p") && t.as_vec()[1].eq(m) }) 440 .any(|t| { t.as_vec()[0].eq("p") && t.as_vec()[1].eq(m) })
420 ); 441 );
421 } 442 }
@@ -432,7 +453,8 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
432 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 453 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
433 assert!( 454 assert!(
434 cover_letter_event 455 cover_letter_event
435 .iter_tags() 456 .tags()
457 .iter()
436 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"cover-letter") }) 458 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"cover-letter") })
437 ); 459 );
438 } 460 }
@@ -448,7 +470,8 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
448 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 470 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
449 assert!( 471 assert!(
450 cover_letter_event 472 cover_letter_event
451 .iter_tags() 473 .tags()
474 .iter()
452 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"root") }) 475 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"root") })
453 ); 476 );
454 } 477 }
@@ -466,7 +489,8 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
466 // branch-name tag 489 // branch-name tag
467 assert_eq!( 490 assert_eq!(
468 cover_letter_event 491 cover_letter_event
469 .iter_tags() 492 .tags()
493 .iter()
470 .find(|t| t.as_vec()[0].eq("branch-name")) 494 .find(|t| t.as_vec()[0].eq("branch-name"))
471 .unwrap() 495 .unwrap()
472 .as_vec()[1], 496 .as_vec()[1],
@@ -487,7 +511,8 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
487 // branch-name tag 511 // branch-name tag
488 assert_eq!( 512 assert_eq!(
489 cover_letter_event 513 cover_letter_event
490 .iter_tags() 514 .tags()
515 .iter()
491 .find(|t| t.as_vec()[0].eq("alt")) 516 .find(|t| t.as_vec()[0].eq("alt"))
492 .unwrap() 517 .unwrap()
493 .as_vec()[1], 518 .as_vec()[1],
@@ -557,7 +582,8 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
557 async fn p_tags_for_maintainers() -> Result<()> { 582 async fn p_tags_for_maintainers() -> Result<()> {
558 let event = generate_repo_ref_event(); 583 let event = generate_repo_ref_event();
559 let maintainers = &event 584 let maintainers = &event
560 .iter_tags() 585 .tags()
586 .iter()
561 .find(|t| t.as_vec()[0].eq(&"maintainers")) 587 .find(|t| t.as_vec()[0].eq(&"maintainers"))
562 .unwrap() 588 .unwrap()
563 .as_vec()[1..]; 589 .as_vec()[1..];
@@ -565,7 +591,8 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
565 assert!( 591 assert!(
566 prep() 592 prep()
567 .await? 593 .await?
568 .iter_tags() 594 .tags()
595 .iter()
569 .any(|t| { t.as_vec()[0].eq("p") && t.as_vec()[1].eq(m) }) 596 .any(|t| { t.as_vec()[0].eq("p") && t.as_vec()[1].eq(m) })
570 ); 597 );
571 } 598 }
@@ -697,7 +724,8 @@ mod when_cover_letter_details_specified_with_range_of_head_2_sends_cover_letter_
697 .collect::<Vec<&nostr::Event>>(); 724 .collect::<Vec<&nostr::Event>>();
698 assert_eq!( 725 assert_eq!(
699 patch_events[1] 726 patch_events[1]
700 .iter_tags() 727 .tags()
728 .iter()
701 .find(|t| t.as_vec()[0].eq("e") 729 .find(|t| t.as_vec()[0].eq("e")
702 && t.as_vec().len().eq(&4) 730 && t.as_vec().len().eq(&4)
703 && t.as_vec()[3].eq("reply")) 731 && t.as_vec()[3].eq("reply"))
@@ -1086,13 +1114,15 @@ mod when_no_cover_letter_flag_set_with_range_of_head_2_sends_2_patches_without_c
1086 // first patch tagged as root 1114 // first patch tagged as root
1087 assert!( 1115 assert!(
1088 patch_events[0] 1116 patch_events[0]
1089 .iter_tags() 1117 .tags()
1118 .iter()
1090 .any(|t| t.as_vec()[0].eq("t") && t.as_vec()[1].eq("root")) 1119 .any(|t| t.as_vec()[0].eq("t") && t.as_vec()[1].eq("root"))
1091 ); 1120 );
1092 // second patch not tagged as root 1121 // second patch not tagged as root
1093 assert!( 1122 assert!(
1094 !patch_events[1] 1123 !patch_events[1]
1095 .iter_tags() 1124 .tags()
1125 .iter()
1096 .any(|t| t.as_vec()[0].eq("t") && t.as_vec()[1].eq("root")) 1126 .any(|t| t.as_vec()[0].eq("t") && t.as_vec()[1].eq("root"))
1097 ); 1127 );
1098 } 1128 }
@@ -1113,7 +1143,8 @@ mod when_no_cover_letter_flag_set_with_range_of_head_2_sends_2_patches_without_c
1113 // branch-name tag 1143 // branch-name tag
1114 assert_eq!( 1144 assert_eq!(
1115 patch_events[0] 1145 patch_events[0]
1116 .iter_tags() 1146 .tags()
1147 .iter()
1117 .find(|t| t.as_vec()[0].eq("branch-name")) 1148 .find(|t| t.as_vec()[0].eq("branch-name"))
1118 .unwrap() 1149 .unwrap()
1119 .as_vec()[1], 1150 .as_vec()[1],
@@ -1136,7 +1167,8 @@ mod when_no_cover_letter_flag_set_with_range_of_head_2_sends_2_patches_without_c
1136 1167
1137 assert_eq!( 1168 assert_eq!(
1138 patch_events[1] 1169 patch_events[1]
1139 .iter_tags() 1170 .tags()
1171 .iter()
1140 .find(|t| t.as_vec()[0].eq("e") 1172 .find(|t| t.as_vec()[0].eq("e")
1141 && t.as_vec().len().eq(&4) 1173 && t.as_vec().len().eq(&4)
1142 && t.as_vec()[3].eq("root")) 1174 && t.as_vec()[3].eq("root"))
@@ -1540,7 +1572,8 @@ mod root_proposal_specified_using_in_reply_to_with_range_of_head_2_and_cover_let
1540 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 1572 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
1541 assert!( 1573 assert!(
1542 cover_letter_event 1574 cover_letter_event
1543 .iter_tags() 1575 .tags()
1576 .iter()
1544 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"root") }) 1577 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"root") })
1545 ); 1578 );
1546 } 1579 }
@@ -1556,7 +1589,8 @@ mod root_proposal_specified_using_in_reply_to_with_range_of_head_2_and_cover_let
1556 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 1589 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
1557 assert!( 1590 assert!(
1558 cover_letter_event 1591 cover_letter_event
1559 .iter_tags() 1592 .tags()
1593 .iter()
1560 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"revision-root") }) 1594 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"revision-root") })
1561 ); 1595 );
1562 } 1596 }
@@ -1572,7 +1606,8 @@ 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(); 1606 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
1573 assert_eq!( 1607 assert_eq!(
1574 cover_letter_event 1608 cover_letter_event
1575 .iter_tags() 1609 .tags()
1610 .iter()
1576 .find(|t| { 1611 .find(|t| {
1577 t.as_vec()[0].eq("e") 1612 t.as_vec()[0].eq("e")
1578 && t.as_vec().len().eq(&4) 1613 && t.as_vec().len().eq(&4)
@@ -1719,7 +1754,7 @@ mod in_reply_to_mentions_issue {
1719 for relay in [&r53, &r55, &r56] { 1754 for relay in [&r53, &r55, &r56] {
1720 let cover_letter_event: &nostr::Event = 1755 let cover_letter_event: &nostr::Event =
1721 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 1756 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
1722 assert!(cover_letter_event.iter_tags().any(|t| { 1757 assert!(cover_letter_event.tags().iter().any(|t| {
1723 t.as_vec()[0].eq("e") 1758 t.as_vec()[0].eq("e")
1724 && t.as_vec()[1].eq(&get_pretend_issue_event().id.to_hex()) 1759 && t.as_vec()[1].eq(&get_pretend_issue_event().id.to_hex())
1725 && t.as_vec()[3].eq(&"mention") 1760 && t.as_vec()[3].eq(&"mention")
@@ -1737,7 +1772,8 @@ mod in_reply_to_mentions_issue {
1737 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 1772 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
1738 assert!( 1773 assert!(
1739 !cover_letter_event 1774 !cover_letter_event
1740 .iter_tags() 1775 .tags()
1776 .iter()
1741 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"revision-root") }) 1777 .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"revision-root") })
1742 ); 1778 );
1743 } 1779 }
@@ -1841,7 +1877,7 @@ mod in_reply_to_mentions_npub_and_nprofile_which_get_mentioned_in_proposal_root
1841 for relay in [&r53, &r55, &r56] { 1877 for relay in [&r53, &r55, &r56] {
1842 let cover_letter_event: &nostr::Event = 1878 let cover_letter_event: &nostr::Event =
1843 relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); 1879 relay.events.iter().find(|e| is_cover_letter(e)).unwrap();
1844 assert!(cover_letter_event.iter_tags().any(|t| { 1880 assert!(cover_letter_event.tags().iter().any(|t| {
1845 t.as_vec()[0].eq("p") 1881 t.as_vec()[0].eq("p")
1846 && t.as_vec()[1].eq(&nostr::Keys::parse( 1882 && t.as_vec()[1].eq(&nostr::Keys::parse(
1847 "nsec1q3c5xnsm5m4wgsrhwnz04p0d5mevkryyggqgdpa9jwulpq9gldhswgtxvq", 1883 "nsec1q3c5xnsm5m4wgsrhwnz04p0d5mevkryyggqgdpa9jwulpq9gldhswgtxvq",
@@ -1850,7 +1886,7 @@ mod in_reply_to_mentions_npub_and_nprofile_which_get_mentioned_in_proposal_root
1850 .public_key() 1886 .public_key()
1851 .to_hex()) 1887 .to_hex())
1852 })); 1888 }));
1853 assert!(cover_letter_event.iter_tags().any(|t| { 1889 assert!(cover_letter_event.tags().iter().any(|t| {
1854 t.as_vec()[0].eq("p") 1890 t.as_vec()[0].eq("p")
1855 && t.as_vec()[1].eq(&nostr::Keys::parse( 1891 && t.as_vec()[1].eq(&nostr::Keys::parse(
1856 "nsec1nx5ulvcndhcuu8k6q8fenw50l6y75sec7pj8vr0r68l6a44w3lqspvj02k", 1892 "nsec1nx5ulvcndhcuu8k6q8fenw50l6y75sec7pj8vr0r68l6a44w3lqspvj02k",