#rsync #backup #delta #input-stream #difference #output-stream #bindings

librsync

为计算和应用网络差分,以Reader/Writer流的形式公开的librsync绑定

7个版本

0.2.3 2023年3月10日
0.2.2 2023年2月22日
0.2.1 2020年3月28日
0.2.0 2016年4月1日
0.1.2 2016年2月13日

#343 in 网络编程


refractor中使用

MIT/Apache

245KB
4.5K SLoC

C 3.5K SLoC // 0.3% comments Rust 773 SLoC // 0.0% comments Shell 70 SLoC // 0.3% comments RPM Specfile 65 SLoC // 0.1% comments Perl 29 SLoC // 0.4% comments

librsync-rs

Build Status Coverage Status

Rust对librsync的绑定。

API文档

简介

此库包含对librsync 1的绑定,以支持计算和应用程序的网络差分,用于rsync和duplicity备份应用程序。此库封装了rsync协议的算法,该算法高效地计算文件之间的差异。

当rsync协议计算差异时,不需要两个文件都存在。它只需要新文件和第一文件(即签名)的一组校验和。计算出的差异可以存储在差分文件中。然后,rsync协议可以通过拥有旧文件和差分来重现新文件。

安装

只需将相应的条目添加到您的Cargo.toml依赖项列表中

[dependencies]
librsync = "0.2"

并将此添加到您的crate根目录

extern crate librsync;

类型和模块概述

此crate在上层模块中提供生成签名、差分和补丁的流操作,使用SignatureDeltaPatch结构体。这些结构体接受一些输入流(ReadRead + Seek特质)并实现另一个流(Read特质),可以从其中读取输出。

whole子模块中提供更高级的操作。如果应用程序不需要对IO操作有精细的控制,可以使用sigdeltapatch子模块。这些函数通过单个调用将算法应用于输出流(实现Write特质)。

示例:流

本例展示了如何遍历流式API,从输入字符串和修改后的字符串开始,这两个字符串分别作为旧文件和新文件。该示例模拟了一个现实世界场景,其中计算了基本文件的签名,将其用作输入来计算基本文件和新文件之间的差异,并最终通过使用补丁和基本文件来重建新文件。

extern crate librsync;

use std::io::prelude::*;
use std::io::Cursor;
use librsync::{Delta, Patch, Signature};

fn main() {
    let base = "base file".as_bytes();
    let new = "modified base file".as_bytes();

    // create signature starting from base file
    let mut sig = Signature::new(base).unwrap();
    // create delta from new file and the base signature
    let delta = Delta::new(new, &mut sig).unwrap();
    // create and store the new file from the base one and the delta
    let mut patch = Patch::new(Cursor::new(base), delta).unwrap();
    let mut computed_new = Vec::new();
    patch.read_to_end(&mut computed_new).unwrap();

    // test whether the computed file is exactly the new file, as expected
    assert_eq!(computed_new, new);
}

请注意,中间结果不存储在临时容器中。这是因为操作实现了Read特质。这样,在计算过程中,结果不需要完全驻留在内存中。

示例:整个文件API

本例展示了如何遍历整个文件API,从输入字符串和修改后的字符串开始,这两个字符串分别作为旧文件和新文件。与流式示例不同,在这里我们调用一个单独的函数,以获取签名、差异和补丁操作的计算结果。当使用输出流(如网络套接字或文件)作为操作输出时,这很方便。

extern crate librsync;

use std::io::Cursor;
use librsync::whole::*;

fn main() {
    let base = "base file".as_bytes();
    let new = "modified base file".as_bytes();

    // signature
    let mut sig = Vec::new();
    signature(&mut Cursor::new(base), &mut sig).unwrap();

    // delta
    let mut dlt = Vec::new();
    delta(&mut Cursor::new(new), &mut Cursor::new(sig), &mut dlt).unwrap();

    // patch
    let mut out = Vec::new();
    patch(&mut Cursor::new(base), &mut Cursor::new(dlt), &mut out).unwrap();

    assert_eq!(out, new);
}

许可证

根据以下任一许可证授权:

任选其一。

此库使用librsync,它附带LGPL-2.0许可证。请在使用此库之前,确保满足librsync的许可要求。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您提交的任何有意包含在工作中的贡献,均应按上述方式双许可,不附加任何额外条款或条件。

依赖关系