o ]Lb3C@sddlmZddlZddlmZddlmZmZmZddl m Z m Z ddl m Z mZmZmZmZmZmZmZmZmZmZmZmZmZddlmZmZ ddl!m"Z"dd l#m$Z$m%Z%d d l&m'Z'd d l(m)Z)m*Z*eZ+e+,edddZ-e+,edddZ.e+,edddZ/ddZ0ddZ1ddZ2dYddZ3ddej4fdd Z5d!d"Z6d#d$Z7e+,ed%d&d'Z8e+,ej9d(d)d*Z:e+,ej9d+d,d-Z;d.d/Ze+,ej?d6d7d8Z@d9d:ZAd;d<ZBd=d>ZCd?d@ZDdAdBZEe+,edCdDdEZFe+,e dFdGdHZGdIdJZHdZdLdMZIdZdNdOZJdPdQZKe+,e dRdSdTZLe+,edUe+,edVdWdXZMdS)[)absolute_importN)_)binhexshort)getattrsetattr)bundle2 changegroupcmdutilcontexterrorexchange exthelper localrepopycompatrevlogscmutilutilvfswireprotov1server)actionsengine) repository) storageutil stringutil)lfutil) blobstorepointersmakefilestoragecKs(d|vr |tj|d||d|S)Nlfs) requirementsfeatures)addrREPO_FEATURE_LFS)origr"r#kwargsr$r$3/usr/lib/python3/dist-packages/hgext/lfs/wrapper.pylocalrepomakefilestorage:s r*sallsupportedversionscCs||}|d|S)Ns03)r%)r'uiversionsr$r$r)allsupportedversionsBs r-s _capabilitiescCs:|||}t|jdrd|jvr|d|d|S)z5Wrap server command to announce lfs server capabilitylfslocalblobstorer!s lfs-serve)r safehasattrsvfsr"append)r'repoprotocapsr$r$r) _capabilitiesIs    r5cCdSNFr$)selftextr$r$r)bypasscheckhashYsr:cCst|}|}|jj}||s|j|_|jj|g||j |dd}i}| D]}| drA|t dd}||||<q,|sI| drOt ||}|dfS)a%Read filelog content from local blobstore transform for flagprocessor. Default tranform for flagprocessor, returning contents from blobstore. Returns a 2-typle (text, validatehash) where validatehash is True as the contents of the blobstore should be checked using checkhash. F)verifysx-hg-Ns T)r deserializeoidopenerlfslocalblobstorehasfilenamelfsremoteblobstore readbatchreadkeys startswithlenrpackmeta)r8r9pr=storehgmetaknamer$r$r) readfromstore]s      rNc Cst|\}}|r|dkr||d}tt|}|jj||d|}t j |dt |d}t |sr?writer gitlfspointerrGrbinaryr iteritems serialize) r8r9rKoffsetr=longoidmetadatarLvrawtextr$r$r) writetostorezs   r`cCsP|dur|dur dS||}n||}||jkrdS||}t|tj@Sr7)revnodenullidflagsboolrREVIDX_EXTSTORED)rlogrbrardr$r$r)_islfss    rhc Ksp|jjjd} | r't|} t|\} }|r| |8} | |jj| r'| tj O} |||||||f||| d| S)Nslfstrack) cachedeltarbrd) _revlogr>optionsgetrGrrRrArrf)r'r8r9 transactionlinkp1p2rirbrdkwdslfstracktextlenmetar[r$r$r)filelogaddrevisions,  rucCs\t|j|r)|j|}|sdSt|}d|vr'd|vr'|dt|dfSdS|||S)NFs x-hg-copys x-hg-copyrev)rhrjrawdatar r<r)r'r8rbr_r]r$r$r)filelogrenameds    rwcCs:t|j|dr|j|}t|}t|dS|||S)N)rassize)rhrjrvr r<int)r'r8rar_r]r$r$r) filelogsizes     rys_verify_revisioncCsjt||dr,||}t|}|jj|r |tj M}n |tj @r,|d ||||||dS)N)rbs safe_renamed) rhrvr r<r>r?r@r=rrfr%)r'rl skipflagsstaterbr_r]r$r$r)_verify_revisions    r}scmpcCsP|r#t|dddr#t|}t|}||kS|||S)z+returns True if text is different than fctxislfscSr6r7r$r$r$r$r)szfilectxcmp..)r~rr r<rvr=)r'r8fctxrorpr$r$r) filectxcmps  rsisbinarycCs2|rt|}tt|ddS||S)NrQr)r~r r<rvrerxrl)r'r8r]r$r$r)filectxisbinarysrcCst|j|SN)rhfilelogrjfilenode)r8r$r$r) filectxislfssrs_updatecatformattercCs(|||||||j||ddS)N)rv)datarv)r'fmctxmatcherpathdecoder$r$r)_updatecatformattersrswrapconvertsinkcs2||}|jdkrGfddd|j|_|S)NshgcseZdZfddZZS)zconvertsink..lfssinkc slt|j} | ||||||||} d|jjvr4|j| tfdd|Dr4|jjdt|j| S)Nr!c3s(|]\}}|vo|VqdSr)r~).0fnrr$r) =s&z9convertsink..lfssink.putcommit..)super putcommitr2r"anyr%rwritereporequirements) r8filescopiesparentscommitsourcerevmapfullcleanp2pcrb) __class__lfssinkrr)r!s"   z&convertsink..lfssink.putcommit)__name__ __module__ __qualname__r __classcell__r$r)rr)r sr)repotyper)r'sinkr$rr) convertsinks  #rs__init__cCs^||||jD]\}}|dr||j|<q dD]}t||r,t||t||qdS)Nr!)r.lfsremoteblobstore)rkitemsrFrr/rr)r'r8othervfsrLr^rMr$r$r)vfsinitJs    rc Cst|jds dSg}t}|jj}|D]3\}}||}||D]%}t||} | rF| |vrF|| sF|| _ | | | | q!q|rUt |||dSdS)zSEnsure that required LFS blobs are present, fetching them as a group if needed.r.N)rr/r0setr?walkpointerfromctxr=r@rAr1r%rremoterC) r2 revmatchespointersoids localstoreramatchrrrIr$r$r)_prefetchfilesXs$   rcCs"t|jds dSt|jjtjS)NrTrr/r0 isinstancerBr _nullremoter2r$r$r)_canskipuploadqsrcCs$t|jds dSt|jjtj S)NrFrrr$r$r) candownloadzsrcCs$t|rdSt||}t||dS)zuupload lfs blobs introduced by revs Note: also used by other extensions e. g. infinitepush. avoid renaming. N)rextractpointers uploadblobs)r2revsrr$r$r)uploadblobsfromrevss rcCst|j|jjS)zPrepush hook. Read through the revisions to push, looking for filelog entries that can be deserialized into metadata so that we can block the push on their upload to the remote blobstore. )rr2outgoingmissing)pushopr$r$r)prepushsrspushcOsd|jvrB|s|dstd}tj|dtdd|jj}zt || |j_|||g|Ri|W||j_S||j_w|||g|Ri|S)zbail on push if the extension isn't enabled on remote when needed, and update the remote store based on the destination path.r!s:required features are not supported in the destination: %ss&enable the lfs extension on the server)hint) r"localcapablerr Abortr0rBrrurl)r'r2rargsr(m remotestorer$r$r)pushs  rswritenewbundlec Os,t||j|||||||g|Ri|S)z;upload LFS blobs added by outgoing revisions on 'hg bundle')rr) r'r+r2rrA bundletyperrr(r$r$r)writenewbundles  rcCs|jdi}|jj}|tdtdt|.}|D]}||}t|D]}|||<q'|qt |dddWdS1sIwYdS)z1return a list of lfs pointers added by given revss&lfs: computing set of blobs to upload s lfs searchs changesetscSs|Sr)r=)rIr$r$r)rsz!extractpointers..)keyN) r+debug makeprogressrrGpointersfromctxvaluesr= incrementsorted)r2rrrprogressrrrIr$r$r)rs  $rFc Cs|}||vr"|s dS||vr|}n ||vr |}ndS||}t|j|s2dSzt|}||krA|WSiWStj y`}zt t d|t ||fd}~ww)a?return a pointer for the named file from the given changectx, or None if the file isn't LFS. Optionally, the pointer for a file deleted from the context can be returned. Since no such pointer is actually stored, and to distinguish from a non LFS file, this pointer is represented by an empty dict. Ns#lfs: corrupted pointer (%s@%s): %s )rorprhrrjrr r<rvInvalidPointerr rrrrb)rrremoved_ctxrrIexr$r$r)rs2    rcCsJi}|}|D]}||sq t|||d}|dur"|||<q |S)zreturn a dict {path: pointer} for given single changectx. If ``removed`` == True and the LFS file was removed from ``ctx``, the value stored for the path is an empty dict. )rN)r2 narrowmatchrr)rrresultrrrIr$r$r)rs  rcCs$|sdS|jj}|||jjdS)z*upload given pointers from local blobstoreN)r0rB writebatchr?)r2r remoteblobr$r$r)rsrsfinishdatamigrationc Cs|||||t|jdrCt|jdrE|jjj}|jjj}|D]#\}}} | D]} |td| t | | | | q*q#dSdSdS)Nr.scopying lfs blob %s ) rr/r0r?rrrVrrrnjoin) r'r+srcrepodstrepor" srclfsvfs dstlfsvfsdirpathdirsrr=r$r$r)upgradefinishdatamigrations   rspreservedrequirementsssupporteddestrequirementscCs ||}d|jvr|d|S)Nr!)r"r%)r'r2reqsr$r$r)upgraderequirements s  r)NN)F)N __future__rrSmercurial.i18nrmercurial.noderrrmercurial.pycompatrr mercurialr r r r r rrrrrrrrvfsmodrmercurial.upgrade_utilsrupgrade_actionsrupgrade_enginemercurial.interfacesrmercurial.utilsrr largefilesrrr eh wrapfunctionr*r-r5r:rNr`rhREVIDX_DEFAULT_FLAGSrurwryr} basefilectxrrrrr readonlyvfsrrrrrrrrrrrrrrr$r$r$r)sv  @          )         .         !