/*
 * 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 git2::Repository;
use structopt::StructOpt;

#[derive(StructOpt)]
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::from_args();
    match run(&args) {
        Ok(()) => {}
        Err(e) => println!("error: {}", e),
    }
}
