[INFO] cloning repository https://github.com/Tankanow/6-disc-changer [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/Tankanow/6-disc-changer" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FTankanow%2F6-disc-changer", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FTankanow%2F6-disc-changer'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] b63fd81d0d4c4a4d7460b507a6bb4c33518a8621 [INFO] linting Tankanow/6-disc-changer against nightly for clippy-nonminimal_bool-denied [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FTankanow%2F6-disc-changer" "/workspace/builds/worker-1-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-1-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/Tankanow/6-disc-changer [INFO] finished tweaking git repo https://github.com/Tankanow/6-disc-changer [INFO] tweaked toml for git repo https://github.com/Tankanow/6-disc-changer written to /workspace/builds/worker-1-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/Tankanow/6-disc-changer on toolchain nightly [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/Tankanow/6-disc-changer already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded aws-smithy-eventstream v0.55.3 [INFO] [stderr] Downloaded aws-smithy-http-tower v0.55.3 [INFO] [stderr] Downloaded memo-map v0.3.3 [INFO] [stderr] Downloaded aws-types v0.55.3 [INFO] [stderr] Downloaded aws-smithy-client v0.55.3 [INFO] [stderr] Downloaded aws-smithy-async v0.55.3 [INFO] [stderr] Downloaded aws-smithy-query v0.55.3 [INFO] [stderr] Downloaded aws-smithy-types v0.55.3 [INFO] [stderr] Downloaded aws-endpoint v0.55.3 [INFO] [stderr] Downloaded aws-sig-auth v0.55.3 [INFO] [stderr] Downloaded aws-smithy-checksums v0.55.3 [INFO] [stderr] Downloaded aws-smithy-json v0.55.3 [INFO] [stderr] Downloaded aws-http v0.55.3 [INFO] [stderr] Downloaded aws-sigv4 v0.55.3 [INFO] [stderr] Downloaded aws-sdk-sso v0.28.0 [INFO] [stderr] Downloaded aws-smithy-http v0.55.3 [INFO] [stderr] Downloaded aws-config v0.55.3 [INFO] [stderr] Downloaded aws-credential-types v0.55.3 [INFO] [stderr] Downloaded minijinja v2.10.2 [INFO] [stderr] Downloaded aws-smithy-xml v0.55.3 [INFO] [stderr] Downloaded aws-sdk-sts v0.28.0 [INFO] [stderr] Downloaded aws-sdk-s3 v0.28.0 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 9a3757038427c8620b748fdbc65e526cbf7ada92b5f30e7283f15a44ad179b14 [INFO] running `Command { std: "docker" "start" "-a" "9a3757038427c8620b748fdbc65e526cbf7ada92b5f30e7283f15a44ad179b14", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "9a3757038427c8620b748fdbc65e526cbf7ada92b5f30e7283f15a44ad179b14", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "9a3757038427c8620b748fdbc65e526cbf7ada92b5f30e7283f15a44ad179b14", kill_on_drop: false }` [INFO] [stdout] 9a3757038427c8620b748fdbc65e526cbf7ada92b5f30e7283f15a44ad179b14 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "clippy" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] a22aa0060f6b0b73d2390d6d2f7e438e0359915b34537aef7765a24bc33e3801 [INFO] running `Command { std: "docker" "start" "-a" "a22aa0060f6b0b73d2390d6d2f7e438e0359915b34537aef7765a24bc33e3801", kill_on_drop: false }` [INFO] [stderr] Checking mio v1.0.4 [INFO] [stderr] Compiling tokio-macros v2.5.0 [INFO] [stderr] Compiling num-traits v0.2.19 [INFO] [stderr] Checking tracing-core v0.1.33 [INFO] [stderr] Checking serde v1.0.219 [INFO] [stderr] Checking futures-util v0.3.31 [INFO] [stderr] Checking hashbrown v0.15.3 [INFO] [stderr] Checking outref v0.5.2 [INFO] [stderr] Checking time v0.3.41 [INFO] [stderr] Compiling zerofrom v0.1.6 [INFO] [stderr] Compiling stable_deref_trait v1.2.0 [INFO] [stderr] Checking yoke v0.8.0 [INFO] [stderr] Compiling ring v0.17.14 [INFO] [stderr] Compiling semver v1.0.26 [INFO] [stderr] Compiling ring v0.16.20 [INFO] [stderr] Checking digest v0.10.7 [INFO] [stderr] Compiling rustls v0.20.9 [INFO] [stderr] Checking base64-simd v0.8.0 [INFO] [stderr] Compiling pin-project-internal v1.1.10 [INFO] [stderr] Checking zerovec v0.11.2 [INFO] [stderr] Compiling smallvec v1.15.0 [INFO] [stderr] Compiling serde_json v1.0.140 [INFO] [stderr] Compiling futures-core v0.3.31 [INFO] [stderr] Checking tracing v0.1.41 [INFO] [stderr] Checking sha2 v0.10.9 [INFO] [stderr] Checking zerotrie v0.2.2 [INFO] [stderr] Compiling lock_api v0.4.12 [INFO] [stderr] Compiling thiserror-impl v2.0.12 [INFO] [stderr] Checking indexmap v2.9.0 [INFO] [stderr] Compiling rustc_version v0.4.1 [INFO] [stderr] Compiling futures-sink v0.3.31 [INFO] [stderr] Compiling libsqlite3-sys v0.30.1 [INFO] [stderr] Compiling crossbeam-utils v0.8.21 [INFO] [stderr] Checking num-integer v0.1.46 [INFO] [stderr] Checking tokio v1.45.1 [INFO] [stderr] Checking aws-smithy-types v0.55.3 [INFO] [stderr] Compiling percent-encoding v2.3.1 [INFO] [stderr] Compiling aws-types v0.55.3 [INFO] [stderr] Checking tinystr v0.8.1 [INFO] [stderr] Checking potential_utf v0.1.2 [INFO] [stderr] Checking aws-smithy-eventstream v0.55.3 [INFO] [stderr] Checking icu_collections v2.0.0 [INFO] [stderr] Checking icu_locale_core v2.0.0 [INFO] [stderr] Compiling form_urlencoded v1.2.1 [INFO] [stderr] Compiling parking_lot_core v0.9.10 [INFO] [stderr] Compiling socket2 v0.5.9 [INFO] [stderr] Compiling slab v0.4.9 [INFO] [stderr] Checking pin-project v1.1.10 [INFO] [stderr] Compiling futures-io v0.3.31 [INFO] [stderr] Compiling futures-task v0.3.31 [INFO] [stderr] Compiling pin-utils v0.1.0 [INFO] [stderr] Compiling parking_lot v0.12.3 [INFO] [stderr] Compiling concurrent-queue v2.5.0 [INFO] [stderr] Checking hmac v0.12.1 [INFO] [stderr] Compiling crc-catalog v2.4.0 [INFO] [stderr] Compiling parking v2.2.1 [INFO] [stderr] Checking icu_provider v2.0.0 [INFO] [stderr] Compiling chrono v0.4.41 [INFO] [stderr] Compiling event-listener v5.4.0 [INFO] [stderr] Compiling crc v3.3.0 [INFO] [stderr] Checking icu_properties v2.0.1 [INFO] [stderr] Checking icu_normalizer v2.0.0 [INFO] [stderr] Compiling futures-intrusive v0.5.0 [INFO] [stderr] Checking either v1.15.0 [INFO] [stderr] Compiling hashlink v0.10.0 [INFO] [stderr] Compiling thiserror v2.0.12 [INFO] [stderr] Compiling crossbeam-queue v0.3.12 [INFO] [stderr] Checking bytes-utils v0.1.4 [INFO] [stderr] Compiling spin v0.9.8 [INFO] [stderr] Compiling base64 v0.22.1 [INFO] [stderr] Compiling atoi v2.0.0 [INFO] [stderr] Compiling flume v0.11.1 [INFO] [stderr] Checking aws-smithy-json v0.55.3 [INFO] [stderr] Compiling crc32c v0.6.8 [INFO] [stderr] Compiling futures-channel v0.3.31 [INFO] [stderr] Checking aws-smithy-xml v0.55.3 [INFO] [stderr] Checking serde_urlencoded v0.7.1 [INFO] [stderr] Checking idna_adapter v1.2.1 [INFO] [stderr] Checking futures-executor v0.3.31 [INFO] [stderr] Checking idna v1.0.3 [INFO] [stderr] Compiling dotenvy v0.15.7 [INFO] [stderr] Checking url v2.5.4 [INFO] [stderr] Checking aws-smithy-query v0.55.3 [INFO] [stderr] Checking sha1 v0.10.6 [INFO] [stderr] Checking md-5 v0.10.6 [INFO] [stderr] Checking rustix v1.0.7 [INFO] [stderr] Checking axum-core v0.5.2 [INFO] [stderr] Checking getrandom v0.3.3 [INFO] [stderr] Compiling syn v1.0.109 [INFO] [stderr] Checking itertools v0.10.5 [INFO] [stderr] Checking serde_path_to_error v0.1.17 [INFO] [stderr] Checking float-cmp v0.9.0 [INFO] [stderr] Checking tracing-log v0.2.0 [INFO] [stderr] Checking sct v0.7.1 [INFO] [stderr] Checking webpki v0.22.4 [INFO] [stderr] Checking memo-map v0.3.3 [INFO] [stderr] Checking matchit v0.8.4 [INFO] [stderr] Checking self_cell v1.2.0 [INFO] [stderr] Checking thiserror v1.0.69 [INFO] [stderr] Checking minijinja v2.10.2 [INFO] [stderr] Checking tokio-util v0.7.15 [INFO] [stderr] Checking tokio-stream v0.1.17 [INFO] [stderr] Checking tower v0.4.13 [INFO] [stderr] Checking hyper v1.6.0 [INFO] [stderr] Checking aws-smithy-async v0.55.3 [INFO] [stderr] Checking tower v0.5.2 [INFO] [stderr] Checking tracing-subscriber v0.3.19 [INFO] [stderr] Checking h2 v0.3.26 [INFO] [stderr] Checking aws-credential-types v0.55.3 [INFO] [stderr] Checking rand v0.8.5 [INFO] [stderr] Checking sqlx-core v0.8.6 [INFO] [stderr] Checking futures v0.3.31 [INFO] [stderr] Compiling async-trait v0.1.88 [INFO] [stderr] Checking tempfile v3.20.0 [INFO] [stderr] Checking predicates v2.1.5 [INFO] [stderr] Checking hyper-util v0.1.12 [INFO] [stderr] Checking axum v0.8.4 [INFO] [stderr] Checking tokio-rustls v0.23.4 [INFO] [stderr] Compiling mockall_derive v0.11.4 [INFO] [stderr] Checking hyper v0.14.32 [INFO] [stderr] Checking mockall v0.11.4 [INFO] [stderr] Checking sqlx-sqlite v0.8.6 [INFO] [stderr] Checking aws-smithy-http v0.55.3 [INFO] [stderr] Checking hyper-rustls v0.23.2 [INFO] [stderr] Checking aws-smithy-http-tower v0.55.3 [INFO] [stderr] Checking aws-sigv4 v0.55.3 [INFO] [stderr] Checking aws-smithy-checksums v0.55.3 [INFO] [stderr] Checking aws-smithy-client v0.55.3 [INFO] [stderr] Compiling sqlx-macros-core v0.8.6 [INFO] [stderr] Checking aws-http v0.55.3 [INFO] [stderr] Checking aws-endpoint v0.55.3 [INFO] [stderr] Checking aws-sig-auth v0.55.3 [INFO] [stderr] Checking aws-sdk-sts v0.28.0 [INFO] [stderr] Checking aws-sdk-sso v0.28.0 [INFO] [stderr] Checking aws-sdk-s3 v0.28.0 [INFO] [stderr] Compiling sqlx-macros v0.8.6 [INFO] [stderr] Checking aws-config v0.55.3 [INFO] [stderr] Checking sqlx v0.8.6 [INFO] [stderr] Checking six-disc-changer v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: fields `backup_manager` and `backup_scheduler` are never read [INFO] [stdout] --> src/main.rs:31:5 [INFO] [stdout] | [INFO] [stdout] 28 | struct AppState { [INFO] [stdout] | -------- fields in this struct [INFO] [stdout] ... [INFO] [stdout] 31 | backup_manager: Option>, [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] 32 | backup_scheduler: Option>, [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `s3_prefix`, `aws_role_arn`, `shutdown_backup_timeout_seconds`, and `skip_restoration_if_no_backups` are never read [INFO] [stdout] --> src/config.rs:15:9 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct BackupConfig { [INFO] [stdout] | ------------ fields in this struct [INFO] [stdout] ... [INFO] [stdout] 15 | pub s3_prefix: String, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 19 | pub aws_role_arn: Option, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 31 | pub shutdown_backup_timeout_seconds: u64, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 35 | pub skip_restoration_if_no_backups: bool, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupConfig` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `port` and `host` are never read [INFO] [stdout] --> src/config.rs:192:9 [INFO] [stdout] | [INFO] [stdout] 188 | pub struct Config { [INFO] [stdout] | ------ fields in this struct [INFO] [stdout] ... [INFO] [stdout] 192 | pub port: u16, [INFO] [stdout] | ^^^^ [INFO] [stdout] 193 | /// Host for the web server [INFO] [stdout] 194 | pub host: String, [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `Config` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: constant `DATABASE_PATH` is never used [INFO] [stdout] --> src/database/mod.rs:23:11 [INFO] [stdout] | [INFO] [stdout] 23 | pub const DATABASE_PATH: &str = "db.sqlite"; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: constant `DATABASE_DIR` is never used [INFO] [stdout] --> src/database/mod.rs:26:11 [INFO] [stdout] | [INFO] [stdout] 26 | pub const DATABASE_DIR: &str = "database"; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `Aws`, `Backup`, and `BackupServiceUnavailable` are never constructed [INFO] [stdout] --> src/database/mod.rs:47:5 [INFO] [stdout] | [INFO] [stdout] 30 | pub enum DatabaseError { [INFO] [stdout] | ------------- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 47 | Aws(String), [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 50 | Backup(String), [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 56 | BackupServiceUnavailable, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `DatabaseError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `retrieve_backup`, `get_latest_backup`, `get_latest_environment_backup`, `delete_backup`, `cleanup_old_backups`, and `cleanup_environment_backups` are never used [INFO] [stdout] --> src/database/storage/mod.rs:43:14 [INFO] [stdout] | [INFO] [stdout] 24 | pub trait StorageProvider: Send + Sync { [INFO] [stdout] | --------------- methods in this trait [INFO] [stdout] ... [INFO] [stdout] 43 | async fn retrieve_backup(&self, backup_id: &str, destination_path: &Path) -> Result<()>; [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 61 | async fn get_latest_backup(&self) -> Result>; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 69 | async fn get_latest_environment_backup(&self, environment: &str) -> Result>; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 75 | async fn delete_backup(&self, backup_id: &str) -> Result<()>; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 95 | async fn cleanup_old_backups(&self, keep_count: usize) -> Result<()>; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 102 | async fn cleanup_environment_backups(&self, environment: &str, keep_count: usize) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `max_backups` is never read [INFO] [stdout] --> src/database/storage/local_storage.rs:22:5 [INFO] [stdout] | [INFO] [stdout] 18 | pub struct LocalStorageProvider { [INFO] [stdout] | -------------------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 22 | max_backups: usize, [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `generate_backup_id` is never used [INFO] [stdout] --> src/database/storage/local_storage.rs:42:12 [INFO] [stdout] | [INFO] [stdout] 25 | impl LocalStorageProvider { [INFO] [stdout] | ------------------------- associated function in this implementation [INFO] [stdout] ... [INFO] [stdout] 42 | pub fn generate_backup_id() -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `temp_dir` is never read [INFO] [stdout] --> src/database/storage/s3_storage.rs:28:5 [INFO] [stdout] | [INFO] [stdout] 20 | pub struct S3StorageProvider { [INFO] [stdout] | ----------------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 28 | temp_dir: PathBuf, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `chunk_size`, `sleep_ms`, and `step_count` are never read [INFO] [stdout] --> src/database/backup.rs:46:9 [INFO] [stdout] | [INFO] [stdout] 44 | pub struct BackupOptions { [INFO] [stdout] | ------------- fields in this struct [INFO] [stdout] 45 | /// Number of pages to copy in each step [INFO] [stdout] 46 | pub chunk_size: usize, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 47 | /// Sleep duration between chunks (milliseconds) [INFO] [stdout] 48 | pub sleep_ms: u64, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 49 | /// Maximum number of steps (None for unlimited) [INFO] [stdout] 50 | pub step_count: Option, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupOptions` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `backup_id`, `timestamp`, `duration`, `size_bytes`, and `status` are never read [INFO] [stdout] --> src/database/backup.rs:74:9 [INFO] [stdout] | [INFO] [stdout] 72 | pub struct BackupResult { [INFO] [stdout] | ------------ fields in this struct [INFO] [stdout] 73 | /// Unique identifier for the backup [INFO] [stdout] 74 | pub backup_id: String, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] 75 | /// Timestamp when the backup was created [INFO] [stdout] 76 | pub timestamp: DateTime, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] 77 | /// Duration of the backup operation [INFO] [stdout] 78 | pub duration: Duration, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 79 | /// Size of the backup in bytes [INFO] [stdout] 80 | pub size_bytes: u64, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 81 | /// Status of the backup operation [INFO] [stdout] 82 | pub status: BackupStatus, [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupResult` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `started_at` is never read [INFO] [stdout] --> src/database/backup.rs:91:9 [INFO] [stdout] | [INFO] [stdout] 89 | Running { [INFO] [stdout] | ------- field in this variant [INFO] [stdout] 90 | /// When the job started [INFO] [stdout] 91 | started_at: DateTime, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupJobStatus` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `result` is never read [INFO] [stdout] --> src/database/backup.rs:96:9 [INFO] [stdout] | [INFO] [stdout] 94 | Completed { [INFO] [stdout] | --------- field in this variant [INFO] [stdout] 95 | /// The backup result [INFO] [stdout] 96 | result: BackupResult, [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupJobStatus` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `error` and `failed_at` are never read [INFO] [stdout] --> src/database/backup.rs:101:9 [INFO] [stdout] | [INFO] [stdout] 99 | Failed { [INFO] [stdout] | ------ fields in this variant [INFO] [stdout] 100 | /// Error message [INFO] [stdout] 101 | error: String, [INFO] [stdout] | ^^^^^ [INFO] [stdout] 102 | /// When the job failed [INFO] [stdout] 103 | failed_at: DateTime, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupJobStatus` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variant `Cancelled` is never constructed [INFO] [stdout] --> src/database/backup.rs:106:5 [INFO] [stdout] | [INFO] [stdout] 87 | pub enum BackupJobStatus { [INFO] [stdout] | --------------- variant in this enum [INFO] [stdout] ... [INFO] [stdout] 106 | Cancelled { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupJobStatus` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `job_id` is never read [INFO] [stdout] --> src/database/backup.rs:116:9 [INFO] [stdout] | [INFO] [stdout] 114 | pub struct BackupJob { [INFO] [stdout] | --------- field in this struct [INFO] [stdout] 115 | /// Unique job identifier [INFO] [stdout] 116 | pub job_id: String, [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupJob` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple methods are never used [INFO] [stdout] --> src/database/backup.rs:503:18 [INFO] [stdout] | [INFO] [stdout] 144 | impl BackupManager { [INFO] [stdout] | ------------------ methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 503 | pub async fn get_backup_status(&self, job_id: &str) -> Option { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 517 | pub async fn wait_for_backup(&self, job_id: &str) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 571 | pub async fn cancel_backup(&self, job_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 596 | pub async fn get_active_backups(&self) -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 604 | pub async fn cleanup_completed_jobs(&self, older_than: Duration) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 746 | pub async fn list_backups(&self) -> Result> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 751 | pub fn get_status(&self) -> &SharedBackupStatus { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 756 | pub async fn get_latest_backup(&self) -> Result> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 761 | pub async fn delete_backup(&self, backup_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 766 | pub async fn cleanup_old_backups(&self, keep_count: usize) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `generate_backup_id` is never used [INFO] [stdout] --> src/database/backup_naming.rs:64:12 [INFO] [stdout] | [INFO] [stdout] 54 | impl BackupNamingService { [INFO] [stdout] | ------------------------ method in this implementation [INFO] [stdout] ... [INFO] [stdout] 64 | pub fn generate_backup_id(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `id`, `server_id`, `backup_type`, and `random_suffix` are never used [INFO] [stdout] --> src/database/backup_naming.rs:195:12 [INFO] [stdout] | [INFO] [stdout] 135 | impl BackupId { [INFO] [stdout] | ------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 195 | pub fn id(&self) -> &str { [INFO] [stdout] | ^^ [INFO] [stdout] ... [INFO] [stdout] 210 | pub fn server_id(&self) -> Option<&str> { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 215 | pub fn backup_type(&self) -> BackupType { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 220 | pub fn random_suffix(&self) -> &str { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `get_backup_storage_path` is never used [INFO] [stdout] --> src/database/backup_naming.rs:231:8 [INFO] [stdout] | [INFO] [stdout] 231 | pub fn get_backup_storage_path>( [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `get_backup_s3_key` is never used [INFO] [stdout] --> src/database/backup_naming.rs:244:8 [INFO] [stdout] | [INFO] [stdout] 244 | pub fn get_backup_s3_key(prefix: &str, backup_id: &str) -> Option { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `started_at`, `completed_at`, `duration`, `success`, `size_bytes`, and `error` are never read [INFO] [stdout] --> src/database/backup_status.rs:33:9 [INFO] [stdout] | [INFO] [stdout] 32 | pub struct BackupResult { [INFO] [stdout] | ------------ fields in this struct [INFO] [stdout] 33 | pub started_at: DateTime, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 34 | pub completed_at: DateTime, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 35 | pub duration: Duration, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 36 | pub success: bool, [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 37 | pub size_bytes: Option, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 38 | pub error: Option, [INFO] [stdout] | ^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupResult` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `average_backup_duration` and `success_rate` are never used [INFO] [stdout] --> src/database/backup_status.rs:166:12 [INFO] [stdout] | [INFO] [stdout] 68 | impl BackupStatus { [INFO] [stdout] | ----------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 166 | pub fn average_backup_duration(&self) -> Option { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 183 | pub fn success_rate(&self) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `completed_at`, `success`, `error`, `restored_size`, `duration`, and `source` are never read [INFO] [stdout] --> src/database/restoration_status.rs:28:9 [INFO] [stdout] | [INFO] [stdout] 26 | pub struct RestorationResult { [INFO] [stdout] | ----------------- fields in this struct [INFO] [stdout] 27 | /// When the restoration completed [INFO] [stdout] 28 | pub completed_at: DateTime, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 29 | /// Whether the restoration was successful [INFO] [stdout] 30 | pub success: bool, [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 31 | /// Error message if restoration failed [INFO] [stdout] 32 | pub error: Option, [INFO] [stdout] | ^^^^^ [INFO] [stdout] 33 | /// Size of the restored database in bytes [INFO] [stdout] 34 | pub restored_size: Option, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 35 | /// Duration of the restoration operation [INFO] [stdout] 36 | pub duration: Duration, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 37 | /// Source of the restoration (e.g., S3 key or local path) [INFO] [stdout] 38 | pub source: String, [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `RestorationResult` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `status_string` is never used [INFO] [stdout] --> src/database/restoration_status.rs:115:12 [INFO] [stdout] | [INFO] [stdout] 55 | impl RestorationStatus { [INFO] [stdout] | ---------------------- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 115 | pub fn status_string(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `environment` and `server_id` are never read [INFO] [stdout] --> src/database/restore.rs:15:5 [INFO] [stdout] | [INFO] [stdout] 12 | pub struct RestorationChecker { [INFO] [stdout] | ------------------ fields in this struct [INFO] [stdout] ... [INFO] [stdout] 15 | environment: String, [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 16 | server_id: Option, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `trigger_immediate_backup`, `is_running`, and `get_status` are never used [INFO] [stdout] --> src/database/scheduler.rs:155:18 [INFO] [stdout] | [INFO] [stdout] 30 | impl BackupScheduler { [INFO] [stdout] | -------------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 155 | pub async fn trigger_immediate_backup(&self, options: BackupOptions) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 169 | pub async fn is_running(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 174 | pub fn get_status(&self) -> &SharedBackupStatus { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `check_database_health` is never used [INFO] [stdout] --> src/db.rs:43:14 [INFO] [stdout] | [INFO] [stdout] 43 | pub async fn check_database_health(database_path: &Path) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `wait_for_shutdown` is never used [INFO] [stdout] --> src/shutdown.rs:107:18 [INFO] [stdout] | [INFO] [stdout] 22 | impl ShutdownManager { [INFO] [stdout] | -------------------- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 107 | pub async fn wait_for_shutdown(&self) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/storage/local_storage.rs:116:9 [INFO] [stdout] | [INFO] [stdout] 116 | / if let Some(parent) = destination_path.parent() { [INFO] [stdout] 117 | | if !parent.exists() { [INFO] [stdout] 118 | | debug!("Creating destination directory: {:?}", parent); [INFO] [stdout] 119 | | tokio_fs::create_dir_all(parent).await.map_err(|e| { [INFO] [stdout] ... | [INFO] [stdout] 124 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 116 ~ if let Some(parent) = destination_path.parent() [INFO] [stdout] 117 ~ && !parent.exists() { [INFO] [stdout] 118 | debug!("Creating destination directory: {:?}", parent); [INFO] [stdout] ... [INFO] [stdout] 122 | })?; [INFO] [stdout] 123 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/storage/local_storage.rs:225:13 [INFO] [stdout] | [INFO] [stdout] 225 | / if path.is_file() { [INFO] [stdout] 226 | | if let Some(file_name) = path.file_name() { [INFO] [stdout] 227 | | if let Some(file_name_str) = file_name.to_str() { [INFO] [stdout] ... | [INFO] [stdout] 239 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 225 ~ if path.is_file() [INFO] [stdout] 226 ~ && let Some(file_name) = path.file_name() { [INFO] [stdout] 227 | if let Some(file_name_str) = file_name.to_str() { [INFO] [stdout] ... [INFO] [stdout] 237 | } [INFO] [stdout] 238 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/storage/local_storage.rs:226:17 [INFO] [stdout] | [INFO] [stdout] 226 | / if let Some(file_name) = path.file_name() { [INFO] [stdout] 227 | | if let Some(file_name_str) = file_name.to_str() { [INFO] [stdout] 228 | | // Extract backup ID from filename (format: backup-{id}.db) [INFO] [stdout] 229 | | if file_name_str.starts_with("backup-") && file_name_str.ends_with(".db") { [INFO] [stdout] ... | [INFO] [stdout] 238 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 226 ~ if let Some(file_name) = path.file_name() [INFO] [stdout] 227 ~ && let Some(file_name_str) = file_name.to_str() { [INFO] [stdout] 228 | // Extract backup ID from filename (format: backup-{id}.db) [INFO] [stdout] ... [INFO] [stdout] 236 | } [INFO] [stdout] 237 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this match could be replaced by its scrutinee and body [INFO] [stdout] --> src/database/storage/s3_storage.rs:126:17 [INFO] [stdout] | [INFO] [stdout] 126 | / match service_err.err() { [INFO] [stdout] 127 | | // Handle specific error types based on the operation [INFO] [stdout] 128 | | _ => { [INFO] [stdout] 129 | | if operation == "retrieve_backup" && status_code == 404 { [INFO] [stdout] ... | [INFO] [stdout] 138 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_single_binding [INFO] [stdout] = note: `#[warn(clippy::match_single_binding)]` on by default [INFO] [stdout] help: consider using the scrutinee and body instead [INFO] [stdout] | [INFO] [stdout] 126 ~ service_err.err(); [INFO] [stdout] 127 + if operation == "retrieve_backup" && status_code == 404 { [INFO] [stdout] 128 + DatabaseError::BackupNotFound [INFO] [stdout] 129 + } else { [INFO] [stdout] 130 + DatabaseError::Storage(format!( [INFO] [stdout] 131 + "S3 service error during {}: {:?}", [INFO] [stdout] 132 + operation, error [INFO] [stdout] 133 + )) [INFO] [stdout] 134 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/storage/s3_storage.rs:218:9 [INFO] [stdout] | [INFO] [stdout] 218 | / if let Some(parent) = destination_path.parent() { [INFO] [stdout] 219 | | if !parent.exists() { [INFO] [stdout] 220 | | tokio_fs::create_dir_all(parent) [INFO] [stdout] 221 | | .await [INFO] [stdout] ... | [INFO] [stdout] 224 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 218 ~ if let Some(parent) = destination_path.parent() [INFO] [stdout] 219 ~ && !parent.exists() { [INFO] [stdout] 220 | tokio_fs::create_dir_all(parent) [INFO] [stdout] 221 | .await [INFO] [stdout] 222 | .map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] 223 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/storage/s3_storage.rs:222:30 [INFO] [stdout] | [INFO] [stdout] 222 | .map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/storage/s3_storage.rs:235:22 [INFO] [stdout] | [INFO] [stdout] 235 | .map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/storage/s3_storage.rs:239:22 [INFO] [stdout] | [INFO] [stdout] 239 | .map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/storage/s3_storage.rs:241:36 [INFO] [stdout] | [INFO] [stdout] 241 | file.flush().await.map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/storage/s3_storage.rs:271:17 [INFO] [stdout] | [INFO] [stdout] 271 | / if let Some(key) = &obj.key { [INFO] [stdout] 272 | | if let Some(id) = self.extract_backup_id(key) { [INFO] [stdout] 273 | | backup_ids.push(id); [INFO] [stdout] 274 | | } [INFO] [stdout] 275 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 271 ~ if let Some(key) = &obj.key [INFO] [stdout] 272 ~ && let Some(id) = self.extract_backup_id(key) { [INFO] [stdout] 273 | backup_ids.push(id); [INFO] [stdout] 274 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/storage/s3_storage.rs:316:17 [INFO] [stdout] | [INFO] [stdout] 316 | / if let Some(key) = &obj.key { [INFO] [stdout] 317 | | if let Some(id) = self.extract_backup_id(key) { [INFO] [stdout] 318 | | backup_ids.push(id); [INFO] [stdout] 319 | | } [INFO] [stdout] 320 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 316 ~ if let Some(key) = &obj.key [INFO] [stdout] 317 ~ && let Some(id) = self.extract_backup_id(key) { [INFO] [stdout] 318 | backup_ids.push(id); [INFO] [stdout] 319 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `backup_manager` and `backup_scheduler` are never read [INFO] [stdout] --> src/main.rs:31:5 [INFO] [stdout] | [INFO] [stdout] 28 | struct AppState { [INFO] [stdout] | -------- fields in this struct [INFO] [stdout] ... [INFO] [stdout] 31 | backup_manager: Option>, [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] 32 | backup_scheduler: Option>, [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `s3_prefix`, `aws_role_arn`, `shutdown_backup_timeout_seconds`, and `skip_restoration_if_no_backups` are never read [INFO] [stdout] --> src/config.rs:15:9 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct BackupConfig { [INFO] [stdout] | ------------ fields in this struct [INFO] [stdout] ... [INFO] [stdout] 15 | pub s3_prefix: String, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 19 | pub aws_role_arn: Option, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 31 | pub shutdown_backup_timeout_seconds: u64, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 35 | pub skip_restoration_if_no_backups: bool, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupConfig` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `port` and `host` are never read [INFO] [stdout] --> src/config.rs:192:9 [INFO] [stdout] | [INFO] [stdout] 188 | pub struct Config { [INFO] [stdout] | ------ fields in this struct [INFO] [stdout] ... [INFO] [stdout] 192 | pub port: u16, [INFO] [stdout] | ^^^^ [INFO] [stdout] 193 | /// Host for the web server [INFO] [stdout] 194 | pub host: String, [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `Config` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: constant `DATABASE_PATH` is never used [INFO] [stdout] --> src/database/mod.rs:23:11 [INFO] [stdout] | [INFO] [stdout] 23 | pub const DATABASE_PATH: &str = "db.sqlite"; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: constant `DATABASE_DIR` is never used [INFO] [stdout] --> src/database/mod.rs:26:11 [INFO] [stdout] | [INFO] [stdout] 26 | pub const DATABASE_DIR: &str = "database"; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variant `Aws` is never constructed [INFO] [stdout] --> src/database/mod.rs:47:5 [INFO] [stdout] | [INFO] [stdout] 30 | pub enum DatabaseError { [INFO] [stdout] | ------------- variant in this enum [INFO] [stdout] ... [INFO] [stdout] 47 | Aws(String), [INFO] [stdout] | ^^^ [INFO] [stdout] | [INFO] [stdout] = note: `DatabaseError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `get_latest_environment_backup` and `cleanup_environment_backups` are never used [INFO] [stdout] --> src/database/storage/mod.rs:69:14 [INFO] [stdout] | [INFO] [stdout] 24 | pub trait StorageProvider: Send + Sync { [INFO] [stdout] | --------------- methods in this trait [INFO] [stdout] ... [INFO] [stdout] 69 | async fn get_latest_environment_backup(&self, environment: &str) -> Result>; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 102 | async fn cleanup_environment_backups(&self, environment: &str, keep_count: usize) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `max_backups` is never read [INFO] [stdout] --> src/database/storage/local_storage.rs:22:5 [INFO] [stdout] | [INFO] [stdout] 18 | pub struct LocalStorageProvider { [INFO] [stdout] | -------------------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 22 | max_backups: usize, [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `generate_backup_id` is never used [INFO] [stdout] --> src/database/storage/local_storage.rs:42:12 [INFO] [stdout] | [INFO] [stdout] 25 | impl LocalStorageProvider { [INFO] [stdout] | ------------------------- associated function in this implementation [INFO] [stdout] ... [INFO] [stdout] 42 | pub fn generate_backup_id() -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `temp_dir` is never read [INFO] [stdout] --> src/database/storage/s3_storage.rs:28:5 [INFO] [stdout] | [INFO] [stdout] 20 | pub struct S3StorageProvider { [INFO] [stdout] | ----------------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 28 | temp_dir: PathBuf, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `chunk_size`, `sleep_ms`, and `step_count` are never read [INFO] [stdout] --> src/database/backup.rs:46:9 [INFO] [stdout] | [INFO] [stdout] 44 | pub struct BackupOptions { [INFO] [stdout] | ------------- fields in this struct [INFO] [stdout] 45 | /// Number of pages to copy in each step [INFO] [stdout] 46 | pub chunk_size: usize, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 47 | /// Sleep duration between chunks (milliseconds) [INFO] [stdout] 48 | pub sleep_ms: u64, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 49 | /// Maximum number of steps (None for unlimited) [INFO] [stdout] 50 | pub step_count: Option, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupOptions` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `duration` is never read [INFO] [stdout] --> src/database/backup.rs:78:9 [INFO] [stdout] | [INFO] [stdout] 72 | pub struct BackupResult { [INFO] [stdout] | ------------ field in this struct [INFO] [stdout] ... [INFO] [stdout] 78 | pub duration: Duration, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupResult` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `started_at` is never read [INFO] [stdout] --> src/database/backup.rs:91:9 [INFO] [stdout] | [INFO] [stdout] 89 | Running { [INFO] [stdout] | ------- field in this variant [INFO] [stdout] 90 | /// When the job started [INFO] [stdout] 91 | started_at: DateTime, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupJobStatus` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variant `Cancelled` is never constructed [INFO] [stdout] --> src/database/backup.rs:106:5 [INFO] [stdout] | [INFO] [stdout] 87 | pub enum BackupJobStatus { [INFO] [stdout] | --------------- variant in this enum [INFO] [stdout] ... [INFO] [stdout] 106 | Cancelled { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupJobStatus` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `cancel_backup`, `get_status`, `delete_backup`, and `cleanup_old_backups` are never used [INFO] [stdout] --> src/database/backup.rs:571:18 [INFO] [stdout] | [INFO] [stdout] 144 | impl BackupManager { [INFO] [stdout] | ------------------ methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 571 | pub async fn cancel_backup(&self, job_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 751 | pub fn get_status(&self) -> &SharedBackupStatus { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 761 | pub async fn delete_backup(&self, backup_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 766 | pub async fn cleanup_old_backups(&self, keep_count: usize) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `setup_test_db` is never used [INFO] [stdout] --> src/database/backup.rs:780:14 [INFO] [stdout] | [INFO] [stdout] 780 | async fn setup_test_db() -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `generate_backup_id` is never used [INFO] [stdout] --> src/database/backup_naming.rs:64:12 [INFO] [stdout] | [INFO] [stdout] 54 | impl BackupNamingService { [INFO] [stdout] | ------------------------ method in this implementation [INFO] [stdout] ... [INFO] [stdout] 64 | pub fn generate_backup_id(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `started_at`, `completed_at`, `size_bytes`, and `error` are never read [INFO] [stdout] --> src/database/backup_status.rs:33:9 [INFO] [stdout] | [INFO] [stdout] 32 | pub struct BackupResult { [INFO] [stdout] | ------------ fields in this struct [INFO] [stdout] 33 | pub started_at: DateTime, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 34 | pub completed_at: DateTime, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 37 | pub size_bytes: Option, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 38 | pub error: Option, [INFO] [stdout] | ^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `BackupResult` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `environment` and `server_id` are never read [INFO] [stdout] --> src/database/restore.rs:15:5 [INFO] [stdout] | [INFO] [stdout] 12 | pub struct RestorationChecker { [INFO] [stdout] | ------------------ fields in this struct [INFO] [stdout] ... [INFO] [stdout] 15 | environment: String, [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 16 | server_id: Option, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `get_status` is never used [INFO] [stdout] --> src/database/scheduler.rs:174:12 [INFO] [stdout] | [INFO] [stdout] 30 | impl BackupScheduler { [INFO] [stdout] | -------------------- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 174 | pub fn get_status(&self) -> &SharedBackupStatus { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `check_database_health` is never used [INFO] [stdout] --> src/db.rs:43:14 [INFO] [stdout] | [INFO] [stdout] 43 | pub async fn check_database_health(database_path: &Path) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `wait_for_shutdown` is never used [INFO] [stdout] --> src/shutdown.rs:107:18 [INFO] [stdout] | [INFO] [stdout] 22 | impl ShutdownManager { [INFO] [stdout] | -------------------- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 107 | pub async fn wait_for_shutdown(&self) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let` [INFO] [stdout] --> src/database/storage/s3_storage.rs:404:17 [INFO] [stdout] | [INFO] [stdout] 404 | / match &err { [INFO] [stdout] 405 | | SdkError::ServiceError(service_err) => { [INFO] [stdout] 406 | | let status_code = service_err.raw().http().status(); [INFO] [stdout] 407 | | if status_code == 404 { [INFO] [stdout] ... | [INFO] [stdout] 412 | | _ => {} [INFO] [stdout] 413 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stdout] = note: `#[warn(clippy::single_match)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 404 ~ if let SdkError::ServiceError(service_err) = &err { [INFO] [stdout] 405 + let status_code = service_err.raw().http().status(); [INFO] [stdout] 406 + if status_code == 404 { [INFO] [stdout] 407 + debug!("Backup {} does not exist in S3", backup_id); [INFO] [stdout] 408 + return Ok(false); [INFO] [stdout] 409 + } [INFO] [stdout] 410 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/storage/local_storage.rs:116:9 [INFO] [stdout] | [INFO] [stdout] 116 | / if let Some(parent) = destination_path.parent() { [INFO] [stdout] 117 | | if !parent.exists() { [INFO] [stdout] 118 | | debug!("Creating destination directory: {:?}", parent); [INFO] [stdout] 119 | | tokio_fs::create_dir_all(parent).await.map_err(|e| { [INFO] [stdout] ... | [INFO] [stdout] 124 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 116 ~ if let Some(parent) = destination_path.parent() [INFO] [stdout] 117 ~ && !parent.exists() { [INFO] [stdout] 118 | debug!("Creating destination directory: {:?}", parent); [INFO] [stdout] ... [INFO] [stdout] 122 | })?; [INFO] [stdout] 123 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this function has too many arguments (8/7) [INFO] [stdout] --> src/database/backup.rs:265:5 [INFO] [stdout] | [INFO] [stdout] 265 | / async fn perform_background_backup( [INFO] [stdout] 266 | | job_id: String, [INFO] [stdout] 267 | | db_pool: Pool, [INFO] [stdout] 268 | | storage: Arc, [INFO] [stdout] ... | [INFO] [stdout] 273 | | options: BackupOptions, [INFO] [stdout] 274 | | ) -> Result { [INFO] [stdout] | |_____________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#too_many_arguments [INFO] [stdout] = note: `#[warn(clippy::too_many_arguments)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/backup.rs:283:13 [INFO] [stdout] | [INFO] [stdout] 283 | / if let Some(job) = jobs.get(&job_id) { [INFO] [stdout] 284 | | if matches!(job.status, BackupJobStatus::Cancelled { .. }) { [INFO] [stdout] 285 | | warn!("Backup job {} was cancelled before starting", job_id); [INFO] [stdout] ... | [INFO] [stdout] 301 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 283 ~ if let Some(job) = jobs.get(&job_id) [INFO] [stdout] 284 ~ && matches!(job.status, BackupJobStatus::Cancelled { .. }) { [INFO] [stdout] 285 | warn!("Backup job {} was cancelled before starting", job_id); [INFO] [stdout] ... [INFO] [stdout] 299 | }); [INFO] [stdout] 300 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/backup.rs:313:42 [INFO] [stdout] | [INFO] [stdout] 313 | let temp_dir = tempdir().map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/storage/local_storage.rs:225:13 [INFO] [stdout] | [INFO] [stdout] 225 | / if path.is_file() { [INFO] [stdout] 226 | | if let Some(file_name) = path.file_name() { [INFO] [stdout] 227 | | if let Some(file_name_str) = file_name.to_str() { [INFO] [stdout] ... | [INFO] [stdout] 239 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 225 ~ if path.is_file() [INFO] [stdout] 226 ~ && let Some(file_name) = path.file_name() { [INFO] [stdout] 227 | if let Some(file_name_str) = file_name.to_str() { [INFO] [stdout] ... [INFO] [stdout] 237 | } [INFO] [stdout] 238 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/storage/local_storage.rs:226:17 [INFO] [stdout] | [INFO] [stdout] 226 | / if let Some(file_name) = path.file_name() { [INFO] [stdout] 227 | | if let Some(file_name_str) = file_name.to_str() { [INFO] [stdout] 228 | | // Extract backup ID from filename (format: backup-{id}.db) [INFO] [stdout] 229 | | if file_name_str.starts_with("backup-") && file_name_str.ends_with(".db") { [INFO] [stdout] ... | [INFO] [stdout] 238 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 226 ~ if let Some(file_name) = path.file_name() [INFO] [stdout] 227 ~ && let Some(file_name_str) = file_name.to_str() { [INFO] [stdout] 228 | // Extract backup ID from filename (format: backup-{id}.db) [INFO] [stdout] ... [INFO] [stdout] 236 | } [INFO] [stdout] 237 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this match could be replaced by its scrutinee and body [INFO] [stdout] --> src/database/storage/s3_storage.rs:126:17 [INFO] [stdout] | [INFO] [stdout] 126 | / match service_err.err() { [INFO] [stdout] 127 | | // Handle specific error types based on the operation [INFO] [stdout] 128 | | _ => { [INFO] [stdout] 129 | | if operation == "retrieve_backup" && status_code == 404 { [INFO] [stdout] ... | [INFO] [stdout] 138 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_single_binding [INFO] [stdout] = note: `#[warn(clippy::match_single_binding)]` on by default [INFO] [stdout] help: consider using the scrutinee and body instead [INFO] [stdout] | [INFO] [stdout] 126 ~ service_err.err(); [INFO] [stdout] 127 + if operation == "retrieve_backup" && status_code == 404 { [INFO] [stdout] 128 + DatabaseError::BackupNotFound [INFO] [stdout] 129 + } else { [INFO] [stdout] 130 + DatabaseError::Storage(format!( [INFO] [stdout] 131 + "S3 service error during {}: {:?}", [INFO] [stdout] 132 + operation, error [INFO] [stdout] 133 + )) [INFO] [stdout] 134 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/storage/s3_storage.rs:218:9 [INFO] [stdout] | [INFO] [stdout] 218 | / if let Some(parent) = destination_path.parent() { [INFO] [stdout] 219 | | if !parent.exists() { [INFO] [stdout] 220 | | tokio_fs::create_dir_all(parent) [INFO] [stdout] 221 | | .await [INFO] [stdout] ... | [INFO] [stdout] 224 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 218 ~ if let Some(parent) = destination_path.parent() [INFO] [stdout] 219 ~ && !parent.exists() { [INFO] [stdout] 220 | tokio_fs::create_dir_all(parent) [INFO] [stdout] 221 | .await [INFO] [stdout] 222 | .map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] 223 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/storage/s3_storage.rs:222:30 [INFO] [stdout] | [INFO] [stdout] 222 | .map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/storage/s3_storage.rs:235:22 [INFO] [stdout] | [INFO] [stdout] 235 | .map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/storage/s3_storage.rs:239:22 [INFO] [stdout] | [INFO] [stdout] 239 | .map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/storage/s3_storage.rs:241:36 [INFO] [stdout] | [INFO] [stdout] 241 | file.flush().await.map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/storage/s3_storage.rs:271:17 [INFO] [stdout] | [INFO] [stdout] 271 | / if let Some(key) = &obj.key { [INFO] [stdout] 272 | | if let Some(id) = self.extract_backup_id(key) { [INFO] [stdout] 273 | | backup_ids.push(id); [INFO] [stdout] 274 | | } [INFO] [stdout] 275 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 271 ~ if let Some(key) = &obj.key [INFO] [stdout] 272 ~ && let Some(id) = self.extract_backup_id(key) { [INFO] [stdout] 273 | backup_ids.push(id); [INFO] [stdout] 274 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/storage/s3_storage.rs:316:17 [INFO] [stdout] | [INFO] [stdout] 316 | / if let Some(key) = &obj.key { [INFO] [stdout] 317 | | if let Some(id) = self.extract_backup_id(key) { [INFO] [stdout] 318 | | backup_ids.push(id); [INFO] [stdout] 319 | | } [INFO] [stdout] 320 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 316 ~ if let Some(key) = &obj.key [INFO] [stdout] 317 ~ && let Some(id) = self.extract_backup_id(key) { [INFO] [stdout] 318 | backup_ids.push(id); [INFO] [stdout] 319 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let` [INFO] [stdout] --> src/database/storage/s3_storage.rs:404:17 [INFO] [stdout] | [INFO] [stdout] 404 | / match &err { [INFO] [stdout] 405 | | SdkError::ServiceError(service_err) => { [INFO] [stdout] 406 | | let status_code = service_err.raw().http().status(); [INFO] [stdout] 407 | | if status_code == 404 { [INFO] [stdout] ... | [INFO] [stdout] 412 | | _ => {} [INFO] [stdout] 413 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stdout] = note: `#[warn(clippy::single_match)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 404 ~ if let SdkError::ServiceError(service_err) = &err { [INFO] [stdout] 405 + let status_code = service_err.raw().http().status(); [INFO] [stdout] 406 + if status_code == 404 { [INFO] [stdout] 407 + debug!("Backup {} does not exist in S3", backup_id); [INFO] [stdout] 408 + return Ok(false); [INFO] [stdout] 409 + } [INFO] [stdout] 410 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/database/restoration_status.rs:41:1 [INFO] [stdout] | [INFO] [stdout] 41 | / impl Default for RestorationStatus { [INFO] [stdout] 42 | | fn default() -> Self { [INFO] [stdout] 43 | | Self { [INFO] [stdout] 44 | | is_restoring: false, [INFO] [stdout] ... | [INFO] [stdout] 53 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] = note: `#[warn(clippy::derivable_impls)]` on by default [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 7 + #[derive(Default)] [INFO] [stdout] 8 | pub struct RestorationStatus { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual checked division [INFO] [stdout] --> src/database/restoration_status.rs:93:12 [INFO] [stdout] | [INFO] [stdout] 93 | if total_restorations > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ check performed here [INFO] [stdout] ... [INFO] [stdout] 100 | total_duration_secs / total_restorations, [INFO] [stdout] | ---------------------------------------- division performed here [INFO] [stdout] | [INFO] [stdout] = help: consider using `checked_div` [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_checked_ops [INFO] [stdout] = note: `#[warn(clippy::manual_checked_ops)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `DateTime` which implements the `Copy` trait [INFO] [stdout] --> src/database/restore.rs:145:46 [INFO] [stdout] | [INFO] [stdout] 145 | parsed_backups.push((backup, backup_id.timestamp().clone())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try dereferencing it: `*backup_id.timestamp()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] = note: `#[warn(clippy::clone_on_copy)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: consider using `sort_by_key` [INFO] [stdout] --> src/database/restore.rs:155:9 [INFO] [stdout] | [INFO] [stdout] 155 | parsed_backups.sort_by(|a, b| b.1.cmp(&a.1)); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_sort_by [INFO] [stdout] = note: `#[warn(clippy::unnecessary_sort_by)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 155 - parsed_backups.sort_by(|a, b| b.1.cmp(&a.1)); [INFO] [stdout] 155 + parsed_backups.sort_by_key(|b| std::cmp::Reverse(b.1)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this function has too many arguments (8/7) [INFO] [stdout] --> src/database/backup.rs:265:5 [INFO] [stdout] | [INFO] [stdout] 265 | / async fn perform_background_backup( [INFO] [stdout] 266 | | job_id: String, [INFO] [stdout] 267 | | db_pool: Pool, [INFO] [stdout] 268 | | storage: Arc, [INFO] [stdout] ... | [INFO] [stdout] 273 | | options: BackupOptions, [INFO] [stdout] 274 | | ) -> Result { [INFO] [stdout] | |_____________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#too_many_arguments [INFO] [stdout] = note: `#[warn(clippy::too_many_arguments)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/database/backup.rs:283:13 [INFO] [stdout] | [INFO] [stdout] 283 | / if let Some(job) = jobs.get(&job_id) { [INFO] [stdout] 284 | | if matches!(job.status, BackupJobStatus::Cancelled { .. }) { [INFO] [stdout] 285 | | warn!("Backup job {} was cancelled before starting", job_id); [INFO] [stdout] ... | [INFO] [stdout] 301 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 283 ~ if let Some(job) = jobs.get(&job_id) [INFO] [stdout] 284 ~ && matches!(job.status, BackupJobStatus::Cancelled { .. }) { [INFO] [stdout] 285 | warn!("Backup job {} was cancelled before starting", job_id); [INFO] [stdout] ... [INFO] [stdout] 299 | }); [INFO] [stdout] 300 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/backup.rs:313:42 [INFO] [stdout] | [INFO] [stdout] 313 | let temp_dir = tempdir().map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/backup.rs:840:42 [INFO] [stdout] | [INFO] [stdout] 840 | let temp_dir = tempdir().map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/backup.rs:889:42 [INFO] [stdout] | [INFO] [stdout] 889 | let temp_dir = tempdir().map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/backup.rs:915:44 [INFO] [stdout] | [INFO] [stdout] 915 | let backup_dir = tempdir().map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/backup.rs:973:42 [INFO] [stdout] | [INFO] [stdout] 973 | let temp_dir = tempdir().map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/backup.rs:993:44 [INFO] [stdout] | [INFO] [stdout] 993 | let backup_dir = tempdir().map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to one [INFO] [stdout] --> src/database/backup.rs:1038:17 [INFO] [stdout] | [INFO] [stdout] 1038 | assert!(active_jobs.len() >= 1); // At least one should still be running [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!active_jobs.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] = note: `#[warn(clippy::len_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/database/backup.rs:1066:44 [INFO] [stdout] | [INFO] [stdout] 1066 | let backup_dir = tempdir().map_err(|e| DatabaseError::Io(e))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `DatabaseError::Io` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/database/backup_status.rs:309:17 [INFO] [stdout] | [INFO] [stdout] 309 | assert!(avg_ms >= 90 && avg_ms <= 150); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(90..=150).contains(&avg_ms)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] = note: `#[warn(clippy::manual_range_contains)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/database/restoration_status.rs:41:1 [INFO] [stdout] | [INFO] [stdout] 41 | / impl Default for RestorationStatus { [INFO] [stdout] 42 | | fn default() -> Self { [INFO] [stdout] 43 | | Self { [INFO] [stdout] 44 | | is_restoring: false, [INFO] [stdout] ... | [INFO] [stdout] 53 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] = note: `#[warn(clippy::derivable_impls)]` on by default [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 7 + #[derive(Default)] [INFO] [stdout] 8 | pub struct RestorationStatus { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual checked division [INFO] [stdout] --> src/database/restoration_status.rs:93:12 [INFO] [stdout] | [INFO] [stdout] 93 | if total_restorations > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ check performed here [INFO] [stdout] ... [INFO] [stdout] 100 | total_duration_secs / total_restorations, [INFO] [stdout] | ---------------------------------------- division performed here [INFO] [stdout] | [INFO] [stdout] = help: consider using `checked_div` [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_checked_ops [INFO] [stdout] = note: `#[warn(clippy::manual_checked_ops)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `DateTime` which implements the `Copy` trait [INFO] [stdout] --> src/database/restore.rs:145:46 [INFO] [stdout] | [INFO] [stdout] 145 | parsed_backups.push((backup, backup_id.timestamp().clone())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try dereferencing it: `*backup_id.timestamp()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] = note: `#[warn(clippy::clone_on_copy)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: consider using `sort_by_key` [INFO] [stdout] --> src/database/restore.rs:155:9 [INFO] [stdout] | [INFO] [stdout] 155 | parsed_backups.sort_by(|a, b| b.1.cmp(&a.1)); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_sort_by [INFO] [stdout] = note: `#[warn(clippy::unnecessary_sort_by)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 155 - parsed_backups.sort_by(|a, b| b.1.cmp(&a.1)); [INFO] [stdout] 155 + parsed_backups.sort_by_key(|b| std::cmp::Reverse(b.1)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless conversion to the same type: `std::path::PathBuf` [INFO] [stdout] --> src/database/scheduler.rs:201:31 [INFO] [stdout] | [INFO] [stdout] 201 | local_backup_dir: PathBuf::from(temp_dir.path().join("backups")), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `PathBuf::from()`: `temp_dir.path().join("backups")` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion [INFO] [stdout] = note: `#[warn(clippy::useless_conversion)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 15s [INFO] running `Command { std: "docker" "inspect" "a22aa0060f6b0b73d2390d6d2f7e438e0359915b34537aef7765a24bc33e3801", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "a22aa0060f6b0b73d2390d6d2f7e438e0359915b34537aef7765a24bc33e3801", kill_on_drop: false }` [INFO] [stdout] a22aa0060f6b0b73d2390d6d2f7e438e0359915b34537aef7765a24bc33e3801