diff options
Diffstat (limited to 'src/bin/git_remote_nostr')
| -rw-r--r-- | src/bin/git_remote_nostr/fetch.rs | 160 |
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)] | ||
| 365 | mod 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 | } | ||