Skip to content

Commit e60e253

Browse files
authored
Merge pull request #2169 from GitoxideLabs/copilot/fix-54bce74a-dc5e-4361-b53b-326c16b34046
Remove special handling of empty blob hash in gix - treat as error if not found
2 parents f891c37 + b9c7a7e commit e60e253

File tree

2 files changed

+37
-54
lines changed

2 files changed

+37
-54
lines changed

gix/src/repository/object.rs

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,6 @@ impl crate::Repository {
5050
repo: self,
5151
});
5252
}
53-
if id == ObjectId::empty_blob(self.object_hash()) {
54-
return Ok(Object {
55-
id,
56-
kind: gix_object::Kind::Blob,
57-
data: Vec::new(),
58-
repo: self,
59-
});
60-
}
6153
let mut buf = self.free_buf();
6254
let kind = self.objects.find(&id, &mut buf)?.kind;
6355
Ok(Object::from_data(id, kind, buf, self))
@@ -106,12 +98,6 @@ impl crate::Repository {
10698
size: 0,
10799
});
108100
}
109-
if id == ObjectId::empty_blob(self.object_hash()) {
110-
return Ok(gix_odb::find::Header::Loose {
111-
kind: gix_object::Kind::Blob,
112-
size: 0,
113-
});
114-
}
115101
self.objects.header(id)
116102
}
117103

@@ -126,7 +112,7 @@ impl crate::Repository {
126112
#[doc(alias = "exists", alias = "git2")]
127113
pub fn has_object(&self, id: impl AsRef<gix_hash::oid>) -> bool {
128114
let id = id.as_ref();
129-
if id.to_owned().is_empty_tree() || id.to_owned().is_empty_blob() {
115+
if id.to_owned().is_empty_tree() {
130116
true
131117
} else {
132118
self.objects.exists(id)
@@ -147,12 +133,6 @@ impl crate::Repository {
147133
size: 0,
148134
}));
149135
}
150-
if id == ObjectId::empty_blob(self.object_hash()) {
151-
return Ok(Some(gix_odb::find::Header::Loose {
152-
kind: gix_object::Kind::Blob,
153-
size: 0,
154-
}));
155-
}
156136
self.objects.try_header(&id).map_err(Into::into)
157137
}
158138

@@ -167,14 +147,6 @@ impl crate::Repository {
167147
repo: self,
168148
}));
169149
}
170-
if id == ObjectId::empty_blob(self.object_hash()) {
171-
return Ok(Some(Object {
172-
id,
173-
kind: gix_object::Kind::Blob,
174-
data: Vec::new(),
175-
repo: self,
176-
}));
177-
}
178150

