Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 2 additions & 30 deletions gix/src/repository/object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,6 @@ impl crate::Repository {
repo: self,
});
}
if id == ObjectId::empty_blob(self.object_hash()) {
return Ok(Object {
id,
kind: gix_object::Kind::Blob,
data: Vec::new(),
repo: self,
});
}
let mut buf = self.free_buf();
let kind = self.objects.find(&id, &mut buf)?.kind;
Ok(Object::from_data(id, kind, buf, self))
Expand Down Expand Up @@ -106,12 +98,6 @@ impl crate::Repository {
size: 0,
});
}
if id == ObjectId::empty_blob(self.object_hash()) {
return Ok(gix_odb::find::Header::Loose {
kind: gix_object::Kind::Blob,
size: 0,
});
}
self.objects.header(id)
}

Expand All @@ -126,7 +112,7 @@ impl crate::Repository {
#[doc(alias = "exists", alias = "git2")]
pub fn has_object(&self, id: impl AsRef<gix_hash::oid>) -> bool {
let id = id.as_ref();
if id.to_owned().is_empty_tree() || id.to_owned().is_empty_blob() {
if id.to_owned().is_empty_tree() {
true
} else {
self.objects.exists(id)
Expand All @@ -147,12 +133,6 @@ impl crate::Repository {
size: 0,
}));
}
if id == ObjectId::empty_blob(self.object_hash()) {
return Ok(Some(gix_odb::find::Header::Loose {
kind: gix_object::Kind::Blob,
size: 0,
}));
}
self.objects.try_header(&id).map_err(Into::into)
}

Expand All @@ -167,14 +147,6 @@ impl crate::Repository {
repo: self,
}));
}
if id == ObjectId::empty_blob(self.object_hash()) {
return Ok(Some(Object {
id,
kind: gix_object::Kind::Blob,
data: Vec::new(),
repo: self,
}));
}

let mut buf = self.free_buf();
match self.objects.try_find(&id, &mut buf)? {
Expand Down Expand Up @@ -466,7 +438,7 @@ impl crate::Repository {
/// This means that this object can be used in an uninitialized, empty repository which would report to have no objects at all.
pub fn empty_blob(&self) -> Blob<'_> {
Blob {
id: gix_hash::ObjectId::empty_blob(self.object_hash()),
id: self.object_hash().empty_blob(),
data: Vec::new(),
repo: self,
}
Expand Down
59 changes: 35 additions & 24 deletions gix/tests/gix/repository/object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,7 @@ mod find {
use gix_pack::Find;

use crate::basic_repo;
use crate::repository::object::empty_bare_in_memory_repo;

#[test]
fn find_and_try_find_with_and_without_object_cache() -> crate::Result {
Expand Down Expand Up @@ -512,18 +513,23 @@ mod find {
}

#[test]
fn empty_blob_can_always_be_found() -> crate::Result {
fn empty_blob_can_be_found_if_it_exists() -> crate::Result {
let repo = basic_repo()?;
let empty_blob = gix::hash::ObjectId::empty_blob(repo.object_hash());
assert_eq!(repo.find_object(empty_blob)?.into_blob().data.len(), 0);

assert_eq!(
repo.find_object(empty_blob)?.into_blob().data.len(),
0,
"The basic_repo fixture contains an empty blob"
);
assert!(repo.has_object(empty_blob));
assert_eq!(
repo.find_header(empty_blob)?,
gix_odb::find::Header::Loose {
kind: gix_object::Kind::Blob,
size: 0,
},
"empty blob is considered a loose object"
"empty blob is found when it exists in the repository"
);
assert_eq!(
repo.try_find_object(empty_blob)?
Expand All @@ -539,46 +545,51 @@ mod find {
kind: gix_object::Kind::Blob,
size: 0,
}),
"empty blob is considered a loose object"
"empty blob is found when it exists in the repository"
);
Ok(())
}

#[test]
fn empty_blob() -> crate::Result {
let repo = empty_bare_in_memory_repo()?;
let empty_blob = repo.empty_blob();

assert_eq!(empty_blob.id, repo.object_hash().empty_blob());
assert_eq!(empty_blob.data.len(), 0);

assert!(!repo.has_object(empty_blob.id), "it doesn't exist by default");
repo.write_blob(&empty_blob.data)?;
assert!(repo.has_object(empty_blob.id), "it exists after it was written");

Ok(())
}
}

#[test]
fn empty_objects_are_always_present_but_not_in_plumbing() -> crate::Result {
let repo = empty_bare_in_memory_repo()?;
let empty_blob_id = gix::hash::ObjectId::empty_blob(repo.object_hash());
let empty_blob_id = repo.object_hash().empty_blob();

assert!(
repo.has_object(empty_blob_id),
"empty object is always present even if it's not"
!repo.has_object(empty_blob_id),
"empty blob is not present unless it actually exists"
);
assert!(!repo.objects.contains(&empty_blob_id));

let header = repo.find_header(empty_blob_id)?;
assert_eq!(header.kind(), gix_object::Kind::Blob);
assert_eq!(header.size(), 0);
assert!(
repo.find_header(empty_blob_id).is_err(),
"Empty blob doesn't exist automatically just like in Git"
);
assert_eq!(repo.objects.try_header(&empty_blob_id)?, None);

let header = repo.try_find_header(empty_blob_id)?.expect("should find header");
assert_eq!(header.kind(), gix_object::Kind::Blob);
assert_eq!(header.size(), 0);

let obj = repo.find_object(empty_blob_id)?;
assert_eq!(obj.kind, gix_object::Kind::Blob);
assert_eq!(obj.data.len(), 0);
assert_eq!(repo.try_find_header(empty_blob_id)?, None);
assert!(repo.find_object(empty_blob_id).is_err());

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

let obj = repo.try_find_object(empty_blob_id)?.expect("should find object");
assert_eq!(obj.kind, gix_object::Kind::Blob);
assert_eq!(obj.data.len(), 0);

let blob = obj.try_into_blob()?;
assert_eq!(blob.data.len(), 0);

Ok(())
}

Expand Down
Loading