123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100(**************************************************************************)(* *)(* Copyright 2015 OCamlPro *)(* *)(* 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. *)(* *)(**************************************************************************)openOpamTypesletlog=OpamConsole.log"REPO_BACKEND"letslog=OpamConsole.slogtypeupdate=|Update_fullofdirname|Update_patchoffilename|Update_empty|Update_errofexnmoduletypeS=sigvalname:OpamUrl.backendvalpull_url:?cache_dir:dirname->dirname->OpamHash.toption->url->filenameoptiondownloadOpamProcess.jobvalfetch_repo_update:repository_name->?cache_dir:dirname->dirname->url->updateOpamProcess.jobvalrepo_update_complete:dirname->url->unitOpamProcess.jobvalrevision:dirname->versionoptionOpamProcess.jobvalsync_dirty:dirname->url->filenameoptiondownloadOpamProcess.jobendletcomparer1r2=comparer1.repo_namer2.repo_nameletto_stringr=Printf.sprintf"%s at %s from %s"(OpamRepositoryName.to_stringr.repo_name)(OpamFilename.Dir.to_stringr.repo_root)(OpamUrl.to_stringr.repo_url)letlocaldirname={repo_name=OpamRepositoryName.of_string"local";repo_root=dirname;repo_url=OpamUrl.empty;repo_trust=None;}letto_jsonr=`O[("name",OpamRepositoryName.to_jsonr.repo_name);("kind",`String(OpamUrl.string_of_backendr.repo_url.OpamUrl.backend));]letcheck_digestfilename=function|SomeexpectedwhenOpamRepositoryConfig.(!r.force_checksums)<>Somefalse->(matchOpamHash.mismatch(OpamFilename.to_stringfilename)expectedwith|None->true|Somebad_hash->OpamConsole.error"Bad checksum for %s: expected %s\n\
\ got %s\n\
Metadata might be out of date, in this case use `opam update`."(OpamFilename.to_stringfilename)(OpamHash.to_stringexpected)(OpamHash.to_stringbad_hash);false)|_->trueopenOpamProcess.Job.Opletjob_textnamelabel=OpamProcess.Job.with_text(Printf.sprintf"[%s: %s]"(OpamConsole.colorise`green(OpamRepositoryName.to_stringname))label)letget_diffparent_dirdir1dir2=log"diff: %a/{%a,%a}"(slogOpamFilename.Dir.to_string)parent_dir(slogOpamFilename.Base.to_string)dir1(slogOpamFilename.Base.to_string)dir2;letpatch=OpamSystem.temp_file~auto_clean:false"patch"inletpatch_file=OpamFilename.of_stringpatchinletfinalise()=OpamFilename.removepatch_fileinOpamProcess.Job.catch(fune->finalise();raisee)@@fun()->OpamSystem.make_command~verbose:OpamCoreConfig.(!r.verbose_level>=2)~dir:(OpamFilename.Dir.to_stringparent_dir)~stdout:patch"diff"["-ruaN";OpamFilename.Base.to_stringdir1;OpamFilename.Base.to_stringdir2;]@@>function|{OpamProcess.r_code=0;_}->finalise();DoneNone|{OpamProcess.r_code=1;_}asr->OpamProcess.cleanup~force:truer;Done(Somepatch_file)|r->OpamSystem.process_errorr