mirror of
https://github.com/ouch-org/ouch.git
synced 2025-06-08 04:25:31 +00:00
Merge pull request #502 from ouch-org/fix-size-unit-inconsistency
Fix size unit inconsistency
This commit is contained in:
commit
9507c4d93a
7
Cargo.lock
generated
7
Cargo.lock
generated
@ -735,7 +735,6 @@ dependencies = [
|
|||||||
"tempfile",
|
"tempfile",
|
||||||
"test-strategy",
|
"test-strategy",
|
||||||
"time",
|
"time",
|
||||||
"ubyte",
|
|
||||||
"xz2",
|
"xz2",
|
||||||
"zip",
|
"zip",
|
||||||
"zstd",
|
"zstd",
|
||||||
@ -1188,12 +1187,6 @@ dependencies = [
|
|||||||
"static_assertions",
|
"static_assertions",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ubyte"
|
|
||||||
version = "0.10.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c81f0dae7d286ad0d9366d7679a77934cfc3cf3a8d67e82669794412b2368fe6"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unarray"
|
name = "unarray"
|
||||||
version = "0.1.4"
|
version = "0.1.4"
|
||||||
|
@ -30,7 +30,6 @@ snap = "1.1.0"
|
|||||||
tar = "0.4.40"
|
tar = "0.4.40"
|
||||||
tempfile = "3.8.0"
|
tempfile = "3.8.0"
|
||||||
time = { version = "0.3.28", default-features = false }
|
time = { version = "0.3.28", default-features = false }
|
||||||
ubyte = { version = "0.10.3", default-features = false }
|
|
||||||
xz2 = "0.1.7"
|
xz2 = "0.1.7"
|
||||||
zip = { version = "0.6.6", default-features = false, features = ["time"] }
|
zip = { version = "0.6.6", default-features = false, features = ["time"] }
|
||||||
zstd = { version = "0.12.4", default-features = false }
|
zstd = { version = "0.12.4", default-features = false }
|
||||||
|
@ -10,13 +10,12 @@ use std::{
|
|||||||
|
|
||||||
use fs_err as fs;
|
use fs_err as fs;
|
||||||
use same_file::Handle;
|
use same_file::Handle;
|
||||||
use ubyte::ToByteUnit;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
error::FinalError,
|
error::FinalError,
|
||||||
info,
|
info,
|
||||||
list::FileInArchive,
|
list::FileInArchive,
|
||||||
utils::{self, EscapedPathDisplay, FileVisibilityPolicy},
|
utils::{self, Bytes, EscapedPathDisplay, FileVisibilityPolicy},
|
||||||
warning,
|
warning,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -41,7 +40,7 @@ pub fn unpack_archive(reader: Box<dyn Read>, output_folder: &Path, quiet: bool)
|
|||||||
inaccessible,
|
inaccessible,
|
||||||
"{:?} extracted. ({})",
|
"{:?} extracted. ({})",
|
||||||
utils::strip_cur_dir(&output_folder.join(file.path()?)),
|
utils::strip_cur_dir(&output_folder.join(file.path()?)),
|
||||||
file.size().bytes(),
|
Bytes::new(file.size()),
|
||||||
);
|
);
|
||||||
|
|
||||||
files_unpacked += 1;
|
files_unpacked += 1;
|
||||||
|
@ -14,7 +14,6 @@ use filetime::{set_file_mtime, FileTime};
|
|||||||
use fs_err as fs;
|
use fs_err as fs;
|
||||||
use same_file::Handle;
|
use same_file::Handle;
|
||||||
use time::OffsetDateTime;
|
use time::OffsetDateTime;
|
||||||
use ubyte::ToByteUnit;
|
|
||||||
use zip::{self, read::ZipFile, DateTime, ZipArchive};
|
use zip::{self, read::ZipFile, DateTime, ZipArchive};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
@ -22,7 +21,7 @@ use crate::{
|
|||||||
info,
|
info,
|
||||||
list::FileInArchive,
|
list::FileInArchive,
|
||||||
utils::{
|
utils::{
|
||||||
self, cd_into_same_dir_as, get_invalid_utf8_paths, pretty_format_list_of_paths, strip_cur_dir,
|
self, cd_into_same_dir_as, get_invalid_utf8_paths, pretty_format_list_of_paths, strip_cur_dir, Bytes,
|
||||||
EscapedPathDisplay, FileVisibilityPolicy,
|
EscapedPathDisplay, FileVisibilityPolicy,
|
||||||
},
|
},
|
||||||
warning,
|
warning,
|
||||||
@ -74,7 +73,7 @@ where
|
|||||||
inaccessible,
|
inaccessible,
|
||||||
"{:?} extracted. ({})",
|
"{:?} extracted. ({})",
|
||||||
file_path.display(),
|
file_path.display(),
|
||||||
file.size().bytes()
|
Bytes::new(file.size()),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use std::{borrow::Cow, fmt::Display, path::Path};
|
use std::{borrow::Cow, cmp, fmt::Display, path::Path};
|
||||||
|
|
||||||
use crate::CURRENT_DIRECTORY;
|
use crate::CURRENT_DIRECTORY;
|
||||||
|
|
||||||
@ -86,3 +86,81 @@ pub fn nice_directory_display(path: &Path) -> Cow<str> {
|
|||||||
to_utf(path)
|
to_utf(path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Struct useful to printing bytes as kB, MB, GB, etc.
|
||||||
|
pub struct Bytes(f64);
|
||||||
|
|
||||||
|
impl Bytes {
|
||||||
|
const UNIT_PREFIXES: [&'static str; 6] = ["", "ki", "Mi", "Gi", "Ti", "Pi"];
|
||||||
|
|
||||||
|
/// Create a new Bytes.
|
||||||
|
pub fn new(bytes: u64) -> Self {
|
||||||
|
Self(bytes as f64)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Display for Bytes {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
let &Self(num) = self;
|
||||||
|
|
||||||
|
debug_assert!(num >= 0.0);
|
||||||
|
if num < 1_f64 {
|
||||||
|
return write!(f, "{} B", num);
|
||||||
|
}
|
||||||
|
|
||||||
|
let delimiter = 1000_f64;
|
||||||
|
let exponent = cmp::min((num.ln() / 6.90775).floor() as i32, 4);
|
||||||
|
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"{:.2} {}B",
|
||||||
|
num / delimiter.powi(exponent),
|
||||||
|
Bytes::UNIT_PREFIXES[exponent as usize]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_pretty_bytes_formatting() {
|
||||||
|
fn format_bytes(bytes: u64) -> String {
|
||||||
|
format!("{}", Bytes::new(bytes))
|
||||||
|
}
|
||||||
|
let b = 1;
|
||||||
|
let kb = b * 1000;
|
||||||
|
let mb = kb * 1000;
|
||||||
|
let gb = mb * 1000;
|
||||||
|
|
||||||
|
assert_eq!("0 B", format_bytes(0)); // This is weird
|
||||||
|
assert_eq!("1.00 B", format_bytes(b));
|
||||||
|
assert_eq!("999.00 B", format_bytes(b * 999));
|
||||||
|
assert_eq!("12.00 MiB", format_bytes(mb * 12));
|
||||||
|
assert_eq!("123.00 MiB", format_bytes(mb * 123));
|
||||||
|
assert_eq!("5.50 MiB", format_bytes(mb * 5 + kb * 500));
|
||||||
|
assert_eq!("7.54 GiB", format_bytes(gb * 7 + 540 * mb));
|
||||||
|
assert_eq!("1.20 TiB", format_bytes(gb * 1200));
|
||||||
|
|
||||||
|
// bytes
|
||||||
|
assert_eq!("234.00 B", format_bytes(234));
|
||||||
|
assert_eq!("999.00 B", format_bytes(999));
|
||||||
|
// kilobytes
|
||||||
|
assert_eq!("2.23 kiB", format_bytes(2234));
|
||||||
|
assert_eq!("62.50 kiB", format_bytes(62500));
|
||||||
|
assert_eq!("329.99 kiB", format_bytes(329990));
|
||||||
|
// megabytes
|
||||||
|
assert_eq!("2.75 MiB", format_bytes(2750000));
|
||||||
|
assert_eq!("55.00 MiB", format_bytes(55000000));
|
||||||
|
assert_eq!("987.65 MiB", format_bytes(987654321));
|
||||||
|
// gigabytes
|
||||||
|
assert_eq!("5.28 GiB", format_bytes(5280000000));
|
||||||
|
assert_eq!("95.20 GiB", format_bytes(95200000000));
|
||||||
|
assert_eq!("302.00 GiB", format_bytes(302000000000));
|
||||||
|
assert_eq!("302.99 GiB", format_bytes(302990000000));
|
||||||
|
// Weird aproximation cases:
|
||||||
|
assert_eq!("999.90 GiB", format_bytes(999900000000));
|
||||||
|
assert_eq!("1.00 TiB", format_bytes(999990000000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -10,7 +10,9 @@ mod fs;
|
|||||||
mod question;
|
mod question;
|
||||||
|
|
||||||
pub use file_visibility::FileVisibilityPolicy;
|
pub use file_visibility::FileVisibilityPolicy;
|
||||||
pub use formatting::{nice_directory_display, pretty_format_list_of_paths, strip_cur_dir, to_utf, EscapedPathDisplay};
|
pub use formatting::{
|
||||||
|
nice_directory_display, pretty_format_list_of_paths, strip_cur_dir, to_utf, Bytes, EscapedPathDisplay,
|
||||||
|
};
|
||||||
pub use fs::{
|
pub use fs::{
|
||||||
cd_into_same_dir_as, clear_path, create_dir_if_non_existent, is_symlink, remove_file_or_dir, try_infer_extension,
|
cd_into_same_dir_as, clear_path, create_dir_if_non_existent, is_symlink, remove_file_or_dir, try_infer_extension,
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user