mirror of
https://git.proxmox.com/git/rustc
synced 2025-08-13 21:46:49 +00:00
61 lines
1.7 KiB
Rust
61 lines
1.7 KiB
Rust
/*
|
|
* libgit2 "rev-parse" example - shows how to parse revspecs
|
|
*
|
|
* Written by the libgit2 contributors
|
|
*
|
|
* To the extent possible under law, the author(s) have dedicated all copyright
|
|
* and related and neighboring rights to this software to the public domain
|
|
* worldwide. This software is distributed without any warranty.
|
|
*
|
|
* You should have received a copy of the CC0 Public Domain Dedication along
|
|
* with this software. If not, see
|
|
* <http://creativecommons.org/publicdomain/zero/1.0/>.
|
|
*/
|
|
|
|
#![deny(warnings)]
|
|
|
|
use clap::Parser;
|
|
use git2::Repository;
|
|
|
|
#[derive(Parser)]
|
|
struct Args {
|
|
#[structopt(name = "spec")]
|
|
arg_spec: String,
|
|
#[structopt(name = "dir", long = "git-dir")]
|
|
/// directory of the git repository to check
|
|
flag_git_dir: Option<String>,
|
|
}
|
|
|
|
fn run(args: &Args) -> Result<(), git2::Error> {
|
|
let path = args.flag_git_dir.as_ref().map(|s| &s[..]).unwrap_or(".");
|
|
let repo = Repository::open(path)?;
|
|
|
|
let revspec = repo.revparse(&args.arg_spec)?;
|
|
|
|
if revspec.mode().contains(git2::RevparseMode::SINGLE) {
|
|
println!("{}", revspec.from().unwrap().id());
|
|
} else if revspec.mode().contains(git2::RevparseMode::RANGE) {
|
|
let to = revspec.to().unwrap();
|
|
let from = revspec.from().unwrap();
|
|
println!("{}", to.id());
|
|
|
|
if revspec.mode().contains(git2::RevparseMode::MERGE_BASE) {
|
|
let base = repo.merge_base(from.id(), to.id())?;
|
|
println!("{}", base);
|
|
}
|
|
|
|
println!("^{}", from.id());
|
|
} else {
|
|
return Err(git2::Error::from_str("invalid results from revparse"));
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
fn main() {
|
|
let args = Args::parse();
|
|
match run(&args) {
|
|
Ok(()) => {}
|
|
Err(e) => println!("error: {}", e),
|
|
}
|
|
}
|