diff --git a/.woodpecker/build-rel.yml b/.woodpecker/build-rel.yml deleted file mode 100644 index b4b7067..0000000 --- a/.woodpecker/build-rel.yml +++ /dev/null @@ -1,42 +0,0 @@ -matrix: - PLATFORM: - - 'linux/amd64' - -platform: ${PLATFORM} - -when: - branch: [main, dev] - event: [push, tag] - -steps: - build: - image: 'git.rustybever.be/chewing_bever/rieter-builder:1.79-alpine3.19' - commands: - - cargo build --verbose --release - - '[ "$(readelf -d target/release/rieterd | grep NEEDED | wc -l)" = 0 ]' - - publish-dev: - image: 'git.rustybever.be/chewing_bever/rieter-builder:1.79-alpine3.19' - commands: - - apk add --no-cache minio-client - - mcli alias set rb 'https://s3.rustybever.be' "$MINIO_ACCESS_KEY" "$MINIO_SECRET_KEY" - - mcli cp target/release/rieterd "rb/rieter/commits/$CI_COMMIT_SHA/rieterd-$(echo '${PLATFORM}' | sed 's:/:-:g')" - secrets: - - minio_access_key - - minio_secret_key - when: - branch: dev - event: push - - publish-rel: - image: 'curlimages/curl' - commands: - - > - curl -s --fail - --user "Chewing_Bever:$GITEA_PASSWORD" - --upload-file target/release/rieterd - https://git.rustybever.be/api/packages/Chewing_Bever/generic/rieter/"${CI_COMMIT_TAG}"/rieterd-"$(echo '${PLATFORM}' | sed 's:/:-:g')" - secrets: - - gitea_password - when: - event: tag diff --git a/.woodpecker/build.yml b/.woodpecker/build.yml index f179f00..3529154 100644 --- a/.woodpecker/build.yml +++ b/.woodpecker/build.yml @@ -2,20 +2,15 @@ platform: 'linux/amd64' when: branch: - exclude: [dev, main] - event: push + exclude: [main] + event: [push, pull_request] steps: build: - image: 'git.rustybever.be/chewing_bever/rieter-builder:1.79-alpine3.19' + image: 'rust:1.70-alpine3.18' commands: + - apk add --no-cache build-base libarchive libarchive-dev - cargo build --verbose # Binaries, even debug ones, should be statically compiled - '[ "$(readelf -d target/debug/rieterd | grep NEEDED | wc -l)" = 0 ]' - # Clippy also performs a full build, so putting it here saves the CI a - # lot of work - clippy: - image: 'git.rustybever.be/chewing_bever/rieter-builder:1.79-alpine3.19' - commands: - - cargo clippy -- --no-deps -Dwarnings diff --git a/.woodpecker/clippy.yml b/.woodpecker/clippy.yml new file mode 100644 index 0000000..b1c86a7 --- /dev/null +++ b/.woodpecker/clippy.yml @@ -0,0 +1,13 @@ +platform: 'linux/amd64' + +when: + branch: + exclude: [main] + event: push + +steps: + clippy: + image: 'rust:1.70-alpine3.18' + commands: + - rustup component add clippy + - cargo clippy -- --no-deps -Dwarnings diff --git a/.woodpecker/docker.yml b/.woodpecker/docker.yml index 214df4b..0bcdf4a 100644 --- a/.woodpecker/docker.yml +++ b/.woodpecker/docker.yml @@ -1,11 +1,11 @@ platform: 'linux/amd64' when: - branch: [main, dev] - event: [push, tag] + branch: dev + event: push depends_on: - - build-rel + - build steps: dev: @@ -19,9 +19,4 @@ steps: tags: - 'dev' platforms: [ 'linux/amd64' ] - build_args_from_env: - - 'CI_COMMIT_SHA' mtu: 1300 - when: - branch: dev - event: push diff --git a/.woodpecker/lint.yml b/.woodpecker/lint.yml index 2bd567e..4c09bc4 100644 --- a/.woodpecker/lint.yml +++ b/.woodpecker/lint.yml @@ -7,6 +7,7 @@ when: steps: lint: - image: 'git.rustybever.be/chewing_bever/rieter-builder:1.79-alpine3.19' + image: 'rust:1.70-alpine3.18' commands: + - rustup component add rustfmt - cargo fmt -- --check diff --git a/Dockerfile b/Dockerfile index 24031b3..88b51a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,16 @@ -FROM git.rustybever.be/chewing_bever/rieter-builder:1.79-alpine3.19 AS builder +FROM rust:1.70-alpine3.18 AS builder -ARG TARGETPLATFORM -ARG CI_COMMIT_SHA ARG DI_VER=1.2.5 WORKDIR /app RUN apk add --no-cache \ + build-base \ curl \ make \ unzip \ - pkgconf + pkgconf \ + libarchive libarchive-dev # Build dumb-init RUN curl -Lo - "https://github.com/Yelp/dumb-init/archive/refs/tags/v${DI_VER}.tar.gz" | tar -xzf - && \ @@ -21,16 +21,33 @@ RUN curl -Lo - "https://github.com/Yelp/dumb-init/archive/refs/tags/v${DI_VER}.t COPY . . -RUN curl \ - --fail \ - -o rieterd \ - "https://s3.rustybever.be/rieter/commits/${CI_COMMIT_SHA}/rieterd-$(echo "${TARGETPLATFORM}" | sed 's:/:-:g')" +# ENV LIBARCHIVE_STATIC=1 \ +# LIBARCHIVE_LIB_DIR=/usr/lib \ +# LIBARCHIVE_INCLUDE_DIR=/usr/include \ +# LIBARCHIVE_LDFLAGS='-lssl -lcrypto -L/lib -lz -lbz2 -llzma -lexpat -lzstd -llz4' + # LIBARCHIVE_LDFLAGS='-L/usr/lib -lz -lbz2 -llzma -lexpat -lzstd -llz4 -lsqlite3' + +# https://users.rust-lang.org/t/sigsegv-with-program-linked-against-openssl-in-an-alpine-container/52172 +ENV RUSTFLAGS='-C target-feature=-crt-static' + +RUN cargo build --release && \ + du -h target/release/rieterd && \ + readelf -d target/release/rieterd && \ + chmod +x target/release/rieterd -FROM alpine:3.19 +FROM alpine:3.18 + +RUN apk add --no-cache \ + libgcc \ + libarchive \ + openssl COPY --from=builder /app/dumb-init /bin/dumb-init -COPY --from=builder /app/rieterd /bin/rieterd +COPY --from=builder /app/target/release/rieterd /bin/rieterd + +ENV RIETER_PKG_DIR=/data/pkgs \ + RIETER_DATA_DIR=/data WORKDIR /data diff --git a/build.Dockerfile b/build.Dockerfile deleted file mode 100644 index 177b462..0000000 --- a/build.Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -# Command to build and push builder image (change tags as necessary): -# docker buildx build -f build.Dockerfile -t git.rustybever.be/chewing_bever/rieter-builder:1.79-alpine3.19 --platform linux/amd64,linux/arm64 --push . -FROM rust:1.79-alpine3.19 - -# Dependencies required to statically compile libarchive and libsqlite3 -RUN apk add --no-cache \ - build-base \ - libarchive-static libarchive-dev \ - zlib-static \ - openssl-libs-static \ - bzip2-static \ - xz-static \ - expat-static \ - zstd-static \ - lz4-static \ - acl-static && \ - rustup component add clippy rustfmt - -# Tell the libarchive3-sys package to statically link libarchive -ENV LIBARCHIVE_STATIC=1 diff --git a/libarchive/src/archive.rs b/libarchive/src/archive.rs index 932013b..3369a44 100644 --- a/libarchive/src/archive.rs +++ b/libarchive/src/archive.rs @@ -386,7 +386,6 @@ pub enum ExtractOption { ClearNoChangeFFlags, } -#[derive(Default)] pub struct ExtractOptions { pub flags: i32, } @@ -421,3 +420,9 @@ impl ExtractOptions { self } } + +impl Default for ExtractOptions { + fn default() -> ExtractOptions { + ExtractOptions { flags: 0 } + } +} diff --git a/libarchive/src/read/builder.rs b/libarchive/src/read/builder.rs index 4af0401..e827130 100644 --- a/libarchive/src/read/builder.rs +++ b/libarchive/src/read/builder.rs @@ -78,7 +78,7 @@ impl Builder { ffi::archive_read_support_filter_program_signature( self.handle_mut(), c_prog.as_ptr(), - mem::transmute::, *const std::ffi::c_void>(cb), + mem::transmute(cb), size, ) } diff --git a/libarchive/src/write/file.rs b/libarchive/src/write/file.rs index ef4877d..fa39a13 100644 --- a/libarchive/src/write/file.rs +++ b/libarchive/src/write/file.rs @@ -41,7 +41,7 @@ impl FileWriter { unsafe { match ffi::archive_write_header(self.handle_mut(), entry.entry_mut()) { ffi::ARCHIVE_OK => Ok(()), - _ => Err(ArchiveError::from(self as &dyn Handle)), + _ => Err(ArchiveError::from(self as &dyn Handle).into()), } } } @@ -50,7 +50,7 @@ impl FileWriter { unsafe { match ffi::archive_write_header(self.handle_mut(), entry.entry_mut()) { ffi::ARCHIVE_OK => (), - _ => return Err(ArchiveError::from(self as &dyn Handle)), + _ => return Err(ArchiveError::from(self as &dyn Handle).into()), } } @@ -74,7 +74,7 @@ impl FileWriter { // Negative values signal errors if res < 0 { - return Err(ArchiveError::from(self as &dyn Handle)); + return Err(ArchiveError::from(self as &dyn Handle).into()); } written += usize::try_from(res).unwrap(); diff --git a/libarchive/src/write/mod.rs b/libarchive/src/write/mod.rs index b64aadf..5f583e0 100644 --- a/libarchive/src/write/mod.rs +++ b/libarchive/src/write/mod.rs @@ -30,12 +30,6 @@ impl Entry for WriteEntry { } } -impl Default for WriteEntry { - fn default() -> Self { - Self::new() - } -} - impl Drop for WriteEntry { fn drop(&mut self) { unsafe { ffi::archive_entry_free(self.entry_mut()) } diff --git a/libarchive3-sys/README.md b/libarchive3-sys/README.md index a1467c0..bd605ef 100644 --- a/libarchive3-sys/README.md +++ b/libarchive3-sys/README.md @@ -4,7 +4,3 @@ DYLD_LIBRARY_PATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib xcode-select --install - -# 64-bit timestamps - -`time_t` has been replaced with `i64` as Musl no longer supports 32-bit `time_t` values. diff --git a/libarchive3-sys/build.rs b/libarchive3-sys/build.rs index afe10d9..43d83e7 100644 --- a/libarchive3-sys/build.rs +++ b/libarchive3-sys/build.rs @@ -1,6 +1,35 @@ +extern crate pkg_config; + +use std::env; + fn main() { - pkg_config::Config::new() - .atleast_version("3") - .probe("libarchive") - .unwrap(); + let lib_dir = env::var("LIBARCHIVE_LIB_DIR").ok(); + let include_dir = env::var("LIBARCHIVE_INCLUDE_DIR").ok(); + + if lib_dir.is_some() && include_dir.is_some() { + println!("cargo:rustc-flags=-L native={}", lib_dir.unwrap()); + println!("cargo:include={}", include_dir.unwrap()); + let mode = match env::var_os("LIBARCHIVE_STATIC") { + Some(_) => "static", + None => "dylib", + }; + println!("cargo:rustc-flags=-l {0}=archive", mode); + + if mode == "static" { + if let Ok(ldflags) = env::var("LIBARCHIVE_LDFLAGS") { + for token in ldflags.split_whitespace() { + if token.starts_with("-L") { + println!("cargo:rustc-flags=-L native={}", token.replace("-L", "")); + } else if token.starts_with("-l") { + println!("cargo:rustc-flags=-l static={}", token.replace("-l", "")); + } + } + } + } + } else { + match pkg_config::find_library("libarchive") { + Ok(_) => (), + Err(msg) => panic!("Unable to locate libarchive, err={:?}", msg), + } + } } diff --git a/libarchive3-sys/src/ffi.rs b/libarchive3-sys/src/ffi.rs index f5ad4cf..92cd267 100644 --- a/libarchive3-sys/src/ffi.rs +++ b/libarchive3-sys/src/ffi.rs @@ -294,10 +294,14 @@ extern "C" { ) -> c_int; pub fn archive_read_extract_set_progress_callback( arg1: *mut Struct_archive, - _progress_func: ::std::option::Option, + _progress_func: ::std::option::Option ()>, _user_data: *mut c_void, - ); - pub fn archive_read_extract_set_skip_file(arg1: *mut Struct_archive, arg2: i64, arg3: i64); + ) -> (); + pub fn archive_read_extract_set_skip_file( + arg1: *mut Struct_archive, + arg2: i64, + arg3: i64, + ) -> (); pub fn archive_read_close(arg1: *mut Struct_archive) -> c_int; pub fn archive_read_free(arg1: *mut Struct_archive) -> c_int; pub fn archive_read_finish(arg1: *mut Struct_archive) -> c_int; @@ -439,7 +443,7 @@ extern "C" { arg3: ::std::option::Option< unsafe extern "C" fn(arg1: *mut c_void, arg2: *const c_char, arg3: i64) -> i64, >, - arg4: ::std::option::Option, + arg4: ::std::option::Option ()>, ) -> c_int; pub fn archive_write_disk_set_user_lookup( arg1: *mut Struct_archive, @@ -447,7 +451,7 @@ extern "C" { arg3: ::std::option::Option< unsafe extern "C" fn(arg1: *mut c_void, arg2: *const c_char, arg3: i64) -> i64, >, - arg4: ::std::option::Option, + arg4: ::std::option::Option ()>, ) -> c_int; pub fn archive_write_disk_gid(arg1: *mut Struct_archive, arg2: *const c_char, arg3: i64) -> i64; @@ -471,7 +475,7 @@ extern "C" { arg3: ::std::option::Option< unsafe extern "C" fn(arg1: *mut c_void, arg2: i64) -> *const c_char, >, - arg4: ::std::option::Option, + arg4: ::std::option::Option ()>, ) -> c_int; pub fn archive_read_disk_set_uname_lookup( arg1: *mut Struct_archive, @@ -479,7 +483,7 @@ extern "C" { arg3: ::std::option::Option< unsafe extern "C" fn(arg1: *mut c_void, arg2: i64) -> *const c_char, >, - arg4: ::std::option::Option, + arg4: ::std::option::Option ()>, ) -> c_int; pub fn archive_read_disk_open(arg1: *mut Struct_archive, arg2: *const c_char) -> c_int; pub fn archive_read_disk_open_w(arg1: *mut Struct_archive, arg2: *const wchar_t) -> c_int; @@ -498,7 +502,7 @@ extern "C" { arg1: *mut Struct_archive, arg2: *mut c_void, arg3: *mut Struct_archive_entry, - ), + ) -> (), >, _client_data: *mut c_void, ) -> c_int; @@ -525,9 +529,10 @@ extern "C" { pub fn archive_error_string(arg1: *mut Struct_archive) -> *const c_char; pub fn archive_format_name(arg1: *mut Struct_archive) -> *const c_char; pub fn archive_format(arg1: *mut Struct_archive) -> c_int; - pub fn archive_clear_error(arg1: *mut Struct_archive); - pub fn archive_set_error(arg1: *mut Struct_archive, _err: c_int, fmt: *const c_char, ...); - pub fn archive_copy_error(dest: *mut Struct_archive, src: *mut Struct_archive); + pub fn archive_clear_error(arg1: *mut Struct_archive) -> (); + pub fn archive_set_error(arg1: *mut Struct_archive, _err: c_int, fmt: *const c_char, ...) + -> (); + pub fn archive_copy_error(dest: *mut Struct_archive, src: *mut Struct_archive) -> (); pub fn archive_file_count(arg1: *mut Struct_archive) -> c_int; pub fn archive_match_new() -> *mut Struct_archive; pub fn archive_match_free(arg1: *mut Struct_archive) -> c_int; @@ -585,7 +590,7 @@ extern "C" { pub fn archive_match_include_time( arg1: *mut Struct_archive, _flag: c_int, - _sec: i64, + _sec: time_t, _nsec: c_long, ) -> c_int; pub fn archive_match_include_date( @@ -625,16 +630,16 @@ extern "C" { pub fn archive_match_include_gname_w(arg1: *mut Struct_archive, arg2: *const wchar_t) -> c_int; pub fn archive_entry_clear(arg1: *mut Struct_archive_entry) -> *mut Struct_archive_entry; pub fn archive_entry_clone(arg1: *mut Struct_archive_entry) -> *mut Struct_archive_entry; - pub fn archive_entry_free(arg1: *mut Struct_archive_entry); + pub fn archive_entry_free(arg1: *mut Struct_archive_entry) -> (); pub fn archive_entry_new() -> *mut Struct_archive_entry; pub fn archive_entry_new2(arg1: *mut Struct_archive) -> *mut Struct_archive_entry; - pub fn archive_entry_atime(arg1: *mut Struct_archive_entry) -> i64; + pub fn archive_entry_atime(arg1: *mut Struct_archive_entry) -> time_t; pub fn archive_entry_atime_nsec(arg1: *mut Struct_archive_entry) -> c_long; pub fn archive_entry_atime_is_set(arg1: *mut Struct_archive_entry) -> c_int; - pub fn archive_entry_birthtime(arg1: *mut Struct_archive_entry) -> i64; + pub fn archive_entry_birthtime(arg1: *mut Struct_archive_entry) -> time_t; pub fn archive_entry_birthtime_nsec(arg1: *mut Struct_archive_entry) -> c_long; pub fn archive_entry_birthtime_is_set(arg1: *mut Struct_archive_entry) -> c_int; - pub fn archive_entry_ctime(arg1: *mut Struct_archive_entry) -> i64; + pub fn archive_entry_ctime(arg1: *mut Struct_archive_entry) -> time_t; pub fn archive_entry_ctime_nsec(arg1: *mut Struct_archive_entry) -> c_long; pub fn archive_entry_ctime_is_set(arg1: *mut Struct_archive_entry) -> c_int; pub fn archive_entry_dev(arg1: *mut Struct_archive_entry) -> dev_t; @@ -646,7 +651,7 @@ extern "C" { arg1: *mut Struct_archive_entry, arg2: *mut c_ulong, arg3: *mut c_ulong, - ); + ) -> (); pub fn archive_entry_fflags_text(arg1: *mut Struct_archive_entry) -> *const c_char; pub fn archive_entry_gid(arg1: *mut Struct_archive_entry) -> i64; pub fn archive_entry_gname(arg1: *mut Struct_archive_entry) -> *const c_char; @@ -657,7 +662,7 @@ extern "C" { pub fn archive_entry_ino64(arg1: *mut Struct_archive_entry) -> i64; pub fn archive_entry_ino_is_set(arg1: *mut Struct_archive_entry) -> c_int; pub fn archive_entry_mode(arg1: *mut Struct_archive_entry) -> mode_t; - pub fn archive_entry_mtime(arg1: *mut Struct_archive_entry) -> i64; + pub fn archive_entry_mtime(arg1: *mut Struct_archive_entry) -> time_t; pub fn archive_entry_mtime_nsec(arg1: *mut Struct_archive_entry) -> c_long; pub fn archive_entry_mtime_is_set(arg1: *mut Struct_archive_entry) -> c_int; pub fn archive_entry_nlink(arg1: *mut Struct_archive_entry) -> c_uint; @@ -677,17 +682,33 @@ extern "C" { pub fn archive_entry_uid(arg1: *mut Struct_archive_entry) -> i64; pub fn archive_entry_uname(arg1: *mut Struct_archive_entry) -> *const c_char; pub fn archive_entry_uname_w(arg1: *mut Struct_archive_entry) -> *const wchar_t; - pub fn archive_entry_set_atime(arg1: *mut Struct_archive_entry, arg2: i64, arg3: c_long); - pub fn archive_entry_unset_atime(arg1: *mut Struct_archive_entry); - pub fn archive_entry_set_birthtime(arg1: *mut Struct_archive_entry, arg2: i64, arg3: c_long); - pub fn archive_entry_unset_birthtime(arg1: *mut Struct_archive_entry); - pub fn archive_entry_set_ctime(arg1: *mut Struct_archive_entry, arg2: i64, arg3: c_long); - pub fn archive_entry_unset_ctime(arg1: *mut Struct_archive_entry); - pub fn archive_entry_set_dev(arg1: *mut Struct_archive_entry, arg2: dev_t); - pub fn archive_entry_set_devmajor(arg1: *mut Struct_archive_entry, arg2: dev_t); - pub fn archive_entry_set_devminor(arg1: *mut Struct_archive_entry, arg2: dev_t); - pub fn archive_entry_set_filetype(arg1: *mut Struct_archive_entry, arg2: c_uint); - pub fn archive_entry_set_fflags(arg1: *mut Struct_archive_entry, arg2: c_ulong, arg3: c_ulong); + pub fn archive_entry_set_atime( + arg1: *mut Struct_archive_entry, + arg2: time_t, + arg3: c_long, + ) -> (); + pub fn archive_entry_unset_atime(arg1: *mut Struct_archive_entry) -> (); + pub fn archive_entry_set_birthtime( + arg1: *mut Struct_archive_entry, + arg2: time_t, + arg3: c_long, + ) -> (); + pub fn archive_entry_unset_birthtime(arg1: *mut Struct_archive_entry) -> (); + pub fn archive_entry_set_ctime( + arg1: *mut Struct_archive_entry, + arg2: time_t, + arg3: c_long, + ) -> (); + pub fn archive_entry_unset_ctime(arg1: *mut Struct_archive_entry) -> (); + pub fn archive_entry_set_dev(arg1: *mut Struct_archive_entry, arg2: dev_t) -> (); + pub fn archive_entry_set_devmajor(arg1: *mut Struct_archive_entry, arg2: dev_t) -> (); + pub fn archive_entry_set_devminor(arg1: *mut Struct_archive_entry, arg2: dev_t) -> (); + pub fn archive_entry_set_filetype(arg1: *mut Struct_archive_entry, arg2: c_uint) -> (); + pub fn archive_entry_set_fflags( + arg1: *mut Struct_archive_entry, + arg2: c_ulong, + arg3: c_ulong, + ) -> (); pub fn archive_entry_copy_fflags_text( arg1: *mut Struct_archive_entry, arg2: *const c_char, @@ -696,60 +717,79 @@ extern "C" { arg1: *mut Struct_archive_entry, arg2: *const wchar_t, ) -> *const wchar_t; - pub fn archive_entry_set_gid(arg1: *mut Struct_archive_entry, arg2: i64); - pub fn archive_entry_set_gname(arg1: *mut Struct_archive_entry, arg2: *const c_char); - pub fn archive_entry_copy_gname(arg1: *mut Struct_archive_entry, arg2: *const c_char); - pub fn archive_entry_copy_gname_w(arg1: *mut Struct_archive_entry, arg2: *const wchar_t); + pub fn archive_entry_set_gid(arg1: *mut Struct_archive_entry, arg2: i64) -> (); + pub fn archive_entry_set_gname(arg1: *mut Struct_archive_entry, arg2: *const c_char) -> (); + pub fn archive_entry_copy_gname(arg1: *mut Struct_archive_entry, arg2: *const c_char) -> (); + pub fn archive_entry_copy_gname_w(arg1: *mut Struct_archive_entry, arg2: *const wchar_t) -> (); pub fn archive_entry_update_gname_utf8( arg1: *mut Struct_archive_entry, arg2: *const c_char, ) -> c_int; - pub fn archive_entry_set_hardlink(arg1: *mut Struct_archive_entry, arg2: *const c_char); - pub fn archive_entry_copy_hardlink(arg1: *mut Struct_archive_entry, arg2: *const c_char); - pub fn archive_entry_copy_hardlink_w(arg1: *mut Struct_archive_entry, arg2: *const wchar_t); + pub fn archive_entry_set_hardlink(arg1: *mut Struct_archive_entry, arg2: *const c_char) -> (); + pub fn archive_entry_copy_hardlink(arg1: *mut Struct_archive_entry, arg2: *const c_char) -> (); + pub fn archive_entry_copy_hardlink_w( + arg1: *mut Struct_archive_entry, + arg2: *const wchar_t, + ) -> (); pub fn archive_entry_update_hardlink_utf8( arg1: *mut Struct_archive_entry, arg2: *const c_char, ) -> c_int; - pub fn archive_entry_set_ino(arg1: *mut Struct_archive_entry, arg2: i64); - pub fn archive_entry_set_ino64(arg1: *mut Struct_archive_entry, arg2: i64); - pub fn archive_entry_set_link(arg1: *mut Struct_archive_entry, arg2: *const c_char); - pub fn archive_entry_copy_link(arg1: *mut Struct_archive_entry, arg2: *const c_char); - pub fn archive_entry_copy_link_w(arg1: *mut Struct_archive_entry, arg2: *const wchar_t); + pub fn archive_entry_set_ino(arg1: *mut Struct_archive_entry, arg2: i64) -> (); + pub fn archive_entry_set_ino64(arg1: *mut Struct_archive_entry, arg2: i64) -> (); + pub fn archive_entry_set_link(arg1: *mut Struct_archive_entry, arg2: *const c_char) -> (); + pub fn archive_entry_copy_link(arg1: *mut Struct_archive_entry, arg2: *const c_char) -> (); + pub fn archive_entry_copy_link_w(arg1: *mut Struct_archive_entry, arg2: *const wchar_t) -> (); pub fn archive_entry_update_link_utf8( arg1: *mut Struct_archive_entry, arg2: *const c_char, ) -> c_int; - pub fn archive_entry_set_mode(arg1: *mut Struct_archive_entry, arg2: mode_t); - pub fn archive_entry_set_mtime(arg1: *mut Struct_archive_entry, arg2: i64, arg3: c_long); - pub fn archive_entry_unset_mtime(arg1: *mut Struct_archive_entry); - pub fn archive_entry_set_nlink(arg1: *mut Struct_archive_entry, arg2: c_uint); - pub fn archive_entry_set_pathname(arg1: *mut Struct_archive_entry, arg2: *const c_char); - pub fn archive_entry_copy_pathname(arg1: *mut Struct_archive_entry, arg2: *const c_char); - pub fn archive_entry_copy_pathname_w(arg1: *mut Struct_archive_entry, arg2: *const wchar_t); + pub fn archive_entry_set_mode(arg1: *mut Struct_archive_entry, arg2: mode_t) -> (); + pub fn archive_entry_set_mtime( + arg1: *mut Struct_archive_entry, + arg2: time_t, + arg3: c_long, + ) -> (); + pub fn archive_entry_unset_mtime(arg1: *mut Struct_archive_entry) -> (); + pub fn archive_entry_set_nlink(arg1: *mut Struct_archive_entry, arg2: c_uint) -> (); + pub fn archive_entry_set_pathname(arg1: *mut Struct_archive_entry, arg2: *const c_char) -> (); + pub fn archive_entry_copy_pathname(arg1: *mut Struct_archive_entry, arg2: *const c_char) -> (); + pub fn archive_entry_copy_pathname_w( + arg1: *mut Struct_archive_entry, + arg2: *const wchar_t, + ) -> (); pub fn archive_entry_update_pathname_utf8( arg1: *mut Struct_archive_entry, arg2: *const c_char, ) -> c_int; - pub fn archive_entry_set_perm(arg1: *mut Struct_archive_entry, arg2: mode_t); - pub fn archive_entry_set_rdev(arg1: *mut Struct_archive_entry, arg2: dev_t); - pub fn archive_entry_set_rdevmajor(arg1: *mut Struct_archive_entry, arg2: dev_t); - pub fn archive_entry_set_rdevminor(arg1: *mut Struct_archive_entry, arg2: dev_t); - pub fn archive_entry_set_size(arg1: *mut Struct_archive_entry, arg2: i64); - pub fn archive_entry_unset_size(arg1: *mut Struct_archive_entry); - pub fn archive_entry_copy_sourcepath(arg1: *mut Struct_archive_entry, arg2: *const c_char); - pub fn archive_entry_copy_sourcepath_w(arg1: *mut Struct_archive_entry, arg2: *const wchar_t); - pub fn archive_entry_set_symlink(arg1: *mut Struct_archive_entry, arg2: *const c_char); - pub fn archive_entry_copy_symlink(arg1: *mut Struct_archive_entry, arg2: *const c_char); - pub fn archive_entry_copy_symlink_w(arg1: *mut Struct_archive_entry, arg2: *const wchar_t); + pub fn archive_entry_set_perm(arg1: *mut Struct_archive_entry, arg2: mode_t) -> (); + pub fn archive_entry_set_rdev(arg1: *mut Struct_archive_entry, arg2: dev_t) -> (); + pub fn archive_entry_set_rdevmajor(arg1: *mut Struct_archive_entry, arg2: dev_t) -> (); + pub fn archive_entry_set_rdevminor(arg1: *mut Struct_archive_entry, arg2: dev_t) -> (); + pub fn archive_entry_set_size(arg1: *mut Struct_archive_entry, arg2: i64) -> (); + pub fn archive_entry_unset_size(arg1: *mut Struct_archive_entry) -> (); + pub fn archive_entry_copy_sourcepath( + arg1: *mut Struct_archive_entry, + arg2: *const c_char, + ) -> (); + pub fn archive_entry_copy_sourcepath_w( + arg1: *mut Struct_archive_entry, + arg2: *const wchar_t, + ) -> (); + pub fn archive_entry_set_symlink(arg1: *mut Struct_archive_entry, arg2: *const c_char) -> (); + pub fn archive_entry_copy_symlink(arg1: *mut Struct_archive_entry, arg2: *const c_char) -> (); + pub fn archive_entry_copy_symlink_w( + arg1: *mut Struct_archive_entry, + arg2: *const wchar_t, + ) -> (); pub fn archive_entry_update_symlink_utf8( arg1: *mut Struct_archive_entry, arg2: *const c_char, ) -> c_int; - pub fn archive_entry_set_uid(arg1: *mut Struct_archive_entry, arg2: i64); - pub fn archive_entry_set_uname(arg1: *mut Struct_archive_entry, arg2: *const c_char); - pub fn archive_entry_copy_uname(arg1: *mut Struct_archive_entry, arg2: *const c_char); - pub fn archive_entry_copy_uname_w(arg1: *mut Struct_archive_entry, arg2: *const wchar_t); + pub fn archive_entry_set_uid(arg1: *mut Struct_archive_entry, arg2: i64) -> (); + pub fn archive_entry_set_uname(arg1: *mut Struct_archive_entry, arg2: *const c_char) -> (); + pub fn archive_entry_copy_uname(arg1: *mut Struct_archive_entry, arg2: *const c_char) -> (); + pub fn archive_entry_copy_uname_w(arg1: *mut Struct_archive_entry, arg2: *const wchar_t) -> (); pub fn archive_entry_update_uname_utf8( arg1: *mut Struct_archive_entry, arg2: *const c_char, @@ -757,7 +797,7 @@ extern "C" { // pub fn archive_entry_stat(arg1: *mut Struct_archive_entry) -> *const Struct_stat; // pub fn archive_entry_copy_stat(arg1: *mut Struct_archive_entry, // arg2: *const Struct_stat) - // ; + // -> (); pub fn archive_entry_mac_metadata( arg1: *mut Struct_archive_entry, arg2: *mut size_t, @@ -766,8 +806,8 @@ extern "C" { arg1: *mut Struct_archive_entry, arg2: *const c_void, arg3: size_t, - ); - pub fn archive_entry_acl_clear(arg1: *mut Struct_archive_entry); + ) -> (); + pub fn archive_entry_acl_clear(arg1: *mut Struct_archive_entry) -> (); pub fn archive_entry_acl_add_entry( arg1: *mut Struct_archive_entry, arg2: c_int, @@ -808,13 +848,13 @@ extern "C" { pub fn archive_entry_acl_text(arg1: *mut Struct_archive_entry, arg2: c_int) -> *const c_char; pub fn archive_entry_acl_count(arg1: *mut Struct_archive_entry, arg2: c_int) -> c_int; pub fn archive_entry_acl(arg1: *mut Struct_archive_entry) -> *mut Struct_archive_acl; - pub fn archive_entry_xattr_clear(arg1: *mut Struct_archive_entry); + pub fn archive_entry_xattr_clear(arg1: *mut Struct_archive_entry) -> (); pub fn archive_entry_xattr_add_entry( arg1: *mut Struct_archive_entry, arg2: *const c_char, arg3: *const c_void, arg4: size_t, - ); + ) -> (); pub fn archive_entry_xattr_count(arg1: *mut Struct_archive_entry) -> c_int; pub fn archive_entry_xattr_reset(arg1: *mut Struct_archive_entry) -> c_int; pub fn archive_entry_xattr_next( @@ -823,8 +863,12 @@ extern "C" { arg3: *mut *const c_void, arg4: *mut size_t, ) -> c_int; - pub fn archive_entry_sparse_clear(arg1: *mut Struct_archive_entry); - pub fn archive_entry_sparse_add_entry(arg1: *mut Struct_archive_entry, arg2: i64, arg3: i64); + pub fn archive_entry_sparse_clear(arg1: *mut Struct_archive_entry) -> (); + pub fn archive_entry_sparse_add_entry( + arg1: *mut Struct_archive_entry, + arg2: i64, + arg3: i64, + ) -> (); pub fn archive_entry_sparse_count(arg1: *mut Struct_archive_entry) -> c_int; pub fn archive_entry_sparse_reset(arg1: *mut Struct_archive_entry) -> c_int; pub fn archive_entry_sparse_next( @@ -836,13 +880,13 @@ extern "C" { pub fn archive_entry_linkresolver_set_strategy( arg1: *mut Struct_archive_entry_linkresolver, arg2: c_int, - ); - pub fn archive_entry_linkresolver_free(arg1: *mut Struct_archive_entry_linkresolver); + ) -> (); + pub fn archive_entry_linkresolver_free(arg1: *mut Struct_archive_entry_linkresolver) -> (); pub fn archive_entry_linkify( arg1: *mut Struct_archive_entry_linkresolver, arg2: *mut *mut Struct_archive_entry, arg3: *mut *mut Struct_archive_entry, - ); + ) -> (); pub fn archive_entry_partial_links( res: *mut Struct_archive_entry_linkresolver, links: *mut c_uint, diff --git a/server/src/db/mod.rs b/server/src/db/mod.rs index 2b03fb1..a1b7476 100644 --- a/server/src/db/mod.rs +++ b/server/src/db/mod.rs @@ -88,7 +88,7 @@ pub async fn connect(conn: &DbConfig) -> crate::Result { } => { let mut url = format!("postgres://{}:{}@{}:{}/{}", user, password, host, port, db); - if !schema.is_empty() { + if schema != "" { url = format!("{url}?currentSchema={schema}"); } diff --git a/server/src/main.rs b/server/src/main.rs index 7118da5..c641666 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -16,8 +16,8 @@ use sea_orm_migration::MigratorTrait; use tokio::runtime; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; -pub const ANY_ARCH: &str = "any"; -pub const PKG_FILENAME_REGEX: &str = "^([a-z0-9@._+-]+)-((?:[0-9]+:)?[a-zA-Z0-9@._+]+-[0-9]+)-([a-zA-z0-9_]+).pkg.tar.([a-zA-Z0-9]+)$"; +pub const ANY_ARCH: &'static str = "any"; +pub const PKG_FILENAME_REGEX: &'static str = "^([a-z0-9@._+-]+)-((?:[0-9]+:)?[a-zA-Z0-9@._+]+-[0-9]+)-([a-zA-z0-9_]+).pkg.tar.([a-zA-Z0-9]+)$"; #[derive(Clone)] pub struct Global { diff --git a/server/src/repo/archive.rs b/server/src/repo/archive.rs index 18e0801..2844b90 100644 --- a/server/src/repo/archive.rs +++ b/server/src/repo/archive.rs @@ -216,8 +216,8 @@ impl RepoArchivesWriter { self.ar_db.close()?; self.ar_files.close()?; - let _ = std::fs::remove_file(&self.tmp_paths[0]); - let _ = std::fs::remove_file(&self.tmp_paths[1]); + let _ = std::fs::remove_file(&self.tmp_paths[0])?; + let _ = std::fs::remove_file(&self.tmp_paths[1])?; Ok(()) } diff --git a/server/src/repo/mod.rs b/server/src/repo/mod.rs index 25325c6..9920326 100644 --- a/server/src/repo/mod.rs +++ b/server/src/repo/mod.rs @@ -29,14 +29,12 @@ pub enum Command { Clean, } -type RepoState = (AtomicU32, Arc>); - pub struct SharedState { pub repos_dir: PathBuf, pub conn: DbConn, pub rx: Mutex>, pub tx: UnboundedSender, - pub repos: RwLock>, + pub repos: RwLock>)>>, } impl SharedState { diff --git a/server/src/repo/package.rs b/server/src/repo/package.rs index 103a521..e8bb076 100644 --- a/server/src/repo/package.rs +++ b/server/src/repo/package.rs @@ -48,18 +48,18 @@ pub struct PkgInfo { } #[derive(Debug, PartialEq, Eq)] -pub enum InvalidPkgInfoError { - Size, - BuildDate, - PgpSigSize, +pub enum ParsePkgInfoError { + InvalidSize, + InvalidBuildDate, + InvalidPgpSigSize, } -impl fmt::Display for InvalidPkgInfoError { +impl fmt::Display for ParsePkgInfoError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let s = match self { - Self::Size => "invalid size", - Self::BuildDate => "invalid build date", - Self::PgpSigSize => "invalid pgp sig size", + Self::InvalidSize => "invalid size", + Self::InvalidBuildDate => "invalid build date", + Self::InvalidPgpSigSize => "invalid pgp sig size", }; write!(f, "{}", s) @@ -67,7 +67,7 @@ impl fmt::Display for InvalidPkgInfoError { } impl PkgInfo { - pub fn extend>(&mut self, line: S) -> Result<(), InvalidPkgInfoError> { + pub fn extend>(&mut self, line: S) -> Result<(), ParsePkgInfoError> { let line = line.as_ref(); if !line.starts_with('#') { @@ -77,21 +77,26 @@ impl PkgInfo { "pkgbase" => self.base = value.to_string(), "pkgver" => self.version = value.to_string(), "pkgdesc" => self.description = Some(value.to_string()), - "size" => self.size = value.parse().map_err(|_| InvalidPkgInfoError::Size)?, + "size" => { + self.size = value.parse().map_err(|_| ParsePkgInfoError::InvalidSize)? + } "url" => self.url = Some(value.to_string()), "arch" => self.arch = value.to_string(), "builddate" => { - let seconds: i64 = - value.parse().map_err(|_| InvalidPkgInfoError::BuildDate)?; - self.build_date = chrono::DateTime::from_timestamp_millis(seconds * 1000) - .ok_or(InvalidPkgInfoError::BuildDate)? - .naive_utc(); + let seconds: i64 = value + .parse() + .map_err(|_| ParsePkgInfoError::InvalidBuildDate)?; + self.build_date = NaiveDateTime::from_timestamp_millis(seconds * 1000) + .ok_or(ParsePkgInfoError::InvalidBuildDate)? } "packager" => self.packager = Some(value.to_string()), "pgpsig" => self.pgpsig = Some(value.to_string()), "pgpsigsize" => { - self.pgpsigsize = - Some(value.parse().map_err(|_| InvalidPkgInfoError::PgpSigSize)?) + self.pgpsigsize = Some( + value + .parse() + .map_err(|_| ParsePkgInfoError::InvalidPgpSigSize)?, + ) } "group" => self.groups.push(value.to_string()), "license" => self.licenses.push(value.to_string()), diff --git a/server/src/web/repo.rs b/server/src/web/repo.rs index e1bc61a..c3bfe6b 100644 --- a/server/src/web/repo.rs +++ b/server/src/web/repo.rs @@ -131,8 +131,8 @@ async fn delete_arch_repo( } async fn delete_package( - State(_global): State, - Path((_distro, _repo, _arch, _pkg_name)): Path<(String, String, String, String)>, + State(global): State, + Path((distro, repo, arch, pkg_name)): Path<(String, String, String, String)>, ) -> crate::Result { Ok(StatusCode::NOT_FOUND) //if let Some(mgr) = global.mgr.get_mgr(&distro).await {