|
| 1 | +use gix_odb::Header; |
| 2 | +use gix_pack::Find; |
1 | 3 | use gix_testtools::tempfile;
|
2 | 4 |
|
3 | 5 | use crate::util::named_subrepo_opts;
|
@@ -507,6 +509,76 @@ mod find {
|
507 | 509 | );
|
508 | 510 | Ok(())
|
509 | 511 | }
|
| 512 | + |
| 513 | + #[test] |
| 514 | + fn empty_blob_can_always_be_found() -> crate::Result { |
| 515 | + let repo = basic_repo()?; |
| 516 | + let empty_blob = gix::hash::ObjectId::empty_blob(repo.object_hash()); |
| 517 | + assert_eq!(repo.find_object(empty_blob)?.into_blob().data.len(), 0); |
| 518 | + assert!(repo.has_object(empty_blob)); |
| 519 | + assert_eq!( |
| 520 | + repo.find_header(empty_blob)?, |
| 521 | + gix_odb::find::Header::Loose { |
| 522 | + kind: gix_object::Kind::Blob, |
| 523 | + size: 0, |
| 524 | + }, |
| 525 | + "empty blob is considered a loose object" |
| 526 | + ); |
| 527 | + assert_eq!( |
| 528 | + repo.try_find_object(empty_blob)? |
| 529 | + .expect("present") |
| 530 | + .into_blob() |
| 531 | + .data |
| 532 | + .len(), |
| 533 | + 0 |
| 534 | + ); |
| 535 | + assert_eq!( |
| 536 | + repo.try_find_header(empty_blob)?, |
| 537 | + Some(gix_odb::find::Header::Loose { |
| 538 | + kind: gix_object::Kind::Blob, |
| 539 | + size: 0, |
| 540 | + }), |
| 541 | + "empty blob is considered a loose object" |
| 542 | + ); |
| 543 | + Ok(()) |
| 544 | + } |
| 545 | +} |
| 546 | + |
| 547 | +#[test] |
| 548 | +fn empty_objects_are_always_present_but_not_in_plumbing() -> crate::Result { |
| 549 | + let repo = empty_bare_in_memory_repo()?; |
| 550 | + let empty_blob_id = gix::hash::ObjectId::empty_blob(repo.object_hash()); |
| 551 | + |
| 552 | + assert!( |
| 553 | + repo.has_object(empty_blob_id), |
| 554 | + "empty object is always present even if it's not" |
| 555 | + ); |
| 556 | + assert!(!repo.objects.contains(&empty_blob_id)); |
| 557 | + |
| 558 | + let header = repo.find_header(empty_blob_id)?; |
| 559 | + assert_eq!(header.kind(), gix_object::Kind::Blob); |
| 560 | + assert_eq!(header.size(), 0); |
| 561 | + assert_eq!(repo.objects.try_header(&empty_blob_id)?, None); |
| 562 | + |
| 563 | + let header = repo.try_find_header(empty_blob_id)?.expect("should find header"); |
| 564 | + assert_eq!(header.kind(), gix_object::Kind::Blob); |
| 565 | + assert_eq!(header.size(), 0); |
| 566 | + |
| 567 | + let obj = repo.find_object(empty_blob_id)?; |
| 568 | + assert_eq!(obj.kind, gix_object::Kind::Blob); |
| 569 | + assert_eq!(obj.data.len(), 0); |
| 570 | + |
| 571 | + let mut buf = Vec::new(); |
| 572 | + assert_eq!(repo.objects.try_find(&empty_blob_id, &mut buf)?, None); |
| 573 | + |
| 574 | + let obj = repo.try_find_object(empty_blob_id)?.expect("should find object"); |
| 575 | + assert_eq!(obj.kind, gix_object::Kind::Blob); |
| 576 | + assert_eq!(obj.data.len(), 0); |
| 577 | + |
| 578 | + let blob = obj.try_into_blob()?; |
| 579 | + assert_eq!(blob.data.len(), 0); |
| 580 | + |
| 581 | + Ok(()) |
510 | 582 | }
|
511 | 583 |
|
512 | 584 | mod tag {
|
|
0 commit comments