179151
let mut buf = self.free_buf();
180152
match self.objects.try_find(&id, &mut buf)? {
@@ -466,7 +438,7 @@ impl crate::Repository {
466438
/// This means that this object can be used in an uninitialized, empty repository which would report to have no objects at all.
467439
pub fn empty_blob(&self) -> Blob<'_> {
468440
Blob {
469-
id: gix_hash::ObjectId::empty_blob(self.object_hash()),
441+
id: self.object_hash().empty_blob(),
470442
data: Vec::new(),
471443
repo: self,
472444
}

gix/tests/gix/repository/object.rs

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@ mod find {
432432
use gix_pack::Find;
433433

434434
use crate::basic_repo;
435+
use crate::repository::object::empty_bare_in_memory_repo;
435436

436437
#[test]
437438
fn find_and_try_find_with_and_without_object_cache() -> crate::Result {
@@ -512,18 +513,23 @@ mod find {
512513
}
513514

514515
#[test]
515-
fn empty_blob_can_always_be_found() -> crate::Result {
516+
fn empty_blob_can_be_found_if_it_exists() -> crate::Result {
516517
let repo = basic_repo()?;
517518
let empty_blob = gix::hash::ObjectId::empty_blob(repo.object_hash());
518-
assert_eq!(repo.find_object(empty_blob)?.into_blob().data.len(), 0);
519+
520+
assert_eq!(
521+
repo.find_object(empty_blob)?.into_blob().data.len(),
522+
0,
523+
"The basic_repo fixture contains an empty blob"
524+
);
519525
assert!(repo.has_object(empty_blob));
520526
assert_eq!(
521527
repo.find_header(empty_blob)?,
522528
gix_odb::find::Header::Loose {
523529
kind: gix_object::Kind::Blob,
524530
size: 0,
525531
},
526-
"empty blob is considered a loose object"
532+
"empty blob is found when it exists in the repository"
527533
);
528534
assert_eq!(
529535
repo.try_find_object(empty_blob)?
@@ -539,46 +545,51 @@ mod find {
539545
kind: gix_object::Kind::Blob,
540546
size: 0,
541547
}),
542-
"empty blob is considered a loose object"
548+
"empty blob is found when it exists in the repository"
543549
);
544550
Ok(())
545551
}
552+
553+
#[test]
554+
fn empty_blob() -> crate::Result {
555+
let repo = empty_bare_in_memory_repo()?;
556+
let empty_blob = repo.empty_blob();
557+
558+
assert_eq!(empty_blob.id, repo.object_hash().empty_blob());
559+
assert_eq!(empty_blob.data.len(), 0);
560+
561+
assert!(!repo.has_object(empty_blob.id), "it doesn't exist by default");
562+
repo.write_blob(&empty_blob.data)?;
563+
assert!(repo.has_object(empty_blob.id), "it exists after it was written");
564+
565+
Ok(())
566+
}
546567
}
547568

548569
#[test]
549570
fn empty_objects_are_always_present_but_not_in_plumbing() -> crate::Result {
550571
let repo = empty_bare_in_memory_repo()?;
551-
let empty_blob_id = gix::hash::ObjectId::empty_blob(repo.object_hash());
572+
let empty_blob_id = repo.object_hash().empty_blob();
552573

553574
assert!(
554-
repo.has_object(empty_blob_id),
555-
"empty object is always present even if it's not"
575+
!repo.has_object(empty_blob_id),
576+
"empty blob is not present unless it actually exists"
556577
);
557578
assert!(!repo.objects.contains(&empty_blob_id));
558579

559-
let header = repo.find_header(empty_blob_id)?;
560-
assert_eq!(header.kind(), gix_object::Kind::Blob);
561-
assert_eq!(header.size(), 0);
580+
assert!(
581+
repo.find_header(empty_blob_id).is_err(),
582+
"Empty blob doesn't exist automatically just like in Git"
583+
);
562584
assert_eq!(repo.objects.try_header(&empty_blob_id)?, None);
563585

564-
let header = repo.try_find_header(empty_blob_id)?.expect("should find header");
565-
assert_eq!(header.kind(), gix_object::Kind::Blob);
566-
assert_eq!(header.size(), 0);
567-
568-
let obj = repo.find_object(empty_blob_id)?;
569-
assert_eq!(obj.kind, gix_object::Kind::Blob);
570-
assert_eq!(obj.data.len(), 0);
586+
assert_eq!(repo.try_find_header(empty_blob_id)?, None);
587+
assert!(repo.find_object(empty_blob_id).is_err());
571588

589+
assert!(repo.try_find_object(empty_blob_id)?.is_none());
572590
let mut buf = Vec::new();
573591
assert_eq!(repo.objects.try_find(&empty_blob_id, &mut buf)?, None);
574592

575-
let obj = repo.try_find_object(empty_blob_id)?.expect("should find object");
576-
assert_eq!(obj.kind, gix_object::Kind::Blob);
577-
assert_eq!(obj.data.len(), 0);
578-
579-
let blob = obj.try_into_blob()?;
580-
assert_eq!(blob.data.len(), 0);
581-
582593
Ok(())
583594
}
584595

0 commit comments

Comments
 (0)