sig
  type kind = [ `Git | `Hg ]
  val pp_kind : Stdlib.Format.formatter -> Topkg_vcs.kind -> unit
  type commit_ish = string
  type t
  val kind : Topkg_vcs.t -> Topkg_vcs.kind
  val dir : Topkg_vcs.t -> Topkg_fpath.t
  val find :
    ?dir:Topkg_fpath.t -> unit -> Topkg_vcs.t option Topkg_result.result
  val get : ?dir:Topkg_fpath.t -> unit -> Topkg_vcs.t Topkg_result.result
  val cmd : Topkg_vcs.t -> Topkg_cmd.t
  val pp : Stdlib.Format.formatter -> Topkg_vcs.t -> unit
  val is_dirty : Topkg_vcs.t -> bool Topkg_result.result
  val not_dirty : Topkg_vcs.t -> unit Topkg_result.result
  val file_is_dirty :
    Topkg_vcs.t -> Topkg_fpath.t -> bool Topkg_result.result
  val head : ?dirty:bool -> Topkg_vcs.t -> string Topkg_result.result
  val commit_id :
    ?dirty:bool ->
    ?commit_ish:string -> Topkg_vcs.t -> string Topkg_result.result
  val commit_ptime_s :
    ?commit_ish:Topkg_vcs.commit_ish ->
    Topkg_vcs.t -> int Topkg_result.result
  val describe :
    ?dirty:bool ->
    ?commit_ish:string -> Topkg_vcs.t -> string Topkg_result.result
  val tags : Topkg_vcs.t -> string list Topkg_result.result
  val changes :
    ?until:string ->
    Topkg_vcs.t -> after:string -> (string * string) list Topkg_result.result
  val tracked_files :
    ?tree_ish:string -> Topkg_vcs.t -> Topkg_fpath.t list Topkg_result.result
  val clone : Topkg_vcs.t -> dir:Topkg_fpath.t -> unit Topkg_result.result
  val checkout :
    ?branch:string ->
    Topkg_vcs.t -> commit_ish:string -> unit Topkg_result.result
  val commit_files :
    ?msg:string ->
    Topkg_vcs.t -> Topkg_fpath.t list -> unit Topkg_result.result
  val delete_tag : Topkg_vcs.t -> string -> unit Topkg_result.result
  val tag :
    ?force:bool ->
    ?sign:bool ->
    ?msg:string ->
    ?commit_ish:string -> Topkg_vcs.t -> string -> unit Topkg_result.result
end