@@ -23,6 +23,14 @@ import (
2323 "github.com/substantialcattle5/sietch/util"
2424)
2525
26+ // SpaceSavings represents space savings statistics for a file
27+ type SpaceSavings struct {
28+ OriginalSize int64
29+ CompressedSize int64
30+ SpaceSaved int64
31+ SpaceSavedPct float64
32+ }
33+
2634// addCmd represents the add command
2735var addCmd = & cobra.Command {
2836 Use : "add <source_path> <destination_path> [source_path2] [destination_path2]..." ,
@@ -128,6 +136,7 @@ Examples:
128136 // Process each file pair
129137 successCount := 0
130138 var failedFiles []string
139+ var totalSpaceSavings SpaceSavings
131140
132141 // Show initial progress for multiple files
133142 if len (filePairs ) > 1 {
@@ -312,14 +321,21 @@ Examples:
312321
313322 fmt .Printf (" • Compression: %s\n " , vaultConfig .Compression )
314323
315- // Calculate and show space savings if compression is used
316- if vaultConfig .Compression != "none" {
317- // TODO: Calculate actual space savings during processing
318- // For now, show compression info
319- fmt .Printf (" • Compression: %s (space savings calculated during processing)\n " , vaultConfig .Compression )
320- }
321-
322324 fmt .Printf (" • Chunking: %s (size: %s)\n " , vaultConfig .Chunking .Strategy , vaultConfig .Chunking .ChunkSize )
325+
326+ // Show total space savings if compression is used
327+ if vaultConfig .Compression != "none" && totalSpaceSavings .SpaceSaved > 0 {
328+ totalSpaceSavedPct := float64 (0 )
329+ if totalSpaceSavings .OriginalSize > 0 {
330+ totalSpaceSavedPct = float64 (totalSpaceSavings .SpaceSaved ) / float64 (totalSpaceSavings .OriginalSize ) * 100
331+ }
332+ fmt .Printf ("\n 💾 Total Space Savings:\n " )
333+ fmt .Printf (" • Original size: %s\n " , util .HumanReadableSize (totalSpaceSavings .OriginalSize ))
334+ fmt .Printf (" • Compressed size: %s\n " , util .HumanReadableSize (totalSpaceSavings .CompressedSize ))
335+ fmt .Printf (" • Space saved: %s (%.1f%%)\n " ,
336+ util .HumanReadableSize (totalSpaceSavings .SpaceSaved ),
337+ totalSpaceSavedPct )
338+ }
323339 }
324340
325341 // Return error only if all files failed
@@ -337,6 +353,35 @@ type FilePair struct {
337353 Destination string
338354}
339355
356+ // calculateSpaceSavings calculates space savings for a file based on its chunks
357+ func calculateSpaceSavings (chunks []config.ChunkRef ) SpaceSavings {
358+ originalSize := int64 (0 )
359+ compressedSize := int64 (0 )
360+
361+ for _ , chunk := range chunks {
362+ originalSize += chunk .Size
363+ if chunk .CompressedSize > 0 {
364+ compressedSize += chunk .CompressedSize
365+ } else {
366+ // If no compressed size is recorded, use original size
367+ compressedSize += chunk .Size
368+ }
369+ }
370+
371+ spaceSaved := originalSize - compressedSize
372+ var spaceSavedPct float64
373+ if originalSize > 0 {
374+ spaceSavedPct = float64 (spaceSaved ) / float64 (originalSize ) * 100
375+ }
376+
377+ return SpaceSavings {
378+ OriginalSize : originalSize ,
379+ CompressedSize : compressedSize ,
380+ SpaceSaved : spaceSaved ,
381+ SpaceSavedPct : spaceSavedPct ,
382+ }
383+ }
384+
340385// parseFileArguments parses command line arguments into source-destination pairs
341386// Supports two patterns:
342387// 1. Paired: source1 dest1 source2 dest2 ... (even number of args)
0 commit comments