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--src/git_remote_helper.rs18
-rw-r--r--test_utils/src/git.rs2
-rw-r--r--test_utils/src/lib.rs6
-rw-r--r--tests/git_remote_helper.rs137
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
152pub fn generate_repo_ref_event() -> nostr::Event { 152pub 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
156pub fn generate_repo_ref_event_with_git_server(git_server: &str) -> nostr::Event { 156pub 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}