76 lines
1.9 KiB
Rust
76 lines
1.9 KiB
Rust
use crate::example::{Example, read_example_files};
|
|
use crate::reorder_patch::{Hunk, Patch, PatchLine};
|
|
use clap::Args;
|
|
use std::path::PathBuf;
|
|
|
|
#[derive(Args, Debug, Clone)]
|
|
pub struct TruncatePatchArgs {
|
|
/// Number of logical groups ahead to leave
|
|
#[arg(long)]
|
|
pub num_groups: usize,
|
|
|
|
/// Leave only edits in the file under the cursor
|
|
#[arg(long, default_value_t = false)]
|
|
pub current_file_only: bool,
|
|
}
|
|
|
|
pub fn run_truncate_expected_patch(
|
|
args: &TruncatePatchArgs,
|
|
inputs: &[PathBuf],
|
|
) -> anyhow::Result<()> {
|
|
let stdin_path = PathBuf::from("-");
|
|
let inputs = if inputs.is_empty() {
|
|
std::slice::from_ref(&stdin_path)
|
|
} else {
|
|
inputs
|
|
};
|
|
|
|
let mut examples = read_example_files(inputs);
|
|
for example in &mut examples {
|
|
run_one_input(example, args)?;
|
|
|
|
println!("{}", serde_json::to_string(&example)?);
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
fn run_one_input(example: &mut Example, args: &TruncatePatchArgs) -> anyhow::Result<()> {
|
|
let mut patch = Patch::parse_unified_diff(&example.spec.expected_patches[0]);
|
|
let mut groups_left = args.num_groups;
|
|
|
|
patch.hunks.retain(|hunk| {
|
|
if groups_left == 0 {
|
|
return false;
|
|
}
|
|
if starts_new_group(hunk) {
|
|
groups_left -= 1;
|
|
}
|
|
|
|
if args.current_file_only {
|
|
return hunk.filename == example.spec.cursor_path.display().to_string();
|
|
}
|
|
|
|
true
|
|
});
|
|
|
|
// Remove all group headers
|
|
patch.header = String::new();
|
|
patch.hunks.iter_mut().for_each(|hunk| {
|
|
hunk.lines.retain(|line| match line {
|
|
PatchLine::Garbage(line) => !line.starts_with("//"),
|
|
_ => true,
|
|
});
|
|
});
|
|
|
|
example.spec.expected_patches[0] = patch.to_string();
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn starts_new_group(hunk: &Hunk) -> bool {
|
|
hunk.lines.iter().any(|line| match line {
|
|
PatchLine::Garbage(content) => content.starts_with("///"),
|
|
_ => false,
|
|
})
|
|
}
|