-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.go
More file actions
85 lines (74 loc) · 3.6 KB
/
Copy pathmain.go
File metadata and controls
85 lines (74 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package main
import (
"flag"
"fmt"
"runtime"
"github.com/tomventa/dedupe/internals/planner"
"github.com/tomventa/dedupe/internals/utils"
"github.com/tomventa/dedupe/models"
)
func main() {
var config models.Config
flag.StringVar(&config.InputFile, "input", "", "Input file or directory to process")
flag.BoolVar(&config.OverwriteOriginal, "overwrite", false, "Overwrite original files with deduplicated versions")
flag.StringVar(&config.OutputDir, "output", "", "Output directory for deduplicated files (if not overwriting originals)")
flag.BoolVar(&config.Verbose, "verbose", false, "Enable verbose logging")
flag.BoolVar(&config.Recursive, "recursive", false, "Recursively process directories")
flag.BoolVar(&config.NoLogo, "nologo", false, "Disable printing the logo")
flag.BoolVar(&config.DeleteOriginal, "delete", false, "Delete original file after successful deduplication")
flag.BoolVar(&config.SortOutputContent, "sort", true, "Sort output file content alphabetically")
flag.IntVar(&config.Workers, "workers", runtime.NumCPU(), "Number of concurrent workers for processing")
flag.Uint64Var(&config.MaxMemoryUsage, "max-memory", 8192, "Maximum total memory usage in Megabytes")
flag.BoolVar(&config.CrossFileDeduplication, "crossfile", false, "Enable cross-file deduplication mode (requires already deduplicated and sorted individual files)")
flag.BoolVar(&config.StripWhitespace, "strip", false, "Strip whitespace from lines before processing")
flag.IntVar(&config.LongLineThreshold, "long-threshold", 2000, "Long Line Threshold (lines longer than this will be skipped if SkipLongLines is enabled)")
flag.IntVar(&config.ShortLineThreshold, "short-threshold", 6, "Short Line Threshold (lines shorter than or equal to this will be skipped if SkipShortLines is enabled)")
flag.BoolVar(&config.SkipLongLines, "skip-long", false, "Skip very long lines exceeding Long Line Threshold")
flag.BoolVar(&config.SkipShortLines, "skip-short", false, "Skip very short lines below (or equal to) Short Line Threshold")
flag.Parse()
// Use first non-flag argument as input if -input flag not provided
if config.InputFile == "" && flag.NArg() > 0 {
config.InputFile = flag.Arg(0)
}
// Detect if input path is directory
isDir, err := utils.IsPathDirectory(config.InputFile)
if err != nil {
if err.Error() == "stat "+config.InputFile+": no such file or directory" {
fmt.Printf("Error: Input path does not exist.\n")
return
}
fmt.Printf("Error accessing input path: %v\n", err)
return
}
config.InputIsDir = isDir
// Check for input = output conflict
if !config.OverwriteOriginal && config.OutputDir != "" && config.InputFile == config.OutputDir {
fmt.Println("Error: Input path and output directory cannot be the same when not overwriting originals.")
return
}
// Check for valid workers count
if config.Workers < 1 {
fmt.Println("Error: Workers count must be at least 1.")
return
}
// Check for max memory > system limits
systemMemory, err := utils.GetTotalSystemMemory()
config.MaxMemoryUsage = config.MaxMemoryUsage * 1024 * 1024 // Convert to bytes
if config.MaxMemoryUsage > systemMemory {
fmt.Printf("Error: Specified max memory usage (%d bytes) exceeds system memory (%d bytes).\n", config.MaxMemoryUsage, systemMemory)
return
}
files, directories, totalSize, err := utils.GetDirectoryEntries(config.InputFile, config.Recursive)
if err != nil {
fmt.Printf("Error reading input path: %v\n", err)
return
}
if !config.NoLogo {
utils.PrintLogo()
}
err = planner.HandleDeduplication(config, files, directories, totalSize)
if err != nil {
fmt.Printf("Error during deduplication: %v\n", err)
return
}
}