12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485(**************************************************************************)(* *)(* 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=OpamStd.Option.mapOpamFile.make(OpamStd.List.find_optOpamFilename.exists(possible_definition_filenamesdirname))letname_of_opam_filenamedirfile=letopenOpamStd.Option.Opinletget_names=ifFilename.check_suffixs".opam"thenSomeFilename.(chop_suffix(basenames)".opam")elseNoneinletrel=OpamFilename.remove_prefixdirfilein(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")|>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