debugdata.rs
71 lines
| 2.0 KiB
| application/rls-services+xml
|
RustLexer
Simon Sapin
|
r47163 | use crate::error::CommandError; | ||
Simon Sapin
|
r47251 | use clap::Arg; | ||
use clap::ArgGroup; | ||||
Simon Sapin
|
r47165 | use hg::operations::{debug_data, DebugDataKind}; | ||
Antoine Cezar
|
r46099 | |||
pub const HELP_TEXT: &str = " | ||||
Dump the contents of a data file revision | ||||
"; | ||||
Raphaël Gomès
|
r50534 | pub fn args() -> clap::Command { | ||
clap::command!("debugdata") | ||||
Simon Sapin
|
r47251 | .arg( | ||
Raphaël Gomès
|
r50534 | Arg::new("changelog") | ||
Simon Sapin
|
r47251 | .help("open changelog") | ||
Raphaël Gomès
|
r50534 | .short('c') | ||
.action(clap::ArgAction::SetTrue), | ||||
Simon Sapin
|
r47251 | ) | ||
.arg( | ||||
Raphaël Gomès
|
r50534 | Arg::new("manifest") | ||
Simon Sapin
|
r47251 | .help("open manifest") | ||
Raphaël Gomès
|
r50534 | .short('m') | ||
.action(clap::ArgAction::SetTrue), | ||||
Simon Sapin
|
r47251 | ) | ||
.group( | ||||
Raphaël Gomès
|
r50534 | ArgGroup::new("revlog") | ||
Simon Sapin
|
r47251 | .args(&["changelog", "manifest"]) | ||
.required(true), | ||||
) | ||||
.arg( | ||||
Raphaël Gomès
|
r50534 | Arg::new("rev") | ||
Simon Sapin
|
r47251 | .help("revision") | ||
.required(true) | ||||
.value_name("REV"), | ||||
) | ||||
.about(HELP_TEXT) | ||||
} | ||||
Raphaël Gomès
|
r50808 | #[logging_timer::time("trace")] | ||
Simon Sapin
|
r47334 | pub fn run(invocation: &crate::CliInvocation) -> Result<(), CommandError> { | ||
let args = invocation.subcommand_args; | ||||
Simon Sapin
|
r47250 | let rev = args | ||
Raphaël Gomès
|
r50534 | .get_one::<String>("rev") | ||
Simon Sapin
|
r47250 | .expect("rev should be a required argument"); | ||
Raphaël Gomès
|
r50534 | let kind = match ( | ||
args.get_one::<bool>("changelog").unwrap(), | ||||
args.get_one::<bool>("manifest").unwrap(), | ||||
) { | ||||
(true, false) => DebugDataKind::Changelog, | ||||
(false, true) => DebugDataKind::Manifest, | ||||
(true, true) => { | ||||
unreachable!("Should not happen since options are exclusive") | ||||
} | ||||
(false, false) => { | ||||
unreachable!("Should not happen since options are required") | ||||
} | ||||
}; | ||||
Antoine Cezar
|
r46099 | |||
Simon Sapin
|
r47335 | let repo = invocation.repo?; | ||
Raphaël Gomès
|
r50375 | if repo.has_narrow() { | ||
return Err(CommandError::unsupported( | ||||
"support for ellipsis nodes is missing and repo has narrow enabled", | ||||
)); | ||||
} | ||||
Raphaël Gomès
|
r50534 | let data = debug_data(repo, rev, kind).map_err(|e| (e, rev.as_ref()))?; | ||
Antoine Cezar
|
r46099 | |||
Simon Sapin
|
r47334 | let mut stdout = invocation.ui.stdout_buffer(); | ||
Simon Sapin
|
r47250 | stdout.write_all(&data)?; | ||
stdout.flush()?; | ||||
Antoine Cezar
|
r46099 | |||
Simon Sapin
|
r47250 | Ok(()) | ||
Antoine Cezar
|
r46099 | } | ||