Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
Byron committed Sep 4, 2020
1 parent 161e7df commit f90b92f
Show file tree
Hide file tree
Showing 2 changed files with 154 additions and 155 deletions.
156 changes: 1 addition & 155 deletions src/plumbing/pretty.rs → src/plumbing/pretty/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,161 +6,7 @@ use std::io::{stderr, stdout, Write};
use gitoxide_core::pack::verify;
use options::*;

mod options {
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 {
/// Create an index from a packfile.
///
/// This command can also be used to stream packs to standard input or to repair partial packs.
#[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,
},
}
}
mod options;

use crate::shared::ProgressRange;

Expand Down
153 changes: 153 additions & 0 deletions src/plumbing/pretty/options.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
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 {
/// Create an index from a packfile.
///
/// This command can also be used to stream packs to standard input or to repair partial packs.
#[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,
},
}

0 comments on commit f90b92f

Please sign in to comment.