sig
  type kind = Git | Hg
  val pp_kind : B0_vcs.kind B0_std.Fmt.t
  type t
  val kind : B0_vcs.t -> B0_vcs.kind
  val repo_dir : B0_vcs.t -> B0_std.Fpath.t
  val work_dir : B0_vcs.t -> B0_std.Fpath.t
  val cmd : B0_vcs.t -> B0_std.Cmd.t
  val pp : B0_vcs.t B0_std.Fmt.t
  val find :
    ?dir:B0_std.Fpath.t -> unit -> (B0_vcs.t option, string) Stdlib.result
  val get : ?dir:B0_std.Fpath.t -> unit -> (B0_vcs.t, string) Stdlib.result
  type commit_ish = string
  type commit_id = string
  val head : B0_vcs.commit_ish
  val commit_id :
    B0_vcs.t ->
    dirty_mark:bool ->
    B0_vcs.commit_ish -> (B0_vcs.commit_id, string) Stdlib.result
  val commit_ptime_s :
    B0_vcs.t -> B0_vcs.commit_ish -> (int, string) Stdlib.result
  val changes :
    B0_vcs.t ->
    after:B0_vcs.commit_ish ->
    until:B0_vcs.commit_ish ->
    ((B0_vcs.commit_id * string) list, string) Stdlib.result
  val tracked_files :
    B0_vcs.t ->
    tree_ish:string -> (B0_std.Fpath.t list, string) Stdlib.result
  val commit_files :
    ?msg:string ->
    B0_vcs.t -> B0_std.Fpath.t list -> (unit, string) Stdlib.result
  val is_dirty : B0_vcs.t -> (bool, string) Stdlib.result
  val not_dirty : B0_vcs.t -> (unit, string) Stdlib.result
  val file_is_dirty :
    B0_vcs.t -> B0_std.Fpath.t -> (bool, string) Stdlib.result
  val checkout :
    ?and_branch:string ->
    B0_vcs.t -> B0_vcs.commit_ish -> (unit, string) Stdlib.result
  val clone :
    B0_vcs.t -> dir:B0_std.Fpath.t -> (B0_vcs.t, string) Stdlib.result
  type tag = string
  val tags : B0_vcs.t -> (B0_vcs.tag list, string) Stdlib.result
  val tag :
    ?msg:string ->
    B0_vcs.t ->
    force:bool ->
    sign:bool ->
    B0_vcs.commit_ish -> B0_vcs.tag -> (unit, string) Stdlib.result
  val delete_tag : B0_vcs.t -> B0_vcs.tag -> (unit, string) Stdlib.result
  val describe :
    B0_vcs.t ->
    dirty_mark:bool -> B0_vcs.commit_ish -> (string, string) Stdlib.result
  module Git :
    sig
      val check_kind : B0_vcs.t -> (unit, string) Stdlib.result
      type remote = string
      type branch = string
      val pp_branch : B0_vcs.Git.branch B0_std.Fmt.t
      val pp_remote_branch :
        (B0_vcs.Git.remote * B0_vcs.Git.branch) B0_std.Fmt.t
      val remote_branch_exists :
        B0_vcs.t ->
        remote:B0_vcs.Git.remote ->
        branch:B0_vcs.Git.branch -> (bool, string) Stdlib.result
      val remote_branch_fetch :
        ?stdout:B0_std.Os.Cmd.stdo ->
        ?stderr:B0_std.Os.Cmd.stdo ->
        B0_vcs.t ->
        remote:B0_vcs.Git.remote ->
        branch:B0_vcs.Git.branch -> (unit, string) Stdlib.result
      val remote_branch_push :
        ?stdout:B0_std.Os.Cmd.stdo ->
        ?stderr:B0_std.Os.Cmd.stdo ->
        B0_vcs.t ->
        force:bool ->
        src:B0_vcs.Git.branch ->
        remote:B0_vcs.Git.remote ->
        dst:B0_vcs.Git.remote -> (unit, string) Stdlib.result
      val remote_branch_delete :
        ?stdout:B0_std.Os.Cmd.stdo ->
        ?stderr:B0_std.Os.Cmd.stdo ->
        B0_vcs.t ->
        force:bool ->
        remote:B0_vcs.Git.remote ->
        branch:B0_vcs.Git.branch -> (unit, string) Stdlib.result
      val branch_delete :
        ?stdout:B0_std.Os.Cmd.stdo ->
        ?stderr:B0_std.Os.Cmd.stdo ->
        B0_vcs.t ->
        force:bool ->
        branch:B0_vcs.Git.branch -> (unit, string) Stdlib.result
      val transient_checkout :
        B0_vcs.t ->
        force:bool ->
        branch:B0_vcs.Git.branch ->
        B0_std.Fpath.t ->
        B0_vcs.commit_ish option -> (B0_vcs.t, string) Stdlib.result
      val transient_checkout_delete :
        B0_vcs.t -> force:bool -> (unit, string) Stdlib.result
      val with_transient_checkout :
        ?dir:B0_std.Fpath.t ->
        B0_vcs.t ->
        force:bool ->
        branch:B0_vcs.Git.branch ->
        B0_vcs.commit_ish option ->
        (B0_vcs.t -> 'a) -> ('a, string) Stdlib.result
      val add :
        B0_vcs.t ->
        force:bool -> B0_std.Fpath.t list -> (unit, string) Stdlib.result
      val has_staged_changes : B0_vcs.t -> (bool, string) Stdlib.result
      val commit :
        ?stdout:B0_std.Os.Cmd.stdo ->
        ?stderr:B0_std.Os.Cmd.stdo ->
        ?sign:bool ->
        ?reset_author:bool ->
        ?amend:bool ->
        ?msg:string -> B0_vcs.t -> (unit, string) Stdlib.result
      val commit_exists :
        B0_vcs.t -> B0_vcs.commit_ish -> (bool, string) Stdlib.result
      val rm :
        ?stdout:B0_std.Os.Cmd.stdo ->
        ?stderr:B0_std.Os.Cmd.stdo ->
        B0_vcs.t ->
        force:bool ->
        recurse:bool ->
        ignore_unmatch:bool ->
        B0_std.Fpath.t list -> (unit, string) Stdlib.result
    end
end