123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123typerejection=|UserConstraintofOpamFormula.atom|Unavailablelet(/)=Filename.concatletwith_dirpathfn=letch=Unix.opendirpathinFun.protect~finally:(fun()->Unix.closedirch)(fun()->fnch)letlist_dirpath=letrecauxaccch=matchUnix.readdirchwith|name->aux(name::acc)ch|exceptionEnd_of_file->accinwith_dirpath(aux[])typet={env:string->OpamVariable.variable_contentsoption;packages_dir:string;pins:(OpamPackage.Version.t*OpamFile.OPAM.t)OpamPackage.Name.Map.t;constraints:OpamFormula.version_constraintOpamTypes.name_map;(* User-provided constraints *)test:OpamPackage.Name.Set.t;prefer_oldest:bool;}letloadtpkg=let{OpamPackage.name;version=_}=pkginmatchOpamPackage.Name.Map.find_optnamet.pinswith|Some(_,opam)->opam|None->letopam_path=t.packages_dir/OpamPackage.Name.to_stringname/OpamPackage.to_stringpkg/"opam"inOpamFile.OPAM.read(OpamFile.make(OpamFilename.rawopam_path))letuser_restrictionstname=OpamPackage.Name.Map.find_optnamet.constraintsletdev=OpamPackage.Version.of_string"dev"letstd_env?(ocaml_native=true)?sys_ocaml_version~arch~os~os_distribution~os_family~os_version()=function|"arch"->Some(OpamTypes.Sarch)|"os"->Some(OpamTypes.Sos)|"os-distribution"->Some(OpamTypes.Sos_distribution)|"os-version"->Some(OpamTypes.Sos_version)|"os-family"->Some(OpamTypes.Sos_family)|"opam-version"->Some(OpamVariable.stringOpamVersion.(to_stringcurrent))|"sys-ocaml-version"->sys_ocaml_version|>Option.map(funv->OpamTypes.Sv)|"ocaml:native"->Some(OpamTypes.Bocaml_native)|"enable-ocaml-beta-repository"->None(* Fake variable? *)|v->OpamConsole.warning"Unknown variable %S"v;Noneletenvtpkgv=ifList.memvOpamPackageVar.predefined_depends_variablesthenNoneelsematchOpamVariable.Full.to_stringvwith|"version"->Some(OpamTypes.S(OpamPackage.Version.to_string(OpamPackage.versionpkg)))|x->t.envxletfilter_depstpkgf=letdev=OpamPackage.Version.compare(OpamPackage.versionpkg)dev=0inlettest=OpamPackage.Name.Set.mem(OpamPackage.namepkg)t.testinf|>OpamFilter.partial_filter_formula(envtpkg)|>OpamFilter.filter_deps~build:true~post:true~test~doc:false~dev~default:falseletversion_comparetv1v2=ift.prefer_oldestthenOpamPackage.Version.comparev1v2elseOpamPackage.Version.comparev2v1letcandidatestname=matchOpamPackage.Name.Map.find_optnamet.pinswith|Some(version,opam)->[version,Okopam]|None->letversions_dir=t.packages_dir/OpamPackage.Name.to_stringnameinmatchlist_dirversions_dirwith|versions->letuser_constraints=user_restrictionstnameinversions|>List.filter_map(fundir->matchOpamPackage.of_string_optdirwith|SomepkgwhenSys.file_exists(versions_dir/dir/"opam")->Some(OpamPackage.versionpkg)|_->None)|>List.sort(version_comparet)|>List.map(funv->matchuser_constraintswith|Sometestwhennot(OpamFormula.check_version_formula(OpamFormula.Atomtest)v)->v,Error(UserConstraint(name,Sometest))|_->letpkg=OpamPackage.createnamevinletopam=loadtpkginletavailable=OpamFile.OPAM.availableopaminmatchOpamFilter.eval~default:(Bfalse)(envtpkg)availablewith|Btrue->v,Okopam|Bfalse->v,ErrorUnavailable|_->OpamConsole.error"Available expression not a boolean: %s"(OpamFilter.to_stringavailable);v,ErrorUnavailable)|exceptionUnix.Unix_error(Unix.ENOENT,_,_)->OpamConsole.log"opam-0install""Package %S not found!"(OpamPackage.Name.to_stringname);[]letpp_rejectionf=function|UserConstraintx->Fmt.pff"Rejected by user-specified constraint %s"(OpamFormula.string_of_atomx)|Unavailable->Fmt.stringf"Availability condition not satisfied"letcreate?(prefer_oldest=false)?(test=OpamPackage.Name.Set.empty)?(pins=OpamPackage.Name.Map.empty)~constraints~envpackages_dir={env;packages_dir;pins;constraints;test;prefer_oldest}