Drop minimal rust/ library
This was my first experiment with using Rust in this way; I gained a lot of knowledge from it. But, we don't really gain anything from the code as it is today - while it is "bit fiddling" code, the C code is well tested. We have a lot of compile-time options, and trimming them will be helpful. We've also gotten pushback on hard requiring Rust client side. Instead, what I'd like to do is hopefully soon create an `ostree-system` crate that uses the existing `ostree` library and can contain code drained from the rpm-ostree Rust and used by other projects perhaps. So the goal here is really more Rust, but we need to focus our efforts on where it's most valuable.
This commit is contained in:
parent
407477f191
commit
61184163ea
|
|
@ -107,11 +107,6 @@ buildopts: {
|
||||||
shwrap("""
|
shwrap("""
|
||||||
git submodule update --init
|
git submodule update --init
|
||||||
|
|
||||||
git worktree add build-rust && cd build-rust
|
|
||||||
env MAKE_JOBS=${n} CONFIGOPTS="--enable-rust" SKIP_INSTALLDEPS=1 ./ci/build.sh
|
|
||||||
make check TESTS=tests/test-rollsum
|
|
||||||
cd .. && rm -rf build-rust
|
|
||||||
|
|
||||||
git worktree add build-libsoup && cd build-libsoup
|
git worktree add build-libsoup && cd build-libsoup
|
||||||
env MAKE_JOBS=${n} CONFIGOPTS="--without-curl --without-openssl --with-soup" SKIP_INSTALLDEPS=1 ./ci/build.sh
|
env MAKE_JOBS=${n} CONFIGOPTS="--without-curl --without-openssl --with-soup" SKIP_INSTALLDEPS=1 ./ci/build.sh
|
||||||
make check
|
make check
|
||||||
|
|
|
||||||
|
|
@ -21,18 +21,9 @@
|
||||||
|
|
||||||
include Makefile-libostree-defines.am
|
include Makefile-libostree-defines.am
|
||||||
|
|
||||||
|
|
||||||
if ENABLE_RUST
|
|
||||||
bupsplitpath = @abs_top_builddir@/target/@RUST_TARGET_SUBDIR@/libbupsplit_rs.a
|
|
||||||
BUPSPLIT_RUST_SRCS = rust/src/bupsplit.rs
|
|
||||||
EXTRA_DIST += $(BUPSPLIT_RUST_SRCS)
|
|
||||||
$(bupsplitpath): Makefile $(BUPSPLIT_RUST_SRCS)
|
|
||||||
cd $(top_srcdir)/rust && CARGO_TARGET_DIR=@abs_top_builddir@/target cargo build --verbose $(CARGO_RELEASE_ARGS)
|
|
||||||
else
|
|
||||||
bupsplitpath = libbupsplit.la
|
bupsplitpath = libbupsplit.la
|
||||||
noinst_LTLIBRARIES += libbupsplit.la
|
noinst_LTLIBRARIES += libbupsplit.la
|
||||||
libbupsplit_la_SOURCES = src/libostree/bupsplit.h src/libostree/bupsplit.c
|
libbupsplit_la_SOURCES = src/libostree/bupsplit.h src/libostree/bupsplit.c
|
||||||
endif # ENABLE_RUST
|
|
||||||
|
|
||||||
lib_LTLIBRARIES += libostree-1.la
|
lib_LTLIBRARIES += libostree-1.la
|
||||||
|
|
||||||
|
|
@ -206,9 +197,6 @@ libostree_1_la_LDFLAGS = -version-number 1:0:0 -Bsymbolic-functions $(addprefix
|
||||||
libostree_1_la_LIBADD = libotutil.la libglnx.la libbsdiff.la $(OT_INTERNAL_GIO_UNIX_LIBS) $(OT_INTERNAL_GPGME_LIBS) \
|
libostree_1_la_LIBADD = libotutil.la libglnx.la libbsdiff.la $(OT_INTERNAL_GIO_UNIX_LIBS) $(OT_INTERNAL_GPGME_LIBS) \
|
||||||
$(OT_DEP_LZMA_LIBS) $(OT_DEP_ZLIB_LIBS) $(OT_DEP_CRYPTO_LIBS)
|
$(OT_DEP_LZMA_LIBS) $(OT_DEP_ZLIB_LIBS) $(OT_DEP_CRYPTO_LIBS)
|
||||||
# Some change between rust-1.21.0-1.fc27 and rust-1.22.1-1.fc27.x86_64
|
# Some change between rust-1.21.0-1.fc27 and rust-1.22.1-1.fc27.x86_64
|
||||||
if ENABLE_RUST
|
|
||||||
libostree_1_la_LIBADD += -ldl
|
|
||||||
endif
|
|
||||||
libostree_1_la_LIBADD += $(bupsplitpath)
|
libostree_1_la_LIBADD += $(bupsplitpath)
|
||||||
EXTRA_libostree_1_la_DEPENDENCIES = $(symbol_files)
|
EXTRA_libostree_1_la_DEPENDENCIES = $(symbol_files)
|
||||||
|
|
||||||
|
|
|
||||||
24
Makefile.am
24
Makefile.am
|
|
@ -71,30 +71,6 @@ GIRS =
|
||||||
TYPELIBS = $(GIRS:.gir=.typelib)
|
TYPELIBS = $(GIRS:.gir=.typelib)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# These bits based on gnome:librsvg/Makefile.am
|
|
||||||
if ENABLE_RUST
|
|
||||||
if RUST_DEBUG
|
|
||||||
CARGO_RELEASE_ARGS=
|
|
||||||
else
|
|
||||||
CARGO_RELEASE_ARGS=--release
|
|
||||||
endif
|
|
||||||
|
|
||||||
check-local:
|
|
||||||
cd $(srcdir)/rust && CARGO_TARGET_DIR=$(abs_top_builddir)/target cargo test
|
|
||||||
|
|
||||||
clean-local:
|
|
||||||
cd $(srcdir)/rust && CARGO_TARGET_DIR=$(abs_top_builddir)/target cargo clean
|
|
||||||
|
|
||||||
dist-hook:
|
|
||||||
(cd $(distdir)/rust && \
|
|
||||||
cp $(abs_top_srcdir)/rust/Cargo.lock . && \
|
|
||||||
cargo vendor -q && \
|
|
||||||
mkdir .cargo && \
|
|
||||||
cp cargo-vendor-config .cargo/config)
|
|
||||||
|
|
||||||
EXTRA_DIST += $(srcdir)/rust/Cargo.toml $(srcdir)/rust/cargo-vendor-config
|
|
||||||
endif # end ENABLE_RUST
|
|
||||||
|
|
||||||
libglnx_srcpath := $(srcdir)/libglnx
|
libglnx_srcpath := $(srcdir)/libglnx
|
||||||
libglnx_cflags := $(OT_DEP_GIO_UNIX_CFLAGS) "-I$(libglnx_srcpath)"
|
libglnx_cflags := $(OT_DEP_GIO_UNIX_CFLAGS) "-I$(libglnx_srcpath)"
|
||||||
libglnx_libs := $(OT_DEP_GIO_UNIX_LIBS)
|
libglnx_libs := $(OT_DEP_GIO_UNIX_LIBS)
|
||||||
|
|
|
||||||
34
configure.ac
34
configure.ac
|
|
@ -287,39 +287,6 @@ AS_IF([test "$enable_man" != no], [
|
||||||
])
|
])
|
||||||
AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no)
|
AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no)
|
||||||
|
|
||||||
AC_ARG_ENABLE(rust,
|
|
||||||
[AS_HELP_STRING([--enable-rust],
|
|
||||||
[Compile Rust code instead of C [default=no]])],,
|
|
||||||
[enable_rust=no; rust_debug_release=no])
|
|
||||||
|
|
||||||
AS_IF([test "$enable_rust" = yes], [
|
|
||||||
AC_PATH_PROG([cargo], [cargo])
|
|
||||||
AS_IF([test -z "$cargo"], [AC_MSG_ERROR([cargo is required for --enable-rust])])
|
|
||||||
AC_PATH_PROG([rustc], [rustc])
|
|
||||||
AS_IF([test -z "$rustc"], [AC_MSG_ERROR([rustc is required for --enable-rust])])
|
|
||||||
|
|
||||||
dnl These bits based on gnome:librsvg/configure.ac
|
|
||||||
|
|
||||||
dnl By default, we build in public release mode.
|
|
||||||
AC_ARG_ENABLE(rust-debug,
|
|
||||||
AC_HELP_STRING([--enable-rust-debug],
|
|
||||||
[Build Rust code with debugging information [default=no]]),
|
|
||||||
[rust_debug_release=$enableval],
|
|
||||||
[rust_debug_release=release])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING(whether to build Rust code with debugging information)
|
|
||||||
if test "x$rust_debug_release" = "xyes" ; then
|
|
||||||
rust_debug_release=debug
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
fi
|
|
||||||
RUST_TARGET_SUBDIR=${rust_debug_release}
|
|
||||||
AC_SUBST([RUST_TARGET_SUBDIR])
|
|
||||||
])
|
|
||||||
AM_CONDITIONAL(RUST_DEBUG, [test "x$rust_debug_release" = "xdebug"])
|
|
||||||
AM_CONDITIONAL(ENABLE_RUST, [test "$enable_rust" != no])
|
|
||||||
|
|
||||||
AC_ARG_WITH(libarchive,
|
AC_ARG_WITH(libarchive,
|
||||||
AS_HELP_STRING([--without-libarchive], [Do not use libarchive]),
|
AS_HELP_STRING([--without-libarchive], [Do not use libarchive]),
|
||||||
:, with_libarchive=maybe)
|
:, with_libarchive=maybe)
|
||||||
|
|
@ -628,7 +595,6 @@ echo "
|
||||||
|
|
||||||
|
|
||||||
introspection: $found_introspection
|
introspection: $found_introspection
|
||||||
Rust (internal oxidation): $rust_debug_release
|
|
||||||
rofiles-fuse: $enable_rofiles_fuse
|
rofiles-fuse: $enable_rofiles_fuse
|
||||||
HTTP backend: $fetcher_backend
|
HTTP backend: $fetcher_backend
|
||||||
\"ostree trivial-httpd\": $enable_trivial_httpd_cmdline
|
\"ostree trivial-httpd\": $enable_trivial_httpd_cmdline
|
||||||
|
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
Cargo.lock
|
|
||||||
target/
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
[package]
|
|
||||||
name = "bupsplit"
|
|
||||||
version = "0.0.1"
|
|
||||||
authors = ["Colin Walters <walters@verbum.org>"]
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
libc = "0.2"
|
|
||||||
|
|
||||||
[lib]
|
|
||||||
name = "bupsplit_rs"
|
|
||||||
path = "src/bupsplit.rs"
|
|
||||||
crate-type = ["staticlib"]
|
|
||||||
|
|
||||||
[profile.release]
|
|
||||||
panic = "abort"
|
|
||||||
lto = true
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
# This is used after `cargo vendor` is run from `make dist`
|
|
||||||
|
|
||||||
[source.crates-io]
|
|
||||||
registry = 'https://github.com/rust-lang/crates.io-index'
|
|
||||||
replace-with = 'vendored-sources'
|
|
||||||
|
|
||||||
[source.vendored-sources]
|
|
||||||
directory = './vendor'
|
|
||||||
|
|
@ -1,137 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2017 Colin Walters <walters@verbum.org>
|
|
||||||
* Based on original bupsplit.c:
|
|
||||||
* Copyright 2011 Avery Pennarun. All rights reserved.
|
|
||||||
*
|
|
||||||
* (This license applies to bupsplit.c and bupsplit.h only.)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in
|
|
||||||
* the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY AVERY PENNARUN ``AS IS'' AND ANY
|
|
||||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern crate libc;
|
|
||||||
|
|
||||||
use std::slice;
|
|
||||||
|
|
||||||
// According to librsync/rollsum.h:
|
|
||||||
// "We should make this something other than zero to improve the
|
|
||||||
// checksum algorithm: tridge suggests a prime number."
|
|
||||||
// apenwarr: I unscientifically tried 0 and 7919, and they both ended up
|
|
||||||
// slightly worse than the librsync value of 31 for my arbitrary test data.
|
|
||||||
const ROLLSUM_CHAR_OFFSET: u32 = 31;
|
|
||||||
|
|
||||||
// Previously in the header file
|
|
||||||
const BUP_BLOBBITS: u32 = 13;
|
|
||||||
const BUP_BLOBSIZE: u32 = 1 << BUP_BLOBBITS;
|
|
||||||
const BUP_WINDOWBITS: u32 = 7;
|
|
||||||
const BUP_WINDOWSIZE: u32 = 1 << BUP_WINDOWBITS - 1;
|
|
||||||
|
|
||||||
struct Rollsum {
|
|
||||||
s1: u32,
|
|
||||||
s2: u32,
|
|
||||||
window: [u8; BUP_WINDOWSIZE as usize],
|
|
||||||
wofs: i32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Rollsum {
|
|
||||||
pub fn new() -> Rollsum {
|
|
||||||
Rollsum {
|
|
||||||
s1: BUP_WINDOWSIZE * ROLLSUM_CHAR_OFFSET,
|
|
||||||
s2: BUP_WINDOWSIZE * (BUP_WINDOWSIZE - 1) * ROLLSUM_CHAR_OFFSET,
|
|
||||||
window: [0; 64],
|
|
||||||
wofs: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// These formulas are based on rollsum.h in the librsync project.
|
|
||||||
pub fn add(&mut self, drop: u8, add: u8) -> () {
|
|
||||||
let drop_expanded = u32::from(drop);
|
|
||||||
let add_expanded = u32::from(add);
|
|
||||||
self.s1 = self
|
|
||||||
.s1
|
|
||||||
.wrapping_add(add_expanded.wrapping_sub(drop_expanded));
|
|
||||||
self.s2 = self.s2.wrapping_add(
|
|
||||||
self.s1
|
|
||||||
.wrapping_sub(BUP_WINDOWSIZE * (drop_expanded + ROLLSUM_CHAR_OFFSET)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn roll(&mut self, ch: u8) -> () {
|
|
||||||
let wofs = self.wofs as usize;
|
|
||||||
let dval = self.window[wofs];
|
|
||||||
self.add(dval, ch);
|
|
||||||
self.window[wofs] = ch;
|
|
||||||
self.wofs = (self.wofs + 1) % (BUP_WINDOWSIZE as i32);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn digest(&self) -> u32 {
|
|
||||||
(self.s1 << 16) | (self.s2 & 0xFFFF)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn bupsplit_sum(buf: *const u8, ofs: libc::size_t, len: libc::size_t) -> u32 {
|
|
||||||
let sbuf = unsafe {
|
|
||||||
assert!(!buf.is_null());
|
|
||||||
slice::from_raw_parts(buf.offset(ofs as isize), (len - ofs) as usize)
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut r = Rollsum::new();
|
|
||||||
for x in sbuf {
|
|
||||||
r.roll(*x);
|
|
||||||
}
|
|
||||||
r.digest()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn bupsplit_find_ofs(
|
|
||||||
buf: *const u8,
|
|
||||||
len: libc::size_t,
|
|
||||||
bits: *mut libc::c_int,
|
|
||||||
) -> libc::c_int {
|
|
||||||
if buf.is_null() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
let sbuf = unsafe { slice::from_raw_parts(buf, len as usize) };
|
|
||||||
let mut r = Rollsum::new();
|
|
||||||
for x in sbuf {
|
|
||||||
r.roll(*x);
|
|
||||||
if (r.s2 & (BUP_BLOBSIZE - 1)) == ((u32::max_value()) & (BUP_BLOBSIZE - 1)) {
|
|
||||||
if !bits.is_null() {
|
|
||||||
let mut sum = r.digest() >> BUP_BLOBBITS;
|
|
||||||
let mut rbits: libc::c_int = BUP_BLOBBITS as i32;
|
|
||||||
while sum & 1 != 0 {
|
|
||||||
sum >>= 1;
|
|
||||||
rbits += 1;
|
|
||||||
}
|
|
||||||
unsafe {
|
|
||||||
*bits = rbits;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return len as i32;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
0
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue