upleb.uk

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

summaryrefslogtreecommitdiff
path: root/src/bin/git_remote_nostr
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/git_remote_nostr')
-rw-r--r--src/bin/git_remote_nostr/fetch.rs160
1 files changed, 153 insertions, 7 deletions
diff --git a/src/bin/git_remote_nostr/fetch.rs b/src/bin/git_remote_nostr/fetch.rs
index 206367c..9a891b2 100644
--- a/src/bin/git_remote_nostr/fetch.rs
+++ b/src/bin/git_remote_nostr/fetch.rs
@@ -259,7 +259,7 @@ impl<'a> FetchReporter<'a> {
259 fn write_all(&self, lines_to_clear: usize) { 259 fn write_all(&self, lines_to_clear: usize) {
260 let _ = self.term.clear_last_lines(lines_to_clear); 260 let _ = self.term.clear_last_lines(lines_to_clear);
261 for msg in &self.remote_msgs { 261 for msg in &self.remote_msgs {
262 let _ = self.term.write_line(msg); 262 let _ = self.term.write_line(format!("remote: {msg}").as_str());
263 } 263 }
264 for msg in &self.transfer_progress_msgs { 264 for msg in &self.transfer_progress_msgs {
265 let _ = self.term.write_line(msg); 265 let _ = self.term.write_line(msg);
@@ -278,15 +278,15 @@ impl<'a> FetchReporter<'a> {
278 self.transfer_progress_msgs.len() 278 self.transfer_progress_msgs.len()
279 } 279 }
280 fn process_remote_msg(&mut self, data: &[u8]) { 280 fn process_remote_msg(&mut self, data: &[u8]) {
281 let existing_lines = self.count_all_existing_lines();
282 if let Ok(data) = str::from_utf8(data) { 281 if let Ok(data) = str::from_utf8(data) {
283 let data = data 282 let data = data
284 .split(['\n', '\r']) 283 .split(['\n', '\r'])
285 .find(|line| !line.is_empty()) 284 .map(str::trim)
286 .unwrap_or("") 285 .filter(|line| !line.trim().is_empty())
287 .trim(); 286 .collect::<Vec<&str>>();
288 if !data.is_empty() { 287 for data in data {
289 let msg = format!("remote: {data}"); 288 let existing_lines = self.count_all_existing_lines();
289 let msg = data.to_string();
290 if let Some(last) = self.remote_msgs.last() { 290 if let Some(last) = self.remote_msgs.last() {
291 if (last.contains('%') && !last.contains("100%")) 291 if (last.contains('%') && !last.contains("100%"))
292 || last == &msg.replace(", done.", "") 292 || last == &msg.replace(", done.", "")
@@ -360,3 +360,149 @@ fn fetch_from_git_server_url(
360 git_server_remote.disconnect()?; 360 git_server_remote.disconnect()?;
361 Ok(()) 361 Ok(())
362} 362}
363
364#[cfg(test)]
365mod tests {
366
367 use super::*;
368
369 fn pass_through_fetch_reporter_proces_remote_msg(msgs: Vec<&str>) -> Vec<String> {
370 let term = console::Term::stdout();
371 let mut reporter = FetchReporter::new(&term);
372 for msg in msgs {
373 reporter.process_remote_msg(msg.as_bytes());
374 }
375 reporter.remote_msgs
376 }
377
378 #[test]
379 fn logs_single_msg() {
380 assert_eq!(
381 pass_through_fetch_reporter_proces_remote_msg(vec![
382 "Enumerating objects: 23716, done.",
383 ]),
384 vec!["Enumerating objects: 23716, done."]
385 );
386 }
387
388 #[test]
389 fn logs_multiple_msgs() {
390 assert_eq!(
391 pass_through_fetch_reporter_proces_remote_msg(vec![
392 "Enumerating objects: 23716, done.",
393 "Counting objects: 0% (1/2195)",
394 ]),
395 vec![
396 "Enumerating objects: 23716, done.",
397 "Counting objects: 0% (1/2195)",
398 ]
399 );
400 }
401
402 mod ignores {
403 use super::*;
404
405 #[test]
406 fn empty_msgs() {
407 assert_eq!(
408 pass_through_fetch_reporter_proces_remote_msg(vec![
409 "Enumerating objects: 23716, done.",
410 "",
411 "Counting objects: 0% (1/2195)",
412 "",
413 ]),
414 vec![
415 "Enumerating objects: 23716, done.",
416 "Counting objects: 0% (1/2195)",
417 ]
418 );
419 }
420
421 #[test]
422 fn whitespace_msgs() {
423 assert_eq!(
424 pass_through_fetch_reporter_proces_remote_msg(vec![
425 "Enumerating objects: 23716, done.",
426 " ",
427 "Counting objects: 0% (1/2195)",
428 " \r\n \r",
429 ]),
430 vec![
431 "Enumerating objects: 23716, done.",
432 "Counting objects: 0% (1/2195)",
433 ]
434 );
435 }
436 }
437
438 mod splits {
439 use super::*;
440
441 #[test]
442 fn multiple_lines_in_single_msg() {
443 assert_eq!(
444 pass_through_fetch_reporter_proces_remote_msg(vec![
445 "Enumerating objects: 23716, done.\r\nCounting objects: 0% (1/2195)",
446 "",
447 ]),
448 vec![
449 "Enumerating objects: 23716, done.",
450 "Counting objects: 0% (1/2195)",
451 ]
452 );
453 }
454 }
455
456 #[test]
457 fn msgs_with_pc_and_not_100pc_are_replaced() {
458 assert_eq!(
459 pass_through_fetch_reporter_proces_remote_msg(vec![
460 "Enumerating objects: 23716, done.",
461 "Counting objects: 0% (1/2195)",
462 "Counting objects: 1% (22/2195)",
463 ]),
464 vec![
465 "Enumerating objects: 23716, done.",
466 "Counting objects: 1% (22/2195)",
467 ]
468 );
469 }
470 mod msgs_with_pc_100pc_are_not_replaced {
471 use super::*;
472
473 #[test]
474 fn when_next_msg_is_not_identical_but_with_done() {
475 assert_eq!(
476 pass_through_fetch_reporter_proces_remote_msg(vec![
477 "Enumerating objects: 23716, done.",
478 "Counting objects: 0% (1/2195)",
479 "Counting objects: 1% (22/2195)",
480 "Counting objects: 100% (2195/2195)",
481 "Compressing objects: 0% (1/560)"
482 ]),
483 vec![
484 "Enumerating objects: 23716, done.",
485 "Counting objects: 100% (2195/2195)",
486 "Compressing objects: 0% (1/560)"
487 ]
488 );
489 }
490
491 #[test]
492 fn but_is_when_next_msg_is_identical_but_with_done_appended() {
493 assert_eq!(
494 pass_through_fetch_reporter_proces_remote_msg(vec![
495 "Enumerating objects: 23716, done.",
496 "Counting objects: 0% (1/2195)",
497 "Counting objects: 1% (22/2195)",
498 "Counting objects: 100% (2195/2195)",
499 "Counting objects: 100% (2195/2195), done.",
500 ]),
501 vec![
502 "Enumerating objects: 23716, done.",
503 "Counting objects: 100% (2195/2195), done.",
504 ]
505 );
506 }
507 }
508}