Add rust example
This commit is contained in:
parent
e78a0ab296
commit
ce4af278ac
1 changed files with 58 additions and 0 deletions
58
examples/merge-file.rs
Normal file
58
examples/merge-file.rs
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
use std::{env, fs, process};
|
||||||
|
|
||||||
|
use reconcile_merge::{BuiltinTokenizer, reconcile};
|
||||||
|
|
||||||
|
/// Merges three versions of a file: mine, base, and theirs.
|
||||||
|
/// Implement a trivial version git merge-file (https://git-scm.com/docs/git-merge-file)
|
||||||
|
///
|
||||||
|
/// Run it with:
|
||||||
|
/// `cargo run --example merge-file my.txt base.txt their.txt [output_file.txt]`
|
||||||
|
fn main() {
|
||||||
|
let args: Vec<String> = env::args().collect();
|
||||||
|
|
||||||
|
if args.len() < 4 || args.len() > 5 {
|
||||||
|
eprintln!("Usage: merge-file <mine> <base> <theirs> [output]");
|
||||||
|
process::exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mine_file = &args[1];
|
||||||
|
let base_file = &args[2];
|
||||||
|
let theirs_file = &args[3];
|
||||||
|
let output_file = args.get(4);
|
||||||
|
|
||||||
|
// Read files
|
||||||
|
let mine_content = fs::read_to_string(mine_file).unwrap_or_else(|e| {
|
||||||
|
eprintln!("Error reading {}: {}", mine_file, e);
|
||||||
|
process::exit(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
let base_content = fs::read_to_string(base_file).unwrap_or_else(|e| {
|
||||||
|
eprintln!("Error reading {}: {}", base_file, e);
|
||||||
|
process::exit(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
let theirs_content = fs::read_to_string(theirs_file).unwrap_or_else(|e| {
|
||||||
|
eprintln!("Error reading {}: {}", theirs_file, e);
|
||||||
|
process::exit(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Perform the merge using reconcile
|
||||||
|
let result = reconcile(
|
||||||
|
&base_content,
|
||||||
|
&mine_content.into(),
|
||||||
|
&theirs_content.into(),
|
||||||
|
&*BuiltinTokenizer::Word,
|
||||||
|
);
|
||||||
|
|
||||||
|
let merged_content = result.apply().text();
|
||||||
|
|
||||||
|
// Write the result
|
||||||
|
if let Some(output_path) = output_file {
|
||||||
|
if let Err(e) = fs::write(output_path, merged_content) {
|
||||||
|
eprintln!("Error writing to {}: {}", output_path, e);
|
||||||
|
process::exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
print!("{}", merged_content);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue