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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
use clap::{AppSettings, Clap};
use gitoxide_core as core;
use std::path::PathBuf;
#[derive(Debug, Clap)]
#[clap(name = "gix-plumbing", about = "The git underworld", version = clap::crate_version!())]
#[clap(setting = AppSettings::SubcommandRequired)]
#[clap(setting = AppSettings::ColoredHelp)]
pub struct Args {
#[clap(long, short = 't')]
/// The amount of threads to use for some operations.
///
/// If unset, or the value is 0, there is no limit and all logical cores can be used.
pub threads: Option<usize>,
/// Display verbose messages and progress information
#[clap(long, short = 'v')]
pub verbose: bool,
/// Bring up a terminal user interface displaying progress visually
#[clap(long, conflicts_with("verbose"))]
pub progress: bool,
/// The progress TUI will stay up even though the work is already completed.
///
/// Use this to be able to read progress messages or additional information visible in the TUI log pane.
#[clap(long, conflicts_with("verbose"), requires("progress"))]
pub progress_keep_open: bool,
/// Determine the format to use when outputting statistics.
#[clap(
long,
short = 'f',
default_value = "human",
possible_values(core::OutputFormat::variants())
)]
pub format: core::OutputFormat,
#[clap(subcommand)]
pub cmd: Subcommands,
}
#[derive(Debug, Clap)]
pub enum Subcommands {
#[clap(setting = AppSettings::ColoredHelp)]
#[clap(setting = AppSettings::DisableVersion)]
PackReceive {
/// The protocol version to use. Valid values are 1 and 2
#[clap(long, short = 'p')]
protocol: Option<core::Protocol>,
/// the directory into which to write references. Existing files will be overwritten.
///
/// Note that the directory will be created if needed.
#[clap(long, short = 'r')]
refs_directory: Option<PathBuf>,
/// The URLs or path from which to receive the pack.
///
/// See here for a list of supported URLs: https://www.git-scm.com/docs/git-clone#_git_urls
url: String,
/// The directory into which to write the received pack and index.
///
/// If unset, they will be discarded.
directory: Option<PathBuf>,
},
/// List remote references from a remote identified by a url.
///
/// This is the plumbing equivalent of `git ls-remote`.
/// Supported URLs are documented here: https://www.git-scm.com/docs/git-clone#_git_urls
#[clap(setting = AppSettings::ColoredHelp)]
#[clap(setting = AppSettings::DisableVersion)]
RemoteRefList {
/// The protocol version to use. Valid values are 1 and 2
#[clap(long, short = 'p')]
protocol: Option<core::Protocol>,
/// the URLs or path from which to receive references
///
/// See here for a list of supported URLs: https://www.git-scm.com/docs/git-clone#_git_urls
url: String,
},
#[clap(setting = AppSettings::ColoredHelp)]
#[clap(setting = AppSettings::DisableVersion)]
PackIndexFromData {
/// Specify how to iterate the pack, defaults to 'verify'
///
/// Valid values are
///
/// **as-is** do not do anything and expect the pack file to be valid as per the trailing hash,
/// **verify** the input ourselves and validate that it matches with the hash provided in the pack,
/// **restore** hash the input ourselves and ignore failing entries, instead finish the pack with the hash we computed
#[clap(
long,
short = 'i',
default_value = "verify",
possible_values(core::pack::index::IterationMode::variants())
)]
iteration_mode: core::pack::index::IterationMode,
/// Path to the pack file to read (with .pack extension).
///
/// If unset, the pack file is expected on stdin.
#[clap(long, short = 'p')]
pack_path: Option<PathBuf>,
/// The folder into which to place the pack and the generated index file
///
/// If unset, only informational output will be provided to standard output.
#[clap(parse(from_os_str))]
directory: Option<PathBuf>,
},
/// Verify the integrity of a pack or index file
#[clap(setting = AppSettings::ColoredHelp)]
#[clap(setting = AppSettings::DisableVersion)]
PackExplode {
#[clap(long)]
/// Read written objects back and assert they match their source. Fail the operation otherwise.
///
/// Only relevant if an object directory is set.
verify: bool,
/// delete the pack and index file after the operation is successful
#[clap(long)]
delete_pack: bool,
/// The amount of checks to run
#[clap(
long,
short = 'c',
default_value = "all",
possible_values(core::pack::explode::SafetyCheck::variants())
)]
check: core::pack::explode::SafetyCheck,
/// Compress bytes even when using the sink, i.e. no object directory is specified
///
/// This helps to determine overhead related to compression. If unset, the sink will
/// only create hashes from bytes, which is usually limited by the speed at which input
/// can be obtained.
#[clap(long)]
sink_compress: bool,
/// The '.pack' or '.idx' file to explode into loose objects
#[clap(parse(from_os_str))]
pack_path: PathBuf,
/// The path into which all objects should be written. Commonly '.git/objects'
#[clap(parse(from_os_str))]
object_path: Option<PathBuf>,
},
/// Verify the integrity of a pack or index file
#[clap(setting = AppSettings::ColoredHelp)]
#[clap(setting = AppSettings::DisableVersion)]
PackVerify {
/// output statistical information about the pack
#[clap(long, short = 's')]
statistics: bool,
/// The algorithm used to verify the pack. They differ in costs.
#[clap(
long,
short = 'a',
default_value = "less-time",
possible_values(core::pack::verify::Algorithm::variants())
)]
algorithm: core::pack::verify::Algorithm,
#[clap(long, conflicts_with("re-encode"))]
/// Decode and parse tags, commits and trees to validate their correctness beyond hashing correctly.
///
/// Malformed objects should not usually occur, but could be injected on purpose or accident.
/// This will reduce overall performance.
decode: bool,
#[clap(long)]
/// Decode and parse tags, commits and trees to validate their correctness, and re-encode them.
///
/// This flag is primarily to test the implementation of encoding, and requires to decode the object first.
/// Encoding an object after decoding it should yield exactly the same bytes.
/// This will reduce overall performance even more, as re-encoding requires to transform zero-copy objects into
/// owned objects, causing plenty of allocation to occour.
re_encode: bool,
/// The '.pack' or '.idx' file whose checksum to validate.
#[clap(parse(from_os_str))]
path: PathBuf,
},
/// Verify the integrity of a commit graph
#[clap(setting = AppSettings::ColoredHelp)]
#[clap(setting = AppSettings::DisableVersion)]
CommitGraphVerify {
/// The path to '.git/objects/info/', '.git/objects/info/commit-graphs/', or '.git/objects/info/commit-graph' to validate.
#[clap(parse(from_os_str))]
path: PathBuf,
/// output statistical information about the pack
#[clap(long, short = 's')]
statistics: bool,
},
}