-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
109 lines (92 loc) · 3.47 KB
/
Program.cs
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using PicoArgs_dotnet;
namespace ZipDir;
/* Displayed syntax should probably be something like:
* \path\to\zip.zip/path/to/file.txt
* ..or for nested zips:
* \path\to\zip1.zip/nested.zip/path/to/file.txt
* ..where
* [\path\to\zip1.zip] [/nested.zip/path/to/file.txt]
*
* Physical files use backslash, zip entries use forward slash
*/
internal static class Program
{
private static bool raw;
private static int Main(string[] args)
{
var ver = GitVersion.VersionInfo.Get();
try {
var parsed = ParseCommandLine(args);
Program.raw = parsed.Raw;
if (!raw) {
Console.WriteLine($"ZipDir - list contents of zip files {ver.GetVersionHash(12)}");
}
var str = parsed.ByExtension ? "extension" : "magic number";
WriteMessage($"Folder: {parsed.Folder}, pattern: {parsed.Pattern}, searching by {str}", true);
Searcher.SearchFolder(parsed.Folder, parsed.Pattern, parsed.Excludes, parsed.ByExtension);
return 0;
}
catch (HelpException) {
// --help has been requested
Console.WriteLine($"ZipDir - list contents of zip files {ver.GetVersionHash(20)}");
Console.WriteLine(CommandLineMessage);
return 0;
}
catch (Exception ex) {
// any other exception
Console.WriteLine($"ERROR: {ex.Message}\r\n");
Console.WriteLine($"ZipDir - list contents of zip files {ver.GetVersionHash(12)}");
Console.WriteLine(CommandLineMessage);
return 1;
}
}
/// <summary>
/// Wrap the call to PicoArgs in a using block, so it automatically throws if there are any errors
/// </summary>
private static ZipDirConfig ParseCommandLine(string[] args)
{
using var pico = new PicoArgsDisposable(args);
var help = pico.Contains("-h", "-?", "--help");
if (help) {
// if we want help, just bail here. Supress the warning about not using other parameters
pico.SuppressCheck = true;
throw new HelpException();
}
// parse the rest of the command line
var raw = pico.Contains("-r", "--raw");
var byExtension = !pico.Contains("-b", "--byte");
var folder = Searcher.NormalizeFolder(pico.GetParamOpt("-f", "--folder") ?? ".");
var pattern = pico.GetParamOpt("-p", "--pattern");
var excludes = pico.GetMultipleParams("-e", "--exclude");
// if no pattern is specified:
// when searching by extension, the default should be *.zip
// when searching by magic number, the default should be *
pattern ??= byExtension ? "*.zip" : "*";
return new ZipDirConfig(byExtension, folder, pattern, excludes, raw);
}
/// <summary>
/// Display helpful message is not in --raw mode
/// </summary>
internal static void WriteMessage(string msg, bool blankLine = false)
{
if (!raw) {
Console.WriteLine(msg);
if (blankLine) {
Console.WriteLine();
}
}
}
private const string CommandLineMessage = """
Usage: ZipDir.exe [options]
Options:
-f, --folder <path> Folder to search (default ".")
-p, --pattern <str> Zip file pattern (default "*.zip")
-e, --exclude <str> Exclude patterns, can be specified multiple times "-e backup -e documents"
-b, --byte Identify zip files by magic number, not extension
-r, --raw Raw output, for piping
-h, --help, -? Help information
Example:
ZipDir.exe -f .
ZipDir.exe --folder \your\docs --pattern *.zip --exclude backup --exclude documents
""";
}