use anyhow::Result;
pub fn enabled() -> bool {
static ON: std::sync::OnceLock<bool> = std::sync::OnceLock::new();
*ON.get_or_init(|| match crate::arms::read_env(crate::arms::ENV_BOUNDARY_DELTA) {
Some(v) => !matches!(v.to_ascii_lowercase().as_str(), "0" | "off" | "false"),
None => true,
})
}
const MIN_MATCH: usize = 16;
const MAX_PROBE: usize = 4;
const MAX_BASE: usize = u32::MAX as usize;
const MAX_COPY: usize = 0xff_ffff;
pub fn delta(base: &[u8], target: &[u8]) -> Result<Option<Vec<u8>>> {
if base.len() > MAX_BASE {
return Ok(None);
}
let index = BlockIndex::build(base);
let mut d = Delta::new(base.len(), target.len());
let mut i = 0usize;
let mut literal_from = 0usize;
while i < target.len() {
let m = if i + MIN_MATCH <= target.len() {
index.longest_match(base, target, i)
} else {
None
};
match m {
Some((at, len)) => {
d.literal(&target[literal_from..i]);
d.copy(at, len);
i += len;
literal_from = i;
}
None => i += 1,
}
if d.out.len() >= target.len() {
return Ok(None);
}
}
d.literal(&target[literal_from..]);
if d.out.len() >= target.len() {
return Ok(None);
}
Ok(Some(d.out))
}
struct Delta {
out: Vec<u8>,
}
impl Delta {
fn new(base_len: usize, target_len: usize) -> Self {
let mut out = Vec::with_capacity(target_len / 4 + 32);
varint(&mut out, base_len as u64);
varint(&mut out, target_len as u64);
Delta { out }
}
fn literal(&mut self, bytes: &[u8]) {
for chunk in bytes.chunks(0x7f) {
self.out.push(chunk.len() as u8);
self.out.extend_from_slice(chunk);
}
}
fn copy(&mut self, at: usize, len: usize) {
debug_assert!(len > 0, "a zero-length copy encodes as 65536");
let mut at = at;
let mut left = len;
while left > 0 {
let n = left.min(MAX_COPY);
let opcode_at = self.out.len();
self.out.push(0x80);
let mut op = 0x80u8;
for shift in 0..4 {
let b = ((at >> (shift * 8)) & 0xff) as u8;
if b != 0 {
op |= 1 << shift;
self.out.push(b);
}
}
for shift in 0..3 {
let b = ((n >> (shift * 8)) & 0xff) as u8;
if b != 0 {
op |= 0x10 << shift;
self.out.push(b);
}
}
self.out[opcode_at] = op;
at += n;
left -= n;
}
}
}
fn varint(out: &mut Vec<u8>, mut n: u64) {
loop {
let mut b = (n & 0x7f) as u8;
n >>= 7;
if n > 0 {
b |= 0x80;
}
out.push(b);
if n == 0 {
return;
}
}
}
struct BlockIndex {
head: Vec<u32>,
next: Vec<u32>,
mask: usize,
}
const NONE: u32 = u32::MAX;
impl BlockIndex {
fn build(base: &[u8]) -> Self {
let blocks = base.len() / MIN_MATCH;
let mut buckets = 1usize;
while buckets < blocks.max(1) * 2 {
buckets <<= 1;
}
let mut idx = BlockIndex {
head: vec![NONE; buckets],
next: vec![NONE; blocks],
mask: buckets - 1,
};
for k in (0..blocks).rev() {
let at = k * MIN_MATCH;
let b = (block_hash(&base[at..at + MIN_MATCH]) as usize) & idx.mask;
idx.next[k] = idx.head[b];
idx.head[b] = k as u32;
}
idx
}
fn longest_match(
&self,
base: &[u8],
target: &[u8],
from: usize,
) -> Option<(usize, usize)> {
let probe = &target[from..from + MIN_MATCH];
let b = (block_hash(probe) as usize) & self.mask;
let mut best: Option<(usize, usize)> = None;
let mut k = self.head[b];
let mut tried = 0usize;
while k != NONE && tried < MAX_PROBE {
let at = k as usize * MIN_MATCH;
k = self.next[k as usize];
if &base[at..at + MIN_MATCH] != probe {
tried += 1;
continue;
}
tried += 1;
let mut len = MIN_MATCH;
while at + len < base.len()
&& from + len < target.len()
&& base[at + len] == target[from + len]
&& len < MAX_COPY
{
len += 1;
}
if best.is_none_or(|(_, prev)| len > prev) {
best = Some((at, len));
}
}
best
}
}
#[inline]
fn block_hash(b: &[u8]) -> u64 {
debug_assert_eq!(b.len(), MIN_MATCH);
let lo = u64::from_le_bytes(b[0..8].try_into().expect("16 bytes"));
let hi = u64::from_le_bytes(b[8..16].try_into().expect("16 bytes"));
(lo ^ hi.rotate_left(29)).wrapping_mul(0x9E37_79B9_7F4A_7C15)
}
#[cfg(test)]
mod tests {
use super::*;
fn apply(base: &[u8], d: &[u8]) -> Vec<u8> {
let mut i = 0usize;
let n = |i: &mut usize| {
let mut v = 0u64;
let mut s = 0;
loop {
let b = d[*i];
*i += 1;
v |= u64::from(b & 0x7f) << s;
s += 7;
if b & 0x80 == 0 {
return v;
}
}
};
let base_size = n(&mut i);
assert_eq!(base_size as usize, base.len(), "declared base size");
let target_size = n(&mut i);
let mut out = Vec::new();
while i < d.len() {
let op = d[i];
i += 1;
if op & 0x80 != 0 {
let mut off = 0usize;
for bit in 0..4 {
if op & (1 << bit) != 0 {
off |= (d[i] as usize) << (bit * 8);
i += 1;
}
}
let mut size = 0usize;
for bit in 0..3 {
if op & (0x10 << bit) != 0 {
size |= (d[i] as usize) << (bit * 8);
i += 1;
}
}
if size == 0 {
size = 0x1_0000;
}
out.extend_from_slice(&base[off..off + size]);
} else {
let k = op as usize;
assert_ne!(k, 0, "a zero-length insert is not a valid instruction");
out.extend_from_slice(&d[i..i + k]);
i += k;
}
}
assert_eq!(out.len() as u64, target_size, "declared target size");
out
}
fn noise(n: usize, seed: u64) -> Vec<u8> {
let mut s = seed | 1;
(0..n)
.map(|_| {
s ^= s << 13;
s ^= s >> 7;
s ^= s << 17;
(s >> 33) as u8
})
.collect()
}
#[test]
fn a_computed_delta_round_trips_and_is_a_fraction_of_the_target() {
let base = noise(16 * 1024, 0x1234);
let mut target = base.clone();
target[4096..4160].copy_from_slice(&noise(64, 0x99));
target.extend_from_slice(&noise(128, 0x77));
let d = delta(&base, &target).unwrap().expect("a near-copy deltas");
assert_eq!(apply(&base, &d), target, "the delta must rebuild the target");
assert!(
d.len() * 20 < target.len(),
"a 16 KiB target differing in ~200 bytes must delta to well under 5 % of it, got {} \
of {}",
d.len(),
target.len()
);
}
#[test]
fn a_copy_of_exactly_65536_bytes_is_not_encoded_as_a_zero_size() {
let base = noise(200_000, 0xBEEF);
let target = base[..0x1_0000].to_vec();
let d = delta(&base, &target).unwrap().expect("a pure prefix deltas");
assert_eq!(apply(&base, &d), target, "the 65536 boundary must round trip");
}
#[test]
fn an_unrelated_base_declines_rather_than_growing_the_entry() {
let base = noise(8192, 1);
let target = noise(8192, 2);
assert!(
delta(&base, &target).unwrap().is_none(),
"two unrelated buffers have no delta worth sending"
);
}
#[test]
fn degenerate_inputs_decline_through_the_grow_guard_and_not_a_special_case() {
for (base, target) in [
(&b""[..], &b"anything"[..]),
(&b"anything"[..], &b""[..]),
(&b""[..], &b""[..]),
(&b"short"[..], &b"also short"[..]),
] {
assert!(
delta(base, target).unwrap().is_none(),
"base {} bytes, target {} bytes: a delta no smaller than its target must decline",
base.len(),
target.len()
);
}
}
#[test]
fn prefixes_and_extensions_round_trip() {
let base = noise(4096, 7);
for target in [
base[..1000].to_vec(),
base[..4095].to_vec(),
{
let mut t = base.clone();
t.extend_from_slice(&noise(3, 9));
t
},
{
let mut t = noise(3, 11);
t.extend_from_slice(&base);
t
},
] {
let d = delta(&base, &target)
.unwrap()
.unwrap_or_else(|| panic!("a {}-byte near-copy must delta", target.len()));
assert_eq!(apply(&base, &d), target, "{} bytes", target.len());
}
}
}