type t = { name : string; version : string; dev_repo : Uri.t; branch : string option; depends : string list; synopsis : string option; } let create ~name ~version ~dev_repo ?branch ?(depends = []) ?synopsis () = { name; version; dev_repo; branch; depends; synopsis } let name t = t.name let version t = t.version let dev_repo t = t.dev_repo let branch t = t.branch let depends t = t.depends let synopsis t = t.synopsis let repo_name t = (* Extract basename from dev-repo URL, stripping .git suffix *) let path = Uri.path t.dev_repo in let basename = Filename.basename path in if Filename.check_suffix basename ".git" then Filename.chop_suffix basename ".git" else basename let checkout_dir ~checkouts_root t = Fpath.(checkouts_root / repo_name t) let subtree_prefix t = repo_name t let compare a b = String.compare a.name b.name let equal a b = String.equal a.name b.name let same_repo a b = Uri.equal a.dev_repo b.dev_repo let pp ppf t = Fmt.pf ppf "@[{ name = %S;@ version = %S;@ dev_repo = %a;@ branch = %a;@ \ depends = [%a];@ synopsis = %a }@]" t.name t.version Uri.pp t.dev_repo Fmt.(option ~none:(any "None") string) t.branch Fmt.(list ~sep:(any ", ") string) t.depends Fmt.(option ~none:(any "None") (quote string)) t.synopsis