o ]Lb @sdZddlmZddlZddlZddlmZddlmZddl m Z ddl m Z m Z mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z"m#Z#ddl$m%Z&d d l'm(Z(m)Z)m*Z*ej+Z+ej,Z,ej-Z-ej.Z.ej/Z/eZ0e)j1Z1e2d Z3d d Z4dddZ5ddZ6ddZ7e08e dddZ9e0j:ddddedfdddedfdddedfgdd d!Z;e08e dd"d#Zd'd(d)Z?e0:d'd*d+Z@e08e j>d,dd.d/ZAe0:d0d1d2ZBe0j:d3ddded4fdd5ded6fdd7ded8fgdd9d:ZCe0j:d;ddded<fgdd=d>ZDe08ed?dd@dAZEe08edBdCdDZFe08edEdFdGZGe08edH ddIdJZHe08edKddLdMZIe08e dNddOdPZJe08e dQdRdSZKe0j:dTddUdedVfddWgedXedYfgdddZd[ZLe0j:d\ddWged]edYfgdd^d_ZMe08ed`dadbZNe0OdcdddeZPe0j:dfddUdedgfgdddhdiZQe08edfdjdkZRe0j:dldldmdndoZSe0jTdpdqZUe0:drdsdtZVe08e drdudvZWe08e dr w    ddxdyZXe08e j>drddzd{ZYe08e d|d}d~ZZe08e dddZ[e08e dddZ\ddZ]ddZ^e0j:ddddedfgdddZ_ddZ`e0j:ddddedfgdddZae08eddddZbe0:dddZce0:dddZde0j:dddmddZee0:dddZfe08edddZge08edddZhe08e&de08e&dddZidZje08e"ddddZkdS)zHOverridden Mercurial commands and functions for the largefiles extension)absolute_importN)_)open) webcommands)archivalcmdutilcopieserrorexchange extensions exthelper filemergehg logcmdutilmatchmerge mergestatepathutilpycompatscmutilsmartsetsubrepourlutil)actions) lfcommandslfutil storefactorylfmrcs\t|}fddfdd|jD|_t|j|_dd|_|jfdd|_|S)zMcreate a matcher that matches only the largefiles in the original matcherct|vSNrstandinfmanifestIz)composelargefilematcher..cg|]}|r|qSr(r(.0lflfiler(r) Jz+composelargefilematcher..cSdSNFr(r(r(r(r)r*Lc|o|Sr!r(r$r1 origmatchfnr(r)r*N)copy_filesset_filesetalwaysmatchfn)rr'mr()r1r'r9r)composelargefilematcherEs    rBcsvt|dur |t|}fddfdd|jD|_t|j|_dd|_|jfdd|_|S)Ncs"t|pt|vp|v Sr!r isstandinr#r$)excludedr'r(r)r*Xsz*composenormalfilematcher..cr,r(r(r-)notlfiler(r)r2[r3z,composenormalfilematcher..cSr4r5r(r(r(r(r)r*]r6cr7r!r(r$)rFr9r(r)r*_r:)r=updater;r<r>r?r@)rr'excluderAr()rEr'rFr9r)composenormalfilematcherRs    rIc s(|d}t|t||d}d}t|r,|tjd} | r,t|jdt | }g} ||d} | t ddD]f}  | } t | | v}| | v}|pT|}| rg|rg|rf|td|| q?| sk|st| s|j| swq?|o|j| j|ddk}|s|s|r|| r| | |js| s|td || q?g|[|d sg}t||}| D] } t | }tj||dt|| d |||| q||fd d |d |D7fdd | D}Wd|fS1s wY|fS)NlargelfsizespatternscSdSr!r()xyr(r(r)r*sr6zaddlargefiles..s%s already a largefile isadding %s as a largefile dry_run)hash executablecs"g|] }|vrt|qSr()filesr splitstandinr.r%rAr(r)r2s  z!addlargefiles..csg|]}|vr|qSr(r(rU)badr(r)r2r3)!getr getminsize islfilesrepo configlistlongnamematchmodrrootlistwalkbadmatchexactr#warnrrDwvfsexistslstatst_sizeappendverbosestatuswlockopenlfdirstate writestandin getexecutablewjoin set_trackedwritecurrenttransactionadd)uirepo isaddremovematcheruipathfnoptsrJrK lfmatcherlfpatslfnameswctxr%rbr1nfilereaboveminstandins lfdirstate standinnameaddedr()rWrAr) addlargefilescsn               rc s|d}t||d}t||j|| d} Wdn1s%wY|dfdd| j| j| j| jfD\} } } } fdd}|r\| }|| | | t d}n| | }|| t d}|| t d po|}| qt |}t |D]!}js||st d ||s|s|jj|d d q|r|WdSd d|D}|s|D] }|jj|d d q|d||D] }|t |q||Wd|S1swY|S)Nafterrcleancsg|] }fdd|DqS)cg|] }t|vr|qSr(r"rUr&r(r)r2z/removelargefiles...r()r.r_r&r(r)r2sz$removelargefiles..cs,|D] }||qtt|dkS)Nr)rcintlen)rSmsgr%)rtrxr(r)rcszremovelargefiles..warns#not removing %s: file still exists s<not removing %s: file is modified (use -f to force removal) sCnot removing %s: file has been marked for add (use forget to undo) removing %s T ignoremissingcSg|]}t|qSr(r"rUr(r(r)r2)rXrBr'lfstatusrjmodifiedrdeletedrrrkrrlsortedrirbrd unlinkpathforget set_untrackedrTrqrr)rtrurvrwrxdryrunryrrAsrrrrrcremoveresultrr%r()r'rtrxr)removelargefilessl        rs decodepathcCst|p|Sr!rrT)origpathr(r(r) decodepathsrsaddrLlargesadd as largefilesnormalsadd as normal fileslfsizesHadd all files above this size (in megabytes) as largefiles (default: 10))rycOs:|dr|drttd|||g|Ri|S)NnormalrJs$--normal cannot be used with --large)rXr Abortrrrtrupatsryr(r(r) overrideaddsrc Ks|dr|||||||fi|St||d||fi|\}} t||d|} |||| |||fi|} | dd| D| S)NrFcss|]}|VqdSr!r(rUr(r(r) szcmdutiladd..)rXrrIr'extend) rrtrurwprefixrx explicitonlyryladdedlbad normalmatcherrWr(r(r) cmdutiladds rsremovec CsFt||d} |||| |||||| } t||d||| ||dp"| S)NF)rforce)rIr'r) rrtrurwrrxrrsubreposrrrr(r(r) cmdutilremove#s" rsstatuscKs@t|j|||fi|WdS1swYdSr!r_repo)rrurev2ryr(r(r)overridestatusfn;s $rcOsDt||||g|Ri|WdS1swYdSr!rrr(r(r)overridestatusAs $rsdirtyFcCs<t|j||||dWdS1swYdS)N) ignoreupdatemissingr)rrurrr(r(r) overridedirtyGs  $rslogc s    d fdd }tjd fdd }ttd|}ttd |}|.||g|Ri|WdWdS1sHwYWddS1sXwYdS) Nr(Frelpathcsp|duri}|||||||d}t|\}} |r|St| }tjfddrHtj} t | dt |  fddndd| fdd | Dt d t |j D]/} |j | d krkqat|j | } | |vr}| |j | <qa|j | |vrj| r|j | qat|j |_d d |_|jfdd} | |_ddt|||fS)zMatcher that merges root directory with .hglf, suitable for log. It is still possible to match .hglf directly. For any listed files run log on the standin too. matchfn tries both the given filename and with .hglf stripped. NbadfncSsJ|dr|St|d}|ddur|dd||dS||dS)Nsset:r:r) startswithr] _patsplit)pat tostandinkindpatr(r(r)fixpatsis    z:overridelog..overridematchandpats..fixpatscs\|rt|tdr|Stjr!|td}nd|}t|S)N/)rrrTrosrisabsr#r$)backcwdr(r)rxs   z.overridematchandpats..tostandincSst|r|St|Sr!rCr$r(r(r)rs  c3s|]}|VqdSr!r(rU)rrr(r)rsz.overridematchandpats..r.cSr4r5r(r(r(r(r)r*r6z;overridelog..overridematchandpats..cs*t|}|dur|rdS|}|SNTr)r%r/r)r9r(r) lfmatchfns z.overridematchandpats..lfmatchfnsupdated patterns: %s s, )r;r?r=rr#getcwd shortnamerpconvertpathtorrGranger<rdisdirrhr>r@debugjoinr)rctxrryglobbeddefaultr matchandpatsrAphglfir#rrurt)rrrr9rr)overridematchandpatsOs>      z)overridelog..overridematchandpatscs(|d}||||d\}fddS)NrcsSr!r(rrr(r)r*r6z>overridelog..overridemakefilematcher..r()rrurryrr})oldmatchandpatsrr)overridemakefilematchers z,overridelog..overridemakefilematchers matchandpatss_makenofollowfilematcherr(NFrNr!)rrr wrappedfunctionr) rrtrurryrrwrappedmatchandpatswrappedmakefilematcherr()rrurtr) overridelogMs"f Rrsverifys5verify that all largefiles in current revision existsslfas4verify largefiles in all revisions, not just currentslfcs3verify local largefile contents, not just existencec Os`|dd}|dd}|dd}|||g|Ri|}|s$|s$|r.|p-t||||}|S)NrJFlfalfc)popr verifylfiles) rrtrurryrJallcontentsrr(r(r)overrideverifys    rs debugstatesdisplay largefiles dirstatecs^|dd}|r!Gfdddt}||g|Ri|dS|g|Ri|dS)NrJFcseZdZeZdS)z$overridedebugstate..fakerepoN)__name__ __module__ __qualname__rrldirstater(rr(r)fakereposr)robject)rrtrurryrJrr(rr)overridedebugstates rs_checkunknownfilecCs*t|j||vr dS||||||Sr5)rr#r normalize)origfnrur}mctxr%f2r(r(r)overridecheckunknownfilesrscalculateupdatescOs<|o| } ||||||||g|Ri| } | r| St} | D]!} t| }|dur6||vr6| |q!t| |vrB| | q!t| D]}t|}| |d\}}}| |d\}}}|tt fvr|t kr|t kr}|\}}}}}|| df}t d|}|j |ddkr| |t dd| |t|dn| |tdd|r| |tddn| |t dd|tt fvr|t kr|t kr|\}}}}}|| df}t d|}|j |ddkr |r| |tdd| |tddqG| |tdd | |tdd qG| |t|d| |t ddqG| S) N)NNNFswremote turned local normal file %s into a largefile use (l)argefile or keep (n)ormal file?$$ &Largefile $$ &Normal filersreplaced by standinsreplaces standinsreplaced by non-standinswremote turned local largefile %s into a normal file keep (l)argefile or use (n)ormal file?$$ &Largefile $$ &Normal filesforget non-standin largefiles keep standin)r=rSrrTrsr#rgetfile ACTION_GETACTION_DELETED_CHANGED ACTION_REMOVEflagsrrt promptchoiceaddfile ACTION_KEEP#MERGE_ACTION_LARGEFILE_MARK_REMOVED ACTION_ADD)rrup1p2pas branchmerger acceptremoteargskwargs overwritemresultlfilesr%rTr1r#lmlargslmsgsmsargssmsgf1rfamoveancusermsgr(r(r)overridecalculateupdates#s       rs recordupdatesc Cst|vrAt|j|}|#|tD]\}}}|jj|ddd|j|dddqWdn1s5wY|||||||S)NTF p1_tracked wc_tracked) rrrlrt parentchanger update_filerqrr) rrurr  getfiledatarr1r rr(r(r)mergerecordupdatess  r"s filemergec Cst|r |s |r|||||||||dSt|} t|} t|} | | kr[| | kr[| | ksN|jtdt|| | | fddkr[| | | | dS)N)labelsslargefile %s has a merge conflict ancestor was %s you can keep (l)ocal %s or take (o)ther %s. what do you want to do?$$ &Local $$ &Otherrr)rF) rrDisabsent readasstandinlowerrtrrrTwwriterdatar) rrur}mynoderfcdfcofcar#ahashdhashohashr(r(r)overridefilemerges(  r0s pathcopiescCsF||||d}i}t|D]\}}t|p||t|p|<q|S)Nr)r iteritemsrrT)rctx1ctx2rrupdatedkvr(r(r)copiespathcopiess r7scopyc st|dkr||||Sd}d}d    dfdd }ttd|3z ||||} Wn tjyV} z| jtdkrH| d }d } WYd} ~ nd} ~ wwWdn1sawYz Wn t yw| YSwfd d } t |} | d } t j | rt j | | st | | z z}d    dfdd }g}|D]}t|dur||q|| |qgfdd}ttd|)ttd|| ||||7} Wdn1swYWdn 1swYt|}D]s\}} tj|vr| tjr|tdd}| tdd}j|pRd}t j |s_t ||r|t ||jj|d d| |n t!|||"|q|#$Wn tjy} z| jtdkr| d }WYd} ~ nd} ~ wwW|%n|%w|r|rttd| S)NFr(rcs*|duri}|||||||d}t|S)Nr)rI)rrrryrrrrr&r(r)normalfilesmatchfns  z(overridecopy..normalfilesmatchfnmatchsno files to copyTrcs&tj|}jt|Sr!)r canonpathr^rrdrrr#)relpathrrur(r) makestandinsz!overridecopy..makestandinc s|duri}g}|D]}t|dur#tj|vr#||tjdq ||q |||||||d} t| } fddfdd| jD| _t| j| _ | j fdd} | | _ | S) NrLrcr r!r"r$r&r(r)r*-r+z5overridecopy..overridematch..csg|] }|rt|qSr(r"rUr0r(r)r2.rz7overridecopy..overridematch..cs&t|}|dur|vr|pdSr!rr%r1)r'r9r(r)r@2s z4overridecopy..overridematch..matchfn) r]patkindrrrhreplacer;r<r=r>r@) rrrryrrrnewpatsrrrAr@r&r8r) overridematchs       z#overridecopy..overridematchcsvtj|vr&|tjr&|tjd}ds&tj|r&tdt d ||f|||g|Ri|dS)NrLsforces$destination largefile already exists) rrrrorBrrreIOErrorrrh)rsrcdestr r  destlfile) copiedfilesryrur(r)overridecopyfileGs z&overridecopy..overridecopyfilescopyfilerLrrr)&rr'r rrr rmessagerrOSError expandpatsrrrmakedirsrkr]rArhrrrlrrrorBr#rddirnamerenamerrcopyfilerprqrrrelease)rrtrurryrP nonormalfilesnolfilesr9rer>fullpatsrGrkrDlistpatsrrJrrFsrclfilerH destlfiledirr()rIr'ryrur) overridecopys        &         rZsrevertc s8t|}t|}||jD] }t|t|q|j D]}t|} j | r>j | q+t }    d fdd } ttd| ||g|Ri|Wdn1spwYt } t| | } tj|| dddWddS1swYdS) Nr(Frcs|duri}||||||d}t|}tjd} d} g} |jD]%} t| } | vs9| vr?| | q*| | vsI| | j rJq*| | q*| |_t |j|_ |j fdd}||_ |S)NrFcs2t|}|dur|o|vp|vS|Sr!rr@)rrr9r(r)r@s z6overriderevert..overridematch..matchfn) r;rrlrurtr<r#rh get_entryremovedr=r>r@)rrrryrrrrrArr} matchfilesr%r#r@rru)rr9r)rDs,       z%overriderevert..overridematchr:T) printmessage normallookupr)rkrrllfdirstatestatusrqrrr updatestandinr#rrdreunlinkgetstandinsstater rrgetlfilestoupdater updatelfiles)rrtrurrryrrr1fstandin oldstandinsrD newstandinsfilelistr(r^r)overridereverts6         -   "rkspullsall-largefiless7download all pulled versions of largefiles (DEPRECATED)slfrevs'download largefiles for these revisionssREVc Kst|}|sd}||_||||fi|}t|}|dg}|dr)|d|rf||krfd} ||_z%t||D]} |td| t ||| \} } | t| 7} q;W|`n|`w| td| |S)Nsdefaultlfrevall_largefilespulled()rs#pulling largefiles for revision %d s%d largefiles cached ) r lfpullsourcerXrh firstpulledrrevrangenoterr cachelfilesrj) rrtrusourcery revsprepullr revspostpulllfrevs numcachedrevcachedrr(r(r) overridepulls*     r{spushs%upload largefiles for these revisionscOsD|dd}|r|di}t|||d<|||g|Ri|S)z.)rpAttributeErrorr rrrbaseset)rusubsetrNr(rr)pulledrevsetsymbols   rsclones'download all versions of all largefilescKsP|}|dur t|}|drt|sttd|||||fi|S)Nrms>--all-largefiles is incompatible with non-local destination %s)r defaultdestrXislocalr rr)rrtrtrGrydr(r(r) overrideclone7s  rc Osb|||g|Ri|}|dur/|\}}|}|s|S|dr/t||\} } | dkr/dS|S)Nsall_largefilesr)localrXrdownloadlfiles) rrtryr r r sourcerepodestreporusuccessrr(r(r)hgcloneOs rrebase) extensioncKst|ds|||fi|S|d}|jt||jddz9|ddid|||fi|WdW|j |j S1sMwYW|j |j dS|j |j w)N_largefilesenabledcontinuec_rMr!r(rryr(r(r)r*pr6z#overriderebasecmd..)rsexperimental.inmemoryF largefiles) r safehasattrrX_lfcommithooksrhrautomatedcommithook_lfstatuswritersconfigoverrider)rrtruryresumingr(r(r)overriderebasecmdis$      rcCs>ztd}Wn tyYdSwdd}t|d|dS)Nrc_sd|d<||i|S)NFinmemoryr(rr r r(r(r) _dorebasesz!overriderebase.._dorebases _dorebase)r findKeyError wrapfunction)rtrebaserr(r(r)overriderebase{s rsarchivecKsHt|||||fi|WdS1swYdSr!)r unfiltered)rrtrurGryr(r(r)overridearchivecmds$rcCs6t|j ||WdS1swYdSr!)rru)rwebr(r(r) hgwebarchives $rTc  sjsjs|||||| S|dur tj||tjvr.tt d|||dkr@r?tt dnt ||fdd} tj|||p] dj ddrq| d d d fd d D]I}  | } | j} t| }|dur|durt| durtt d|n||} fdd } | | d| vrdpd d| v| qs| rtjD]9}|}t|}|d}t|drt|jpt|||Wdn1swYqĈdS)Nsunknown archive type '%s'sfiless*cannot give prefix when archiving to filescs>r|sdS|}r||}||||dSr!) wwritedatarnamemodeislinkgetdatar()archiverdecoderrrur(r)rqs  zoverridearchive..writersuis archivemetas.hg_archival.txtFc tSr!)r buildmetadatar(rr(r)r* z!overridearchive..4largefile %s not found in repo store or system cachecrr!)rreadfiler()rr(r)r*rxlrr)rrrrsrtr archiversr rr tidyprefixdate configboolrr(rrTfindfilestriprsubstate workingsubr] subdirmatcherrrrnullcontextmanagerarchivedone)rrurGnodekindrrrmtimerrqr%ffrr1subpathsubsubmatch subprefixr()rrrrrrrur)overridearchivesr            rc stjd}|r jjs|Sjdjd}j|}|dur8tj j|fdd} |D]M| } |j } t } | dur|durxt j| durwttd| n| | fdd} | d | vrd pd d | v| qEt|jD]:} || }t| }| d }t|drt|jpt|||Wdn1swYqdS)Nr)shgrcs@rsdS|}rj||}||||dSr!)rrrr)rrr%rrrur(r)rqs zhgsubrepoarchive..writercsttjSr!)rrrrrr()rrr(r)r*#sz"hgsubrepoarchive..rrrrrr)rrrr_get_staterrrsrtrr(rrTrrr rrrrrr]rrr)rrurrrr lfenabledryrrqrrr1rrrrr()rrr%rrrrur)hgsubrepoarchivesT             rs bailifchangedcOsp||g|Ri|t| |}Wdn1swY|js/|js/|js/|jr6ttddS)Nsuncommitted changes) rrjrrr\rr rr)rrur r rr(r(r)overridebailifchanged;s  rspostcommitstatuscOsBt|||g|Ri|WdS1swYdSr!r)rrur r r(r(r)postcommitstatusDs $rsforgetc  st||d} |||| |||||\} } t||dt||jdd} Wdn1s5wY|dt| j| j| j| j } fdd| D} | D]"}t |}||j vr{|j |s{|td||| |qY| D]}|js|s|td||q~|:t ||}| D]}||q||dd| D}|D] }|j j|ddq|d|Wdn1swY| fd d D| fd d | D| | fS) NTrcrr(r"rUr&r(r)r2_rz!cmdutilforget..s+not removing %s: file is already untracked rcSrr(r"rUr(r(r)r2trrc3s |] }|vr|VqdSr!)rSrUrVr(r)rysz cmdutilforget..c3s|] }|vr|VqdSr!r(rU)rejectedr(r)rzs)rIr'rBrrjrrrrrrr#rrdrrcrrhrirbrkrlrrqrrrrr)rrtrurrrxrr interactiverrWforgotrrr%rgrrr()rAr'rr) cmdutilforgetJsV        rcsfttfdd}t|||r/t||}D]\}}||s.|||q!dSdS)zget pairs of filename and largefile hash in outgoing revisions in 'missing'. largefiles already existing on 'other' repository are ignored. 'addfunc' is invoked with each unique pairs of filename and largefile hash value. cs,||f}|vr||dSdSr!rs)fnlfhashr5knownslfhashesr(r)dedups  z_getoutgoings..dedupN)r=rgetlfilestouploadr openstorere)ruotherraddfuncrlfexistsrrr(rr) _getoutgoings~s   rcs|ddrdtjrifdd}fdd}ntfdd}dd}t||||s=tddStd ttD]}t |d ||qLd dSdS) Nrcs,|vrg|<|||dSr!)rhrsrrrtouploadr(r)rszoutgoinghook..addfunccs$t|D] }d|qdS)Ns %s )rrr)rrtr(r) showhashessz outgoinghook..showhashesc||dSr!rrrr(r)r cSrMr!r()rr(r(r)rsslargefiles: no files to upload s$largefiles to upload (%d entities):  ) rr= debugflagrrjrrrrrT)rtrurryrrrfiler()rrrtr) outgoinghooks(   rsoutgoingsdisplay outgoing largefilescOs||i|Sr!r(rr(r(r) _outgoingcmdsrc s|dd}|dur|rdSdS|rX|d\}}}}|dur'|tddSttfdd} t|||j| sG|td dS|td ttfdSdS) NrF)FTFFrslargefiles: (no remote repo) crr!rrrr(r)rrz"summaryremotehook..addfuncs!largefiles: (no files to upload) s/largefiles: %d entities for %d files to upload )rXrjrr=rrr) rtrurychangeslargeoptrbranchpeeroutgoingrr(rr)summaryremotehooks, rssummarycOsFt||||g|Ri|WddS1swYdSr!rrr(r(r)overridesummarys "rs addremovec s|duri}t|s||||||St|j|}|jtgdddd\}}jrPt|} | j fdd| _ t |j|d| || dfit |t|j|d||fit |\} } t||d| }||||||S)NFrignoredrunknowncs|jvo|Sr!)rr$r@rr(r)r*sz"scmutiladdremove..Tsdry_run)rrZrlrtrjr]r?rr;r@rrXr strkwargsrrIr') rrurwrrxryrunsuremtime_boundaryrArrWr(rr)scmutiladdremovesB     rspurgecsVj     dfdd }|_|g|Ri|_dS)NrFc sh|||||||}tfdd|jD}fdd|jD}t|j|j|j|j |||j S)Ncg|] }|js|qSr(r[ any_trackedrUrr(r)r2C  z9overridepurge..overridestatus..crr(rrUrr(r)r2Fr) rrlrrrrjrrr\rr)node1node2rrrr listsubreposr oldstatusrurtrr)r6s    z%overridepurge..overridestatus)rNNFFFF)rrj)rrtrudirsryrr(r r) overridepurge(s  r srollbackc  sj}fddjD}||fi|}j}||kr/|WdSd}jD]8} t| rn|| j| jrRjj | ddq6| |vrf|| } | | | q6t | ddq6|D] } jj | ddqqWd|S1swY|S)Ncs(h|]}t|rj|js|qSr()rrDrr[r\rUr=r(r) Vs z#overriderollback..rTrrLF)rkrparentsrrDdiscardr[r\rdrr'r(rrm) rrtrurybeforeorphansrrpctxr%fctxr#r(r=r)overriderollbackRs8        rs transplantcOsv|d}|jt||jddz|||g|Ri|}W|j|j|S|j|jw)Nrc_rMr!r(rr(r(r)r*wr6z$overridetransplant..)rXrrhrrrr)rrtrurevsryrrr(r(r)overridetransplantss    rscatc st|}t||d}d}tt||f||}|jfdd} | |_|j fdd} | |_ |j fdd} | |_ | |D]} t j ||d | d } t| }|dusc| rz|| }|d rt|| |}| |nUt|| }t|j|st|}|||fg\}}t|dkrttd |t|j|}t|d }t|D]}| |qWdn1swYWdn1swYd}qH|S)Nsrevrcs4|rdSt|}|durdS||SNTF)rrTrs)r%r/)notbadr9r(r)rs  zoverridecat..lfmatchfncs|vr ||dSdSr!r()r%r)r origbadfnr(r)lfbadfnszoverridecat..lfbadfncs<|tjkrdS|}|r|St|}|durdS|Sr)rrrT)dirretr/)origvisitdirfnr(r) lfvisitdirfns  z!overridecat..lfvisitdirfnsoutput)pathnamesdecodes8largefile %s is not in cache and could not be downloadedsrbr) r byteskwargsr revsinglerXr=rrr@rWvisitdirr`r makefileobjrrTr(rrqr% inusercachertrrrr rr usercachepathrr filechunkiter)rrtrufile1rryrerrrArrrr%fpr/r(rQstorerrrfpinchunkr()rrr9rr) overridecatsX             r-s_updatec OsB|dd}|o | }|t|j|} | jtgdddd\} } } t| j } |d}||}| | j D]6}|j |}|j |sJq;t|}t|}t|||t|||vrq|t||krq| |q;| jD]}t|}||vrqut|||qu| D]}| |q| |t|}|d}|r|rtd| Q|||||g|Ri|}t|}t||}| |D] }| j |dddq| ||s|s|r|!| j"| j#t$j%|j|||d Wdn 1swY|WdS1swYdS) NrwFTrrwcs1largefiles is not compatible with in-memory merger)rjr`)&rXr?rkrrlrtrjr]r=rrrdrrehashfiler#rmrnr%rsrrbset_possibly_dirtyrqrrrd isinmemoryr ProgrammingErrorrre differencer rrr\rrf)rrurr rr r rwpartialrrrroldcleanrdctxr1lfileabsrr#rgrhr.rrirjr(r(r) mergeupdatesr                   &r8s marktouchedc Os`|||g|Ri|}g}|D]}t|}|dur ||q|r.tj|j||ddd|S)NFT)rjr_r`)rrTrhrrfrt) rrurSr r rrjr%r/r(r(r)scmutilmarktouched s   r9spreservedrequirementsssupporteddestrequirementscCs ||}d|jvr|d|S)Nr) requirementsrs)rrureqsr(r(r)upgraderequirements5s  r<s largefile://sopencKsN|tr|rd}t||ttd}t||S|||fd|i|S)Ns'cannot use data on a 'largefile://' urlr()r _lfschemer r2rrgetlfile)rrturl_r(r rlfidr(r(r) openlargefileAs   rAr!r)F)TNrLNNr)l__doc__ __future__rr;rmercurial.i18nrmercurial.pycompatrmercurial.hgwebr mercurialrrr copiesmodr r r r r rrrr]rr mergestatemodrrrrrrurlmodrmercurial.upgrade_utilsrupgrade_actionsrrrrrrrrehr MergeActionrrBrIrrrr wrapcommandrrr hgsubreporrrrrrrrr"r0r7rZrkr{r~rrevsetpredicaterrrrextsetuprrrrrrrrrrrrrrr rrr-r8r9r<r=rAr(r(r(r)sx    X   H J            x       n       , O            `  C     3( "   4 )    G  W