///| Human-readable `git status` formatting

///|
/// Format status output similar to `git status`.
pub async fn status_text(
  fs : &@bit.RepoFileSystem,
  root : String,
) -> String raise @bit.GitError {
  let bit_marker = join_path(root, ".bit")
  let bit_marker = if fs.is_dir(bit_marker) || fs.is_file(bit_marker) {
    bit_marker
  } else {
    join_path(root, ".git")
  }
  let git_dir = if fs.is_file(bit_marker) {
    resolve_gitdir(fs, bit_marker)
  } else {
    bit_marker
  }
  let sb = StringBuilder::new()
  let head = read_head_ref(fs, git_dir)
  match head {
    Branch(name) => sb.write_string("On branch " + name + "\n")
    Detached(id) => {
      let short = @bithash.short_hex(id.to_hex(), 7)
      sb.write_string("HEAD detached at " + short + "\n")
    }
  }
  let head_commit = resolve_head_commit(fs, git_dir)
  if head_commit is None {
    sb.write_string("No commits yet\n")
  }
  let st = status(fs, root)
  let has_staged = st.staged_added.length() > 0 ||
    st.staged_modified.length() > 0 ||
    st.staged_deleted.length() > 0
  if has_staged {
    sb.write_string("\nChanges to be committed:\n")
    for path in st.staged_added {
      sb.write_string("  staged: " + path + "\n")
    }
    for path in st.staged_modified {
      sb.write_string("  staged: " + path + "\n")
    }
    for path in st.staged_deleted {
      sb.write_string("  staged: " + path + "\n")
    }
  }
  let has_unstaged = st.unstaged_modified.length() > 0 ||
    st.unstaged_deleted.length() > 0
  if has_unstaged {
    sb.write_string("\nChanges not staged for commit:\n")
    for path in st.unstaged_modified {
      sb.write_string("  modified: " + path + "\n")
    }
    for path in st.unstaged_deleted {
      sb.write_string("  deleted: " + path + "\n")
    }
  }
  if st.untracked.length() > 0 {
    sb.write_string("\nUntracked files:\n")
    for path in st.untracked {
      sb.write_string("  " + path + "\n")
    }
  }
  if !has_staged && !has_unstaged && st.untracked.length() == 0 {
    sb.write_string("\nnothing to commit, working tree clean\n")
  }
  sb.to_string()
}