diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2024-08-01 10:17:01 +0100 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2024-08-01 10:19:36 +0100 |
| commit | 24125936adb6c152cdb16d55f2639dd374dfee1d (patch) | |
| tree | 3e3c2005b05c24dc31291cdad874a1cf1af1436d | |
| parent | 1f38d2a97e4c8b1d814c414343d1e118ce119f70 (diff) | |
feat(remote): `push` to all `clone` servers
initially we push to the first server, if successful update the
state event, then siliently push to the others and silently fail
| -rw-r--r-- | src/git_remote_helper.rs | 18 | ||||
| -rw-r--r-- | test_utils/src/git.rs | 2 | ||||
| -rw-r--r-- | test_utils/src/lib.rs | 6 | ||||
| -rw-r--r-- | tests/git_remote_helper.rs | 137 |
4 files changed, 140 insertions, 23 deletions
diff --git a/src/git_remote_helper.rs b/src/git_remote_helper.rs index de49275..d0c0005 100644 --- a/src/git_remote_helper.rs +++ b/src/git_remote_helper.rs | |||
| @@ -270,6 +270,24 @@ async fn push( | |||
| 270 | ) | 270 | ) |
| 271 | .await?; | 271 | .await?; |
| 272 | 272 | ||
| 273 | // silently push to any other git servers | ||
| 274 | for (i, git_server_url) in repo_ref.git_server.iter().enumerate() { | ||
| 275 | // we have already pushed to the first one | ||
| 276 | if i.gt(&0) { | ||
| 277 | if let Ok(mut git_server_remote) = git_repo.git_repo.remote_anonymous(git_server_url) { | ||
| 278 | let auth = GitAuthenticator::default(); | ||
| 279 | let git_config = git_repo.git_repo.config()?; | ||
| 280 | let mut push_options = git2::PushOptions::new(); | ||
| 281 | let mut remote_callbacks = git2::RemoteCallbacks::new(); | ||
| 282 | remote_callbacks.credentials(auth.credentials(&git_config)); | ||
| 283 | push_options.remote_callbacks(remote_callbacks); | ||
| 284 | let _ = git_server_remote.push(&refspecs, Some(&mut push_options)); | ||
| 285 | let _ = git_server_remote.disconnect(); | ||
| 286 | } | ||
| 287 | } | ||
| 288 | } | ||
| 289 | // todo report on errors | ||
| 290 | |||
| 273 | println!(); | 291 | println!(); |
| 274 | Ok(()) | 292 | Ok(()) |
| 275 | } | 293 | } |
diff --git a/test_utils/src/git.rs b/test_utils/src/git.rs index 4a4aaa8..e522ffd 100644 --- a/test_utils/src/git.rs +++ b/test_utils/src/git.rs | |||
| @@ -62,7 +62,7 @@ impl GitTestRepo { | |||
| 62 | Self::new("main").unwrap() | 62 | Self::new("main").unwrap() |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | fn duplicate(existing_repo: &GitTestRepo) -> Result<Self> { | 65 | pub fn duplicate(existing_repo: &GitTestRepo) -> Result<Self> { |
| 66 | let path = current_dir()?.join(format!("tmpgit-{}", rand::random::<u64>())); | 66 | let path = current_dir()?.join(format!("tmpgit-{}", rand::random::<u64>())); |
| 67 | // function source: https://stackoverflow.com/a/65192210 | 67 | // function source: https://stackoverflow.com/a/65192210 |
| 68 | fn copy_dir_all(src: impl AsRef<Path>, dst: impl AsRef<Path>) -> std::io::Result<()> { | 68 | fn copy_dir_all(src: impl AsRef<Path>, dst: impl AsRef<Path>) -> std::io::Result<()> { |
diff --git a/test_utils/src/lib.rs b/test_utils/src/lib.rs index 7a2bf35..2e7a4e8 100644 --- a/test_utils/src/lib.rs +++ b/test_utils/src/lib.rs | |||
| @@ -150,10 +150,10 @@ pub fn make_event_old_or_change_user( | |||
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | pub fn generate_repo_ref_event() -> nostr::Event { | 152 | pub fn generate_repo_ref_event() -> nostr::Event { |
| 153 | generate_repo_ref_event_with_git_server("git:://123.gitexample.com/test") | 153 | generate_repo_ref_event_with_git_server(vec!["git:://123.gitexample.com/test".to_string()]) |
| 154 | } | 154 | } |
| 155 | 155 | ||
| 156 | pub fn generate_repo_ref_event_with_git_server(git_server: &str) -> nostr::Event { | 156 | pub fn generate_repo_ref_event_with_git_server(git_servers: Vec<String>) -> nostr::Event { |
| 157 | // taken from test git_repo | 157 | // taken from test git_repo |
| 158 | // TODO - this may not be consistant across computers as it might take the | 158 | // TODO - this may not be consistant across computers as it might take the |
| 159 | // author and committer from global git config | 159 | // author and committer from global git config |
| @@ -171,7 +171,7 @@ pub fn generate_repo_ref_event_with_git_server(git_server: &str) -> nostr::Event | |||
| 171 | Tag::from_standardized(TagStandard::Description("example description".into())), | 171 | Tag::from_standardized(TagStandard::Description("example description".into())), |
| 172 | Tag::custom( | 172 | Tag::custom( |
| 173 | nostr::TagKind::Custom(std::borrow::Cow::Borrowed("clone")), | 173 | nostr::TagKind::Custom(std::borrow::Cow::Borrowed("clone")), |
| 174 | vec![git_server.to_string()], | 174 | git_servers, |
| 175 | ), | 175 | ), |
| 176 | Tag::custom( | 176 | Tag::custom( |
| 177 | nostr::TagKind::Custom(std::borrow::Cow::Borrowed("web")), | 177 | nostr::TagKind::Custom(std::borrow::Cow::Borrowed("web")), |
diff --git a/tests/git_remote_helper.rs b/tests/git_remote_helper.rs index 20ecad7..69f290a 100644 --- a/tests/git_remote_helper.rs +++ b/tests/git_remote_helper.rs | |||
| @@ -63,7 +63,9 @@ async fn generate_repo_with_state_event() -> Result<(nostr::Event, GitTestRepo)> | |||
| 63 | let events = vec![ | 63 | let events = vec![ |
| 64 | generate_test_key_1_metadata_event("fred"), | 64 | generate_test_key_1_metadata_event("fred"), |
| 65 | generate_test_key_1_relay_list_event(), | 65 | generate_test_key_1_relay_list_event(), |
| 66 | generate_repo_ref_event_with_git_server(source_git_repo.dir.to_str().unwrap()), | 66 | generate_repo_ref_event_with_git_server(vec![ |
| 67 | source_git_repo.dir.to_str().unwrap().to_string(), | ||
| 68 | ]), | ||
| 67 | ]; | 69 | ]; |
| 68 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) | 70 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) |
| 69 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( | 71 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( |
| @@ -136,7 +138,9 @@ mod initially_runs_fetch { | |||
| 136 | let events = vec![ | 138 | let events = vec![ |
| 137 | generate_test_key_1_metadata_event("fred"), | 139 | generate_test_key_1_metadata_event("fred"), |
| 138 | generate_test_key_1_relay_list_event(), | 140 | generate_test_key_1_relay_list_event(), |
| 139 | generate_repo_ref_event_with_git_server(source_git_repo.dir.to_str().unwrap()), | 141 | generate_repo_ref_event_with_git_server(vec![ |
| 142 | source_git_repo.dir.to_str().unwrap().to_string(), | ||
| 143 | ]), | ||
| 140 | ]; | 144 | ]; |
| 141 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) | 145 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) |
| 142 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( | 146 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( |
| @@ -203,7 +207,9 @@ mod list { | |||
| 203 | let events = vec![ | 207 | let events = vec![ |
| 204 | generate_test_key_1_metadata_event("fred"), | 208 | generate_test_key_1_metadata_event("fred"), |
| 205 | generate_test_key_1_relay_list_event(), | 209 | generate_test_key_1_relay_list_event(), |
| 206 | generate_repo_ref_event_with_git_server(source_git_repo.dir.to_str().unwrap()), | 210 | generate_repo_ref_event_with_git_server(vec![ |
| 211 | source_git_repo.dir.to_str().unwrap().to_string(), | ||
| 212 | ]), | ||
| 207 | ]; | 213 | ]; |
| 208 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) | 214 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) |
| 209 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( | 215 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( |
| @@ -276,7 +282,9 @@ mod list { | |||
| 276 | let events = vec![ | 282 | let events = vec![ |
| 277 | generate_test_key_1_metadata_event("fred"), | 283 | generate_test_key_1_metadata_event("fred"), |
| 278 | generate_test_key_1_relay_list_event(), | 284 | generate_test_key_1_relay_list_event(), |
| 279 | generate_repo_ref_event_with_git_server(source_git_repo.dir.to_str().unwrap()), | 285 | generate_repo_ref_event_with_git_server(vec![ |
| 286 | source_git_repo.dir.to_str().unwrap().to_string(), | ||
| 287 | ]), | ||
| 280 | state_event, | 288 | state_event, |
| 281 | ]; | 289 | ]; |
| 282 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) | 290 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) |
| @@ -357,7 +365,9 @@ mod list { | |||
| 357 | let events = vec![ | 365 | let events = vec![ |
| 358 | generate_test_key_1_metadata_event("fred"), | 366 | generate_test_key_1_metadata_event("fred"), |
| 359 | generate_test_key_1_relay_list_event(), | 367 | generate_test_key_1_relay_list_event(), |
| 360 | generate_repo_ref_event_with_git_server(source_git_repo.dir.to_str().unwrap()), | 368 | generate_repo_ref_event_with_git_server(vec![ |
| 369 | source_git_repo.dir.to_str().unwrap().to_string(), | ||
| 370 | ]), | ||
| 361 | state_event, | 371 | state_event, |
| 362 | ]; | 372 | ]; |
| 363 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) | 373 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) |
| @@ -433,7 +443,9 @@ mod fetch { | |||
| 433 | let events = vec![ | 443 | let events = vec![ |
| 434 | generate_test_key_1_metadata_event("fred"), | 444 | generate_test_key_1_metadata_event("fred"), |
| 435 | generate_test_key_1_relay_list_event(), | 445 | generate_test_key_1_relay_list_event(), |
| 436 | generate_repo_ref_event_with_git_server(source_git_repo.dir.to_str().unwrap()), | 446 | generate_repo_ref_event_with_git_server(vec![ |
| 447 | source_git_repo.dir.to_str().unwrap().to_string(), | ||
| 448 | ]), | ||
| 437 | ]; | 449 | ]; |
| 438 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) | 450 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) |
| 439 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( | 451 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( |
| @@ -513,7 +525,9 @@ mod push { | |||
| 513 | let events = vec![ | 525 | let events = vec![ |
| 514 | generate_test_key_1_metadata_event("fred"), | 526 | generate_test_key_1_metadata_event("fred"), |
| 515 | generate_test_key_1_relay_list_event(), | 527 | generate_test_key_1_relay_list_event(), |
| 516 | generate_repo_ref_event_with_git_server(source_git_repo.dir.to_str().unwrap()), | 528 | generate_repo_ref_event_with_git_server(vec![ |
| 529 | source_git_repo.dir.to_str().unwrap().to_string(), | ||
| 530 | ]), | ||
| 517 | ]; | 531 | ]; |
| 518 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) | 532 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) |
| 519 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( | 533 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( |
| @@ -595,7 +609,9 @@ mod push { | |||
| 595 | let events = vec![ | 609 | let events = vec![ |
| 596 | generate_test_key_1_metadata_event("fred"), | 610 | generate_test_key_1_metadata_event("fred"), |
| 597 | generate_test_key_1_relay_list_event(), | 611 | generate_test_key_1_relay_list_event(), |
| 598 | generate_repo_ref_event_with_git_server(source_git_repo.dir.to_str().unwrap()), | 612 | generate_repo_ref_event_with_git_server(vec![ |
| 613 | source_git_repo.dir.to_str().unwrap().to_string(), | ||
| 614 | ]), | ||
| 599 | ]; | 615 | ]; |
| 600 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) | 616 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) |
| 601 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( | 617 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( |
| @@ -688,9 +704,9 @@ mod push { | |||
| 688 | let events = vec![ | 704 | let events = vec![ |
| 689 | generate_test_key_1_metadata_event("fred"), | 705 | generate_test_key_1_metadata_event("fred"), |
| 690 | generate_test_key_1_relay_list_event(), | 706 | generate_test_key_1_relay_list_event(), |
| 691 | generate_repo_ref_event_with_git_server( | 707 | generate_repo_ref_event_with_git_server(vec![ |
| 692 | source_git_repo.dir.to_str().unwrap(), | 708 | source_git_repo.dir.to_str().unwrap().to_string(), |
| 693 | ), | 709 | ]), |
| 694 | ]; | 710 | ]; |
| 695 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) | 711 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) |
| 696 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( | 712 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( |
| @@ -788,9 +804,9 @@ mod push { | |||
| 788 | let events = vec![ | 804 | let events = vec![ |
| 789 | generate_test_key_1_metadata_event("fred"), | 805 | generate_test_key_1_metadata_event("fred"), |
| 790 | generate_test_key_1_relay_list_event(), | 806 | generate_test_key_1_relay_list_event(), |
| 791 | generate_repo_ref_event_with_git_server( | 807 | generate_repo_ref_event_with_git_server(vec![ |
| 792 | source_git_repo.dir.to_str().unwrap(), | 808 | source_git_repo.dir.to_str().unwrap().to_string(), |
| 793 | ), | 809 | ]), |
| 794 | state_event.clone(), | 810 | state_event.clone(), |
| 795 | ]; | 811 | ]; |
| 796 | 812 | ||
| @@ -918,7 +934,9 @@ mod push { | |||
| 918 | let events = vec![ | 934 | let events = vec![ |
| 919 | generate_test_key_1_metadata_event("fred"), | 935 | generate_test_key_1_metadata_event("fred"), |
| 920 | generate_test_key_1_relay_list_event(), | 936 | generate_test_key_1_relay_list_event(), |
| 921 | generate_repo_ref_event_with_git_server(source_git_repo.dir.to_str().unwrap()), | 937 | generate_repo_ref_event_with_git_server(vec![ |
| 938 | source_git_repo.dir.to_str().unwrap().to_string(), | ||
| 939 | ]), | ||
| 922 | ]; | 940 | ]; |
| 923 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) | 941 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) |
| 924 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( | 942 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( |
| @@ -1003,7 +1021,9 @@ mod push { | |||
| 1003 | let events = vec![ | 1021 | let events = vec![ |
| 1004 | generate_test_key_1_metadata_event("fred"), | 1022 | generate_test_key_1_metadata_event("fred"), |
| 1005 | generate_test_key_1_relay_list_event(), | 1023 | generate_test_key_1_relay_list_event(), |
| 1006 | generate_repo_ref_event_with_git_server(source_git_repo.dir.to_str().unwrap()), | 1024 | generate_repo_ref_event_with_git_server(vec![ |
| 1025 | source_git_repo.dir.to_str().unwrap().to_string(), | ||
| 1026 | ]), | ||
| 1007 | ]; | 1027 | ]; |
| 1008 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) | 1028 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) |
| 1009 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( | 1029 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( |
| @@ -1083,9 +1103,9 @@ mod push { | |||
| 1083 | let events = vec![ | 1103 | let events = vec![ |
| 1084 | generate_test_key_1_metadata_event("fred"), | 1104 | generate_test_key_1_metadata_event("fred"), |
| 1085 | generate_test_key_1_relay_list_event(), | 1105 | generate_test_key_1_relay_list_event(), |
| 1086 | generate_repo_ref_event_with_git_server( | 1106 | generate_repo_ref_event_with_git_server(vec![ |
| 1087 | source_git_repo.dir.to_str().unwrap(), | 1107 | source_git_repo.dir.to_str().unwrap().to_string(), |
| 1088 | ), | 1108 | ]), |
| 1089 | state_event.clone(), | 1109 | state_event.clone(), |
| 1090 | ]; | 1110 | ]; |
| 1091 | 1111 | ||
| @@ -1155,4 +1175,83 @@ mod push { | |||
| 1155 | } | 1175 | } |
| 1156 | } | 1176 | } |
| 1157 | } | 1177 | } |
| 1178 | |||
| 1179 | mod pushes_to_all_git_servers_listed { | ||
| 1180 | use super::*; | ||
| 1181 | async fn async_run_test() -> Result<()> { | ||
| 1182 | let (state_event, source_git_repo) = generate_repo_with_state_event().await?; | ||
| 1183 | let second_source_git_repo = GitTestRepo::duplicate(&source_git_repo)?; | ||
| 1184 | |||
| 1185 | // uppdate announcement with extra git server | ||
| 1186 | |||
| 1187 | let git_repo = prep_git_repo()?; | ||
| 1188 | |||
| 1189 | std::fs::write(git_repo.dir.join("new.md"), "some content")?; | ||
| 1190 | let main_commit_id = git_repo.stage_and_commit("new.md")?; | ||
| 1191 | |||
| 1192 | let events = vec![ | ||
| 1193 | generate_test_key_1_metadata_event("fred"), | ||
| 1194 | generate_test_key_1_relay_list_event(), | ||
| 1195 | generate_repo_ref_event_with_git_server(vec![ | ||
| 1196 | source_git_repo.dir.to_str().unwrap().to_string(), | ||
| 1197 | second_source_git_repo.dir.to_str().unwrap().to_string(), | ||
| 1198 | ]), | ||
| 1199 | state_event.clone(), | ||
| 1200 | ]; | ||
| 1201 | |||
| 1202 | // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) | ||
| 1203 | let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( | ||
| 1204 | Relay::new(8051, None, None), | ||
| 1205 | Relay::new(8052, None, None), | ||
| 1206 | Relay::new(8053, None, None), | ||
| 1207 | Relay::new(8055, None, None), | ||
| 1208 | Relay::new(8056, None, None), | ||
| 1209 | Relay::new(8057, None, None), | ||
| 1210 | ); | ||
| 1211 | r51.events = events.clone(); | ||
| 1212 | r55.events = events; | ||
| 1213 | |||
| 1214 | let cli_tester_handle = std::thread::spawn(move || -> Result<()> { | ||
| 1215 | let mut p = cli_tester_after_fetch(&git_repo)?; | ||
| 1216 | p.send_line("push refs/heads/main:refs/heads/main")?; | ||
| 1217 | p.send_line("")?; | ||
| 1218 | p.expect("ok refs/heads/main\r\n")?; | ||
| 1219 | p.expect("\r\n")?; | ||
| 1220 | p.exit()?; | ||
| 1221 | for p in [51, 52, 53, 55, 56, 57] { | ||
| 1222 | relay::shutdown_relay(8000 + p)?; | ||
| 1223 | } | ||
| 1224 | Ok(()) | ||
| 1225 | }); | ||
| 1226 | // launch relays | ||
| 1227 | let _ = join!( | ||
| 1228 | r51.listen_until_close(), | ||
| 1229 | r52.listen_until_close(), | ||
| 1230 | r53.listen_until_close(), | ||
| 1231 | r55.listen_until_close(), | ||
| 1232 | r56.listen_until_close(), | ||
| 1233 | r57.listen_until_close(), | ||
| 1234 | ); | ||
| 1235 | |||
| 1236 | cli_tester_handle.join().unwrap()?; | ||
| 1237 | |||
| 1238 | // git_server updated | ||
| 1239 | assert_eq!( | ||
| 1240 | source_git_repo.get_tip_of_local_branch("main")?, | ||
| 1241 | main_commit_id | ||
| 1242 | ); | ||
| 1243 | assert_eq!( | ||
| 1244 | second_source_git_repo.get_tip_of_local_branch("main")?, | ||
| 1245 | main_commit_id | ||
| 1246 | ); | ||
| 1247 | |||
| 1248 | Ok(()) | ||
| 1249 | } | ||
| 1250 | |||
| 1251 | #[tokio::test] | ||
| 1252 | #[serial] | ||
| 1253 | async fn second_git_server_uptodate() -> Result<()> { | ||
| 1254 | async_run_test().await | ||
| 1255 | } | ||
| 1256 | } | ||
| 1158 | } | 1257 | } |