#![doc = include_str!("../docs/delta.md")]
mod apply;
mod bspatch;
mod codec;
mod create;
mod fsutil;
mod macho;
mod plan;
#[cfg(test)]
mod tests;
use semver::Version;
use serde::{Deserialize, Serialize};
pub use apply::{apply, read_info};
pub use create::{VersionPair, create};
pub use plan::delta_bases;
pub(crate) use plan::{Route, cheapest};
use crate::release::DELTA_FORMAT_FILES_BSDIFF_V1;
pub const FORMAT: &str = DELTA_FORMAT_FILES_BSDIFF_V1;
const MAGIC: &[u8; 8] = b"GPUIDLT1";
const PREAMBLE_LEN: u64 = 16;
const MAX_HEADER_LEN: u64 = 64 * 1024 * 1024;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub struct DeltaInfo {
pub from: Version,
pub to: Version,
pub files: usize,
pub copied: usize,
pub patched: usize,
pub added: usize,
}
#[derive(Debug, Serialize, Deserialize)]
struct Header {
format: String,
from: String,
to: String,
root: RootKind,
entries: Vec<Entry>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
enum RootKind {
Dir,
File,
}
#[derive(Debug, Serialize, Deserialize)]
struct Entry {
path: String,
#[serde(flatten)]
kind: EntryKind,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "lowercase")]
enum EntryKind {
Dir {
mode: u32,
},
Symlink {
target: String,
},
File {
mode: u32,
size: u64,
sha256: String,
source: Source,
},
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "op", rename_all = "lowercase")]
enum Source {
Copy {
base: String,
base_sha256: String,
},
Patch {
base: String,
base_sha256: String,
offset: u64,
len: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
transform: Option<Transform>,
},
Add {
offset: u64,
len: u64,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
enum Transform {
MachoCodeSlots,
}