diff --git a/src/base.rs b/src/base.rs index 8148522..73eaa97 100644 --- a/src/base.rs +++ b/src/base.rs @@ -228,6 +228,16 @@ pub fn init() -> std::io::Result<()> { Ok(()) } +pub fn get_branch_name() -> String { + let head = data::get_ref("HEAD".to_owned(), false); + if !head.symbolic { + return "".to_owned(); + } + assert!(head.value.starts_with("refs/heads/")); + let ref_items: Vec<&str> = head.value.splitn(3, "/").collect(); + return (*ref_items.last().unwrap()).to_owned(); +} + fn is_ignored(path: &String) -> bool { if path.contains(".rgit") { true diff --git a/src/main.rs b/src/main.rs index f13f35e..ab2a941 100644 --- a/src/main.rs +++ b/src/main.rs @@ -64,6 +64,7 @@ fn main() { .arg(Arg::with_name("name").index(1).required(true)) .arg(Arg::with_name("start_point").index(2).default_value("@")), ) + .subcommand(SubCommand::with_name("status").about("check current branch")) .get_matches(); match matches.subcommand_name() { @@ -78,6 +79,7 @@ fn main() { Some("tag") => tag(matches), Some("k") => k(), Some("branch") => branch(matches), + Some("status") => status(), _ => println!("unknown sub command"), } } @@ -212,3 +214,12 @@ fn branch(matches: ArgMatches) { println!("Branch {} created_at {}", name, oid); } } + +fn status() { + let branch = base::get_branch_name(); + if branch != "".to_owned() { + println!("On branch {}", branch); + } else { + println!("HEAD detached at {}", &base::get_oid("@".to_owned())[1..10]) + } +}