Skip to content

Commit b4812d9

Browse files
authored
Merge pull request #2166 from GitoxideLabs/copilot/fix-ffb06a30-3f53-4f82-94ed-51935d63da63
Add `is_empty_tree()` and `is_empty_blob()` methods to `gix_hash::Oid`
2 parents 772c434 + 58e2d18 commit b4812d9

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

gix-hash/src/oid.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,22 @@ impl oid {
148148
Kind::Sha1 => &self.bytes == oid::null_sha1().as_bytes(),
149149
}
150150
}
151+
152+
/// Returns `true` if this hash is equal to an empty blob.
153+
#[inline]
154+
pub fn is_empty_blob(&self) -> bool {
155+
match self.kind() {
156+
Kind::Sha1 => &self.bytes == oid::empty_blob_sha1().as_bytes(),
157+
}
158+
}
159+
160+
/// Returns `true` if this hash is equal to an empty tree.
161+
#[inline]
162+
pub fn is_empty_tree(&self) -> bool {
163+
match self.kind() {
164+
Kind::Sha1 => &self.bytes == oid::empty_tree_sha1().as_bytes(),
165+
}
166+
}
151167
}
152168

153169
/// Sha1 specific methods
@@ -175,6 +191,18 @@ impl oid {
175191
pub(crate) fn null_sha1() -> &'static Self {
176192
oid::from_bytes([0u8; SIZE_OF_SHA1_DIGEST].as_ref())
177193
}
194+
195+
/// Returns an oid representing the hash of an empty blob.
196+
#[inline]
197+
pub(crate) fn empty_blob_sha1() -> &'static Self {
198+
oid::from_bytes(b"\xe6\x9d\xe2\x9b\xb2\xd1\xd6\x43\x4b\x8b\x29\xae\x77\x5a\xd8\xc2\xe4\x8c\x53\x91")
199+
}
200+
201+
/// Returns an oid representing the hash of an empty tree.
202+
#[inline]
203+
pub(crate) fn empty_tree_sha1() -> &'static Self {
204+
oid::from_bytes(b"\x4b\x82\x5d\xc6\x42\xcb\x6e\xb9\xa0\x60\xe5\x4b\xf8\xd6\x92\x88\xfb\xee\x49\x04")
205+
}
178206
}
179207

180208
impl AsRef<oid> for &oid {

gix-hash/tests/hash/oid.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,25 @@ fn is_null() {
1919
assert!(gix_hash::Kind::Sha1.null().is_null());
2020
assert!(gix_hash::Kind::Sha1.null().as_ref().is_null());
2121
}
22+
23+
#[test]
24+
fn is_empty_blob() {
25+
let empty_blob = gix_hash::ObjectId::empty_blob(gix_hash::Kind::Sha1);
26+
assert!(empty_blob.is_empty_blob());
27+
assert!(empty_blob.as_ref().is_empty_blob());
28+
29+
let non_empty = gix_hash::Kind::Sha1.null();
30+
assert!(!non_empty.is_empty_blob());
31+
assert!(!non_empty.as_ref().is_empty_blob());
32+
}
33+
34+
#[test]
35+
fn is_empty_tree() {
36+
let empty_tree = gix_hash::ObjectId::empty_tree(gix_hash::Kind::Sha1);
37+
assert!(empty_tree.is_empty_tree());
38+
assert!(empty_tree.as_ref().is_empty_tree());
39+
40+
let non_empty = gix_hash::Kind::Sha1.null();
41+
assert!(!non_empty.is_empty_tree());
42+
assert!(!non_empty.as_ref().is_empty_tree());
43+
}

0 commit comments

Comments
 (0)