From 47ea98e0e3e89ed3128c764e757fc2f5784dcee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Fri, 15 Jan 2021 14:10:24 +0100 Subject: [PATCH 01/32] clippy: collapse/rework nested ifs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit no semantic changes (intended). Signed-off-by: Fabian Grünbichler --- src/api2/access/tfa.rs | 12 +++++------- src/config/network/helper.rs | 15 ++++++++------- src/rrd/rrd.rs | 27 +++++++++++---------------- 3 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/api2/access/tfa.rs b/src/api2/access/tfa.rs index 0298b2e1..ee2bcac7 100644 --- a/src/api2/access/tfa.rs +++ b/src/api2/access/tfa.rs @@ -331,13 +331,11 @@ fn list_tfa(rpcenv: &mut dyn RpcEnvironment) -> Result, Error> { entries: to_data(data), }); } - } else { - if let Some(data) = { tfa_data }.remove(authid.user()) { - out.push(TfaUser { - userid: authid.into(), - entries: to_data(data), - }); - } + } else if let Some(data) = { tfa_data }.remove(authid.user()) { + out.push(TfaUser { + userid: authid.into(), + entries: to_data(data), + }); } Ok(out) diff --git a/src/config/network/helper.rs b/src/config/network/helper.rs index d9266e3f..d6d62d95 100644 --- a/src/config/network/helper.rs +++ b/src/config/network/helper.rs @@ -68,15 +68,16 @@ pub fn parse_cidr(cidr: &str) -> Result<(String, u8, bool), Error> { } pub fn check_netmask(mask: u8, is_v6: bool) -> Result<(), Error> { - if is_v6 { - if !(mask >= 1 && mask <= 128) { - bail!("IPv6 mask '{}' is out of range (1..128).", mask); - } + let (ver, min, max) = if is_v6 { + ("IPv6", 1, 128) } else { - if !(mask > 0 && mask <= 32) { - bail!("IPv4 mask '{}' is out of range (1..32).", mask); - } + ("IPv4", 1, 32) + }; + + if !(mask >= min && mask <= max) { + bail!("{} mask '{}' is out of range ({}..{}).", ver, mask, min, max); } + Ok(()) } diff --git a/src/rrd/rrd.rs b/src/rrd/rrd.rs index c8b16471..37bdf3b9 100644 --- a/src/rrd/rrd.rs +++ b/src/rrd/rrd.rs @@ -128,25 +128,20 @@ impl RRA { // derive counter value if self.flags.intersects(RRAFlags::DST_DERIVE | RRAFlags::DST_COUNTER) { let time_diff = time - self.last_update; + let is_counter = self.flags.contains(RRAFlags::DST_COUNTER); + let diff = if self.counter_value.is_nan() { 0.0 + } else if is_counter && value < 0.0 { + eprintln!("rrdb update failed - got negative value for counter"); + return; + } else if is_counter && value < self.counter_value { + // Note: We do not try automatic overflow corrections + self.counter_value = value; + eprintln!("rrdb update failed - conter overflow/reset detected"); + return; } else { - if self.flags.contains(RRAFlags::DST_COUNTER) { // check for overflow - if value < 0.0 { - eprintln!("rrdb update failed - got negative value for counter"); - return; - } - // Note: We do not try automatic overflow corrections - if value < self.counter_value { // overflow or counter reset - self.counter_value = value; - eprintln!("rrdb update failed - conter overflow/reset detected"); - return; - } else { - value - self.counter_value - } - } else { - value - self.counter_value - } + value - self.counter_value }; self.counter_value = value; value = diff/time_diff; From 4428818412632eb4c9b955aa568152d7963fbee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Fri, 15 Jan 2021 14:38:27 +0100 Subject: [PATCH 02/32] clippy: remove unnecessary clones MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit and from::(T) Signed-off-by: Fabian Grünbichler --- src/api2/access/role.rs | 2 +- src/api2/access/user.rs | 2 +- src/api2/admin/datastore.rs | 12 ++++++------ src/api2/admin/sync.rs | 2 +- src/api2/backup.rs | 2 +- src/api2/config/datastore.rs | 2 +- src/api2/config/remote.rs | 2 +- src/api2/config/sync.rs | 4 ++-- src/api2/config/verify.rs | 2 +- src/api2/helpers.rs | 2 +- src/api2/node/disks/directory.rs | 2 +- src/api2/node/subscription.rs | 2 +- src/api2/tape/backup.rs | 2 +- src/api2/tape/restore.rs | 3 +-- src/backup/checksum_writer.rs | 2 +- src/backup/chunk_store.rs | 5 ++--- src/backup/datastore.rs | 4 +--- src/backup/dynamic_index.rs | 2 +- src/backup/key_derivation.rs | 6 +++--- src/backup/manifest.rs | 2 +- src/bin/proxmox-backup-client.rs | 2 +- src/bin/proxmox_backup_client/key.rs | 2 +- src/config/network.rs | 2 +- src/config/sync.rs | 2 +- src/config/tape_encryption_keys.rs | 4 ++-- src/server/email_notifications.rs | 2 +- src/server/environment.rs | 2 +- src/server/h2service.rs | 2 +- src/server/rest.rs | 2 +- src/server/verify_job.rs | 2 +- src/tape/helpers/snapshot_reader.rs | 2 +- src/tools/broadcast_future.rs | 2 +- src/tools/runtime.rs | 2 +- tests/prune.rs | 6 +++--- tests/worker-task-abort.rs | 2 +- 35 files changed, 47 insertions(+), 51 deletions(-) diff --git a/src/api2/access/role.rs b/src/api2/access/role.rs index 2b4c6b82..43863d40 100644 --- a/src/api2/access/role.rs +++ b/src/api2/access/role.rs @@ -46,7 +46,7 @@ fn list_roles() -> Result { let mut priv_list = Vec::new(); for (name, privilege) in PRIVILEGES.iter() { if privs & privilege > 0 { - priv_list.push(name.clone()); + priv_list.push(name); } } list.push(json!({ "roleid": role, "privs": priv_list, "comment": comment })); diff --git a/src/api2/access/user.rs b/src/api2/access/user.rs index f03389f8..ea583b1d 100644 --- a/src/api2/access/user.rs +++ b/src/api2/access/user.rs @@ -603,7 +603,7 @@ pub fn generate_token( token_shadow::set_secret(&tokenid, &secret)?; let token = user::ApiToken { - tokenid: tokenid.clone(), + tokenid, comment, enable, expire, diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index 5b9a1e84..9ce096f5 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -440,8 +440,8 @@ pub fn list_snapshots ( let files = info .files .into_iter() - .map(|x| BackupContent { - filename: x.to_string(), + .map(|filename| BackupContent { + filename, size: None, crypt_mode: None, }) @@ -666,7 +666,7 @@ pub fn verify( let upid_str = WorkerTask::new_thread( worker_type, - Some(worker_id.clone()), + Some(worker_id), auth_id.clone(), to_stdout, move |worker| { @@ -855,7 +855,7 @@ fn prune( // We use a WorkerTask just to have a task log, but run synchrounously - let worker = WorkerTask::new("prune", Some(worker_id), auth_id.clone(), true)?; + let worker = WorkerTask::new("prune", Some(worker_id), auth_id, true)?; if keep_all { worker.log("No prune selection - keeping all files."); @@ -1009,7 +1009,7 @@ fn get_datastore_list( } } - Ok(list.into()) + Ok(list) } #[sortable] @@ -1066,7 +1066,7 @@ fn download_file( .map_err(|err| http_err!(BAD_REQUEST, "File open failed: {}", err))?; let payload = tokio_util::codec::FramedRead::new(file, tokio_util::codec::BytesCodec::new()) - .map_ok(|bytes| hyper::body::Bytes::from(bytes.freeze())) + .map_ok(|bytes| bytes.freeze()) .map_err(move |err| { eprintln!("error during streaming of '{:?}' - {}", &path, err); err diff --git a/src/api2/admin/sync.rs b/src/api2/admin/sync.rs index c9b9e145..3a808b22 100644 --- a/src/api2/admin/sync.rs +++ b/src/api2/admin/sync.rs @@ -58,7 +58,7 @@ pub fn list_sync_jobs( } }) .filter(|job: &SyncJobStatus| { - let as_config: SyncJobConfig = job.clone().into(); + let as_config: SyncJobConfig = job.into(); check_sync_job_read_access(&user_info, &auth_id, &as_config) }).collect(); diff --git a/src/api2/backup.rs b/src/api2/backup.rs index bf9c1465..9c773ecf 100644 --- a/src/api2/backup.rs +++ b/src/api2/backup.rs @@ -138,7 +138,7 @@ async move { } }; - let backup_dir = BackupDir::with_group(backup_group.clone(), backup_time)?; + let backup_dir = BackupDir::with_group(backup_group, backup_time)?; let _last_guard = if let Some(last) = &last_backup { if backup_dir.backup_time() <= last.backup_dir.backup_time() { diff --git a/src/api2/config/datastore.rs b/src/api2/config/datastore.rs index a4d25989..b8b420e0 100644 --- a/src/api2/config/datastore.rs +++ b/src/api2/config/datastore.rs @@ -120,7 +120,7 @@ pub fn create_datastore(param: Value) -> Result<(), Error> { let _lock = open_file_locked(datastore::DATASTORE_CFG_LOCKFILE, std::time::Duration::new(10, 0), true)?; - let datastore: datastore::DataStoreConfig = serde_json::from_value(param.clone())?; + let datastore: datastore::DataStoreConfig = serde_json::from_value(param)?; let (mut config, _digest) = datastore::config()?; diff --git a/src/api2/config/remote.rs b/src/api2/config/remote.rs index 49db68ce..5c29d28a 100644 --- a/src/api2/config/remote.rs +++ b/src/api2/config/remote.rs @@ -96,7 +96,7 @@ pub fn create_remote(password: String, param: Value) -> Result<(), Error> { let _lock = open_file_locked(remote::REMOTE_CFG_LOCKFILE, std::time::Duration::new(10, 0), true)?; - let mut data = param.clone(); + let mut data = param; data["password"] = Value::from(base64::encode(password.as_bytes())); let remote: remote::Remote = serde_json::from_value(data)?; diff --git a/src/api2/config/sync.rs b/src/api2/config/sync.rs index 1192d15f..c0f40909 100644 --- a/src/api2/config/sync.rs +++ b/src/api2/config/sync.rs @@ -154,7 +154,7 @@ pub fn create_sync_job( let _lock = open_file_locked(sync::SYNC_CFG_LOCKFILE, std::time::Duration::new(10, 0), true)?; - let sync_job: sync::SyncJobConfig = serde_json::from_value(param.clone())?; + let sync_job: sync::SyncJobConfig = serde_json::from_value(param)?; if !check_sync_job_modify_access(&user_info, &auth_id, &sync_job) { bail!("permission check failed"); } @@ -514,7 +514,7 @@ acl:1:/remote/remote1/remotestore1:write@pbs:RemoteSyncOperator // unless they have Datastore.Modify as well job.store = "localstore3".to_string(); - job.owner = Some(read_auth_id.clone()); + job.owner = Some(read_auth_id); assert_eq!(check_sync_job_modify_access(&user_info, &write_auth_id, &job), true); job.owner = None; assert_eq!(check_sync_job_modify_access(&user_info, &write_auth_id, &job), true); diff --git a/src/api2/config/verify.rs b/src/api2/config/verify.rs index 2be2772d..7d59893a 100644 --- a/src/api2/config/verify.rs +++ b/src/api2/config/verify.rs @@ -98,7 +98,7 @@ pub fn create_verification_job( let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let user_info = CachedUserInfo::new()?; - let verification_job: verify::VerificationJobConfig = serde_json::from_value(param.clone())?; + let verification_job: verify::VerificationJobConfig = serde_json::from_value(param)?; user_info.check_privs(&auth_id, &["datastore", &verification_job.store], PRIV_DATASTORE_VERIFY, false)?; diff --git a/src/api2/helpers.rs b/src/api2/helpers.rs index 3a11340b..2a822654 100644 --- a/src/api2/helpers.rs +++ b/src/api2/helpers.rs @@ -16,7 +16,7 @@ pub async fn create_download_response(path: PathBuf) -> Result, E }; let payload = tokio_util::codec::FramedRead::new(file, tokio_util::codec::BytesCodec::new()) - .map_ok(|bytes| hyper::body::Bytes::from(bytes.freeze())); + .map_ok(|bytes| bytes.freeze()); let body = Body::wrap_stream(payload); diff --git a/src/api2/node/disks/directory.rs b/src/api2/node/disks/directory.rs index da16e753..32628c4a 100644 --- a/src/api2/node/disks/directory.rs +++ b/src/api2/node/disks/directory.rs @@ -164,7 +164,7 @@ pub fn create_datastore_disk( let manager = DiskManage::new(); - let disk = manager.clone().disk_by_name(&disk)?; + let disk = manager.disk_by_name(&disk)?; let partition = create_single_linux_partition(&disk)?; create_file_system(&partition, filesystem)?; diff --git a/src/api2/node/subscription.rs b/src/api2/node/subscription.rs index c935fa2c..0559a2e5 100644 --- a/src/api2/node/subscription.rs +++ b/src/api2/node/subscription.rs @@ -137,7 +137,7 @@ pub fn set_subscription( let server_id = tools::get_hardware_address()?; - let info = subscription::check_subscription(key, server_id.to_owned())?; + let info = subscription::check_subscription(key, server_id)?; subscription::write_subscription(info) .map_err(|e| format_err!("Error writing subscription status - {}", e))?; diff --git a/src/api2/tape/backup.rs b/src/api2/tape/backup.rs index 56622e64..5e05e599 100644 --- a/src/api2/tape/backup.rs +++ b/src/api2/tape/backup.rs @@ -94,7 +94,7 @@ pub fn backup( let upid_str = WorkerTask::new_thread( "tape-backup", - Some(store.clone()), + Some(store), auth_id, to_stdout, move |worker| { diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs index 1131f181..441cbd1a 100644 --- a/src/api2/tape/restore.rs +++ b/src/api2/tape/restore.rs @@ -128,7 +128,7 @@ pub fn restore( let members = inventory.compute_media_set_members(&media_set_uuid)?; - let media_list = members.media_list().clone(); + let media_list = members.media_list(); let mut media_id_list = Vec::new(); @@ -234,7 +234,6 @@ pub fn restore_media( Some(reader) => reader, }; - let target = target.clone(); restore_archive(worker, reader, current_file_number, target, &mut catalog, verbose)?; } diff --git a/src/backup/checksum_writer.rs b/src/backup/checksum_writer.rs index 1167be6c..5aac6511 100644 --- a/src/backup/checksum_writer.rs +++ b/src/backup/checksum_writer.rs @@ -18,7 +18,7 @@ impl ChecksumWriter { let hasher = crc32fast::Hasher::new(); let signer = match config { Some(config) => { - let tied_signer = Tied::new(config.clone(), |config| { + let tied_signer = Tied::new(config, |config| { Box::new(unsafe { (*config).data_signer() }) }); Some(tied_signer) diff --git a/src/backup/chunk_store.rs b/src/backup/chunk_store.rs index 34d6f655..99d62a2e 100644 --- a/src/backup/chunk_store.rs +++ b/src/backup/chunk_store.rs @@ -80,7 +80,7 @@ impl ChunkStore { let default_options = CreateOptions::new(); - match create_path(&base, Some(default_options.clone()), Some(options.clone())) { + match create_path(&base, Some(default_options), Some(options.clone())) { Err(err) => bail!("unable to create chunk store '{}' at {:?} - {}", name, base, err), Ok(res) => if ! res { nix::unistd::chown(&base, Some(uid), Some(gid))? }, } @@ -113,9 +113,8 @@ impl ChunkStore { } fn lockfile_path>(base: P) -> PathBuf { - let base: PathBuf = base.into(); + let mut lockfile_path: PathBuf = base.into(); - let mut lockfile_path = base.clone(); lockfile_path.push(".lock"); lockfile_path diff --git a/src/backup/datastore.rs b/src/backup/datastore.rs index 19e7ccba..b384d88a 100644 --- a/src/backup/datastore.rs +++ b/src/backup/datastore.rs @@ -334,9 +334,7 @@ impl DataStore { auth_id: &Authid, ) -> Result<(Authid, DirLockGuard), Error> { // create intermediate path first: - let base_path = self.base_path(); - - let mut full_path = base_path.clone(); + let mut full_path = self.base_path(); full_path.push(backup_group.backup_type()); std::fs::create_dir_all(&full_path)?; diff --git a/src/backup/dynamic_index.rs b/src/backup/dynamic_index.rs index df651906..54561205 100644 --- a/src/backup/dynamic_index.rs +++ b/src/backup/dynamic_index.rs @@ -229,7 +229,7 @@ impl IndexFile for DynamicIndexReader { Some(ChunkReadInfo { range: start..end, - digest: self.index[pos].digest.clone(), + digest: self.index[pos].digest, }) } diff --git a/src/backup/key_derivation.rs b/src/backup/key_derivation.rs index b0647618..73478c00 100644 --- a/src/backup/key_derivation.rs +++ b/src/backup/key_derivation.rs @@ -233,7 +233,7 @@ pub fn decrypt_key_config( let mut result = [0u8; 32]; result.copy_from_slice(&key); - let crypt_config = CryptConfig::new(result.clone())?; + let crypt_config = CryptConfig::new(result)?; let fingerprint = crypt_config.fingerprint(); if let Some(ref stored_fingerprint) = key_config.fingerprint { if &fingerprint != stored_fingerprint { @@ -313,9 +313,9 @@ fn encrypt_decrypt_test() -> Result<(), Error> { ])), }; - let encrypted = rsa_encrypt_key_config(public.clone(), &key).expect("encryption failed"); + let encrypted = rsa_encrypt_key_config(public, &key).expect("encryption failed"); let (decrypted, created, fingerprint) = - rsa_decrypt_key_config(private.clone(), &encrypted, &passphrase) + rsa_decrypt_key_config(private, &encrypted, &passphrase) .expect("decryption failed"); assert_eq!(key.created, created); diff --git a/src/backup/manifest.rs b/src/backup/manifest.rs index d9a55655..47f9cadc 100644 --- a/src/backup/manifest.rs +++ b/src/backup/manifest.rs @@ -186,7 +186,7 @@ impl BackupManifest { manifest["unprotected"]["key-fingerprint"] = serde_json::to_value(fingerprint)?; } - let manifest = serde_json::to_string_pretty(&manifest).unwrap().into(); + let manifest = serde_json::to_string_pretty(&manifest).unwrap(); Ok(manifest) } diff --git a/src/bin/proxmox-backup-client.rs b/src/bin/proxmox-backup-client.rs index 2cd00c2e..96e47588 100644 --- a/src/bin/proxmox-backup-client.rs +++ b/src/bin/proxmox-backup-client.rs @@ -917,7 +917,7 @@ async fn create_backup( let (key, created, fingerprint) = decrypt_key(&key, &key::get_encryption_key_password)?; println!("Encryption key fingerprint: {}", fingerprint); - let crypt_config = CryptConfig::new(key.clone())?; + let crypt_config = CryptConfig::new(key)?; match key::find_master_pubkey()? { Some(ref path) if path.exists() => { diff --git a/src/bin/proxmox_backup_client/key.rs b/src/bin/proxmox_backup_client/key.rs index 109f0384..06104feb 100644 --- a/src/bin/proxmox_backup_client/key.rs +++ b/src/bin/proxmox_backup_client/key.rs @@ -118,7 +118,7 @@ fn create(kdf: Option, path: Option) -> Result<(), Error> { let mut key_array = [0u8; 32]; proxmox::sys::linux::fill_with_random_data(&mut key_array)?; - let crypt_config = CryptConfig::new(key_array.clone())?; + let crypt_config = CryptConfig::new(key_array)?; let key = key_array.to_vec(); match kdf { diff --git a/src/config/network.rs b/src/config/network.rs index 458dfe11..d6790afe 100644 --- a/src/config/network.rs +++ b/src/config/network.rs @@ -577,7 +577,7 @@ pub fn complete_port_list(arg: &str, _param: &HashMap) -> Vec return vec![], }; - let arg = arg.clone().trim(); + let arg = arg.trim(); let prefix = if let Some(idx) = arg.rfind(",") { &arg[..idx+1] } else { "" }; ports.iter().map(|port| format!("{}{}", prefix, port)).collect() } diff --git a/src/config/sync.rs b/src/config/sync.rs index d2e945a1..0d9be9dc 100644 --- a/src/config/sync.rs +++ b/src/config/sync.rs @@ -79,7 +79,7 @@ impl From<&SyncJobStatus> for SyncJobConfig { owner: job_status.owner.clone(), remote: job_status.remote.clone(), remote_store: job_status.remote_store.clone(), - remove_vanished: job_status.remove_vanished.clone(), + remove_vanished: job_status.remove_vanished, comment: job_status.comment.clone(), schedule: job_status.schedule.clone(), } diff --git a/src/config/tape_encryption_keys.rs b/src/config/tape_encryption_keys.rs index ff565349..284d0ed3 100644 --- a/src/config/tape_encryption_keys.rs +++ b/src/config/tape_encryption_keys.rs @@ -61,7 +61,7 @@ pub struct EncryptionKeyConfig { } pub fn compute_tape_key_fingerprint(key: &[u8; 32]) -> Result { - let crypt_config = CryptConfig::new(key.clone())?; + let crypt_config = CryptConfig::new(*key)?; Ok(crypt_config.fingerprint()) } @@ -228,7 +228,7 @@ pub fn insert_key(key: [u8;32], key_config: KeyConfig, hint: String) -> Result<( save_keys(key_map)?; let item = EncryptionKeyConfig::new(key_config, hint); - config_map.insert(fingerprint.clone(), item); + config_map.insert(fingerprint, item); save_key_configs(config_map)?; Ok(()) diff --git a/src/server/email_notifications.rs b/src/server/email_notifications.rs index 8bfc5f55..9a31f628 100644 --- a/src/server/email_notifications.rs +++ b/src/server/email_notifications.rs @@ -403,7 +403,7 @@ fn lookup_user_email(userid: &Userid) -> Option { if let Ok(user_config) = user::cached_config() { if let Ok(user) = user_config.lookup::("user", userid.as_str()) { - return user.email.clone(); + return user.email; } } diff --git a/src/server/environment.rs b/src/server/environment.rs index 2577c379..0548b5bc 100644 --- a/src/server/environment.rs +++ b/src/server/environment.rs @@ -48,6 +48,6 @@ impl RpcEnvironment for RestEnvironment { } fn get_client_ip(&self) -> Option { - self.client_ip.clone() + self.client_ip } } diff --git a/src/server/h2service.rs b/src/server/h2service.rs index 0bb735b8..989618ec 100644 --- a/src/server/h2service.rs +++ b/src/server/h2service.rs @@ -97,7 +97,7 @@ impl tower_service::Service> for H2Ser let method = req.method().clone(); let worker = self.worker.clone(); - std::pin::Pin::from(self.handle_request(req)) + self.handle_request(req) .map(move |result| match result { Ok(res) => { Self::log_response(worker, method, &path, &res); diff --git a/src/server/rest.rs b/src/server/rest.rs index 79c9c3d0..67fbbbb2 100644 --- a/src/server/rest.rs +++ b/src/server/rest.rs @@ -517,7 +517,7 @@ async fn chuncked_static_file_download(filename: PathBuf) -> Result BroadcastFuture { let task = source.map(move |value| { match value { - Ok(value) => Self::notify_listeners(inner1, Ok(value.clone())), + Ok(value) => Self::notify_listeners(inner1, Ok(value)), Err(err) => Self::notify_listeners(inner1, Err(err.to_string())), } }); diff --git a/src/tools/runtime.rs b/src/tools/runtime.rs index 46564e76..477d26d6 100644 --- a/src/tools/runtime.rs +++ b/src/tools/runtime.rs @@ -73,7 +73,7 @@ pub fn get_runtime_with_builder runtime::Builder>(get_builder: F) -> let runtime = builder.build().expect("failed to spawn tokio runtime"); let rt = Arc::new(runtime); - *guard = Arc::downgrade(&rt.clone()); + *guard = Arc::downgrade(&rt); rt } diff --git a/tests/prune.rs b/tests/prune.rs index d9758ea7..da516a0e 100644 --- a/tests/prune.rs +++ b/tests/prune.rs @@ -63,7 +63,7 @@ fn test_prune_hourly() -> Result<(), Error> { ]; assert_eq!(remove_list, expect); - let list = orig_list.clone(); + let list = orig_list; let options = PruneOptions::new().keep_hourly(Some(2)); let remove_list = get_prune_list(list, true, &options); let expect: Vec = vec![ @@ -126,7 +126,7 @@ fn test_prune_simple2() -> Result<(), Error> { ]; assert_eq!(remove_list, expect); - let list = orig_list.clone(); + let list = orig_list; let options = PruneOptions::new().keep_monthly(Some(1)).keep_yearly(Some(1)); let remove_list = get_prune_list(list, true, &options); let expect: Vec = vec![ @@ -266,7 +266,7 @@ fn test_prune_simple() -> Result<(), Error> { assert_eq!(remove_list, expect); // keep-weekly + keep-monthly + keep-yearly - let list = orig_list.clone(); + let list = orig_list; let options = PruneOptions::new().keep_weekly(Some(5)).keep_monthly(Some(6)).keep_yearly(Some(7)); let remove_list = get_prune_list(list, false, &options); // all backup are within one week, so we only keep a single file diff --git a/tests/worker-task-abort.rs b/tests/worker-task-abort.rs index 7ec3958c..1a0d938d 100644 --- a/tests/worker-task-abort.rs +++ b/tests/worker-task-abort.rs @@ -25,7 +25,7 @@ fn garbage_collection(worker: &server::WorkerTask) -> Result<(), Error> { worker.log("end garbage collection"); - Ok(()).into() + Ok(()) } From 22a9189ee0ffc001eb5851859a514c3ab2fd053a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Fri, 15 Jan 2021 15:21:34 +0100 Subject: [PATCH 03/32] clippy: remove unnecessary closures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/api2/access/user.rs | 2 +- src/api2/admin/sync.rs | 4 ++-- src/api2/admin/verify.rs | 4 ++-- src/backup/fixed_index.rs | 2 +- src/bin/proxmox-backup-client.rs | 2 +- src/config/acl.rs | 16 ++++++++-------- src/pxar/extract.rs | 2 +- src/server/worker_task.rs | 3 +-- src/tape/drive/linux_tape.rs | 2 +- src/tools/apt.rs | 2 +- 10 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/api2/access/user.rs b/src/api2/access/user.rs index ea583b1d..9af15b69 100644 --- a/src/api2/access/user.rs +++ b/src/api2/access/user.rs @@ -169,7 +169,7 @@ pub fn list_users( }) .collect() } else { - iter.map(|user: user::User| UserWithTokens::new(user)) + iter.map(UserWithTokens::new) .collect() }; diff --git a/src/api2/admin/sync.rs b/src/api2/admin/sync.rs index 3a808b22..41d01a4b 100644 --- a/src/api2/admin/sync.rs +++ b/src/api2/admin/sync.rs @@ -81,13 +81,13 @@ pub fn list_sync_jobs( job.last_run_state = state; job.last_run_endtime = endtime; - let last = job.last_run_endtime.unwrap_or_else(|| starttime); + let last = job.last_run_endtime.unwrap_or(starttime); job.next_run = (|| -> Option { let schedule = job.schedule.as_ref()?; let event = parse_calendar_event(&schedule).ok()?; // ignore errors - compute_next_event(&event, last, false).unwrap_or_else(|_| None) + compute_next_event(&event, last, false).unwrap_or(None) })(); } diff --git a/src/api2/admin/verify.rs b/src/api2/admin/verify.rs index 6c345cd8..0337adcb 100644 --- a/src/api2/admin/verify.rs +++ b/src/api2/admin/verify.rs @@ -86,13 +86,13 @@ pub fn list_verification_jobs( job.last_run_state = state; job.last_run_endtime = endtime; - let last = job.last_run_endtime.unwrap_or_else(|| starttime); + let last = job.last_run_endtime.unwrap_or(starttime); job.next_run = (|| -> Option { let schedule = job.schedule.as_ref()?; let event = parse_calendar_event(&schedule).ok()?; // ignore errors - compute_next_event(&event, last, false).unwrap_or_else(|_| None) + compute_next_event(&event, last, false).unwrap_or(None) })(); } diff --git a/src/backup/fixed_index.rs b/src/backup/fixed_index.rs index 7ac41b13..279537de 100644 --- a/src/backup/fixed_index.rs +++ b/src/backup/fixed_index.rs @@ -60,7 +60,7 @@ impl FixedIndexReader { pub fn open(path: &Path) -> Result { File::open(path) .map_err(Error::from) - .and_then(|file| Self::new(file)) + .and_then(Self::new) .map_err(|err| format_err!("Unable to open fixed index {:?} - {}", path, err)) } diff --git a/src/bin/proxmox-backup-client.rs b/src/bin/proxmox-backup-client.rs index 96e47588..b5677cdb 100644 --- a/src/bin/proxmox-backup-client.rs +++ b/src/bin/proxmox-backup-client.rs @@ -898,7 +898,7 @@ async fn create_backup( } } - let backup_time = backup_time_opt.unwrap_or_else(|| epoch_i64()); + let backup_time = backup_time_opt.unwrap_or_else(epoch_i64); let client = connect(&repo)?; record_repository(&repo); diff --git a/src/config/acl.rs b/src/config/acl.rs index 3ad17eb5..32fb0b9b 100644 --- a/src/config/acl.rs +++ b/src/config/acl.rs @@ -402,7 +402,7 @@ impl AclTreeNode { } fn insert_group_role(&mut self, group: String, role: String, propagate: bool) { - let map = self.groups.entry(group).or_insert_with(|| HashMap::new()); + let map = self.groups.entry(group).or_insert_with(HashMap::new); if role == ROLE_NAME_NO_ACCESS { map.clear(); map.insert(role, propagate); @@ -413,7 +413,7 @@ impl AclTreeNode { } fn insert_user_role(&mut self, auth_id: Authid, role: String, propagate: bool) { - let map = self.users.entry(auth_id).or_insert_with(|| HashMap::new()); + let map = self.users.entry(auth_id).or_insert_with(HashMap::new); if role == ROLE_NAME_NO_ACCESS { map.clear(); map.insert(role, propagate); @@ -455,7 +455,7 @@ impl AclTree { node = node .children .entry(String::from(*comp)) - .or_insert_with(|| AclTreeNode::new()); + .or_insert_with(AclTreeNode::new); } node } @@ -521,12 +521,12 @@ impl AclTree { if *propagate { role_ug_map1 .entry(role) - .or_insert_with(|| BTreeSet::new()) + .or_insert_with(BTreeSet::new) .insert(auth_id); } else { role_ug_map0 .entry(role) - .or_insert_with(|| BTreeSet::new()) + .or_insert_with(BTreeSet::new) .insert(auth_id); } } @@ -538,12 +538,12 @@ impl AclTree { if *propagate { role_ug_map1 .entry(role) - .or_insert_with(|| BTreeSet::new()) + .or_insert_with(BTreeSet::new) .insert(group); } else { role_ug_map0 .entry(role) - .or_insert_with(|| BTreeSet::new()) + .or_insert_with(BTreeSet::new) .insert(group); } } @@ -563,7 +563,7 @@ impl AclTree { }); result_map .entry(item_list) - .or_insert_with(|| BTreeSet::new()) + .or_insert_with(BTreeSet::new) .insert(item.to_string()); } result_map diff --git a/src/pxar/extract.rs b/src/pxar/extract.rs index ed238a2c..12f9054d 100644 --- a/src/pxar/extract.rs +++ b/src/pxar/extract.rs @@ -228,7 +228,7 @@ impl Extractor { allow_existing_dirs, feature_flags, current_path: Arc::new(Mutex::new(OsString::new())), - on_error: Box::new(|err| Err(err)), + on_error: Box::new(Err), } } diff --git a/src/server/worker_task.rs b/src/server/worker_task.rs index 46fe9664..3ac618b0 100644 --- a/src/server/worker_task.rs +++ b/src/server/worker_task.rs @@ -362,8 +362,7 @@ fn update_active_workers(new_upid: Option<&UPID>) -> Result<(), Error> { if !worker_is_active_local(&info.upid) { // println!("Detected stopped task '{}'", &info.upid_str); let now = proxmox::tools::time::epoch_i64(); - let status = upid_read_status(&info.upid) - .unwrap_or_else(|_| TaskState::Unknown { endtime: now }); + let status = upid_read_status(&info.upid).unwrap_or(TaskState::Unknown { endtime: now }); finish_list.push(TaskListInfo { upid: info.upid, upid_str: info.upid_str, diff --git a/src/tape/drive/linux_tape.rs b/src/tape/drive/linux_tape.rs index a23524a7..fab8a2ca 100644 --- a/src/tape/drive/linux_tape.rs +++ b/src/tape/drive/linux_tape.rs @@ -527,7 +527,7 @@ impl TapeDriver for LinuxTapeHandle { let result: Result = serde_json::from_str(&output)?; result .map_err(|err| format_err!("{}", err)) - .map(|bits| TapeAlertFlags::from_bits_truncate(bits)) + .map(TapeAlertFlags::from_bits_truncate) } /// Set or clear encryption key diff --git a/src/tools/apt.rs b/src/tools/apt.rs index af8f51f1..f4734432 100644 --- a/src/tools/apt.rs +++ b/src/tools/apt.rs @@ -37,7 +37,7 @@ pub fn read_pkg_state() -> Result, Error> { }; serde_json::from_str(&serialized_state) - .map(|s| Some(s)) + .map(Some) .map_err(|err| format_err!("could not parse cached package status - {}", err)) } From 87152fbac6b5665c315b9df2304bb9b5fcd39cc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Mon, 18 Jan 2021 13:25:04 +0100 Subject: [PATCH 04/32] clippy: drop redundant 'static lifetime MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit those declarations are already const/static.. Signed-off-by: Fabian Grünbichler --- src/config/media_pool.rs | 4 ++-- src/tape/drive/mam.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config/media_pool.rs b/src/config/media_pool.rs index e7d66f42..5e1184e3 100644 --- a/src/config/media_pool.rs +++ b/src/config/media_pool.rs @@ -43,8 +43,8 @@ fn init() -> SectionConfig { config } -pub const MEDIA_POOL_CFG_FILENAME: &'static str = "/etc/proxmox-backup/media-pool.cfg"; -pub const MEDIA_POOL_CFG_LOCKFILE: &'static str = "/etc/proxmox-backup/.media-pool.lck"; +pub const MEDIA_POOL_CFG_FILENAME: &str = "/etc/proxmox-backup/media-pool.cfg"; +pub const MEDIA_POOL_CFG_LOCKFILE: &str = "/etc/proxmox-backup/.media-pool.lck"; pub fn lock() -> Result { open_file_locked(MEDIA_POOL_CFG_LOCKFILE, std::time::Duration::new(10, 0), true) diff --git a/src/tape/drive/mam.rs b/src/tape/drive/mam.rs index 1153863e..7aaa62b8 100644 --- a/src/tape/drive/mam.rs +++ b/src/tape/drive/mam.rs @@ -32,7 +32,7 @@ enum MamFormat { DEC, } -static MAM_ATTRIBUTES: &'static [ (u16, u16, MamFormat, &'static str) ] = &[ +static MAM_ATTRIBUTES: &[ (u16, u16, MamFormat, &str) ] = &[ (0x00_00, 8, MamFormat::DEC, "Remaining Capacity In Partition"), (0x00_01, 8, MamFormat::DEC, "Maximum Capacity In Partition"), (0x00_02, 8, MamFormat::DEC, "Tapealert Flags"), From 365915da9a6b41df9c4c062d35c3b2b82c8e9d08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Mon, 18 Jan 2021 13:50:28 +0100 Subject: [PATCH 05/32] clippy: use strip_prefix instead of manual stripping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit it's less error-prone (off-by-one!) Signed-off-by: Fabian Grünbichler --- src/config/acl.rs | 3 +-- src/config/network/lexer.rs | 4 ++-- src/config/tfa.rs | 16 ++++++++-------- src/server/command_socket.rs | 8 ++++---- src/server/ticket.rs | 4 ++-- src/server/worker_task.rs | 6 +++--- src/tape/changer/parse_mtx_status.rs | 21 ++++++++------------- src/tape/drive/virtual_tape.rs | 4 ++-- src/tools/disks.rs | 4 ++-- src/tools/disks/zpool_list.rs | 8 ++++---- src/tools/systemd/parse_time.rs | 16 +++++++--------- 11 files changed, 43 insertions(+), 51 deletions(-) diff --git a/src/config/acl.rs b/src/config/acl.rs index 32fb0b9b..4c3bd0bc 100644 --- a/src/config/acl.rs +++ b/src/config/acl.rs @@ -651,8 +651,7 @@ impl AclTree { if !ROLE_NAMES.contains_key(role) { bail!("unknown role '{}'", role); } - if user_or_group.starts_with('@') { - let group = &user_or_group[1..]; + if let Some(group) = user_or_group.strip_prefix('@') { node.insert_group_role(group.to_string(), role.to_string(), propagate); } else { node.insert_user_role(user_or_group.parse()?, role.to_string(), propagate); diff --git a/src/config/network/lexer.rs b/src/config/network/lexer.rs index d63312c5..b1aa294e 100644 --- a/src/config/network/lexer.rs +++ b/src/config/network/lexer.rs @@ -74,9 +74,9 @@ impl Lexer { } fn split_line(line: &str) -> VecDeque<(Token, String)> { - if line.starts_with("#") { + if let Some(comment) = line.strip_prefix('#') { let mut res = VecDeque::new(); - res.push_back((Token::Comment, line[1..].trim().to_string())); + res.push_back((Token::Comment, comment.trim().to_string())); return res; } let mut list: VecDeque<(Token, String)> = line.split_ascii_whitespace().map(|text| { diff --git a/src/config/tfa.rs b/src/config/tfa.rs index f957cd75..380df7e8 100644 --- a/src/config/tfa.rs +++ b/src/config/tfa.rs @@ -1380,14 +1380,14 @@ impl std::str::FromStr for TfaResponse { type Err = Error; fn from_str(s: &str) -> Result { - Ok(if s.starts_with("totp:") { - TfaResponse::Totp(s[5..].to_string()) - } else if s.starts_with("u2f:") { - TfaResponse::U2f(serde_json::from_str(&s[4..])?) - } else if s.starts_with("webauthn:") { - TfaResponse::Webauthn(serde_json::from_str(&s[9..])?) - } else if s.starts_with("recovery:") { - TfaResponse::Recovery(s[9..].to_string()) + Ok(if let Some(totp) = s.strip_prefix("totp:") { + TfaResponse::Totp(totp.to_string()) + } else if let Some(u2f) = s.strip_prefix("u2f:") { + TfaResponse::U2f(serde_json::from_str(u2f)?) + } else if let Some(webauthn) = s.strip_prefix("webauthn:") { + TfaResponse::Webauthn(serde_json::from_str(webauthn)?) + } else if let Some(recovery) = s.strip_prefix("recovery:") { + TfaResponse::Recovery(recovery.to_string()) } else { bail!("invalid tfa response"); }) diff --git a/src/server/command_socket.rs b/src/server/command_socket.rs index 84d4e9fe..89c77585 100644 --- a/src/server/command_socket.rs +++ b/src/server/command_socket.rs @@ -127,13 +127,13 @@ pub async fn send_command

( if rx.read_line(&mut data).await? == 0 { bail!("no response"); } - if data.starts_with("OK: ") { - match data[4..].parse::() { + if let Some(res) = data.strip_prefix("OK: ") { + match res.parse::() { Ok(v) => Ok(v), Err(err) => bail!("unable to parse json response - {}", err), } - } else if data.starts_with("ERROR: ") { - bail!("{}", &data[7..]); + } else if let Some(err) = data.strip_prefix("ERROR: ") { + bail!("{}", err); } else { bail!("unable to parse response: {}", data); } diff --git a/src/server/ticket.rs b/src/server/ticket.rs index 0142a03a..457fb24e 100644 --- a/src/server/ticket.rs +++ b/src/server/ticket.rs @@ -68,8 +68,8 @@ impl std::str::FromStr for ApiTicket { type Err = Error; fn from_str(s: &str) -> Result { - if s.starts_with("!tfa!") { - Ok(ApiTicket::Partial(serde_json::from_str(&s[5..])?)) + if let Some(tfa_ticket) = s.strip_prefix("!tfa!") { + Ok(ApiTicket::Partial(serde_json::from_str(tfa_ticket)?)) } else { Ok(ApiTicket::Full(s.parse()?)) } diff --git a/src/server/worker_task.rs b/src/server/worker_task.rs index 3ac618b0..f047c347 100644 --- a/src/server/worker_task.rs +++ b/src/server/worker_task.rs @@ -267,11 +267,11 @@ impl TaskState { Ok(TaskState::Unknown { endtime }) } else if s == "OK" { Ok(TaskState::OK { endtime }) - } else if s.starts_with("WARNINGS: ") { - let count: u64 = s[10..].parse()?; + } else if let Some(warnings) = s.strip_prefix("WARNINGS: ") { + let count: u64 = warnings.parse()?; Ok(TaskState::Warning{ count, endtime }) } else if s.len() > 0 { - let message = if s.starts_with("ERROR: ") { &s[7..] } else { s }.to_string(); + let message = if let Some(err) = s.strip_prefix("ERROR: ") { err } else { s }.to_string(); Ok(TaskState::Error{ message, endtime }) } else { bail!("unable to parse Task Status '{}'", s); diff --git a/src/tape/changer/parse_mtx_status.rs b/src/tape/changer/parse_mtx_status.rs index 438a7cb3..97bb7e6a 100644 --- a/src/tape/changer/parse_mtx_status.rs +++ b/src/tape/changer/parse_mtx_status.rs @@ -58,13 +58,12 @@ fn parse_drive_status(i: &str) -> IResult<&str, DriveStatus> { let mut loaded_slot = None; - if i.starts_with("Empty") { - return Ok((&i[5..], DriveStatus { loaded_slot, status: ElementStatus::Empty })); + if let Some(empty) = i.strip_suffix("Empty") { + return Ok((empty, DriveStatus { loaded_slot, status: ElementStatus::Empty })); } let (mut i, _) = tag("Full (")(i)?; - if i.starts_with("Storage Element ") { - let n = &i[16..]; + if let Some(n) = i.strip_prefix("Storage Element ") { let (n, id) = parse_u64(n)?; loaded_slot = Some(id); let (n, _) = tag(" Loaded")(n)?; @@ -76,8 +75,7 @@ fn parse_drive_status(i: &str) -> IResult<&str, DriveStatus> { let (i, _) = tag(")")(i)?; - if i.starts_with(":VolumeTag = ") { - let i = &i[13..]; + if let Some(i) = i.strip_prefix(":VolumeTag = ") { let (i, tag) = take_while(|c| !(c == ' ' || c == ':' || c == '\n'))(i)?; let (i, _) = take_while(|c| c != '\n')(i)?; // skip to eol return Ok((i, DriveStatus { loaded_slot, status: ElementStatus::VolumeTag(tag.to_string()) })); @@ -89,14 +87,11 @@ fn parse_drive_status(i: &str) -> IResult<&str, DriveStatus> { } fn parse_slot_status(i: &str) -> IResult<&str, ElementStatus> { - if i.starts_with("Empty") { - return Ok((&i[5..], ElementStatus::Empty)); + if let Some(empty) = i.strip_prefix("Empty") { + return Ok((empty, ElementStatus::Empty)); } - if i.starts_with("Full ") { - let mut n = &i[5..]; - - if n.starts_with(":VolumeTag=") { - n = &n[11..]; + if let Some(n) = i.strip_prefix("Full ") { + if let Some(n) = n.strip_prefix(":VolumeTag=") { let (n, tag) = take_while(|c| !(c == ' ' || c == ':' || c == '\n'))(n)?; let (n, _) = take_while(|c| c != '\n')(n)?; // skip to eol return Ok((n, ElementStatus::VolumeTag(tag.to_string()))); diff --git a/src/tape/drive/virtual_tape.rs b/src/tape/drive/virtual_tape.rs index 06de1cd6..126c8d3a 100644 --- a/src/tape/drive/virtual_tape.rs +++ b/src/tape/drive/virtual_tape.rs @@ -168,8 +168,8 @@ impl VirtualTapeHandle { if path.is_file() && path.extension() == Some(std::ffi::OsStr::new("json")) { if let Some(name) = path.file_stem() { if let Some(name) = name.to_str() { - if name.starts_with("tape-") { - list.push(name[5..].to_string()); + if let Some(label) = name.strip_prefix("tape-") { + list.push(label.to_string()); } } } diff --git a/src/tools/disks.rs b/src/tools/disks.rs index 1a07992e..706955a2 100644 --- a/src/tools/disks.rs +++ b/src/tools/disks.rs @@ -996,8 +996,8 @@ pub fn get_fs_uuid(disk: &Disk) -> Result { let output = crate::tools::run_command(command, None)?; for line in output.lines() { - if line.starts_with("UUID=") { - return Ok(line[5..].to_string()); + if let Some(uuid) = line.strip_prefix("UUID=") { + return Ok(uuid.to_string()); } } diff --git a/src/tools/disks/zpool_list.rs b/src/tools/disks/zpool_list.rs index 5087a54e..515068ca 100644 --- a/src/tools/disks/zpool_list.rs +++ b/src/tools/disks/zpool_list.rs @@ -31,8 +31,8 @@ pub struct ZFSPoolInfo { fn parse_optional_u64(i: &str) -> IResult<&str, Option> { - if i.starts_with('-') { - Ok((&i[1..], None)) + if let Some(rest) = i.strip_prefix('-') { + Ok((rest, None)) } else { let (i, value) = map_res(recognize(digit1), str::parse)(i)?; Ok((i, Some(value))) @@ -40,8 +40,8 @@ fn parse_optional_u64(i: &str) -> IResult<&str, Option> { } fn parse_optional_f64(i: &str) -> IResult<&str, Option> { - if i.starts_with('-') { - Ok((&i[1..], None)) + if let Some(rest) = i.strip_prefix('-') { + Ok((rest, None)) } else { let (i, value) = nom::number::complete::double(i)?; Ok((i, Some(value))) diff --git a/src/tools/systemd/parse_time.rs b/src/tools/systemd/parse_time.rs index a1e40139..a03b078b 100644 --- a/src/tools/systemd/parse_time.rs +++ b/src/tools/systemd/parse_time.rs @@ -151,10 +151,9 @@ fn parse_date_time_comp(max: usize) -> impl Fn(&str) -> IResult<&str, DateTimeVa return Ok((i, DateTimeValue::Range(value, end))) } - if i.starts_with("/") { - let i = &i[1..]; - let (i, repeat) = parse_time_comp(max)(i)?; - Ok((i, DateTimeValue::Repeated(value, repeat))) + if let Some(time) = i.strip_prefix('/') { + let (time, repeat) = parse_time_comp(max)(time)?; + Ok((time, DateTimeValue::Repeated(value, repeat))) } else { Ok((i, DateTimeValue::Single(value))) } @@ -163,15 +162,14 @@ fn parse_date_time_comp(max: usize) -> impl Fn(&str) -> IResult<&str, DateTimeVa fn parse_date_time_comp_list(start: u32, max: usize) -> impl Fn(&str) -> IResult<&str, Vec> { move |i: &str| { - if i.starts_with("*") { - let i = &i[1..]; - if i.starts_with("/") { - let (n, repeat) = parse_time_comp(max)(&i[1..])?; + if let Some(rest) = i.strip_prefix('*') { + if let Some(time) = rest.strip_prefix('/') { + let (n, repeat) = parse_time_comp(max)(time)?; if repeat > 0 { return Ok((n, vec![DateTimeValue::Repeated(start, repeat)])); } } - return Ok((i, Vec::new())); + return Ok((rest, Vec::new())); } separated_nonempty_list(tag(","), parse_date_time_comp(max))(i) From 397356096a91aee77daf5afad4783f6400a41abf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Mon, 18 Jan 2021 14:12:27 +0100 Subject: [PATCH 06/32] clippy: remove needless bool literals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/api2/admin/datastore.rs | 4 ++-- src/api2/node/apt.rs | 4 ++-- src/api2/node/disks.rs | 2 +- src/api2/node/disks/directory.rs | 2 +- src/api2/node/disks/zfs.rs | 2 +- src/api2/tape/backup.rs | 2 +- src/api2/tape/drive.rs | 14 +++++++------- src/api2/tape/restore.rs | 2 +- src/backup/verify.rs | 2 +- src/tape/pool_writer.rs | 4 ++-- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index 9ce096f5..cb748194 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -662,7 +662,7 @@ pub fn verify( _ => bail!("parameters do not specify a backup group or snapshot"), } - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let upid_str = WorkerTask::new_thread( worker_type, @@ -935,7 +935,7 @@ fn start_garbage_collection( let job = Job::new("garbage_collection", &store) .map_err(|_| format_err!("garbage collection already running"))?; - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let upid_str = crate::server::do_garbage_collection_job(job, datastore, &auth_id, None, to_stdout) .map_err(|err| format_err!("unable to start garbage collection job on datastore {} - {}", store, err))?; diff --git a/src/api2/node/apt.rs b/src/api2/node/apt.rs index e6077a8a..20281919 100644 --- a/src/api2/node/apt.rs +++ b/src/api2/node/apt.rs @@ -90,8 +90,8 @@ fn do_apt_update(worker: &WorkerTask, quiet: bool) -> Result<(), Error> { type: bool, description: r#"Send notification mail about new package updates availanle to the email address configured for 'root@pam')."#, - optional: true, default: false, + optional: true, }, quiet: { description: "Only produces output suitable for logging, omitting progress indicators.", @@ -116,7 +116,7 @@ pub fn apt_update_database( ) -> Result { let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; // FIXME: change to non-option in signature and drop below once we have proxmox-api-macro 0.2.3 let quiet = quiet.unwrap_or(API_METHOD_APT_UPDATE_DATABASE_PARAM_DEFAULT_QUIET); let notify = notify.unwrap_or(API_METHOD_APT_UPDATE_DATABASE_PARAM_DEFAULT_NOTIFY); diff --git a/src/api2/node/disks.rs b/src/api2/node/disks.rs index 97e04edd..44554157 100644 --- a/src/api2/node/disks.rs +++ b/src/api2/node/disks.rs @@ -138,7 +138,7 @@ pub fn initialize_disk( rpcenv: &mut dyn RpcEnvironment, ) -> Result { - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; diff --git a/src/api2/node/disks/directory.rs b/src/api2/node/disks/directory.rs index 32628c4a..c3840526 100644 --- a/src/api2/node/disks/directory.rs +++ b/src/api2/node/disks/directory.rs @@ -132,7 +132,7 @@ pub fn create_datastore_disk( rpcenv: &mut dyn RpcEnvironment, ) -> Result { - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; diff --git a/src/api2/node/disks/zfs.rs b/src/api2/node/disks/zfs.rs index ef7b7c67..0f93f110 100644 --- a/src/api2/node/disks/zfs.rs +++ b/src/api2/node/disks/zfs.rs @@ -254,7 +254,7 @@ pub fn create_zpool( rpcenv: &mut dyn RpcEnvironment, ) -> Result { - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; diff --git a/src/api2/tape/backup.rs b/src/api2/tape/backup.rs index 5e05e599..2288a393 100644 --- a/src/api2/tape/backup.rs +++ b/src/api2/tape/backup.rs @@ -87,7 +87,7 @@ pub fn backup( // early check before starting worker check_drive_exists(&drive_config, &pool_config.drive)?; - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let eject_media = eject_media.unwrap_or(false); let export_media_set = export_media_set.unwrap_or(false); diff --git a/src/api2/tape/drive.rs b/src/api2/tape/drive.rs index 5cf18fe5..48b58251 100644 --- a/src/api2/tape/drive.rs +++ b/src/api2/tape/drive.rs @@ -227,7 +227,7 @@ pub fn erase_media( let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let upid_str = WorkerTask::new_thread( "erase-media", @@ -268,7 +268,7 @@ pub fn rewind( let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let upid_str = WorkerTask::new_thread( "rewind-media", @@ -354,7 +354,7 @@ pub fn label_media( let (config, _digest) = config::drive::config()?; - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let upid_str = WorkerTask::new_thread( "label-media", @@ -590,7 +590,7 @@ pub fn clean_drive( let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let upid_str = WorkerTask::new_thread( "clean-drive", @@ -717,7 +717,7 @@ pub fn update_inventory( let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let upid_str = WorkerTask::new_thread( "inventory-update", @@ -819,7 +819,7 @@ pub fn barcode_label_media( let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let upid_str = WorkerTask::new_thread( "barcode-label-media", @@ -997,7 +997,7 @@ pub fn catalog_media( let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let upid_str = WorkerTask::new_thread( "catalog-media", diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs index 441cbd1a..36bee0bd 100644 --- a/src/api2/tape/restore.rs +++ b/src/api2/tape/restore.rs @@ -115,7 +115,7 @@ pub fn restore( // early check before starting worker check_drive_exists(&drive_config, &pool_config.drive)?; - let to_stdout = if rpcenv.env_type() == RpcEnvironmentType::CLI { true } else { false }; + let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI; let upid_str = WorkerTask::new_thread( "tape-restore", diff --git a/src/backup/verify.rs b/src/backup/verify.rs index 7ba8d56a..5e4bc7fb 100644 --- a/src/backup/verify.rs +++ b/src/backup/verify.rs @@ -342,7 +342,7 @@ pub fn verify_backup_dir_with_lock( }; if let Some(filter) = filter { - if filter(&manifest) == false { + if !filter(&manifest) { task_log!( worker, "SKIPPED: verify {}:{} (recently verified)", diff --git a/src/tape/pool_writer.rs b/src/tape/pool_writer.rs index b04bfddb..5cb04eb9 100644 --- a/src/tape/pool_writer.rs +++ b/src/tape/pool_writer.rs @@ -303,7 +303,7 @@ impl PoolWriter { status.bytes_written += bytes_written; - let request_sync = if status.bytes_written >= COMMIT_BLOCK_SIZE { true } else { false }; + let request_sync = status.bytes_written >= COMMIT_BLOCK_SIZE; if !done || request_sync { status.commit()?; @@ -361,7 +361,7 @@ impl PoolWriter { (bytes_written as f64)/(1024.0*1024.0*elapsed), )); - let request_sync = if status.bytes_written >= COMMIT_BLOCK_SIZE { true } else { false }; + let request_sync = status.bytes_written >= COMMIT_BLOCK_SIZE; // register chunks in media_catalog status.catalog.start_chunk_archive(content_uuid, current_file_number)?; From 3984a5fd776a579a2eed0a04026014610b0edd76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 10:27:59 +0100 Subject: [PATCH 07/32] clippy: is_some/none/ok/err/empty MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/api2/access/acl.rs | 4 ++-- src/api2/access/user.rs | 4 ++-- src/api2/admin/datastore.rs | 6 +++--- src/api2/backup/environment.rs | 2 +- src/api2/config/datastore.rs | 2 +- src/api2/config/remote.rs | 2 +- src/api2/config/sync.rs | 2 +- src/api2/config/verify.rs | 2 +- src/api2/node/apt.rs | 2 +- src/api2/node/tasks.rs | 2 +- src/api2/tape/drive.rs | 8 +++----- src/api2/types/mod.rs | 4 ++-- src/backup/chunk_store.rs | 2 +- src/backup/chunk_stream.rs | 4 ++-- src/backup/crypt_reader.rs | 6 +++--- src/backup/prune.rs | 2 +- src/bin/proxmox-backup-proxy.rs | 6 ++---- src/bin/proxmox_backup_client/mount.rs | 4 ++-- src/config/tape_encryption_keys.rs | 2 +- src/server/worker_task.rs | 6 +++--- src/tools/fuse_loop.rs | 4 ++-- tests/verify-api.rs | 4 ++-- 22 files changed, 38 insertions(+), 42 deletions(-) diff --git a/src/api2/access/acl.rs b/src/api2/access/acl.rs index ff9da466..f1fd9995 100644 --- a/src/api2/access/acl.rs +++ b/src/api2/access/acl.rs @@ -72,7 +72,7 @@ fn extract_acl_node_data( } } for (group, roles) in &node.groups { - if let Some(_) = token_user { + if token_user.is_some() { continue; } @@ -210,7 +210,7 @@ pub fn update_acl( let top_level_privs = user_info.lookup_privs(¤t_auth_id, &["access", "acl"]); if top_level_privs & PRIV_PERMISSIONS_MODIFY == 0 { - if let Some(_) = group { + if group.is_some() { bail!("Unprivileged users are not allowed to create group ACL item."); } diff --git a/src/api2/access/user.rs b/src/api2/access/user.rs index 9af15b69..a4f29f61 100644 --- a/src/api2/access/user.rs +++ b/src/api2/access/user.rs @@ -230,7 +230,7 @@ pub fn create_user( let (mut config, _digest) = user::config()?; - if let Some(_) = config.sections.get(user.userid.as_str()) { + if config.sections.get(user.userid.as_str()).is_some() { bail!("user '{}' already exists.", user.userid); } @@ -595,7 +595,7 @@ pub fn generate_token( let tokenid = Authid::from((userid.clone(), Some(tokenname.clone()))); let tokenid_string = tokenid.to_string(); - if let Some(_) = config.sections.get(&tokenid_string) { + if config.sections.get(&tokenid_string).is_some() { bail!("token '{}' for user '{}' already exists.", tokenname.as_str(), userid); } diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index cb748194..12263e48 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -711,7 +711,7 @@ pub fn verify( verify_all_backups(datastore, worker.clone(), worker.upid(), owner, None)? }; - if failed_dirs.len() > 0 { + if !failed_dirs.is_empty() { worker.log("Failed to verify the following snapshots/groups:"); for dir in failed_dirs { worker.log(format!("\t{}", dir)); @@ -1341,7 +1341,7 @@ fn catalog( if filepath != "root" { components = base64::decode(filepath)?; - if components.len() > 0 && components[0] == '/' as u8 { + if !components.is_empty() && components[0] == b'/' { components.remove(0); } for component in components.split(|c| *c == '/' as u8) { @@ -1487,7 +1487,7 @@ fn pxar_file_download( check_priv_or_backup_owner(&datastore, backup_dir.group(), &auth_id, PRIV_DATASTORE_READ)?; let mut components = base64::decode(&filepath)?; - if components.len() > 0 && components[0] == '/' as u8 { + if !components.is_empty() && components[0] == b'/' { components.remove(0); } diff --git a/src/api2/backup/environment.rs b/src/api2/backup/environment.rs index ec7ca55d..53fd76a2 100644 --- a/src/api2/backup/environment.rs +++ b/src/api2/backup/environment.rs @@ -465,7 +465,7 @@ impl BackupEnvironment { state.ensure_unfinished()?; // test if all writer are correctly closed - if state.dynamic_writers.len() != 0 || state.fixed_writers.len() != 0 { + if !state.dynamic_writers.is_empty() || !state.fixed_writers.is_empty() { bail!("found open index writer - unable to finish backup"); } diff --git a/src/api2/config/datastore.rs b/src/api2/config/datastore.rs index b8b420e0..00009b74 100644 --- a/src/api2/config/datastore.rs +++ b/src/api2/config/datastore.rs @@ -124,7 +124,7 @@ pub fn create_datastore(param: Value) -> Result<(), Error> { let (mut config, _digest) = datastore::config()?; - if let Some(_) = config.sections.get(&datastore.name) { + if config.sections.get(&datastore.name).is_some() { bail!("datastore '{}' already exists.", datastore.name); } diff --git a/src/api2/config/remote.rs b/src/api2/config/remote.rs index 5c29d28a..fe7dc451 100644 --- a/src/api2/config/remote.rs +++ b/src/api2/config/remote.rs @@ -102,7 +102,7 @@ pub fn create_remote(password: String, param: Value) -> Result<(), Error> { let (mut config, _digest) = remote::config()?; - if let Some(_) = config.sections.get(&remote.name) { + if config.sections.get(&remote.name).is_some() { bail!("remote '{}' already exists.", remote.name); } diff --git a/src/api2/config/sync.rs b/src/api2/config/sync.rs index c0f40909..e7360051 100644 --- a/src/api2/config/sync.rs +++ b/src/api2/config/sync.rs @@ -161,7 +161,7 @@ pub fn create_sync_job( let (mut config, _digest) = sync::config()?; - if let Some(_) = config.sections.get(&sync_job.id) { + if config.sections.get(&sync_job.id).is_some() { bail!("job '{}' already exists.", sync_job.id); } diff --git a/src/api2/config/verify.rs b/src/api2/config/verify.rs index 7d59893a..08a9e717 100644 --- a/src/api2/config/verify.rs +++ b/src/api2/config/verify.rs @@ -106,7 +106,7 @@ pub fn create_verification_job( let (mut config, _digest) = verify::config()?; - if let Some(_) = config.sections.get(&verification_job.id) { + if config.sections.get(&verification_job.id).is_some() { bail!("job '{}' already exists.", verification_job.id); } diff --git a/src/api2/node/apt.rs b/src/api2/node/apt.rs index 20281919..345b1997 100644 --- a/src/api2/node/apt.rs +++ b/src/api2/node/apt.rs @@ -196,7 +196,7 @@ fn apt_get_changelog( } }, Some(&name)); - if pkg_info.len() == 0 { + if pkg_info.is_empty() { bail!("Package '{}' not found", name); } diff --git a/src/api2/node/tasks.rs b/src/api2/node/tasks.rs index 1a9fb942..8de35ca9 100644 --- a/src/api2/node/tasks.rs +++ b/src/api2/node/tasks.rs @@ -513,7 +513,7 @@ pub fn list_tasks( .collect(); let mut count = result.len() + start as usize; - if result.len() > 0 && result.len() >= limit { // we have a 'virtual' entry as long as we have any new + if !result.is_empty() && result.len() >= limit { // we have a 'virtual' entry as long as we have any new count += 1; } diff --git a/src/api2/tape/drive.rs b/src/api2/tape/drive.rs index 48b58251..ba80f488 100644 --- a/src/api2/tape/drive.rs +++ b/src/api2/tape/drive.rs @@ -747,11 +747,9 @@ pub fn update_inventory( let label_text = label_text.to_string(); - if !read_all_labels.unwrap_or(false) { - if let Some(_) = inventory.find_media_by_label_text(&label_text) { - worker.log(format!("media '{}' already inventoried", label_text)); - continue; - } + if !read_all_labels.unwrap_or(false) && inventory.find_media_by_label_text(&label_text).is_some() { + worker.log(format!("media '{}' already inventoried", label_text)); + continue; } if let Err(err) = changer.load_media(&label_text) { diff --git a/src/api2/types/mod.rs b/src/api2/types/mod.rs index 71875324..7cb1cdce 100644 --- a/src/api2/types/mod.rs +++ b/src/api2/types/mod.rs @@ -1077,7 +1077,7 @@ fn test_cert_fingerprint_schema() -> Result<(), anyhow::Error> { ]; for fingerprint in invalid_fingerprints.iter() { - if let Ok(_) = parse_simple_value(fingerprint, &schema) { + if parse_simple_value(fingerprint, &schema).is_ok() { bail!("test fingerprint '{}' failed - got Ok() while exception an error.", fingerprint); } } @@ -1118,7 +1118,7 @@ fn test_proxmox_user_id_schema() -> Result<(), anyhow::Error> { ]; for name in invalid_user_ids.iter() { - if let Ok(_) = parse_simple_value(name, &Userid::API_SCHEMA) { + if parse_simple_value(name, &Userid::API_SCHEMA).is_ok() { bail!("test userid '{}' failed - got Ok() while exception an error.", name); } } diff --git a/src/backup/chunk_store.rs b/src/backup/chunk_store.rs index 99d62a2e..39635d7d 100644 --- a/src/backup/chunk_store.rs +++ b/src/backup/chunk_store.rs @@ -401,7 +401,7 @@ impl ChunkStore { file.write_all(raw_data)?; if let Err(err) = std::fs::rename(&tmp_path, &chunk_path) { - if let Err(_) = std::fs::remove_file(&tmp_path) { /* ignore */ } + if std::fs::remove_file(&tmp_path).is_err() { /* ignore */ } bail!( "Atomic rename on store '{}' failed for chunk {} - {}", self.name, diff --git a/src/backup/chunk_stream.rs b/src/backup/chunk_stream.rs index 5bb06158..2c4040c4 100644 --- a/src/backup/chunk_stream.rs +++ b/src/backup/chunk_stream.rs @@ -59,7 +59,7 @@ where } None => { this.scan_pos = 0; - if this.buffer.len() > 0 { + if !this.buffer.is_empty() { return Poll::Ready(Some(Ok(this.buffer.split()))); } else { return Poll::Ready(None); @@ -111,7 +111,7 @@ where } None => { // last chunk can have any size - if this.buffer.len() > 0 { + if !this.buffer.is_empty() { return Poll::Ready(Some(Ok(this.buffer.split()))); } else { return Poll::Ready(None); diff --git a/src/backup/crypt_reader.rs b/src/backup/crypt_reader.rs index ee2e625a..8bf15cfd 100644 --- a/src/backup/crypt_reader.rs +++ b/src/backup/crypt_reader.rs @@ -36,7 +36,7 @@ impl CryptReader { impl Read for CryptReader { fn read(&mut self, buf: &mut [u8]) -> Result { - if self.small_read_buf.len() > 0 { + if !self.small_read_buf.is_empty() { let max = if self.small_read_buf.len() > buf.len() { buf.len() } else { self.small_read_buf.len() }; let rest = self.small_read_buf.split_off(max); buf[..max].copy_from_slice(&self.small_read_buf); @@ -50,7 +50,7 @@ impl Read for CryptReader { if buf.len() <= 2*self.block_size { let mut outbuf = [0u8; 1024]; - let count = if data.len() == 0 { // EOF + let count = if data.is_empty() { // EOF let written = self.crypter.finalize(&mut outbuf)?; self.finalized = true; written @@ -72,7 +72,7 @@ impl Read for CryptReader { buf[..count].copy_from_slice(&outbuf[..count]); Ok(count) } - } else if data.len() == 0 { // EOF + } else if data.is_empty() { // EOF let rest = self.crypter.finalize(buf)?; self.finalized = true; Ok(rest) diff --git a/src/backup/prune.rs b/src/backup/prune.rs index bc0a75ad..66c2ee84 100644 --- a/src/backup/prune.rs +++ b/src/backup/prune.rs @@ -26,7 +26,7 @@ fn mark_selections Result> ( for info in list { let backup_id = info.backup_dir.relative_path(); - if let Some(_) = mark.get(&backup_id) { continue; } + if mark.get(&backup_id).is_some() { continue; } let sel_id: String = select_id(&info)?; if already_included.contains(&sel_id) { continue; } diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs index 39e8d537..53bd526b 100644 --- a/src/bin/proxmox-backup-proxy.rs +++ b/src/bin/proxmox-backup-proxy.rs @@ -218,10 +218,8 @@ fn accept_connections( match result { Ok(Ok(())) => { - if let Err(_) = sender.send(Ok(stream)).await { - if debug { - eprintln!("detect closed connection channel"); - } + if sender.send(Ok(stream)).await.is_err() && debug { + eprintln!("detect closed connection channel"); } } Ok(Err(err)) => { diff --git a/src/bin/proxmox_backup_client/mount.rs b/src/bin/proxmox_backup_client/mount.rs index f8410709..72ed9166 100644 --- a/src/bin/proxmox_backup_client/mount.rs +++ b/src/bin/proxmox_backup_client/mount.rs @@ -189,12 +189,12 @@ async fn mount_do(param: Value, pipe: Option) -> Result { }; let server_archive_name = if archive_name.ends_with(".pxar") { - if let None = target { + if target.is_none() { bail!("use the 'mount' command to mount pxar archives"); } format!("{}.didx", archive_name) } else if archive_name.ends_with(".img") { - if let Some(_) = target { + if target.is_some() { bail!("use the 'map' command to map drive images"); } format!("{}.fidx", archive_name) diff --git a/src/config/tape_encryption_keys.rs b/src/config/tape_encryption_keys.rs index 284d0ed3..64e533ec 100644 --- a/src/config/tape_encryption_keys.rs +++ b/src/config/tape_encryption_keys.rs @@ -219,7 +219,7 @@ pub fn insert_key(key: [u8;32], key_config: KeyConfig, hint: String) -> Result<( None => bail!("missing encryption key fingerprint - internal error"), }; - if let Some(_) = config_map.get(&fingerprint) { + if config_map.get(&fingerprint).is_some() { bail!("encryption key '{}' already exists.", fingerprint); } diff --git a/src/server/worker_task.rs b/src/server/worker_task.rs index f047c347..0d884ba1 100644 --- a/src/server/worker_task.rs +++ b/src/server/worker_task.rs @@ -48,7 +48,7 @@ pub async fn worker_is_active(upid: &UPID) -> Result { return Ok(WORKER_TASK_LIST.lock().unwrap().contains_key(&upid.task_id)); } - if !procfs::check_process_running_pstart(upid.pid, upid.pstart).is_some() { + if procfs::check_process_running_pstart(upid.pid, upid.pstart).is_none() { return Ok(false); } @@ -191,7 +191,7 @@ pub fn upid_read_status(upid: &UPID) -> Result { file.read_to_end(&mut data)?; // task logs should end with newline, we do not want it here - if data.len() > 0 && data[data.len()-1] == b'\n' { + if !data.is_empty() && data[data.len()-1] == b'\n' { data.pop(); } @@ -270,7 +270,7 @@ impl TaskState { } else if let Some(warnings) = s.strip_prefix("WARNINGS: ") { let count: u64 = warnings.parse()?; Ok(TaskState::Warning{ count, endtime }) - } else if s.len() > 0 { + } else if !s.is_empty() { let message = if let Some(err) = s.strip_prefix("ERROR: ") { err } else { s }.to_string(); Ok(TaskState::Error{ message, endtime }) } else { diff --git a/src/tools/fuse_loop.rs b/src/tools/fuse_loop.rs index 8a8b668a..ebc30398 100644 --- a/src/tools/fuse_loop.rs +++ b/src/tools/fuse_loop.rs @@ -113,7 +113,7 @@ impl FuseLoopSession { abort_chan: Receiver<()>, ) -> Result<(), Error> { - if let None = self.session { + if self.session.is_none() { panic!("internal error: fuse_loop::main called before ::map_loop"); } let mut session = self.session.take().unwrap().fuse(); @@ -236,7 +236,7 @@ pub fn cleanup_unused_run_files(filter_name: Option) { // clean leftover FUSE instances (e.g. user called 'losetup -d' or similar) // does nothing if files are already stagnant (e.g. instance crashed etc...) - if let Ok(_) = unmap_from_backing(&path, None) { + if unmap_from_backing(&path, None).is_ok() { // we have reaped some leftover instance, tell the user eprintln!( "Cleaned up dangling mapping '{}': no loop device assigned", diff --git a/tests/verify-api.rs b/tests/verify-api.rs index 83a26a21..0d6b654b 100644 --- a/tests/verify-api.rs +++ b/tests/verify-api.rs @@ -13,7 +13,7 @@ fn verify_object_schema(schema: &ObjectSchema) -> Result<(), Error> { let map = schema.properties; - if map.len() >= 1 { + if !map.is_empty() { for i in 1..map.len() { @@ -125,7 +125,7 @@ fn verify_dirmap( dirmap: SubdirMap, ) -> Result<(), Error> { - if dirmap.len() >= 1 { + if !dirmap.is_empty() { for i in 1..dirmap.len() { From d8d8af9826aff66dccb132a9d83e5a546795c0d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 10:38:00 +0100 Subject: [PATCH 08/32] clippy: use chars / byte string literals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/api2/admin/datastore.rs | 6 +++--- src/backup/chunk_store.rs | 4 ++-- src/backup/datastore.rs | 2 +- src/config/network.rs | 2 +- src/tools/subscription.rs | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index 12263e48..09cde15e 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -1344,7 +1344,7 @@ fn catalog( if !components.is_empty() && components[0] == b'/' { components.remove(0); } - for component in components.split(|c| *c == '/' as u8) { + for component in components.split(|c| *c == b'/') { if let Some(entry) = catalog_reader.lookup(¤t, component)? { current = entry; } else { @@ -1357,7 +1357,7 @@ fn catalog( for direntry in catalog_reader.read_dir(¤t)? { let mut components = components.clone(); - components.push('/' as u8); + components.push(b'/'); components.extend(&direntry.name); let path = base64::encode(components); let text = String::from_utf8_lossy(&direntry.name); @@ -1491,7 +1491,7 @@ fn pxar_file_download( components.remove(0); } - let mut split = components.splitn(2, |c| *c == '/' as u8); + let mut split = components.splitn(2, |c| *c == b'/'); let pxar_name = std::str::from_utf8(split.next().unwrap())?; let file_path = split.next().ok_or(format_err!("filepath looks strange '{}'", filepath))?; let (manifest, files) = read_backup_index(&datastore, &backup_dir)?; diff --git a/src/backup/chunk_store.rs b/src/backup/chunk_store.rs index 39635d7d..f782169d 100644 --- a/src/backup/chunk_store.rs +++ b/src/backup/chunk_store.rs @@ -44,7 +44,7 @@ fn digest_to_prefix(digest: &[u8]) -> PathBuf { buf.push(HEX_CHARS[(digest[0] as usize) &0xf]); buf.push(HEX_CHARS[(digest[1] as usize) >> 4]); buf.push(HEX_CHARS[(digest[1] as usize) & 0xf]); - buf.push('/' as u8); + buf.push(b'/'); let path = unsafe { String::from_utf8_unchecked(buf)}; @@ -226,7 +226,7 @@ impl ChunkStore { continue; } - let bad = bytes.ends_with(".bad".as_bytes()); + let bad = bytes.ends_with(b".bad"); return Some((Ok(entry), percentage, bad)); } Some(Err(err)) => { diff --git a/src/backup/datastore.rs b/src/backup/datastore.rs index b384d88a..be764836 100644 --- a/src/backup/datastore.rs +++ b/src/backup/datastore.rs @@ -390,7 +390,7 @@ impl DataStore { fn is_hidden(entry: &walkdir::DirEntry) -> bool { entry.file_name() .to_str() - .map(|s| s.starts_with(".")) + .map(|s| s.starts_with('.')) .unwrap_or(false) } let handle_entry_err = |err: walkdir::Error| { diff --git a/src/config/network.rs b/src/config/network.rs index d6790afe..39f41c7e 100644 --- a/src/config/network.rs +++ b/src/config/network.rs @@ -578,7 +578,7 @@ pub fn complete_port_list(arg: &str, _param: &HashMap) -> Vec info.message = Some(value.into()), "validdirectory" => { - if value.split(",").find(is_server_id) == None { + if value.split(',').find(is_server_id) == None { bail!("Server ID does not match"); } info.serverid = Some(server_id.to_owned()); From 38556bf60df7337a9f07d1d029b719c0dcb3c67f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 10:50:42 +0100 Subject: [PATCH 09/32] clippy: remove explicit returns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/api2/node/apt.rs | 8 ++++---- src/api2/tape/restore.rs | 4 ++-- src/bin/proxmox_tape/changer.rs | 2 +- src/config/acl.rs | 2 +- src/config/cached_user_info.rs | 2 +- src/config/network/helper.rs | 10 +++++----- src/config/network/lexer.rs | 6 +++--- src/config/network/parser.rs | 4 ++-- src/server/verify_job.rs | 2 +- src/tape/drive/mod.rs | 6 +++--- src/tape/helpers/blocked_reader.rs | 4 ++-- src/tools/apt.rs | 4 ++-- src/tools/disks.rs | 2 +- 13 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/api2/node/apt.rs b/src/api2/node/apt.rs index 345b1997..7fdc8ade 100644 --- a/src/api2/node/apt.rs +++ b/src/api2/node/apt.rs @@ -46,7 +46,7 @@ fn apt_update_available(_param: Value) -> Result { let cache = apt::update_cache()?; - return Ok(json!(cache.package_status)); + Ok(json!(cache.package_status)) } fn do_apt_update(worker: &WorkerTask, quiet: bool) -> Result<(), Error> { @@ -205,7 +205,7 @@ fn apt_get_changelog( if changelog_url.starts_with("http://download.proxmox.com/") { let changelog = crate::tools::runtime::block_on(http::get_string(changelog_url, None)) .map_err(|err| format_err!("Error downloading changelog from '{}': {}", changelog_url, err))?; - return Ok(json!(changelog)); + Ok(json!(changelog)) } else if changelog_url.starts_with("https://enterprise.proxmox.com/") { let sub = match subscription::read_subscription()? { @@ -229,7 +229,7 @@ fn apt_get_changelog( let changelog = crate::tools::runtime::block_on(http::get_string(changelog_url, Some(&auth_header))) .map_err(|err| format_err!("Error downloading changelog from '{}': {}", changelog_url, err))?; - return Ok(json!(changelog)); + Ok(json!(changelog)) } else { let mut command = std::process::Command::new("apt-get"); @@ -237,7 +237,7 @@ fn apt_get_changelog( command.arg("-qq"); // don't display download progress command.arg(name); let output = crate::tools::run_command(command, None)?; - return Ok(json!(output)); + Ok(json!(output)) } } diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs index 36bee0bd..6854221d 100644 --- a/src/api2/tape/restore.rs +++ b/src/api2/tape/restore.rs @@ -406,7 +406,7 @@ fn restore_snapshot_archive<'a>( let mut decoder = pxar::decoder::sync::Decoder::from_std(reader)?; match try_restore_snapshot_archive(&mut decoder, snapshot_path) { - Ok(()) => return Ok(true), + Ok(()) => Ok(true), Err(err) => { let reader = decoder.input(); @@ -421,7 +421,7 @@ fn restore_snapshot_archive<'a>( } // else the archive is corrupt - return Err(err); + Err(err) } } } diff --git a/src/bin/proxmox_tape/changer.rs b/src/bin/proxmox_tape/changer.rs index b54616de..f9bff02b 100644 --- a/src/bin/proxmox_tape/changer.rs +++ b/src/bin/proxmox_tape/changer.rs @@ -239,7 +239,7 @@ async fn get_status( } let text = value.as_str().unwrap().to_string(); if text.is_empty() { - return Ok(String::from("--FULL--")); + Ok(String::from("--FULL--")) } else { Ok(text) } diff --git a/src/config/acl.rs b/src/config/acl.rs index 4c3bd0bc..4ffb2357 100644 --- a/src/config/acl.rs +++ b/src/config/acl.rs @@ -435,7 +435,7 @@ impl AclTree { /// Iterates over the tree looking for a node matching `path`. pub fn find_node(&mut self, path: &str) -> Option<&mut AclTreeNode> { let path = split_acl_path(path); - return self.get_node(&path); + self.get_node(&path) } fn get_node(&mut self, path: &[&str]) -> Option<&mut AclTreeNode> { diff --git a/src/config/cached_user_info.rs b/src/config/cached_user_info.rs index 518cf050..c85d643c 100644 --- a/src/config/cached_user_info.rs +++ b/src/config/cached_user_info.rs @@ -98,7 +98,7 @@ impl CachedUserInfo { } } - return true; + true } pub fn check_privs( diff --git a/src/config/network/helper.rs b/src/config/network/helper.rs index d6d62d95..c4c4b63b 100644 --- a/src/config/network/helper.rs +++ b/src/config/network/helper.rs @@ -61,7 +61,7 @@ lazy_static! { pub fn parse_cidr(cidr: &str) -> Result<(String, u8, bool), Error> { let (address, mask, is_v6) = parse_address_or_cidr(cidr)?; if let Some(mask) = mask { - return Ok((address, mask, is_v6)); + Ok((address, mask, is_v6)) } else { bail!("missing netmask in '{}'", cidr); } @@ -98,18 +98,18 @@ pub fn parse_address_or_cidr(cidr: &str) -> Result<(String, Option, bool), E if let Some(mask) = caps.get(2) { let mask = u8::from_str_radix(mask.as_str(), 10)?; check_netmask(mask, false)?; - return Ok((address.to_string(), Some(mask), false)); + Ok((address.to_string(), Some(mask), false)) } else { - return Ok((address.to_string(), None, false)); + Ok((address.to_string(), None, false)) } } else if let Some(caps) = CIDR_V6_REGEX.captures(&cidr) { let address = &caps[1]; if let Some(mask) = caps.get(2) { let mask = u8::from_str_radix(mask.as_str(), 10)?; check_netmask(mask, true)?; - return Ok((address.to_string(), Some(mask), true)); + Ok((address.to_string(), Some(mask), true)) } else { - return Ok((address.to_string(), None, true)); + Ok((address.to_string(), None, true)) } } else { bail!("invalid address/mask '{}'", cidr); diff --git a/src/config/network/lexer.rs b/src/config/network/lexer.rs index b1aa294e..ea0478f5 100644 --- a/src/config/network/lexer.rs +++ b/src/config/network/lexer.rs @@ -114,14 +114,14 @@ impl Iterator for Lexer { Some(ref mut cur_line) => { if cur_line.is_empty() { self.cur_line = None; - return Some(Ok((Token::Newline, String::from("\n")))); + Some(Ok((Token::Newline, String::from("\n")))) } else { let (token, text) = cur_line.pop_front().unwrap(); - return Some(Ok((token, text))); + Some(Ok((token, text))) } } None => { - return None; + None } } } diff --git a/src/config/network/parser.rs b/src/config/network/parser.rs index 9261ff1f..246ce05d 100644 --- a/src/config/network/parser.rs +++ b/src/config/network/parser.rs @@ -29,7 +29,7 @@ impl NetworkParser { bail!("input error - {}", err); } Some(Ok((token, _))) => { - return Ok(*token); + Ok(*token) } None => { bail!("got unexpected end of stream (inside peek)"); @@ -44,7 +44,7 @@ impl NetworkParser { } Some(Ok((token, text))) => { if token == Token::Newline { self.line_nr += 1; } - return Ok((token, text)); + Ok((token, text)) } None => { bail!("got unexpected end of stream (inside peek)"); diff --git a/src/server/verify_job.rs b/src/server/verify_job.rs index e07942f0..6791196b 100644 --- a/src/server/verify_job.rs +++ b/src/server/verify_job.rs @@ -33,7 +33,7 @@ pub fn do_verification_job( let raw_verify_state = manifest.unprotected["verify_state"].clone(); match serde_json::from_value::(raw_verify_state) { - Err(_) => return true, // no last verification, always include + Err(_) => true, // no last verification, always include Ok(last_verify) => { match outdated_after { None => false, // never re-verify if ignored and no max age diff --git a/src/tape/drive/mod.rs b/src/tape/drive/mod.rs index b651f742..a74b5084 100644 --- a/src/tape/drive/mod.rs +++ b/src/tape/drive/mod.rs @@ -246,13 +246,13 @@ pub fn required_media_changer( ) -> Result<(Box, String), Error> { match media_changer(config, drive) { Ok(Some(result)) => { - return Ok(result); + Ok(result) } Ok(None) => { bail!("drive '{}' has no associated changer device", drive); }, Err(err) => { - return Err(err); + Err(err) } } } @@ -327,7 +327,7 @@ pub fn request_and_load_media( let media_id = check_label(handle.as_mut(), &label.uuid)?; - return Ok((handle, media_id)); + Ok((handle, media_id)) } "linux" => { let drive_config = LinuxTapeDrive::deserialize(config)?; diff --git a/src/tape/helpers/blocked_reader.rs b/src/tape/helpers/blocked_reader.rs index 5ee090dc..821d2ceb 100644 --- a/src/tape/helpers/blocked_reader.rs +++ b/src/tape/helpers/blocked_reader.rs @@ -179,7 +179,7 @@ impl Read for BlockedReader { } if rest <= 0 { - return Ok(0); + Ok(0) } else { let copy_len = if (buffer.len() as isize) < rest { buffer.len() @@ -189,7 +189,7 @@ impl Read for BlockedReader { buffer[..copy_len].copy_from_slice( &self.buffer.payload[self.read_pos..(self.read_pos + copy_len)]); self.read_pos += copy_len; - return Ok(copy_len); + Ok(copy_len) } } } diff --git a/src/tools/apt.rs b/src/tools/apt.rs index f4734432..d725639a 100644 --- a/src/tools/apt.rs +++ b/src/tools/apt.rs @@ -226,7 +226,7 @@ pub fn list_installed_apt_packages bool>( } } - return ret; + ret } fn query_detailed_info<'a, F, V>( @@ -366,5 +366,5 @@ where } } - return None; + None } diff --git a/src/tools/disks.rs b/src/tools/disks.rs index 706955a2..e3b93e02 100644 --- a/src/tools/disks.rs +++ b/src/tools/disks.rs @@ -725,7 +725,7 @@ pub fn get_disk_usage_info( filter.push(disk.to_string()); let mut map = get_disks(Some(filter), no_smart)?; if let Some(info) = map.remove(disk) { - return Ok(info); + Ok(info) } else { bail!("failed to get disk usage info - internal error"); // should not happen } From 3b82f3eea5d3db2d7edba3d66a62656893f9f315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 10:54:37 +0100 Subject: [PATCH 10/32] clippy: avoid useless format! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/api2/tape/drive.rs | 2 +- src/api2/tape/restore.rs | 2 +- src/bin/proxmox-backup-proxy.rs | 14 +++++++------- src/tape/drive/mod.rs | 2 +- src/tape/pool_writer.rs | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/api2/tape/drive.rs b/src/api2/tape/drive.rs index ba80f488..4571d9e2 100644 --- a/src/api2/tape/drive.rs +++ b/src/api2/tape/drive.rs @@ -730,7 +730,7 @@ pub fn update_inventory( let label_text_list = changer.online_media_label_texts()?; if label_text_list.is_empty() { - worker.log(format!("changer device does not list any media labels")); + worker.log("changer device does not list any media labels".to_string()); } let state_path = Path::new(TAPE_STATUS_DIR); diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs index 6854221d..e97ae4a4 100644 --- a/src/api2/tape/restore.rs +++ b/src/api2/tape/restore.rs @@ -389,7 +389,7 @@ fn restore_chunk_archive<'a>( // check if this is an aborted stream without end marker if let Ok(false) = reader.has_end_marker() { - worker.log(format!("missing stream end marker")); + worker.log("missing stream end marker".to_string()); return Ok(None); } diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs index 53bd526b..bb2be243 100644 --- a/src/bin/proxmox-backup-proxy.rs +++ b/src/bin/proxmox-backup-proxy.rs @@ -581,16 +581,16 @@ async fn schedule_task_log_rotate() { false, move |worker| { job.start(&worker.upid().to_string())?; - worker.log(format!("starting task log rotation")); + worker.log("starting task log rotation".to_string()); let result = try_block!({ let max_size = 512 * 1024 - 1; // an entry has ~ 100b, so > 5000 entries/file let max_files = 20; // times twenty files gives > 100000 task entries let has_rotated = rotate_task_log_archive(max_size, true, Some(max_files))?; if has_rotated { - worker.log(format!("task log archive was rotated")); + worker.log("task log archive was rotated".to_string()); } else { - worker.log(format!("task log archive was not rotated")); + worker.log("task log archive was not rotated".to_string()); } let max_size = 32 * 1024 * 1024 - 1; @@ -601,18 +601,18 @@ async fn schedule_task_log_rotate() { if logrotate.rotate(max_size, None, Some(max_files))? { println!("rotated access log, telling daemons to re-open log file"); proxmox_backup::tools::runtime::block_on(command_reopen_logfiles())?; - worker.log(format!("API access log was rotated")); + worker.log("API access log was rotated".to_string()); } else { - worker.log(format!("API access log was not rotated")); + worker.log("API access log was not rotated".to_string()); } let mut logrotate = LogRotate::new(buildcfg::API_AUTH_LOG_FN, true) .ok_or_else(|| format_err!("could not get API auth log file names"))?; if logrotate.rotate(max_size, None, Some(max_files))? { - worker.log(format!("API authentication log was rotated")); + worker.log("API authentication log was rotated".to_string()); } else { - worker.log(format!("API authentication log was not rotated")); + worker.log("API authentication log was not rotated".to_string()); } Ok(()) diff --git a/src/tape/drive/mod.rs b/src/tape/drive/mod.rs index a74b5084..6f6b6f75 100644 --- a/src/tape/drive/mod.rs +++ b/src/tape/drive/mod.rs @@ -391,7 +391,7 @@ pub fn request_and_load_media( } Ok((None, _)) => { if last_media_uuid.is_some() { - worker.log(format!("found empty media without label (please label all tapes first)")); + worker.log("found empty media without label (please label all tapes first)".to_string()); last_media_uuid = None; } } diff --git a/src/tape/pool_writer.rs b/src/tape/pool_writer.rs index 5cb04eb9..4486d644 100644 --- a/src/tape/pool_writer.rs +++ b/src/tape/pool_writer.rs @@ -426,7 +426,7 @@ fn write_chunk_archive<'a>( } if writer.bytes_written() > max_size { - worker.log(format!("Chunk Archive max size reached, closing archive")); + worker.log("Chunk Archive max size reached, closing archive".to_string()); break; } } @@ -472,7 +472,7 @@ fn update_media_set_label( match old_set { None => { - worker.log(format!("wrinting new media set label")); + worker.log("wrinting new media set label".to_string()); drive.write_media_set_label(new_set, key_config.as_ref())?; media_catalog = MediaCatalog::overwrite(status_path, media_id, false)?; } From 6334bdc1c5451b72c067c5c1c996d6e3991fd4b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 11:06:26 +0100 Subject: [PATCH 11/32] clippy: collapse nested ifs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/api2/tape/drive.rs | 6 ++---- src/api2/tape/restore.rs | 12 ++++-------- src/bin/proxmox-tape.rs | 16 +++++++--------- src/bin/sg-tape-cmd.rs | 12 +++++------- src/tape/changer/mod.rs | 8 +++----- src/tape/drive/linux_tape.rs | 16 +++++++--------- src/tape/drive/mod.rs | 16 +++++++--------- src/tape/helpers/blocked_reader.rs | 6 ++---- src/tape/inventory.rs | 26 ++++++++++++-------------- src/tape/pool_writer.rs | 8 +++----- 10 files changed, 52 insertions(+), 74 deletions(-) diff --git a/src/api2/tape/drive.rs b/src/api2/tape/drive.rs index 4571d9e2..3a0b79ce 100644 --- a/src/api2/tape/drive.rs +++ b/src/api2/tape/drive.rs @@ -1051,10 +1051,8 @@ pub fn catalog_media( let _lock = MediaPool::lock(status_path, &pool)?; - if MediaCatalog::exists(status_path, &media_id.label.uuid) { - if !force { - bail!("media catalog exists (please use --force to overwrite)"); - } + if MediaCatalog::exists(status_path, &media_id.label.uuid) && !force { + bail!("media catalog exists (please use --force to overwrite)"); } restore_media(&worker, &mut drive, &media_id, None, verbose)?; diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs index e97ae4a4..1db64077 100644 --- a/src/api2/tape/restore.rs +++ b/src/api2/tape/restore.rs @@ -359,15 +359,11 @@ fn restore_chunk_archive<'a>( worker.log(format!("Insert chunk: {}", proxmox::tools::digest_to_hex(&digest))); } datastore.insert_chunk(&blob, &digest)?; - } else { - if verbose { - worker.log(format!("Found existing chunk: {}", proxmox::tools::digest_to_hex(&digest))); - } - } - } else { - if verbose { - worker.log(format!("Found chunk: {}", proxmox::tools::digest_to_hex(&digest))); + } else if verbose { + worker.log(format!("Found existing chunk: {}", proxmox::tools::digest_to_hex(&digest))); } + } else if verbose { + worker.log(format!("Found chunk: {}", proxmox::tools::digest_to_hex(&digest))); } chunks.push(digest); } diff --git a/src/bin/proxmox-tape.rs b/src/bin/proxmox-tape.rs index 09dd25b1..7995977d 100644 --- a/src/bin/proxmox-tape.rs +++ b/src/bin/proxmox-tape.rs @@ -601,16 +601,14 @@ fn debug_scan(param: Value) -> Result<(), Error> { Ok(header) => { if header.magic != PROXMOX_BACKUP_CONTENT_HEADER_MAGIC_1_0 { println!("got MediaContentHeader with wrong magic: {:?}", header.magic); + } else if let Some(name) = PROXMOX_BACKUP_CONTENT_NAME.get(&header.content_magic) { + println!("got content header: {}", name); + println!(" uuid: {}", header.content_uuid()); + println!(" ctime: {}", strftime_local("%c", header.ctime)?); + println!(" hsize: {}", HumanByte::from(header.size as usize)); + println!(" part: {}", header.part_number); } else { - if let Some(name) = PROXMOX_BACKUP_CONTENT_NAME.get(&header.content_magic) { - println!("got content header: {}", name); - println!(" uuid: {}", header.content_uuid()); - println!(" ctime: {}", strftime_local("%c", header.ctime)?); - println!(" hsize: {}", HumanByte::from(header.size as usize)); - println!(" part: {}", header.part_number); - } else { - println!("got unknown content header: {:?}", header.content_magic); - } + println!("got unknown content header: {:?}", header.content_magic); } } Err(err) => { diff --git a/src/bin/sg-tape-cmd.rs b/src/bin/sg-tape-cmd.rs index d63f595f..b6145660 100644 --- a/src/bin/sg-tape-cmd.rs +++ b/src/bin/sg-tape-cmd.rs @@ -274,13 +274,11 @@ fn main() -> Result<(), Error> { bail!("this program needs to be run with setuid root"); } - if !running_uid.is_root() { - if running_uid != backup_uid || running_gid != backup_gid { - bail!( - "Not running as backup user or group (got uid {} gid {})", - running_uid, running_gid, - ); - } + if !running_uid.is_root() && (running_uid != backup_uid || running_gid != backup_gid) { + bail!( + "Not running as backup user or group (got uid {} gid {})", + running_uid, running_gid, + ); } let cmd_def = CliCommandMap::new() diff --git a/src/tape/changer/mod.rs b/src/tape/changer/mod.rs index 6e2c5b5b..6e92bbe2 100644 --- a/src/tape/changer/mod.rs +++ b/src/tape/changer/mod.rs @@ -187,11 +187,9 @@ pub trait MediaChange { if let ElementStatus::Empty = element_status { to = Some(i as u64 + 1); } - } else { - if let ElementStatus::VolumeTag(ref tag) = element_status { - if tag == label_text { - from = Some(i as u64 + 1); - } + } else if let ElementStatus::VolumeTag(ref tag) = element_status { + if tag == label_text { + from = Some(i as u64 + 1); } } } diff --git a/src/tape/drive/linux_tape.rs b/src/tape/drive/linux_tape.rs index fab8a2ca..02da7e37 100644 --- a/src/tape/drive/linux_tape.rs +++ b/src/tape/drive/linux_tape.rs @@ -97,16 +97,14 @@ impl LinuxTapeDrive { if drive_status.blocksize == 0 { // device is variable block size - OK - } else { - if drive_status.blocksize != PROXMOX_TAPE_BLOCK_SIZE as u32 { - eprintln!("device is in fixed block size mode with wrong size ({} bytes)", drive_status.blocksize); - eprintln!("trying to set variable block size mode..."); - if handle.set_block_size(0).is_err() { - bail!("set variable block size mod failed - device uses wrong blocksize."); - } - } else { - // device is in fixed block size mode with correct block size + } else if drive_status.blocksize != PROXMOX_TAPE_BLOCK_SIZE as u32 { + eprintln!("device is in fixed block size mode with wrong size ({} bytes)", drive_status.blocksize); + eprintln!("trying to set variable block size mode..."); + if handle.set_block_size(0).is_err() { + bail!("set variable block size mod failed - device uses wrong blocksize."); } + } else { + // device is in fixed block size mode with correct block size } // Only root can set driver options, so we cannot diff --git a/src/tape/drive/mod.rs b/src/tape/drive/mod.rs index 6f6b6f75..3f9271e4 100644 --- a/src/tape/drive/mod.rs +++ b/src/tape/drive/mod.rs @@ -378,15 +378,13 @@ pub fn request_and_load_media( media_id.label.uuid.to_string(), )); return Ok((Box::new(handle), media_id)); - } else { - if Some(media_id.label.uuid.clone()) != last_media_uuid { - worker.log(format!( - "wrong media label {} ({})", - media_id.label.label_text, - media_id.label.uuid.to_string(), - )); - last_media_uuid = Some(media_id.label.uuid); - } + } else if Some(media_id.label.uuid.clone()) != last_media_uuid { + worker.log(format!( + "wrong media label {} ({})", + media_id.label.label_text, + media_id.label.uuid.to_string(), + )); + last_media_uuid = Some(media_id.label.uuid); } } Ok((None, _)) => { diff --git a/src/tape/helpers/blocked_reader.rs b/src/tape/helpers/blocked_reader.rs index 821d2ceb..e4f875b6 100644 --- a/src/tape/helpers/blocked_reader.rs +++ b/src/tape/helpers/blocked_reader.rs @@ -81,10 +81,8 @@ impl BlockedReader { if size > buffer.payload.len() { proxmox::io_bail!("detected tape block with wrong payload size ({} > {}", size, buffer.payload.len()); - } else if size == 0 { - if !found_end_marker{ - proxmox::io_bail!("detected tape block with zero payload size"); - } + } else if size == 0 && !found_end_marker { + proxmox::io_bail!("detected tape block with zero payload size"); } diff --git a/src/tape/inventory.rs b/src/tape/inventory.rs index 21b72e0a..17832c21 100644 --- a/src/tape/inventory.rs +++ b/src/tape/inventory.rs @@ -675,20 +675,18 @@ impl Inventory { for (uuid, entry) in self.map.iter_mut() { if let Some(changer_name) = online_map.lookup_changer(uuid) { entry.location = Some(MediaLocation::Online(changer_name.to_string())); - } else { - if let Some(MediaLocation::Online(ref changer_name)) = entry.location { - match online_map.online_map(changer_name) { - None => { - // no such changer device - entry.location = Some(MediaLocation::Offline); - } - Some(None) => { - // got no info - do nothing - } - Some(Some(_)) => { - // media changer changed - entry.location = Some(MediaLocation::Offline); - } + } else if let Some(MediaLocation::Online(ref changer_name)) = entry.location { + match online_map.online_map(changer_name) { + None => { + // no such changer device + entry.location = Some(MediaLocation::Offline); + } + Some(None) => { + // got no info - do nothing + } + Some(Some(_)) => { + // media changer changed + entry.location = Some(MediaLocation::Offline); } } } diff --git a/src/tape/pool_writer.rs b/src/tape/pool_writer.rs index 4486d644..57f6c648 100644 --- a/src/tape/pool_writer.rs +++ b/src/tape/pool_writer.rs @@ -159,11 +159,9 @@ impl PoolWriter { } } - } else { - if let Some(mut status) = status { - worker.log("standalone drive - ejecting media instead of export"); - status.drive.eject_media()?; - } + } else if let Some(mut status) = status { + worker.log("standalone drive - ejecting media instead of export"); + status.drive.eject_media()?; } Ok(()) From a6bd669854668efdfa5f2b5a233fde8fa1a65e99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 11:08:10 +0100 Subject: [PATCH 12/32] clippy: use matches! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/backup/catalog.rs | 10 ++-------- src/backup/datastore.rs | 2 +- src/pxar/create.rs | 7 ++----- src/pxar/metadata.rs | 5 +---- 4 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/backup/catalog.rs b/src/backup/catalog.rs index b500fb93..b686fd5f 100644 --- a/src/backup/catalog.rs +++ b/src/backup/catalog.rs @@ -137,18 +137,12 @@ impl DirEntry { /// Check if DirEntry is a directory pub fn is_directory(&self) -> bool { - match self.attr { - DirEntryAttribute::Directory { .. } => true, - _ => false, - } + matches!(self.attr, DirEntryAttribute::Directory { .. }) } /// Check if DirEntry is a symlink pub fn is_symlink(&self) -> bool { - match self.attr { - DirEntryAttribute::Symlink { .. } => true, - _ => false, - } + matches!(self.attr, DirEntryAttribute::Symlink { .. }) } } diff --git a/src/backup/datastore.rs b/src/backup/datastore.rs index be764836..de129135 100644 --- a/src/backup/datastore.rs +++ b/src/backup/datastore.rs @@ -546,7 +546,7 @@ impl DataStore { } pub fn garbage_collection_running(&self) -> bool { - if let Ok(_) = self.gc_mutex.try_lock() { false } else { true } + !matches!(self.gc_mutex.try_lock(), Ok(_)) } pub fn garbage_collection(&self, worker: &dyn TaskState, upid: &UPID) -> Result<(), Error> { diff --git a/src/pxar/create.rs b/src/pxar/create.rs index cc28a79d..a21511c3 100644 --- a/src/pxar/create.rs +++ b/src/pxar/create.rs @@ -40,8 +40,7 @@ fn detect_fs_type(fd: RawFd) -> Result { pub fn is_virtual_file_system(magic: i64) -> bool { use proxmox::sys::linux::magic::*; - match magic { - BINFMTFS_MAGIC | + matches!(magic, BINFMTFS_MAGIC | CGROUP2_SUPER_MAGIC | CGROUP_SUPER_MAGIC | CONFIGFS_MAGIC | @@ -58,9 +57,7 @@ pub fn is_virtual_file_system(magic: i64) -> bool { SECURITYFS_MAGIC | SELINUX_MAGIC | SMACK_MAGIC | - SYSFS_MAGIC => true, - _ => false - } + SYSFS_MAGIC) } #[derive(Debug)] diff --git a/src/pxar/metadata.rs b/src/pxar/metadata.rs index ae72890c..12a89cbe 100644 --- a/src/pxar/metadata.rs +++ b/src/pxar/metadata.rs @@ -345,10 +345,7 @@ fn apply_quota_project_id(flags: Flags, fd: RawFd, metadata: &Metadata) -> Resul } pub(crate) fn errno_is_unsupported(errno: Errno) -> bool { - match errno { - Errno::ENOTTY | Errno::ENOSYS | Errno::EBADF | Errno::EOPNOTSUPP | Errno::EINVAL => true, - _ => false, - } + matches!(errno, Errno::ENOTTY | Errno::ENOSYS | Errno::EBADF | Errno::EOPNOTSUPP | Errno::EINVAL) } fn apply_chattr(fd: RawFd, chattr: libc::c_long, mask: libc::c_long) -> Result<(), Error> { From 1e0c6194b531839a2b3ebeee672c588a6145bda3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 11:10:40 +0100 Subject: [PATCH 13/32] clippy: fix option_as_ref_deref MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/api2/node.rs | 2 +- src/tools/disks.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api2/node.rs b/src/api2/node.rs index 78e0fa44..fc32193b 100644 --- a/src/api2/node.rs +++ b/src/api2/node.rs @@ -121,7 +121,7 @@ async fn termproxy( )?; let mut command = Vec::new(); - match cmd.as_ref().map(|x| x.as_str()) { + match cmd.as_deref() { Some("login") | None => { command.push("login"); if userid == "root@pam" { diff --git a/src/tools/disks.rs b/src/tools/disks.rs index e3b93e02..bfea5a8b 100644 --- a/src/tools/disks.rs +++ b/src/tools/disks.rs @@ -105,7 +105,7 @@ impl DiskManage { let mut mounted = HashSet::new(); for (_id, mp) in self.mount_info()? { - let source = match mp.mount_source.as_ref().map(OsString::as_os_str) { + let source = match mp.mount_source.as_deref() { Some(s) => s, None => continue, }; From a3775bb4e8c8cb9e8c290cda60f6fe3b91572a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 11:12:01 +0100 Subject: [PATCH 14/32] clippy: shorten assignments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/backup/catalog.rs | 4 ++-- src/tape/drive/volume_statistics.rs | 4 ++-- src/tape/helpers/blocked_writer.rs | 2 +- src/tools/systemd/parse_time.rs | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backup/catalog.rs b/src/backup/catalog.rs index b686fd5f..4c72ba3a 100644 --- a/src/backup/catalog.rs +++ b/src/backup/catalog.rs @@ -605,7 +605,7 @@ pub fn catalog_encode_i64(writer: &mut W, v: i64) -> Result<(), Error> break; } enc.push((128 | (d & 127)) as u8); - d = d >> 7; + d >>= 7; } writer.write_all(&enc)?; @@ -659,7 +659,7 @@ pub fn catalog_encode_u64(writer: &mut W, v: u64) -> Result<(), Error> break; } enc.push((128 | (d & 127)) as u8); - d = d >> 7; + d >>= 7; } writer.write_all(&enc)?; diff --git a/src/tape/drive/volume_statistics.rs b/src/tape/drive/volume_statistics.rs index cf84ea9c..5657d3ef 100644 --- a/src/tape/drive/volume_statistics.rs +++ b/src/tape/drive/volume_statistics.rs @@ -105,8 +105,8 @@ fn decode_volume_statistics(data: &[u8]) -> Result let mut value: u64 = 0; for i in 0..len { - value = value << 8; - value = value | buffer[i] as u64; + value <<= 8; + value |= buffer[i] as u64; } Ok(value) diff --git a/src/tape/helpers/blocked_writer.rs b/src/tape/helpers/blocked_writer.rs index c51beedc..961b2ed2 100644 --- a/src/tape/helpers/blocked_writer.rs +++ b/src/tape/helpers/blocked_writer.rs @@ -77,7 +77,7 @@ impl BlockedWriter { self.bytes_written += BlockHeader::SIZE; } else { - self.buffer_pos = self.buffer_pos + bytes; + self.buffer_pos += bytes; } Ok(bytes) diff --git a/src/tools/systemd/parse_time.rs b/src/tools/systemd/parse_time.rs index a03b078b..88f5c92d 100644 --- a/src/tools/systemd/parse_time.rs +++ b/src/tools/systemd/parse_time.rs @@ -120,7 +120,7 @@ fn parse_weekdays_range(i: &str) -> IResult<&str, WeekDays> { loop { res |= pos; if pos >= end { break; } - pos = pos << 1; + pos <<= 1; } WeekDays::from_bits(res).unwrap() }; From a375df6f4c48dde600f80b2ffea0a9666f7a980a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 11:30:30 +0100 Subject: [PATCH 15/32] clippy: use copied/cloned instead of map MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/bin/proxmox-backup-client.rs | 2 +- src/tape/inventory.rs | 2 +- src/tape/media_catalog.rs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bin/proxmox-backup-client.rs b/src/bin/proxmox-backup-client.rs index b5677cdb..2297d302 100644 --- a/src/bin/proxmox-backup-client.rs +++ b/src/bin/proxmox-backup-client.rs @@ -1466,7 +1466,7 @@ async fn prune_async(mut param: Value) -> Result { if quiet { let list: Vec = data.as_array().unwrap().iter().filter(|item| { item["keep"].as_bool() == Some(false) - }).map(|v| v.clone()).collect(); + }).cloned().collect(); data = list.into(); } diff --git a/src/tape/inventory.rs b/src/tape/inventory.rs index 17832c21..289ef510 100644 --- a/src/tape/inventory.rs +++ b/src/tape/inventory.rs @@ -300,7 +300,7 @@ impl Inventory { } pub fn media_set_start_time(&self, media_set_uuid: &Uuid) -> Option { - self.media_set_start_times.get(media_set_uuid).map(|t| *t) + self.media_set_start_times.get(media_set_uuid).copied() } /// Lookup media set pool diff --git a/src/tape/media_catalog.rs b/src/tape/media_catalog.rs index a3dd04db..d9cdf0ae 100644 --- a/src/tape/media_catalog.rs +++ b/src/tape/media_catalog.rs @@ -323,7 +323,7 @@ impl MediaCatalog { /// Returns the chunk archive file number pub fn lookup_snapshot(&self, snapshot: &str) -> Option { - self.snapshot_index.get(snapshot).map(|n| *n) + self.snapshot_index.get(snapshot).copied() } /// Test if the catalog already contain a chunk @@ -333,7 +333,7 @@ impl MediaCatalog { /// Returns the chunk archive file number pub fn lookup_chunk(&self, digest: &[u8;32]) -> Option { - self.chunk_index.get(digest).map(|n| *n) + self.chunk_index.get(digest).copied() } fn check_register_label(&self, file_number: u64) -> Result<(), Error> { From 17c7b46a6959aae02fc7573282429ed606d5a16a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 11:31:37 +0100 Subject: [PATCH 16/32] clippy: use unwrap_or_default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/bin/proxmox-backup-proxy.rs | 2 +- src/config/network.rs | 2 +- src/config/network/parser.rs | 4 ++-- src/server/email_notifications.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs index bb2be243..92f6f67c 100644 --- a/src/bin/proxmox-backup-proxy.rs +++ b/src/bin/proxmox-backup-proxy.rs @@ -749,7 +749,7 @@ async fn generate_host_stats(save: bool) { match datastore::config() { Ok((config, _)) => { let datastore_list: Vec = - config.convert_to_typed_array("datastore").unwrap_or(Vec::new()); + config.convert_to_typed_array("datastore").unwrap_or_default(); for config in datastore_list { diff --git a/src/config/network.rs b/src/config/network.rs index 39f41c7e..fbfef052 100644 --- a/src/config/network.rs +++ b/src/config/network.rs @@ -515,7 +515,7 @@ pub fn config() -> Result<(NetworkConfig, [u8;32]), Error> { Some(content) => content, None => { let content = proxmox::tools::fs::file_get_optional_contents(NETWORK_INTERFACES_FILENAME)?; - content.unwrap_or(Vec::new()) + content.unwrap_or_default() } }; diff --git a/src/config/network/parser.rs b/src/config/network/parser.rs index 246ce05d..2546f027 100644 --- a/src/config/network/parser.rs +++ b/src/config/network/parser.rs @@ -215,12 +215,12 @@ impl NetworkParser { Token::Comment => { let comment = self.eat(Token::Comment)?; if !address_family_v4 && address_family_v6 { - let mut comments = interface.comments6.take().unwrap_or(String::new()); + let mut comments = interface.comments6.take().unwrap_or_default(); if !comments.is_empty() { comments.push('\n'); } comments.push_str(&comment); interface.comments6 = Some(comments); } else { - let mut comments = interface.comments.take().unwrap_or(String::new()); + let mut comments = interface.comments.take().unwrap_or_default(); if !comments.is_empty() { comments.push('\n'); } comments.push_str(&comment); interface.comments = Some(comments); diff --git a/src/server/email_notifications.rs b/src/server/email_notifications.rs index 9a31f628..f35d1b94 100644 --- a/src/server/email_notifications.rs +++ b/src/server/email_notifications.rs @@ -434,7 +434,7 @@ pub fn lookup_datastore_notify_settings( None => lookup_user_email(Userid::root_userid()), }; - let notify_str = config.notify.unwrap_or(String::new()); + let notify_str = config.notify.unwrap_or_default(); if let Ok(value) = parse_property_string(¬ify_str, &DatastoreNotify::API_SCHEMA) { if let Ok(notify) = serde_json::from_value(value) { From 3f48cdb3805a3ce2329d6265343a74676a2edcd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 11:36:26 +0100 Subject: [PATCH 17/32] clippy: don't pass along unit value MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit make it explicit. this whole section should probably be re-written with select! Signed-off-by: Fabian Grünbichler --- src/api2/reader.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/api2/reader.rs b/src/api2/reader.rs index 72b6e33a..9bdccfc9 100644 --- a/src/api2/reader.rs +++ b/src/api2/reader.rs @@ -150,16 +150,16 @@ fn upgrade_to_backup_reader_protocol( } }); let abort_future = abort_future - .map(|_| Err(format_err!("task aborted"))); + .map(|_| -> Result<(), anyhow::Error> { Err(format_err!("task aborted")) }); use futures::future::Either; futures::future::select(req_fut, abort_future) .map(move |res| { let _guard = _guard; match res { - Either::Left((Ok(res), _)) => Ok(res), + Either::Left((Ok(_), _)) => Ok(()), Either::Left((Err(err), _)) => Err(err), - Either::Right((Ok(res), _)) => Ok(res), + Either::Right((Ok(_), _)) => Ok(()), Either::Right((Err(err), _)) => Err(err), } }) From ea368a06cd4e2041c705d0232923ce70346ddb08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 11:37:49 +0100 Subject: [PATCH 18/32] clippy: misc. fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/api2/node/disks/directory.rs | 3 +-- src/backup/catalog.rs | 2 ++ src/backup/data_blob.rs | 4 +--- src/backup/datastore.rs | 8 +++----- src/bin/proxmox-backup-proxy.rs | 2 +- src/bin/proxmox_backup_client/benchmark.rs | 10 +++++----- src/bin/sg-tape-cmd.rs | 2 +- src/tape/drive/encryption.rs | 5 +---- src/tape/drive/tape_alert_flags.rs | 1 + src/tape/sgutils2.rs | 2 +- src/tools/format.rs | 4 ++-- src/tools/json.rs | 2 +- src/tools/systemd/time.rs | 2 +- tests/pxar.rs | 4 ++-- 14 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/api2/node/disks/directory.rs b/src/api2/node/disks/directory.rs index c3840526..c968b333 100644 --- a/src/api2/node/disks/directory.rs +++ b/src/api2/node/disks/directory.rs @@ -212,8 +212,7 @@ pub fn delete_datastore_disk(name: String) -> Result<(), Error> { let (config, _) = crate::config::datastore::config()?; let datastores: Vec = config.convert_to_typed_array("datastore")?; let conflicting_datastore: Option = datastores.into_iter() - .filter(|ds| ds.path == path) - .next(); + .find(|ds| ds.path == path); if let Some(conflicting_datastore) = conflicting_datastore { bail!("Can't remove '{}' since it's required by datastore '{}'", diff --git a/src/backup/catalog.rs b/src/backup/catalog.rs index 4c72ba3a..224e6bf7 100644 --- a/src/backup/catalog.rs +++ b/src/backup/catalog.rs @@ -585,6 +585,7 @@ impl CatalogReader { /// /// Stores 7 bits per byte, Bit 8 indicates the end of the sequence (when not set). /// If the value is negative, we end with a zero byte (0x00). +#[allow(clippy::neg_multiply)] pub fn catalog_encode_i64(writer: &mut W, v: i64) -> Result<(), Error> { let mut enc = Vec::new(); @@ -617,6 +618,7 @@ pub fn catalog_encode_i64(writer: &mut W, v: i64) -> Result<(), Error> /// We currently read maximal 11 bytes, which give a maximum of 70 bits + sign. /// this method is compatible with catalog_encode_u64 iff the /// value encoded is <= 2^63 (values > 2^63 cannot be represented in an i64) +#[allow(clippy::neg_multiply)] pub fn catalog_decode_i64(reader: &mut R) -> Result { let mut v: u64 = 0; diff --git a/src/backup/data_blob.rs b/src/backup/data_blob.rs index 284dc243..2c36ac9a 100644 --- a/src/backup/data_blob.rs +++ b/src/backup/data_blob.rs @@ -408,9 +408,7 @@ impl <'a, 'b> DataChunkBuilder<'a, 'b> { chunk_size: usize, compress: bool, ) -> Result<(DataBlob, [u8; 32]), Error> { - - let mut zero_bytes = Vec::with_capacity(chunk_size); - zero_bytes.resize(chunk_size, 0u8); + let zero_bytes = vec![0; chunk_size]; let mut chunk_builder = DataChunkBuilder::new(&zero_bytes).compress(compress); if let Some(ref crypt_config) = crypt_config { chunk_builder = chunk_builder.crypt_config(crypt_config); diff --git a/src/backup/datastore.rs b/src/backup/datastore.rs index de129135..b1099460 100644 --- a/src/backup/datastore.rs +++ b/src/backup/datastore.rs @@ -476,12 +476,11 @@ impl DataStore { let image_list = self.list_images()?; let image_count = image_list.len(); - let mut done = 0; let mut last_percentage: usize = 0; let mut strange_paths_count: u64 = 0; - for img in image_list { + for (i, img) in image_list.into_iter().enumerate() { worker.check_abort()?; tools::fail_on_shutdown()?; @@ -514,15 +513,14 @@ impl DataStore { Err(err) if err.kind() == io::ErrorKind::NotFound => (), // ignore vanished files Err(err) => bail!("can't open index {} - {}", img.to_string_lossy(), err), } - done += 1; - let percentage = done*100/image_count; + let percentage = (i + 1) * 100 / image_count; if percentage > last_percentage { crate::task_log!( worker, "marked {}% ({} of {} index files)", percentage, - done, + i + 1, image_count, ); last_percentage = percentage; diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs index 92f6f67c..0cfd56d5 100644 --- a/src/bin/proxmox-backup-proxy.rs +++ b/src/bin/proxmox-backup-proxy.rs @@ -4,7 +4,7 @@ use std::os::unix::io::AsRawFd; use anyhow::{bail, format_err, Error}; use futures::*; -use hyper; + use openssl::ssl::{SslMethod, SslAcceptor, SslFiletype}; use tokio_stream::wrappers::ReceiverStream; diff --git a/src/bin/proxmox_backup_client/benchmark.rs b/src/bin/proxmox_backup_client/benchmark.rs index 2ecb3dc9..1076dc19 100644 --- a/src/bin/proxmox_backup_client/benchmark.rs +++ b/src/bin/proxmox_backup_client/benchmark.rs @@ -293,7 +293,7 @@ fn test_crypt_speed( let speed = (bytes as f64)/start_time.elapsed().as_secs_f64(); benchmark_result.sha256.speed = Some(speed); - eprintln!("SHA256 speed: {:.2} MB/s", speed/1_000_000_.0); + eprintln!("SHA256 speed: {:.2} MB/s", speed/1_000_000.0); let start_time = std::time::Instant::now(); @@ -308,7 +308,7 @@ fn test_crypt_speed( let speed = (bytes as f64)/start_time.elapsed().as_secs_f64(); benchmark_result.compress.speed = Some(speed); - eprintln!("Compression speed: {:.2} MB/s", speed/1_000_000_.0); + eprintln!("Compression speed: {:.2} MB/s", speed/1_000_000.0); let start_time = std::time::Instant::now(); @@ -328,7 +328,7 @@ fn test_crypt_speed( let speed = (bytes as f64)/start_time.elapsed().as_secs_f64(); benchmark_result.decompress.speed = Some(speed); - eprintln!("Decompress speed: {:.2} MB/s", speed/1_000_000_.0); + eprintln!("Decompress speed: {:.2} MB/s", speed/1_000_000.0); let start_time = std::time::Instant::now(); @@ -343,7 +343,7 @@ fn test_crypt_speed( let speed = (bytes as f64)/start_time.elapsed().as_secs_f64(); benchmark_result.aes256_gcm.speed = Some(speed); - eprintln!("AES256/GCM speed: {:.2} MB/s", speed/1_000_000_.0); + eprintln!("AES256/GCM speed: {:.2} MB/s", speed/1_000_000.0); let start_time = std::time::Instant::now(); @@ -361,7 +361,7 @@ fn test_crypt_speed( let speed = (bytes as f64)/start_time.elapsed().as_secs_f64(); benchmark_result.verify.speed = Some(speed); - eprintln!("Verify speed: {:.2} MB/s", speed/1_000_000_.0); + eprintln!("Verify speed: {:.2} MB/s", speed/1_000_000.0); Ok(()) } diff --git a/src/bin/sg-tape-cmd.rs b/src/bin/sg-tape-cmd.rs index b6145660..fa89e5ef 100644 --- a/src/bin/sg-tape-cmd.rs +++ b/src/bin/sg-tape-cmd.rs @@ -54,7 +54,7 @@ fn get_tape_handle(param: &Value) -> Result { let file = unsafe { File::from_raw_fd(fd) }; check_tape_is_linux_tape_device(&file)?; LinuxTapeHandle::new(file) - } else if let Some(name) = std::env::var("PROXMOX_TAPE_DRIVE").ok() { + } else if let Ok(name) = std::env::var("PROXMOX_TAPE_DRIVE") { let (config, _digest) = config::drive::config()?; let drive: LinuxTapeDrive = config.lookup("linux", &name)?; eprintln!("using device {}", drive.path); diff --git a/src/tape/drive/encryption.rs b/src/tape/drive/encryption.rs index 4b08dfd1..77d05567 100644 --- a/src/tape/drive/encryption.rs +++ b/src/tape/drive/encryption.rs @@ -24,10 +24,7 @@ pub fn has_encryption( Ok(data) => data, Err(_) => return false, }; - match decode_spin_data_encryption_caps(&data) { - Ok(_) => true, - Err(_) => false, - } + decode_spin_data_encryption_caps(&data).is_ok() } /// Set or clear encryption key diff --git a/src/tape/drive/tape_alert_flags.rs b/src/tape/drive/tape_alert_flags.rs index 8d19ea02..3ce5b658 100644 --- a/src/tape/drive/tape_alert_flags.rs +++ b/src/tape/drive/tape_alert_flags.rs @@ -17,6 +17,7 @@ bitflags::bitflags!{ /// /// See LTO SCSI Reference LOG_SENSE - LP 2Eh: TapeAlerts pub struct TapeAlertFlags: u64 { + #[allow(clippy::eq_op)] const READ_WARNING = 1 << (0x0001 -1); const WRITE_WARNING = 1 << (0x0002 -1); const HARD_ERROR = 1 << (0x0003 -1); diff --git a/src/tape/sgutils2.rs b/src/tape/sgutils2.rs index 464acbd9..31cd61b5 100644 --- a/src/tape/sgutils2.rs +++ b/src/tape/sgutils2.rs @@ -201,7 +201,7 @@ impl <'a, F: AsRawFd> SgRaw<'a, F> { let data_len = self.buffer.len() - (unsafe { get_scsi_pt_resid(&mut *ptvp) } as usize); - if data_len <= 0 { + if data_len == 0 { bail!("do_scsi_pt failed - no data received"); } diff --git a/src/tools/format.rs b/src/tools/format.rs index c9f50053..70d0490b 100644 --- a/src/tools/format.rs +++ b/src/tools/format.rs @@ -144,6 +144,6 @@ fn correct_byte_convert() { assert_eq!(convert(1023), "1023 B"); assert_eq!(convert(1<<10), "1.00 KiB"); assert_eq!(convert(1<<20), "1.00 MiB"); - assert_eq!(convert((1<<30) + (103 * 1<<20)), "1.10 GiB"); - assert_eq!(convert((2<<50) + (500 * 1<<40)), "2.49 PiB"); + assert_eq!(convert((1<<30) + 103 * (1<<20)), "1.10 GiB"); + assert_eq!(convert((2<<50) + 500 * (1<<40)), "2.49 PiB"); } diff --git a/src/tools/json.rs b/src/tools/json.rs index c81afccb..7a43c700 100644 --- a/src/tools/json.rs +++ b/src/tools/json.rs @@ -29,7 +29,7 @@ pub fn write_canonical_json(value: &Value, output: &mut Vec) -> Result<(), E Value::Object(map) => { output.push(b'{'); let mut keys: Vec<&str> = map.keys().map(String::as_str).collect(); - keys.sort(); + keys.sort_unstable(); let mut iter = keys.into_iter(); if let Some(key) = iter.next() { serde_json::to_writer(&mut *output, &key)?; diff --git a/src/tools/systemd/time.rs b/src/tools/systemd/time.rs index 1961d4b8..02395724 100644 --- a/src/tools/systemd/time.rs +++ b/src/tools/systemd/time.rs @@ -49,7 +49,7 @@ impl DateTimeValue { } pub fn list_contains(list: &[DateTimeValue], value: u32) -> bool { - list.iter().find(|spec| spec.contains(value)).is_some() + list.iter().any(|spec| spec.contains(value)) } // Find an return an entry greater than value diff --git a/tests/pxar.rs b/tests/pxar.rs index cdb25e3f..03181c7f 100644 --- a/tests/pxar.rs +++ b/tests/pxar.rs @@ -52,9 +52,9 @@ fn pxar_create_and_extract() { .unwrap(); let reader = BufReader::new(stdout); - let mut line_iter = reader.lines().map(|l| l.unwrap()); + let line_iter = reader.lines().map(|l| l.unwrap()); let mut linecount = 0; - while let Some(curr) = line_iter.next() { + for curr in line_iter { println!("{}", curr); linecount += 1; } From b92cad0938329b024db87d095065caff7bdf5d48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 12:09:33 +0100 Subject: [PATCH 19/32] clippy: convert single match to if let MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/api2/node/apt.rs | 11 +++--- src/api2/status.rs | 75 +++++++++++++++++++--------------------- src/server/gc_job.rs | 7 ++-- src/server/jobstate.rs | 7 ++-- src/server/verify_job.rs | 7 ++-- src/tools/disks.rs | 29 +++++++--------- src/tools/fuse_loop.rs | 18 ++++------ 7 files changed, 66 insertions(+), 88 deletions(-) diff --git a/src/api2/node/apt.rs b/src/api2/node/apt.rs index 7fdc8ade..52eeb976 100644 --- a/src/api2/node/apt.rs +++ b/src/api2/node/apt.rs @@ -35,13 +35,10 @@ use crate::api2::types::{Authid, APTUpdateInfo, NODE_SCHEMA, UPID_SCHEMA}; /// List available APT updates fn apt_update_available(_param: Value) -> Result { - match apt::pkg_cache_expired() { - Ok(false) => { - if let Ok(Some(cache)) = apt::read_pkg_state() { - return Ok(json!(cache.package_status)); - } - }, - _ => (), + if let Ok(false) = apt::pkg_cache_expired() { + if let Ok(Some(cache)) = apt::read_pkg_state() { + return Ok(json!(cache.package_status)); + } } let cache = apt::update_cache()?; diff --git a/src/api2/status.rs b/src/api2/status.rs index 743b1355..dc354d70 100644 --- a/src/api2/status.rs +++ b/src/api2/status.rs @@ -127,49 +127,46 @@ fn datastore_status( rrd_mode, ); - match (total_res, used_res) { - (Some((start, reso, total_list)), Some((_, _, used_list))) => { - let mut usage_list: Vec = Vec::new(); - let mut time_list: Vec = Vec::new(); - let mut history = Vec::new(); + if let (Some((start, reso, total_list)), Some((_, _, used_list))) = (total_res, used_res) { + let mut usage_list: Vec = Vec::new(); + let mut time_list: Vec = Vec::new(); + let mut history = Vec::new(); - for (idx, used) in used_list.iter().enumerate() { - let total = if idx < total_list.len() { - total_list[idx] + for (idx, used) in used_list.iter().enumerate() { + let total = if idx < total_list.len() { + total_list[idx] + } else { + None + }; + + match (total, used) { + (Some(total), Some(used)) if total != 0.0 => { + time_list.push(start + (idx as u64)*reso); + let usage = used/total; + usage_list.push(usage); + history.push(json!(usage)); + }, + _ => { + history.push(json!(null)) + } + } + } + + entry["history-start"] = start.into(); + entry["history-delta"] = reso.into(); + entry["history"] = history.into(); + + // we skip the calculation for datastores with not enough data + if usage_list.len() >= 7 { + if let Some((a,b)) = linear_regression(&time_list, &usage_list) { + if b != 0.0 { + let estimate = (1.0 - a) / b; + entry["estimated-full-date"] = Value::from(estimate.floor() as u64); } else { - None - }; - - match (total, used) { - (Some(total), Some(used)) if total != 0.0 => { - time_list.push(start + (idx as u64)*reso); - let usage = used/total; - usage_list.push(usage); - history.push(json!(usage)); - }, - _ => { - history.push(json!(null)) - } + entry["estimated-full-date"] = Value::from(0); } } - - entry["history-start"] = start.into(); - entry["history-delta"] = reso.into(); - entry["history"] = history.into(); - - // we skip the calculation for datastores with not enough data - if usage_list.len() >= 7 { - if let Some((a,b)) = linear_regression(&time_list, &usage_list) { - if b != 0.0 { - let estimate = (1.0 - a) / b; - entry["estimated-full-date"] = Value::from(estimate.floor() as u64); - } else { - entry["estimated-full-date"] = Value::from(0); - } - } - } - }, - _ => {}, + } } list.push(entry); diff --git a/src/server/gc_job.rs b/src/server/gc_job.rs index 7a7e6de2..6f3d9538 100644 --- a/src/server/gc_job.rs +++ b/src/server/gc_job.rs @@ -39,13 +39,12 @@ pub fn do_garbage_collection_job( let status = worker.create_state(&result); - match job.finish(status) { - Err(err) => eprintln!( + if let Err(err) = job.finish(status) { + eprintln!( "could not finish job state for {}: {}", job.jobtype().to_string(), err - ), - Ok(_) => (), + ); } if let Some(email) = email { diff --git a/src/server/jobstate.rs b/src/server/jobstate.rs index e55a193e..ea934e00 100644 --- a/src/server/jobstate.rs +++ b/src/server/jobstate.rs @@ -207,11 +207,8 @@ impl Job { /// Start the job and update the statefile accordingly /// Fails if the job was already started pub fn start(&mut self, upid: &str) -> Result<(), Error> { - match self.state { - JobState::Started { .. } => { - bail!("cannot start job that is started!"); - } - _ => {} + if let JobState::Started { .. } = self.state { + bail!("cannot start job that is started!"); } self.state = JobState::Started { diff --git a/src/server/verify_job.rs b/src/server/verify_job.rs index 6791196b..ca6eb554 100644 --- a/src/server/verify_job.rs +++ b/src/server/verify_job.rs @@ -83,13 +83,12 @@ pub fn do_verification_job( let status = worker.create_state(&job_result); - match job.finish(status) { - Err(err) => eprintln!( + if let Err(err) = job.finish(status) { + eprintln!( "could not finish job state for {}: {}", job.jobtype().to_string(), err - ), - Ok(_) => (), + ); } if let Some(email) = email { diff --git a/src/tools/disks.rs b/src/tools/disks.rs index bfea5a8b..8573695d 100644 --- a/src/tools/disks.rs +++ b/src/tools/disks.rs @@ -566,23 +566,18 @@ pub fn get_partition_type_info() -> Result>, Error> let mut res: HashMap> = HashMap::new(); let output: serde_json::Value = output.parse()?; - match output["blockdevices"].as_array() { - Some(list) => { - for info in list { - let path = match info["path"].as_str() { - Some(p) => p, - None => continue, - }; - let partition_type = match info["parttype"].as_str() { - Some(t) => t.to_owned(), - None => continue, - }; - let devices = res.entry(partition_type).or_insert(Vec::new()); - devices.push(path.to_string()); - } - } - None => { - + if let Some(list) = output["blockdevices"].as_array() { + for info in list { + let path = match info["path"].as_str() { + Some(p) => p, + None => continue, + }; + let partition_type = match info["parttype"].as_str() { + Some(t) => t.to_owned(), + None => continue, + }; + let devices = res.entry(partition_type).or_insert(Vec::new()); + devices.push(path.to_string()); } } Ok(res) diff --git a/src/tools/fuse_loop.rs b/src/tools/fuse_loop.rs index ebc30398..b93381a5 100644 --- a/src/tools/fuse_loop.rs +++ b/src/tools/fuse_loop.rs @@ -357,18 +357,12 @@ pub fn find_all_mappings() -> Result { - let loopdev = format!("/dev/{}", ent.file_name().to_string_lossy()); - match get_backing_file(&loopdev) { - Ok(file) => { - // insert filename only, strip RUN_DIR/ - loopmap.insert(file[RUN_DIR.len()+1..].to_owned(), loopdev); - }, - Err(_) => {}, - } - }, - Err(_) => {}, + if let Ok(ent) = ent { + let loopdev = format!("/dev/{}", ent.file_name().to_string_lossy()); + if let Ok(file) = get_backing_file(&loopdev) { + // insert filename only, strip RUN_DIR/ + loopmap.insert(file[RUN_DIR.len()+1..].to_owned(), loopdev); + } } } From e062ebbc299d994cb56e5fc753c0021cece14ae2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 14:04:46 +0100 Subject: [PATCH 20/32] clippy: us *_or_else with function calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/api2/admin/datastore.rs | 4 ++-- src/api2/pull.rs | 2 +- src/api2/types/userid.rs | 4 ++-- src/backup/async_index_reader.rs | 2 +- src/config/datastore.rs | 4 ++-- src/config/drive.rs | 4 ++-- src/config/media_pool.rs | 4 ++-- src/config/network.rs | 4 ++-- src/config/remote.rs | 4 ++-- src/config/sync.rs | 4 ++-- src/config/user.rs | 4 ++-- src/server/email_notifications.rs | 6 +++--- src/server/rest.rs | 4 ++-- src/server/worker_task.rs | 2 +- src/tape/drive/linux_list_drives.rs | 8 ++++---- src/tape/inventory.rs | 2 +- src/tape/media_pool.rs | 4 ++-- src/tools/logrotate.rs | 6 +++--- 18 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index 09cde15e..c3d4d5f1 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -1493,7 +1493,7 @@ fn pxar_file_download( let mut split = components.splitn(2, |c| *c == b'/'); let pxar_name = std::str::from_utf8(split.next().unwrap())?; - let file_path = split.next().ok_or(format_err!("filepath looks strange '{}'", filepath))?; + let file_path = split.next().ok_or_else(|| format_err!("filepath looks strange '{}'", filepath))?; let (manifest, files) = read_backup_index(&datastore, &backup_dir)?; for file in files { if file.filename == pxar_name && file.crypt_mode == Some(CryptMode::Encrypt) { @@ -1520,7 +1520,7 @@ fn pxar_file_download( let root = decoder.open_root().await?; let file = root .lookup(OsStr::from_bytes(file_path)).await? - .ok_or(format_err!("error opening '{:?}'", file_path))?; + .ok_or_else(|| format_err!("error opening '{:?}'", file_path))?; let body = match file.kind() { EntryKind::File { .. } => Body::wrap_stream( diff --git a/src/api2/pull.rs b/src/api2/pull.rs index 77f9746e..101ab308 100644 --- a/src/api2/pull.rs +++ b/src/api2/pull.rs @@ -88,7 +88,7 @@ pub fn do_sync_job( let worker_future = async move { let delete = sync_job.remove_vanished.unwrap_or(true); - let sync_owner = sync_job.owner.unwrap_or(Authid::root_auth_id().clone()); + let sync_owner = sync_job.owner.unwrap_or_else(|| Authid::root_auth_id().clone()); let (client, src_repo, tgt_store) = get_pull_parameters(&sync_job.store, &sync_job.remote, &sync_job.remote_store).await?; worker.log(format!("Starting datastore sync job '{}'", job_id)); diff --git a/src/api2/types/userid.rs b/src/api2/types/userid.rs index 0ad64954..85c1edd1 100644 --- a/src/api2/types/userid.rs +++ b/src/api2/types/userid.rs @@ -638,7 +638,7 @@ impl std::str::FromStr for Authid { .iter() .rposition(|&b| b == b'!') .map(|pos| if pos < name_len { id.len() } else { pos }) - .unwrap_or(id.len()); + .unwrap_or_else(|| id.len()); if realm_end == id.len() - 1 { bail!("empty token name in userid"); @@ -670,7 +670,7 @@ impl TryFrom for Authid { .iter() .rposition(|&b| b == b'!') .map(|pos| if pos < name_len { data.len() } else { pos }) - .unwrap_or(data.len()); + .unwrap_or_else(|| data.len()); if realm_end == data.len() - 1 { bail!("empty token name in userid"); diff --git a/src/backup/async_index_reader.rs b/src/backup/async_index_reader.rs index 2a04282c..60c68d4f 100644 --- a/src/backup/async_index_reader.rs +++ b/src/backup/async_index_reader.rs @@ -97,7 +97,7 @@ where let info = this .index .chunk_info(idx) - .ok_or(io_format_err!("could not get digest"))?; + .ok_or_else(|| io_format_err!("could not get digest"))?; this.current_chunk_offset = offset; this.current_chunk_idx = idx; diff --git a/src/config/datastore.rs b/src/config/datastore.rs index 4c3031fc..e8f552fd 100644 --- a/src/config/datastore.rs +++ b/src/config/datastore.rs @@ -135,8 +135,8 @@ pub const DATASTORE_CFG_LOCKFILE: &str = "/etc/proxmox-backup/.datastore.lck"; pub fn config() -> Result<(SectionConfigData, [u8;32]), Error> { - let content = proxmox::tools::fs::file_read_optional_string(DATASTORE_CFG_FILENAME)?; - let content = content.unwrap_or(String::from("")); + let content = proxmox::tools::fs::file_read_optional_string(DATASTORE_CFG_FILENAME)? + .unwrap_or_else(|| "".to_string()); let digest = openssl::sha::sha256(content.as_bytes()); let data = CONFIG.parse(DATASTORE_CFG_FILENAME, &content)?; diff --git a/src/config/drive.rs b/src/config/drive.rs index 72bc05af..32ec3c4f 100644 --- a/src/config/drive.rs +++ b/src/config/drive.rs @@ -68,8 +68,8 @@ pub fn lock() -> Result { pub fn config() -> Result<(SectionConfigData, [u8;32]), Error> { - let content = proxmox::tools::fs::file_read_optional_string(DRIVE_CFG_FILENAME)?; - let content = content.unwrap_or(String::from("")); + let content = proxmox::tools::fs::file_read_optional_string(DRIVE_CFG_FILENAME)? + .unwrap_or_else(|| "".to_string()); let digest = openssl::sha::sha256(content.as_bytes()); let data = CONFIG.parse(DRIVE_CFG_FILENAME, &content)?; diff --git a/src/config/media_pool.rs b/src/config/media_pool.rs index 5e1184e3..768cc6d9 100644 --- a/src/config/media_pool.rs +++ b/src/config/media_pool.rs @@ -52,8 +52,8 @@ pub fn lock() -> Result { pub fn config() -> Result<(SectionConfigData, [u8;32]), Error> { - let content = proxmox::tools::fs::file_read_optional_string(MEDIA_POOL_CFG_FILENAME)?; - let content = content.unwrap_or(String::from("")); + let content = proxmox::tools::fs::file_read_optional_string(MEDIA_POOL_CFG_FILENAME)? + .unwrap_or_else(|| "".to_string()); let digest = openssl::sha::sha256(content.as_bytes()); let data = CONFIG.parse(MEDIA_POOL_CFG_FILENAME, &content)?; diff --git a/src/config/network.rs b/src/config/network.rs index fbfef052..4241261a 100644 --- a/src/config/network.rs +++ b/src/config/network.rs @@ -386,9 +386,9 @@ impl NetworkConfig { pub fn check_mtu(&self, parent_name: &str, child_name: &str) -> Result<(), Error> { let parent = self.interfaces.get(parent_name) - .ok_or(format_err!("check_mtu - missing parent interface '{}'", parent_name))?; + .ok_or_else(|| format_err!("check_mtu - missing parent interface '{}'", parent_name))?; let child = self.interfaces.get(child_name) - .ok_or(format_err!("check_mtu - missing child interface '{}'", child_name))?; + .ok_or_else(|| format_err!("check_mtu - missing child interface '{}'", child_name))?; let child_mtu = match child.mtu { Some(mtu) => mtu, diff --git a/src/config/remote.rs b/src/config/remote.rs index 20fd39d4..9315575b 100644 --- a/src/config/remote.rs +++ b/src/config/remote.rs @@ -92,8 +92,8 @@ pub const REMOTE_CFG_LOCKFILE: &str = "/etc/proxmox-backup/.remote.lck"; pub fn config() -> Result<(SectionConfigData, [u8;32]), Error> { - let content = proxmox::tools::fs::file_read_optional_string(REMOTE_CFG_FILENAME)?; - let content = content.unwrap_or(String::from("")); + let content = proxmox::tools::fs::file_read_optional_string(REMOTE_CFG_FILENAME)? + .unwrap_or_else(|| "".to_string()); let digest = openssl::sha::sha256(content.as_bytes()); let data = CONFIG.parse(REMOTE_CFG_FILENAME, &content)?; diff --git a/src/config/sync.rs b/src/config/sync.rs index 0d9be9dc..8febc5d8 100644 --- a/src/config/sync.rs +++ b/src/config/sync.rs @@ -183,8 +183,8 @@ pub const SYNC_CFG_LOCKFILE: &str = "/etc/proxmox-backup/.sync.lck"; pub fn config() -> Result<(SectionConfigData, [u8;32]), Error> { - let content = proxmox::tools::fs::file_read_optional_string(SYNC_CFG_FILENAME)?; - let content = content.unwrap_or(String::from("")); + let content = proxmox::tools::fs::file_read_optional_string(SYNC_CFG_FILENAME)? + .unwrap_or_else(|| "".to_string()); let digest = openssl::sha::sha256(content.as_bytes()); let data = CONFIG.parse(SYNC_CFG_FILENAME, &content)?; diff --git a/src/config/user.rs b/src/config/user.rs index 3254183b..cd955927 100644 --- a/src/config/user.rs +++ b/src/config/user.rs @@ -157,8 +157,8 @@ pub const USER_CFG_LOCKFILE: &str = "/etc/proxmox-backup/.user.lck"; pub fn config() -> Result<(SectionConfigData, [u8;32]), Error> { - let content = proxmox::tools::fs::file_read_optional_string(USER_CFG_FILENAME)?; - let content = content.unwrap_or(String::from("")); + let content = proxmox::tools::fs::file_read_optional_string(USER_CFG_FILENAME)? + .unwrap_or_else(|| "".to_string()); let digest = openssl::sha::sha256(content.as_bytes()); let mut data = CONFIG.parse(USER_CFG_FILENAME, &content)?; diff --git a/src/server/email_notifications.rs b/src/server/email_notifications.rs index f35d1b94..24c15073 100644 --- a/src/server/email_notifications.rs +++ b/src/server/email_notifications.rs @@ -456,7 +456,7 @@ fn handlebars_humam_bytes_helper( ) -> HelperResult { let param = h.param(0).map(|v| v.value().as_u64()) .flatten() - .ok_or(RenderError::new("human-bytes: param not found"))?; + .ok_or_else(|| RenderError::new("human-bytes: param not found"))?; out.write(&HumanByte::from(param).to_string())?; @@ -472,10 +472,10 @@ fn handlebars_relative_percentage_helper( ) -> HelperResult { let param0 = h.param(0).map(|v| v.value().as_f64()) .flatten() - .ok_or(RenderError::new("relative-percentage: param0 not found"))?; + .ok_or_else(|| RenderError::new("relative-percentage: param0 not found"))?; let param1 = h.param(1).map(|v| v.value().as_f64()) .flatten() - .ok_or(RenderError::new("relative-percentage: param1 not found"))?; + .ok_or_else(|| RenderError::new("relative-percentage: param1 not found"))?; if param1 == 0.0 { out.write("-")?; diff --git a/src/server/rest.rs b/src/server/rest.rs index 67fbbbb2..0586979a 100644 --- a/src/server/rest.rs +++ b/src/server/rest.rs @@ -147,7 +147,7 @@ fn log_response( let now = proxmox::tools::time::epoch_i64(); // time format which apache/nginx use (by default), copied from pve-http-server let datetime = proxmox::tools::time::strftime_local("%d/%m/%Y:%H:%M:%S %z", now) - .unwrap_or("-".into()); + .unwrap_or_else(|_| "-".to_string()); logfile .lock() @@ -161,7 +161,7 @@ fn log_response( path, status.as_str(), resp.body().size_hint().lower(), - user_agent.unwrap_or("-".into()), + user_agent.unwrap_or_else(|| "-".to_string()), )); } } diff --git a/src/server/worker_task.rs b/src/server/worker_task.rs index 0d884ba1..967814c9 100644 --- a/src/server/worker_task.rs +++ b/src/server/worker_task.rs @@ -330,7 +330,7 @@ pub fn rotate_task_log_archive(size_threshold: u64, compress: bool, max_files: O let _lock = lock_task_list_files(true)?; let mut logrotate = LogRotate::new(PROXMOX_BACKUP_ARCHIVE_TASK_FN, compress) - .ok_or(format_err!("could not get archive file names"))?; + .ok_or_else(|| format_err!("could not get archive file names"))?; logrotate.rotate(size_threshold, None, max_files) } diff --git a/src/tape/drive/linux_list_drives.rs b/src/tape/drive/linux_list_drives.rs index 1b5926d1..e3ab9524 100644 --- a/src/tape/drive/linux_list_drives.rs +++ b/src/tape/drive/linux_list_drives.rs @@ -85,12 +85,12 @@ pub fn linux_tape_changer_list() -> Vec { let vendor = device.property_value("ID_VENDOR") .map(std::ffi::OsString::from) .and_then(|s| if let Ok(s) = s.into_string() { Some(s) } else { None }) - .unwrap_or(String::from("unknown")); + .unwrap_or_else(|| String::from("unknown")); let model = device.property_value("ID_MODEL") .map(std::ffi::OsString::from) .and_then(|s| if let Ok(s) = s.into_string() { Some(s) } else { None }) - .unwrap_or(String::from("unknown")); + .unwrap_or_else(|| String::from("unknown")); let dev_path = format!("/dev/tape/by-id/scsi-{}", serial); @@ -166,12 +166,12 @@ pub fn linux_tape_device_list() -> Vec { let vendor = device.property_value("ID_VENDOR") .map(std::ffi::OsString::from) .and_then(|s| if let Ok(s) = s.into_string() { Some(s) } else { None }) - .unwrap_or(String::from("unknown")); + .unwrap_or_else(|| String::from("unknown")); let model = device.property_value("ID_MODEL") .map(std::ffi::OsString::from) .and_then(|s| if let Ok(s) = s.into_string() { Some(s) } else { None }) - .unwrap_or(String::from("unknown")); + .unwrap_or_else(|| String::from("unknown")); let dev_path = format!("/dev/tape/by-id/scsi-{}-nst", serial); diff --git a/src/tape/inventory.rs b/src/tape/inventory.rs index 289ef510..446d9379 100644 --- a/src/tape/inventory.rs +++ b/src/tape/inventory.rs @@ -522,7 +522,7 @@ impl Inventory { ) -> Result { if let Some(ctime) = self.media_set_start_time(media_set_uuid) { - let mut template = template.unwrap_or(String::from("%c")); + let mut template = template.unwrap_or_else(|| String::from("%c")); template = template.replace("%id%", &media_set_uuid.to_string()); proxmox::tools::time::strftime_local(&template, ctime) } else { diff --git a/src/tape/media_pool.rs b/src/tape/media_pool.rs index 08e2a16b..0499d3ed 100644 --- a/src/tape/media_pool.rs +++ b/src/tape/media_pool.rs @@ -89,9 +89,9 @@ impl MediaPool { use_offline_media: bool, ) -> Result { - let allocation = config.allocation.clone().unwrap_or(String::from("continue")).parse()?; + let allocation = config.allocation.clone().unwrap_or_else(|| String::from("continue")).parse()?; - let retention = config.retention.clone().unwrap_or(String::from("keep")).parse()?; + let retention = config.retention.clone().unwrap_or_else(|| String::from("keep")).parse()?; let encrypt_fingerprint = match config.encrypt { Some(ref fingerprint) => Some(fingerprint.parse()?), diff --git a/src/tools/logrotate.rs b/src/tools/logrotate.rs index 354e9c6a..5d026e8c 100644 --- a/src/tools/logrotate.rs +++ b/src/tools/logrotate.rs @@ -104,8 +104,8 @@ impl LogRotate { for i in (0..count-1).rev() { if self.compress - && filenames[i+0].extension().unwrap_or(std::ffi::OsStr::new("")) != "zst" - && filenames[i+1].extension().unwrap_or(std::ffi::OsStr::new("")) == "zst" + && filenames[i+0].extension() != Some(std::ffi::OsStr::new("zst")) + && filenames[i+1].extension() == Some(std::ffi::OsStr::new("zst")) { Self::compress(&filenames[i], &filenames[i+1], &options)?; } else { @@ -204,7 +204,7 @@ impl Iterator for LogRotateFiles { let filename = self.file_names.next()?; let file = File::open(&filename).ok()?; - if filename.extension().unwrap_or(std::ffi::OsStr::new("")) == "zst" { + if filename.extension() == Some(std::ffi::OsStr::new("zst")) { let encoder = zstd::stream::read::Decoder::new(file).ok()?; return Some(Box::new(encoder)); } From 81281d04a404cbd3c3f630f72c8505dfa6ec949e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 14:12:07 +0100 Subject: [PATCH 21/32] clippy: fix/allow identity_op MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/config/acl.rs | 9 +++++++++ src/tools/logrotate.rs | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/config/acl.rs b/src/config/acl.rs index 4ffb2357..63fd065e 100644 --- a/src/config/acl.rs +++ b/src/config/acl.rs @@ -74,12 +74,14 @@ pub const ROLE_ADMIN: u64 = std::u64::MAX; pub const ROLE_NO_ACCESS: u64 = 0; #[rustfmt::skip] +#[allow(clippy::identity_op)] /// Audit can view configuration and status information, but not modify it. pub const ROLE_AUDIT: u64 = 0 | PRIV_SYS_AUDIT | PRIV_DATASTORE_AUDIT; #[rustfmt::skip] +#[allow(clippy::identity_op)] /// Datastore.Admin can do anything on the datastore. pub const ROLE_DATASTORE_ADMIN: u64 = 0 | PRIV_DATASTORE_AUDIT @@ -90,6 +92,7 @@ pub const ROLE_DATASTORE_ADMIN: u64 = 0 | PRIV_DATASTORE_PRUNE; #[rustfmt::skip] +#[allow(clippy::identity_op)] /// Datastore.Reader can read/verify datastore content and do restore pub const ROLE_DATASTORE_READER: u64 = 0 | PRIV_DATASTORE_AUDIT @@ -97,27 +100,32 @@ pub const ROLE_DATASTORE_READER: u64 = 0 | PRIV_DATASTORE_READ; #[rustfmt::skip] +#[allow(clippy::identity_op)] /// Datastore.Backup can do backup and restore, but no prune. pub const ROLE_DATASTORE_BACKUP: u64 = 0 | PRIV_DATASTORE_BACKUP; #[rustfmt::skip] +#[allow(clippy::identity_op)] /// Datastore.PowerUser can do backup, restore, and prune. pub const ROLE_DATASTORE_POWERUSER: u64 = 0 | PRIV_DATASTORE_PRUNE | PRIV_DATASTORE_BACKUP; #[rustfmt::skip] +#[allow(clippy::identity_op)] /// Datastore.Audit can audit the datastore. pub const ROLE_DATASTORE_AUDIT: u64 = 0 | PRIV_DATASTORE_AUDIT; #[rustfmt::skip] +#[allow(clippy::identity_op)] /// Remote.Audit can audit the remote pub const ROLE_REMOTE_AUDIT: u64 = 0 | PRIV_REMOTE_AUDIT; #[rustfmt::skip] +#[allow(clippy::identity_op)] /// Remote.Admin can do anything on the remote. pub const ROLE_REMOTE_ADMIN: u64 = 0 | PRIV_REMOTE_AUDIT @@ -125,6 +133,7 @@ pub const ROLE_REMOTE_ADMIN: u64 = 0 | PRIV_REMOTE_READ; #[rustfmt::skip] +#[allow(clippy::identity_op)] /// Remote.SyncOperator can do read and prune on the remote. pub const ROLE_REMOTE_SYNC_OPERATOR: u64 = 0 | PRIV_REMOTE_AUDIT diff --git a/src/tools/logrotate.rs b/src/tools/logrotate.rs index 5d026e8c..a326a3a2 100644 --- a/src/tools/logrotate.rs +++ b/src/tools/logrotate.rs @@ -104,7 +104,7 @@ impl LogRotate { for i in (0..count-1).rev() { if self.compress - && filenames[i+0].extension() != Some(std::ffi::OsStr::new("zst")) + && filenames[i].extension() != Some(std::ffi::OsStr::new("zst")) && filenames[i+1].extension() == Some(std::ffi::OsStr::new("zst")) { Self::compress(&filenames[i], &filenames[i+1], &options)?; From 96b7483138557ceb0171b8dcb9dd409c9f567450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 14:19:47 +0100 Subject: [PATCH 22/32] clippy: remove/replace needless explicit lifetimes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/pxar/fuse.rs | 12 ++++++------ src/tools/lru_cache.rs | 2 +- src/tools/systemd/time.rs | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pxar/fuse.rs b/src/pxar/fuse.rs index 2037a484..a5001cbe 100644 --- a/src/pxar/fuse.rs +++ b/src/pxar/fuse.rs @@ -480,11 +480,11 @@ impl SessionImpl { Ok(()) } - async fn lookup<'a>( - &'a self, + async fn lookup( + &'_ self, parent: u64, file_name: &OsStr, - ) -> Result<(EntryParam, LookupRef<'a>), Error> { + ) -> Result<(EntryParam, LookupRef<'_>), Error> { let dir = self.open_dir(parent).await?; let entry = match { dir }.lookup(file_name).await? { @@ -519,10 +519,10 @@ impl SessionImpl { to_stat(inode, &entry) } - async fn readdirplus<'a>( - &'a self, + async fn readdirplus( + &'_ self, request: &mut requests::ReaddirPlus, - ) -> Result>, Error> { + ) -> Result>, Error> { let mut lookups = Vec::new(); let offset = usize::try_from(request.offset) .map_err(|_| io_format_err!("directory offset out of range"))?; diff --git a/src/tools/lru_cache.rs b/src/tools/lru_cache.rs index 1033dd42..19012976 100644 --- a/src/tools/lru_cache.rs +++ b/src/tools/lru_cache.rs @@ -173,7 +173,7 @@ impl LruCache { /// Get a mutable reference to the value identified by `key`. /// This will update the cache entry to be the most recently used entry. /// On cache misses, None is returned. - pub fn get_mut<'a>(&'a mut self, key: K) -> Option<&'a mut V> { + pub fn get_mut(&mut self, key: K) -> Option<&mut V> { let node_ptr = self.map.get(&key)?; self.list.bring_to_front(*node_ptr); Some(unsafe { &mut (*self.list.head).value }) diff --git a/src/tools/systemd/time.rs b/src/tools/systemd/time.rs index 02395724..7cc42415 100644 --- a/src/tools/systemd/time.rs +++ b/src/tools/systemd/time.rs @@ -142,7 +142,7 @@ impl From for f64 { } -pub fn verify_time_span<'a>(i: &'a str) -> Result<(), Error> { +pub fn verify_time_span(i: &str) -> Result<(), Error> { parse_time_span(i)?; Ok(()) } From 05725ac9a44f95ddfe758f0e36332489ffe542b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 14:24:31 +0100 Subject: [PATCH 23/32] clippy: remove unnecessary `let` binding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/backup/catalog_shell.rs | 3 +-- src/tape/chunk_archive.rs | 10 +++------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/backup/catalog_shell.rs b/src/backup/catalog_shell.rs index 795d8bb3..00b5b580 100644 --- a/src/backup/catalog_shell.rs +++ b/src/backup/catalog_shell.rs @@ -441,8 +441,7 @@ impl Shell { R: 'static, { let shell: &mut Shell = unsafe { std::mem::transmute(SHELL.unwrap()) }; - let result = call(&mut *shell).await; - result + call(&mut *shell).await } pub async fn shell(mut self) -> Result<(), Error> { diff --git a/src/tape/chunk_archive.rs b/src/tape/chunk_archive.rs index ebbf9ac1..fe0780fc 100644 --- a/src/tape/chunk_archive.rs +++ b/src/tape/chunk_archive.rs @@ -62,15 +62,11 @@ impl <'a> ChunkArchiveWriter<'a> { } fn write_all(&mut self, data: &[u8]) -> Result { - let result = match self.writer { - Some(ref mut writer) => { - let leom = writer.write_all(data)?; - Ok(leom) - } + match self.writer { + Some(ref mut writer) => writer.write_all(data), None => proxmox::io_bail!( "detected write after archive finished - internal error"), - }; - result + } } /// Write chunk into archive. From ccec086e25d4ba05ce76c3a24dea4519553ed000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 14:40:13 +0100 Subject: [PATCH 24/32] clippy: remove unnecessary &mut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/backup/key_derivation.rs | 2 +- src/tape/sgutils2.rs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backup/key_derivation.rs b/src/backup/key_derivation.rs index 73478c00..6b6e7484 100644 --- a/src/backup/key_derivation.rs +++ b/src/backup/key_derivation.rs @@ -278,7 +278,7 @@ pub fn rsa_decrypt_key_config( let decrypted = rsa .private_decrypt(key, &mut buffer, openssl::rsa::Padding::PKCS1) .map_err(|err| format_err!("failed to decrypt KeyConfig using RSA - {}", err))?; - decrypt_key(&mut buffer[..decrypted], passphrase) + decrypt_key(&buffer[..decrypted], passphrase) } #[test] diff --git a/src/tape/sgutils2.rs b/src/tape/sgutils2.rs index 31cd61b5..65deed70 100644 --- a/src/tape/sgutils2.rs +++ b/src/tape/sgutils2.rs @@ -191,16 +191,16 @@ impl <'a, F: AsRawFd> SgRaw<'a, F> { } // todo: what about sense data? - let _sense_len = unsafe { get_scsi_pt_sense_len(&mut *ptvp) }; + let _sense_len = unsafe { get_scsi_pt_sense_len(&*ptvp) }; - let status = unsafe { get_scsi_pt_status_response(&mut *ptvp) }; + let status = unsafe { get_scsi_pt_status_response(&*ptvp) }; if status != 0 { // toto: improve error reporting bail!("unknown scsi error - status response {}", status); } let data_len = self.buffer.len() - - (unsafe { get_scsi_pt_resid(&mut *ptvp) } as usize); + (unsafe { get_scsi_pt_resid(&*ptvp) } as usize); if data_len == 0 { bail!("do_scsi_pt failed - no data received"); } @@ -248,9 +248,9 @@ impl <'a, F: AsRawFd> SgRaw<'a, F> { } // todo: what about sense data? - let _sense_len = unsafe { get_scsi_pt_sense_len(&mut *ptvp) }; + let _sense_len = unsafe { get_scsi_pt_sense_len(&*ptvp) }; - let status = unsafe { get_scsi_pt_status_response(&mut *ptvp) }; + let status = unsafe { get_scsi_pt_status_response(&*ptvp) }; if status != 0 { // toto: improve error reporting bail!("unknown scsi error - status response {}", status); From 09faa9ee956f026403451e6d2c8b75a7483ca6b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 14:46:39 +0100 Subject: [PATCH 25/32] clippy: pass &str/&[..] instead of &String/&Vec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/backup/prune.rs | 4 ++-- src/server/email_notifications.rs | 2 +- src/tape/online_status_map.rs | 2 +- src/tools/subscription.rs | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backup/prune.rs b/src/backup/prune.rs index 66c2ee84..baec57d6 100644 --- a/src/backup/prune.rs +++ b/src/backup/prune.rs @@ -8,7 +8,7 @@ enum PruneMark { Keep, KeepPartial, Remove } fn mark_selections Result> ( mark: &mut HashMap, - list: &Vec, + list: &[BackupInfo], keep: usize, select_id: F, ) -> Result<(), Error> { @@ -45,7 +45,7 @@ fn mark_selections Result> ( fn remove_incomplete_snapshots( mark: &mut HashMap, - list: &Vec, + list: &[BackupInfo], ) { let mut keep_unfinished = true; diff --git a/src/server/email_notifications.rs b/src/server/email_notifications.rs index 24c15073..6af6bd38 100644 --- a/src/server/email_notifications.rs +++ b/src/server/email_notifications.rs @@ -376,7 +376,7 @@ fn get_server_url() -> (String, usize) { } pub fn send_updates_available( - updates: &Vec<&APTUpdateInfo>, + updates: &[&APTUpdateInfo], ) -> Result<(), Error> { // update mails always go to the root@pam configured email.. if let Some(email) = lookup_user_email(Userid::root_userid()) { diff --git a/src/tape/online_status_map.rs b/src/tape/online_status_map.rs index e010fbcf..52042217 100644 --- a/src/tape/online_status_map.rs +++ b/src/tape/online_status_map.rs @@ -173,7 +173,7 @@ pub fn update_changer_online_status( drive_config: &SectionConfigData, inventory: &mut Inventory, changer_name: &str, - label_text_list: &Vec, + label_text_list: &[String], ) -> Result<(), Error> { let mut online_map = OnlineStatusMap::new(drive_config)?; diff --git a/src/tools/subscription.rs b/src/tools/subscription.rs index 54819ea2..4d5caf39 100644 --- a/src/tools/subscription.rs +++ b/src/tools/subscription.rs @@ -87,8 +87,8 @@ pub struct SubscriptionInfo { } async fn register_subscription( - key: &String, - server_id: &String, + key: &str, + server_id: &str, checktime: i64 ) -> Result<(String, String), Error> { // WHCMS sample code feeds the key into this, but it's just a challenge, so keep it simple From 0d2133db98a9cb09af31016b4b37612e2e4648c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 14:52:20 +0100 Subject: [PATCH 26/32] clippy: use while let loops MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/api2/tape/restore.rs | 38 +++++++++++++++-------------------- src/tools/parallel_handler.rs | 6 +----- 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs index 1db64077..2b4102d1 100644 --- a/src/api2/tape/restore.rs +++ b/src/api2/tape/restore.rs @@ -343,32 +343,26 @@ fn restore_chunk_archive<'a>( let mut decoder = ChunkArchiveDecoder::new(reader); let result: Result<_, Error> = proxmox::try_block!({ - loop { - match decoder.next_chunk()? { - Some((digest, blob)) => { + while let Some((digest, blob)) = decoder.next_chunk()? { + if let Some(datastore) = datastore { + let chunk_exists = datastore.cond_touch_chunk(&digest, false)?; + if !chunk_exists { + blob.verify_crc()?; - if let Some(datastore) = datastore { - let chunk_exists = datastore.cond_touch_chunk(&digest, false)?; - if !chunk_exists { - blob.verify_crc()?; - - if blob.crypt_mode()? == CryptMode::None { - blob.decode(None, Some(&digest))?; // verify digest - } - if verbose { - worker.log(format!("Insert chunk: {}", proxmox::tools::digest_to_hex(&digest))); - } - datastore.insert_chunk(&blob, &digest)?; - } else if verbose { - worker.log(format!("Found existing chunk: {}", proxmox::tools::digest_to_hex(&digest))); - } - } else if verbose { - worker.log(format!("Found chunk: {}", proxmox::tools::digest_to_hex(&digest))); + if blob.crypt_mode()? == CryptMode::None { + blob.decode(None, Some(&digest))?; // verify digest } - chunks.push(digest); + if verbose { + worker.log(format!("Insert chunk: {}", proxmox::tools::digest_to_hex(&digest))); + } + datastore.insert_chunk(&blob, &digest)?; + } else if verbose { + worker.log(format!("Found existing chunk: {}", proxmox::tools::digest_to_hex(&digest))); } - None => break, + } else if verbose { + worker.log(format!("Found chunk: {}", proxmox::tools::digest_to_hex(&digest))); } + chunks.push(digest); } Ok(()) }); diff --git a/src/tools/parallel_handler.rs b/src/tools/parallel_handler.rs index 5482ccb3..f2480b2f 100644 --- a/src/tools/parallel_handler.rs +++ b/src/tools/parallel_handler.rs @@ -134,11 +134,7 @@ impl ParallelHandler { let mut msg_list = Vec::new(); let mut i = 0; - loop { - let handle = match self.handles.pop() { - Some(handle) => handle, - None => break, - }; + while let Some(handle) = self.handles.pop() { if let Err(panic) = handle.join() { match panic.downcast::<&str>() { Ok(panic_msg) => msg_list.push( From 382f10a0cc179f8283f5bd5d5d5cd1bdeae47d2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 19 Jan 2021 15:03:04 +0100 Subject: [PATCH 27/32] clippy: fix/allow needless_range_loop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/config/network/helper.rs | 1 + src/server/config.rs | 4 ++-- src/tape/drive/volume_statistics.rs | 11 ++++------- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/config/network/helper.rs b/src/config/network/helper.rs index c4c4b63b..0449caac 100644 --- a/src/config/network/helper.rs +++ b/src/config/network/helper.rs @@ -51,6 +51,7 @@ pub static IPV4_REVERSE_MASK: &[&str] = &[ lazy_static! { pub static ref IPV4_MASK_HASH_LOCALNET: HashMap<&'static str, u8> = { let mut map = HashMap::new(); + #[allow(clippy::needless_range_loop)] for i in 8..32 { map.insert(IPV4_REVERSE_MASK[i], i as u8); } diff --git a/src/server/config.rs b/src/server/config.rs index c7300668..8306f1c2 100644 --- a/src/server/config.rs +++ b/src/server/config.rs @@ -57,9 +57,9 @@ impl ApiConfig { prefix.push_str(components[0]); if let Some(subdir) = self.aliases.get(&prefix) { filename.push(subdir); - for i in 1..comp_len { filename.push(components[i]) } + components.iter().skip(1).for_each(|comp| filename.push(comp)); } else { - for i in 0..comp_len { filename.push(components[i]) } + components.iter().for_each(|comp| filename.push(comp)); } } filename diff --git a/src/tape/drive/volume_statistics.rs b/src/tape/drive/volume_statistics.rs index 5657d3ef..a6a8a26c 100644 --- a/src/tape/drive/volume_statistics.rs +++ b/src/tape/drive/volume_statistics.rs @@ -95,19 +95,16 @@ fn decode_volume_statistics(data: &[u8]) -> Result let read_be_counter = |reader: &mut &[u8], len: u8| { let len = len as usize; - if len == 0 || len > 8 { bail!("invalid conter size '{}'", len); } let mut buffer = [0u8; 8]; reader.read_exact(&mut buffer[..len])?; - let mut value: u64 = 0; - - for i in 0..len { - value <<= 8; - value |= buffer[i] as u64; - } + let value = buffer + .iter() + .take(len) + .fold(0, |value, curr| (value << 8) | *curr as u64); Ok(value) }; From f2f81791d1adfd0a12343a738bf6f46b9edf5a37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Wed, 20 Jan 2021 10:42:57 +0100 Subject: [PATCH 28/32] clippy: fix for_kv_map MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit and allow it in the one case where the entry loop is intended, but the code is not yet implemented fully. Signed-off-by: Fabian Grünbichler --- src/config/acl.rs | 1 + src/server/report.rs | 2 +- src/tape/inventory.rs | 25 ++++++++++++------------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/config/acl.rs b/src/config/acl.rs index 63fd065e..6ef54e30 100644 --- a/src/config/acl.rs +++ b/src/config/acl.rs @@ -372,6 +372,7 @@ impl AclTreeNode { fn extract_group_roles(&self, _user: &Userid, leaf: bool) -> HashMap { let mut map = HashMap::new(); + #[allow(clippy::for_kv_map)] for (_group, roles) in &self.groups { let is_member = false; // fixme: check if user is member of the group if !is_member { diff --git a/src/server/report.rs b/src/server/report.rs index 848aa326..1b77f442 100644 --- a/src/server/report.rs +++ b/src/server/report.rs @@ -39,7 +39,7 @@ fn function_calls() -> Vec<(&'static str, fn() -> String)> { }; let mut list = Vec::new(); - for (store, _) in &config.sections { + for store in config.sections.keys() { list.push(store.as_str()); } list.join(", ") diff --git a/src/tape/inventory.rs b/src/tape/inventory.rs index 446d9379..26d72528 100644 --- a/src/tape/inventory.rs +++ b/src/tape/inventory.rs @@ -215,12 +215,13 @@ impl Inventory { /// find media by label_text pub fn find_media_by_label_text(&self, label_text: &str) -> Option<&MediaId> { - for (_uuid, entry) in &self.map { + self.map.values().find_map(|entry| { if entry.id.label.label_text == label_text { - return Some(&entry.id); + Some(&entry.id) + } else { + None } - } - None + }) } /// Lookup media pool @@ -245,7 +246,7 @@ impl Inventory { pub fn list_pool_media(&self, pool: &str) -> Vec { let mut list = Vec::new(); - for (_uuid, entry) in &self.map { + for entry in self.map.values() { match entry.id.media_set_label { None => continue, // not assigned to any pool Some(ref set) => { @@ -272,7 +273,7 @@ impl Inventory { pub fn list_used_media(&self) -> Vec { let mut list = Vec::new(); - for (_uuid, entry) in &self.map { + for entry in self.map.values() { match entry.id.media_set_label { None => continue, // not assigned to any pool Some(ref set) => { @@ -288,15 +289,13 @@ impl Inventory { /// List media not assigned to any pool pub fn list_unassigned_media(&self) -> Vec { - let mut list = Vec::new(); - - for (_uuid, entry) in &self.map { + self.map.values().filter_map(|entry| if entry.id.media_set_label.is_none() { - list.push(entry.id.clone()); + Some(entry.id.clone()) + } else { + None } - } - - list + ).collect() } pub fn media_set_start_time(&self, media_set_uuid: &Uuid) -> Option { From 1d928b25fe6b7f39216fb9391115281188b01ab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Wed, 20 Jan 2021 10:50:35 +0100 Subject: [PATCH 29/32] clippy: remove some unnecessary reference taking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/api2/types/userid.rs | 2 +- src/backup/file_formats.rs | 10 +++++----- src/tape/inventory.rs | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/api2/types/userid.rs b/src/api2/types/userid.rs index 85c1edd1..20ce9370 100644 --- a/src/api2/types/userid.rs +++ b/src/api2/types/userid.rs @@ -277,7 +277,7 @@ impl PartialEq<&str> for RealmRef { impl PartialEq for Realm { fn eq(&self, rhs: &RealmRef) -> bool { - self.0 == &rhs.0 + self.0 == rhs.0 } } diff --git a/src/backup/file_formats.rs b/src/backup/file_formats.rs index f0caa430..a25263f2 100644 --- a/src/backup/file_formats.rs +++ b/src/backup/file_formats.rs @@ -63,11 +63,11 @@ pub struct EncryptedDataBlobHeader { /// /// Panics on unknown magic numbers. pub fn header_size(magic: &[u8; 8]) -> usize { - match magic { - &UNCOMPRESSED_BLOB_MAGIC_1_0 => std::mem::size_of::(), - &COMPRESSED_BLOB_MAGIC_1_0 => std::mem::size_of::(), - &ENCRYPTED_BLOB_MAGIC_1_0 => std::mem::size_of::(), - &ENCR_COMPR_BLOB_MAGIC_1_0 => std::mem::size_of::(), + match *magic { + UNCOMPRESSED_BLOB_MAGIC_1_0 => std::mem::size_of::(), + COMPRESSED_BLOB_MAGIC_1_0 => std::mem::size_of::(), + ENCRYPTED_BLOB_MAGIC_1_0 => std::mem::size_of::(), + ENCR_COMPR_BLOB_MAGIC_1_0 => std::mem::size_of::(), _ => panic!("unknown blob magic"), } } diff --git a/src/tape/inventory.rs b/src/tape/inventory.rs index 26d72528..8babcbf5 100644 --- a/src/tape/inventory.rs +++ b/src/tape/inventory.rs @@ -382,7 +382,7 @@ impl Inventory { let set_list = self.map.values() .filter_map(|entry| entry.id.media_set_label.as_ref()) - .filter(|set| &set.pool == &pool && set.uuid.as_ref() != [0u8;16]); + .filter(|set| set.pool == pool && set.uuid.as_ref() != [0u8;16]); for set in set_list { match last_set { @@ -405,7 +405,7 @@ impl Inventory { // consistency check - must be the only set with that ctime let set_list = self.map.values() .filter_map(|entry| entry.id.media_set_label.as_ref()) - .filter(|set| &set.pool == &pool && set.uuid.as_ref() != [0u8;16]); + .filter(|set| set.pool == pool && set.uuid.as_ref() != [0u8;16]); for set in set_list { if set.uuid != uuid && set.ctime >= ctime { // should not happen @@ -436,7 +436,7 @@ impl Inventory { let set_list = self.map.values() .filter_map(|entry| entry.id.media_set_label.as_ref()) - .filter(|set| (&set.uuid != media_set_uuid) && (&set.pool == &pool)); + .filter(|set| (&set.uuid != media_set_uuid) && (set.pool == pool)); let mut next_ctime = None; From 50deb0d3f8dafd2751236c16b8f730190d67f957 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Wed, 20 Jan 2021 11:38:24 +0100 Subject: [PATCH 30/32] clippy: use is_null to check for null pointers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/backup/fixed_index.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backup/fixed_index.rs b/src/backup/fixed_index.rs index 279537de..5eb7f04a 100644 --- a/src/backup/fixed_index.rs +++ b/src/backup/fixed_index.rs @@ -126,7 +126,7 @@ impl FixedIndexReader { } fn unmap(&mut self) -> Result<(), Error> { - if self.index == std::ptr::null_mut() { + if self.index.is_null() { return Ok(()); } @@ -324,7 +324,7 @@ impl FixedIndexWriter { } fn unmap(&mut self) -> Result<(), Error> { - if self.index == std::ptr::null_mut() { + if self.index.is_null() { return Ok(()); } @@ -342,7 +342,7 @@ impl FixedIndexWriter { } pub fn close(&mut self) -> Result<[u8; 32], Error> { - if self.index == std::ptr::null_mut() { + if self.index.is_null() { bail!("cannot close already closed index file."); } @@ -437,7 +437,7 @@ impl FixedIndexWriter { ); } - if self.index == std::ptr::null_mut() { + if self.index.is_null() { bail!("cannot write to closed index file."); } From d967d8f1a7c15af7616c048595c12ce43303b84b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Wed, 20 Jan 2021 13:21:44 +0100 Subject: [PATCH 31/32] clippy: remove drop(&..) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit it does nothing. Signed-off-by: Fabian Grünbichler --- src/api2/tape/media.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/api2/tape/media.rs b/src/api2/tape/media.rs index cbbe80c5..6c880944 100644 --- a/src/api2/tape/media.rs +++ b/src/api2/tape/media.rs @@ -194,7 +194,6 @@ pub fn destroy_media(label_text: String, force: Option,) -> Result<(), Err } let uuid = media_id.label.uuid.clone(); - drop(media_id); inventory.remove_media(&uuid)?; From 8be65e34de303134a7dba88fc9a098034780b5a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Wed, 20 Jan 2021 13:31:01 +0100 Subject: [PATCH 32/32] clippy: replace transmute with &* MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- src/backup/dynamic_index.rs | 2 +- src/backup/fixed_index.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backup/dynamic_index.rs b/src/backup/dynamic_index.rs index 54561205..1619d8db 100644 --- a/src/backup/dynamic_index.rs +++ b/src/backup/dynamic_index.rs @@ -194,7 +194,7 @@ impl IndexFile for DynamicIndexReader { if pos >= self.index.len() { None } else { - Some(unsafe { std::mem::transmute(self.chunk_digest(pos).as_ptr()) }) + Some(unsafe { &*(self.chunk_digest(pos).as_ptr() as *const [u8; 32]) }) } } diff --git a/src/backup/fixed_index.rs b/src/backup/fixed_index.rs index 5eb7f04a..ceb6fe29 100644 --- a/src/backup/fixed_index.rs +++ b/src/backup/fixed_index.rs @@ -166,7 +166,7 @@ impl IndexFile for FixedIndexReader { if pos >= self.index_length { None } else { - Some(unsafe { std::mem::transmute(self.index.add(pos * 32)) }) + Some(unsafe { &*(self.index.add(pos * 32) as *const [u8; 32]) }) } }