123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109(**************************************************************************)(* *)(* Copyright 2012-2015 OCamlPro *)(* Copyright 2012 INRIA *)(* *)(* All rights reserved. This file is distributed under the terms of the *)(* GNU Lesser General Public License version 2.1, with the special *)(* exception on linking described in the file LICENSE. *)(* *)(**************************************************************************)openOpamTypesopenOpamStateTypesopenOpamFilename.Opletpackagestname=OpamPackage.package_of_namest.pinnednameletpackage_optstname=trySome(packagestname)withNot_found->Noneletversionstname=(packagestname).versionletpackagesst=st.pinnedletpossible_definition_filenamesdirname=[dir/(OpamPackage.Name.to_stringname^".opam")//"opam";dir//(OpamPackage.Name.to_stringname^".opam");dir/"opam"/(OpamPackage.Name.to_stringname^".opam")//"opam";dir/"opam"//(OpamPackage.Name.to_stringname^".opam");dir/"opam"//"opam";dir//"opam"]letfind_opam_file_in_sourcenamedir=letopt=OpamStd.List.find_optOpamFilename.exists(possible_definition_filenamesdirname)in(matchopt,OpamStateConfig.(!r.locked)with|Somebase,Someext->letfl=OpamFilename.add_extensionbaseextinifOpamFilename.existsflthenSomeflelseopt|_->opt)|>OpamStd.Option.mapOpamFile.makeletname_of_opam_filenamedirfile=letopenOpamStd.Option.Opinletsuffix=".opam"inletget_names=ifFilename.check_suffixssuffixthenSomeFilename.(chop_suffix(basenames)suffix)elseNoneinletrel=OpamFilename.remove_prefixdirfileinletrel=matchOpamStateConfig.(!r.locked)with|None->rel|Somesuf->letext="."^sufinifOpamStd.String.ends_with~suffix:(suffix^ext)relthenOpamStd.String.remove_suffix~suffix:extrelelserelin(get_name(Filename.basenamerel)>>+fun()->get_name(Filename.dirnamerel))>>=funname->trySome(OpamPackage.Name.of_stringname)withFailure_->Noneletfiles_in_sourced=letbaseopam=OpamFilename.Base.of_string"opam"inletfilesd=List.filter(funf->OpamFilename.basenamef=baseopam||OpamFilename.check_suffixf".opam")(OpamFilename.filesd)@OpamStd.List.filter_map(fund->ifOpamFilename.(basename_dird=Base.of_string"opam")||OpamStd.String.ends_with~suffix:".opam"(OpamFilename.Dir.to_stringd)thenOpamFilename.opt_fileOpamFilename.Op.(d//"opam")elseNone)(OpamFilename.dirsd)infilesd@files(d/"opam")|>List.map(funf->matchOpamStateConfig.(!r.locked)with|None->f|Someext->letfl=OpamFilename.add_extensionfextinifOpamFilename.existsflthenflelsef)|>OpamStd.List.filter_map(funf->try(* Ignore empty files *)if(Unix.stat(OpamFilename.to_stringf)).Unix.st_size=0thenNoneelseSome(name_of_opam_filenamedf,OpamFile.makef)withUnix.Unix_error_->OpamConsole.error"Can not read %s, ignored."(OpamFilename.to_stringf);None)letorig_opam_fileopam=letopenOpamStd.Option.OpinOpamFile.OPAM.metadata_diropam>>=fundir->OpamStd.List.find_optOpamFilename.exists[dir//(OpamPackage.Name.to_string(OpamFile.OPAM.nameopam)^".opam");dir//"opam"]>>|OpamFile.make