refactor: rename size to uncompressed_size, add compressed_size and closed columns
Schema changes: - Rename items.size to items.uncompressed_size for clarity - Add compressed_size (INTEGER NULL) - tracks compressed file size on disk - Add closed (BOOLEAN NOT NULL DEFAULT 1) - tracks whether item is fully written - Existing items default to closed=true via migration Lifecycle: - Items created with closed=false, set to true on successful save/import - Compressed size captured via fs::metadata() after compression writer closes - Truncated uploads (413) get compressed_size set, closed=true, uncompressed_size=None - Update command now backfills both uncompressed_size and compressed_size Also includes bug fixes and dedup from prior review: - Fix stream_raw_content_response using uncompressed_size for raw byte Content-Length - ApiResponse::ok()/empty() constructors, TryFrom<ItemWithMeta> for ItemInfo - tag_names() method on ItemWithMeta, meta_filter() on Settings - Fix .unwrap() panics in compression engine Read/Write impls - Fix TOCTOU race in stream_raw_content_response (now uses compressed_size) - Fix swallowed write errors in meta plugins (digest, magic_file, exec) - Fix term::stderr().unwrap() panic in item_service - Deduplicate ItemService::new() calls across 20 API handlers - ImportMeta supports #[serde(alias = "size")] for backward compat All 75 tests, 67 doc tests pass. Clippy clean.
This commit is contained in:
@@ -152,7 +152,7 @@ pub fn mode_list(
|
||||
.with_timezone(&chrono::Local)
|
||||
.format("%F %T")
|
||||
.to_string(),
|
||||
ColumnType::Size => match item.size {
|
||||
ColumnType::Size => match item.uncompressed_size {
|
||||
Some(size) => format_size(size as u64, settings.human_readable),
|
||||
None => match item_path.metadata() {
|
||||
Ok(_) => "Unknown".to_string(),
|
||||
@@ -218,7 +218,7 @@ pub fn mode_list(
|
||||
// Apply styling for specific cases
|
||||
match column_type {
|
||||
ColumnType::Size => {
|
||||
if item.size.is_none() {
|
||||
if item.uncompressed_size.is_none() {
|
||||
if item_path.metadata().is_ok() {
|
||||
cell = cell
|
||||
.fg(comfy_table::Color::Yellow)
|
||||
@@ -282,7 +282,7 @@ fn show_list_structured(
|
||||
None => "Missing".to_string(),
|
||||
};
|
||||
|
||||
let size_formatted = match item.size {
|
||||
let size_formatted = match item.uncompressed_size {
|
||||
Some(size) => crate::modes::common::format_size(size as u64, settings.human_readable),
|
||||
None => "Unknown".to_string(),
|
||||
};
|
||||
@@ -294,7 +294,7 @@ fn show_list_structured(
|
||||
.with_timezone(&chrono::Local)
|
||||
.format("%F %T")
|
||||
.to_string(),
|
||||
size: item.size.map(|s| s as u64),
|
||||
size: item.uncompressed_size.map(|s| s as u64),
|
||||
size_formatted,
|
||||
compression: item.compression,
|
||||
file_size,
|
||||
|
||||
Reference in New Issue
Block a user