///|
#borrow(path)
extern "C" fn hub_libgit2_repo_path(path : Bytes) -> Bytes = "hub_libgit2_repo_path"

///|
#borrow(path)
extern "C" fn hub_libgit2_head_name(path : Bytes) -> Bytes = "hub_libgit2_head_name"

///|
extern "C" fn hub_libgit2_init() -> Int = "hub_libgit2_init"

///|
extern "C" fn hub_libgit2_is_loaded() -> Int = "hub_libgit2_is_loaded"

///|
fn hub_libgit2_decode_nonempty(bytes : Bytes) -> String? {
  let value = decode_bytes(bytes)
  if value.length() == 0 {
    None
  } else {
    Some(value)
  }
}

///|
fn hub_libgit2_available() -> Bool {
  hub_libgit2_is_loaded() == 1 || hub_libgit2_init() >= 0
}

///|
fn hub_git_repository_path(root : String) -> String? {
  if !hub_libgit2_available() {
    return None
  }
  hub_libgit2_decode_nonempty(hub_libgit2_repo_path(str_to_bytes(root)))
}

///|
fn hub_git_head_ref_name(root : String) -> String? {
  if !hub_libgit2_available() {
    return None
  }
  hub_libgit2_decode_nonempty(hub_libgit2_head_name(str_to_bytes(root)))
}