Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file fetch.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129typeconfiguration=Neg.configurationletmulti_ackcapabilities=match(List.exists((=)`Multi_ack)capabilities,List.exists((=)`Multi_ack_detailed)capabilities)with|true,true|false,true->`Detailed|true,false->`Some|false,false->`Noneletno_done=List.exists((=)`No_done)letconfiguration?(stateless=false)capabilities={Neg.stateless;Neg.no_done=(ifstatelessthentrueelseno_donecapabilities);Neg.multi_ack=multi_ackcapabilities;}moduleS=SigsmoduleMake(Scheduler:S.SCHED)(IO:S.IOwithtype'at='aScheduler.s)(Flow:S.FLOWwithtype'afiber='aScheduler.s)(Uid:S.UID)(Ref:S.REF)=structopenSchedulermoduleLog=(valletsrc=Logs.Src.create"fetch"inLogs.src_logsrc:Logs.LOG)let(>>=)xf=IO.bindxfletreturnx=IO.returnxletsched=S.{bind=(funxf->inj(prjx>>=funx->prj(fx)));return=(funx->inj(returnx));}letfailexn=letfail=IO.failexnininjfailletio=S.{recv=(funflowraw->inj(Flow.recvflowraw));send=(funflowraw->inj(Flow.sendflowraw));pp_error=Flow.pp_error;}letreferenceswanthave=matchwantwith|`None->[],[]|`All->List.fold_left(funacc->function|uid,ref,false->(uid,ref)::acc|_->acc)[]have|>List.split|`Somerefs->letfoldacc(uid,ref,peeled)=ifList.existsRef.(equalref)refs&¬peeledthen(uid,ref)::accelseaccinList.fold_leftfold[]have|>List.splitletfetch_v1?(uses_git_transport=false)?(push_stdout=ignore)?(push_stderr=ignore)~capabilities?deepen?want:(refs=`None)~hostpathflowstoreaccessfetch_cfgpack=letcapabilities=(* XXX(dinosaure): HTTP ([stateless]) enforces no-done capabilities. Otherwise, you never
will receive the PACK file. *)iffetch_cfg.Neg.no_done&¬(no_donecapabilities)then`No_done::capabilitieselsecapabilitiesinletpreludectx=letopenSmartinlet*()=ifuses_git_transportthensendctxproto_request(Proto_request.upload_pack~host~version:1path)elsereturn()inlet*v=recvctxadvertised_refsinletv=Smart.Advertised_refs.map~fuid:Uid.of_hex~fref:Ref.vvinletuids,refs=referencesrefs(Smart.Advertised_refs.refsv)inSmart.Context.updatectx(Smart.Advertised_refs.capabilitiesv);return(uids,refs)inletctx=Smart.Context.makecapabilitiesinletnegotiator=Neg.make~compare:Uid.compareinNeg.tipsschedaccessstorenegotiator|>prj>>=fun()->Smart_flow.runschedfailioflow(preludectx)|>prj>>=fun(uids,refs)->lethex={Neg.to_hex=Uid.to_hex;of_hex=Uid.of_hex;compare=Uid.compare}inNeg.find_commonschedioflowfetch_cfghexaccessstorenegotiatorctx?deepenuids|>prj>>=function|`Close->return[]|`Continueres->letpackctx=letopenSmartinletside_band=Smart.Context.is_cap_sharedctx`Side_band||Smart.Context.is_cap_sharedctx`Side_band_64kinrecvctx(recv_pack~side_band~push_stdout~push_stderrpack)inifres<0thenLog.warn(funm->m"No common commits");letrecgo()=Log.debug(funm->m"Read PACK file.");Smart_flow.runschedfailioflow(packctx)|>prj>>=funcontinue->ifcontinuethengo()elsereturn()inLog.debug(funm->m"Start to download PACK file.");go()>>=fun()->return(List.combinerefsuids)end