Ë àüb­€›;ôãó@—ddlZddlmZddlmZmZmZddlmZm Z ddl m Z m Z m Z mZmZmZmZmZmZmZmZmZmZddlmZmZddlmZddl m!Z!m"Z"d d l#m$Z$d d l%m&Z&m'Z'ej"«Z(e(jSed «d„«Z*e(jSe d«d„«Z+e(jSed«d„«Z,d„Z-d„Z.d„Z/d9d„Z0ddejbfd„Z2d„Z3d„Z4e(jSed«d„«Z5e(jSejld«d„«Z7e(jSejld«d„«Z8d „Z9e(jSe d!«d"„«Z:e(jSed#«d$„«Z;e(jSejxd%«d&„«Z=d'„Z>d(„Z?d)„Z@d*„ZAd+„ZBe(jSed,«d-„«ZCe(jSe d.«d/„«ZDd0„ZEd:d1„ZFd:d2„ZGd3„ZHe(jSed4«d5„«ZIe(jSed6«e(jSed7«d8„««ZJy);éN)Ú_)ÚbinÚhexÚshort)ÚgetattrÚsetattr) Úbundle2Ú changegroupÚcmdutilÚcontextÚerrorÚexchangeÚ exthelperÚ localrepoÚrevlogÚscmutilÚutilÚvfsÚwireprotov1server)ÚactionsÚengine)Ú repository)Ú storageutilÚ stringutilé)Úlfutilé)Ú blobstoreÚpointersmakefilestoragec ó^—d|vr|jtj«|d||dœ|¤ŽS)Nólfs)Ú requirementsÚfeatures©)ÚaddrÚREPO_FEATURE_LFS)Úorigr"r#Úkwargss ú5usr/lib/python3.12/site-packages/hgext/lfs/wrapper.pyÚlocalrepomakefilestorager*8s1€à �ÑØ� ‰ ”Z×0Ñ0Ô1á Ð G˜\°HÑ GÀÑ GÐGósallsupportedversionscó8—||«}|jd«|S)Ns03)r%)r'ÚuiÚversionss r)Úallsupportedversionsr/@s€á�B‹x€HØ ‡L�L�ÔØ €Or+s _capabilitiescó¸—|||«}tj|jd«r0d|jvr|j d«|j d«|S)z5Wrap server command to announce lfs server capabilityólfslocalblobstorer!s lfs-serve)rÚ safehasattrÚsvfsr"Úappend)r'ÚrepoÚprotoÚcapss r)Ú _capabilitiesr8GsR€ñ ��eÓ €DÜ ×јŸ ™ Ð#7Ô8ð �T×&Ñ&Ñ &Ø �K‰K˜ Ô %à � ‰ �FÔØ €Kr+có—y©NFr$)ÚselfÚtexts r)Úbypasscheckhashr=Ws€Ø r+có—tj|«}|j«}|jj}|j |«s8|j |_|jjj|g|«|j|d¬«}i}|j«D]*}|jd«sŒ|td«d}||||<Œ,|s|jd«rtj||«}|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Ú deserializeÚoidÚopenerÚlfslocalblobstoreÚhasÚfilenameÚlfsremoteblobstoreÚ readbatchÚreadÚkeysÚ startswithÚlenrÚpackmeta)r;r<ÚprAÚstoreÚhgmetaÚkÚnames r)Ú readfromstorerR[sà€ô ×јDÓ!€AØ �%‰%‹'€CØ �K‰K× )Ñ )€EØ �9‰9�SŒ>Ø—]‘]ˆŒ Ø � ‰ ×&Ñ&×0Ñ0°!°°eÔ<ð �:‰:�c %ˆ:Ó (€Dð€FØ �V‰VŽXˆØ �<‰<˜Õ !Ø”S˜“]�_Ð%ˆDؘQ™4ˆF�4ŠLðñ�—‘ Ô)Ü×#Ñ# F¨DÓ1ˆà �$ˆ<Ðr+cóÞ—tj|«\}}|r |dkDr||d}ttj|«j ««}|j jj||«d|z}tj|dt|«z¬«}tj|«sd|d<|� |j«D] \}}||d|z<Œ|j«} | dfS) Nrs sha256:%ss%d)rAÚsizeó0ó x-is-binarysx-hg-%sF)rÚ parsemetarÚhashlibÚsha256ÚdigestrBrCÚwriterÚ gitlfspointerrKrÚbinaryÚitemsÚ serialize) r;r<rOÚoffsetrAÚlongoidÚmetadatarPÚvÚrawtexts r)Ú writetostorerexsè€ä ×*Ñ*¨4Ó0�N€FˆFÙ �&˜1’*à�F�Gˆ}ˆô Œg�n‰n˜TÓ"×)Ñ)Ó+Ó ,€C؇K�K×!Ñ!×'Ñ'¨¨TÔ2ð˜SÑ €GÜ×$Ñ$¨°u¼sÀ4»yÑ7HÔI€Hô × Ñ ˜TÔ "à#'ˆ�Ñ ðÐØ—L‘L–N‰DˆAˆqØ'(ˆH�Z !‘^Ò $ð#ð× Ñ Ó"€GØ �UÐ Ðr+cóÌ—|€|€y|j|«}n|j|«}||jk(ry|j|«}t |t j z«Sr:)ÚrevÚnodeÚnullidÚflagsÚboolrÚREVIDX_EXTSTORED)Úrlogrhrgrjs r)Ú_islfsrn—s[€Ø €{Ø ˆ<àØ�h‰h�t‹n‰à�y‰y˜‹~ˆØ ˆt�{‰{ÒØØ �J‰J�s‹O€EÜ �œ×/Ñ/Ñ/Ó 0Ð0r+c  ó<—|jjjjd«} | rZt |«} t j |«\} }|r| |z} | |jj| «r| tjz} |||||||f||| dœ| ¤ŽS)Nslfstrack)Ú cachedeltarhrj) Ú_revlogrBÚoptionsÚgetrKrrWrErrl)r'r;r<Ú transactionÚlinkÚp1Úp2rprhrjÚkwdsÚlfstrackÚtextlenÚmetar`s r)Úfilelogaddrevisionr|¦s®€ð�|‰|×"Ñ"×*Ñ*×.Ñ.¨{Ó;€HáÜ�d“)ˆä"×,Ñ,¨TÓ2‰ ˆˆfÙ Ø �vÑ ˆGá �D—L‘L×)Ñ)¨7Ô 3Ø ”V×,Ñ,Ñ ,ˆEá Ø Ø ØØ Ø Ø ð ðØ Øñ ð ñ ð r+cóÞ—t|j|«rO|jj|«}|sytj|«}d|vrd|vr|dt |d«fSy|||«S)NFs x-hg-copys x-hg-copyrev)rnrqÚrawdatarr@r)r'r;rhrdrbs r)ÚfilelogrenamedrÏss€Ü ˆd�l‰l˜DÔ!Ø—,‘,×&Ñ& tÓ,ˆÙØÜ×&Ñ& wÓ/ˆØ ˜8Ñ #¨¸8Ñ(CؘLÑ)¬3¨x¸Ñ/HÓ+IÐIÐ IàÙ ��dÓ Ðr+có¾—t|j|¬«r>|jj|«}tj|«}t |d«S|||«S)N)rgssize)rnrqr~rr@Úint)r'r;rgrdrbs r)Ú filelogsizer‚ÝsP€Ü ˆd�l‰l Õ$à—,‘,×&Ñ& sÓ+ˆÜ×&Ñ& wÓ/ˆÜ�8˜GÑ$Ó%Ð%Ù ��c‹?Ðr+s_verify_revisioncó^—t||¬«r•|j|«}tj|«}|jj j |j««r|tjz}n'|tjzr|dj|«|||||«y)N)rhs safe_renamed) rnr~rr@rBrCrDrArrlr%)r'ÚrlÚ skipflagsÚstaterhrdrbs r)Ú_verify_revisionr‡æsŽ€ä ˆb�tÕØ—*‘*˜TÓ"ˆÜ×&Ñ& wÓ/ˆð �9‰9× &Ñ &× *Ñ *¨8¯<©<«>Ô :Ø œ&×1Ñ1Ð1Ñ 1‰IØ œ×0Ñ0Ò 0ð �/Ñ "× &Ñ & tÔ ,ለY˜˜tÕ$r+scmpcó(—|j«rzt|dd„««rgtj|j ««}tj|j ««}|j «|j «k7S|||«S)z+returns True if text is different than fctxÚislfscó—yr:r$r$r+r)Úzfilectxcmp..ýs€°ur+)r‰rrr@r~rA)r'r;Úfctxrvrws r)Ú filectxcmpr�ùsn€ð ‡z�z„|Ð=œ  g©}Ó=Ô?ä × Ñ  §¡£Ó 0ˆÜ × Ñ  §¡£Ó 0ˆØ�v‰v‹x˜2Ÿ6™6›8Ñ#Ð#Ù ��dÓ Ðr+sisbinarycóÀ—|j«rGtj|j««}t t |j dd«««S||«S)NrVr)r‰rr@r~rkr�rs)r'r;rbs r)Úfilectxisbinaryr�sF€à ‡z�z„|ä×&Ñ& t§|¡|£~Ó6ˆä”C˜Ÿ ™  ^°QÓ7Ó8Ó9Ð9Ù �‹:Ðr+cóf—t|j«j|j««S©N)rnÚfilelogrqÚfilenode)r;s r)Ú filectxislfsr”s!€Ü �$—,‘,“.×(Ñ(¨$¯-©-«/Ó :Ð:r+s_updatecatformattercób—||||||«|j||j«¬«y)N)r~)Údatar~)r'ÚfmÚctxÚmatcherÚpathÚdecodes r)Ú_updatecatformatterrœs-€áˆˆS�'˜4 Ô(؇G�G�C˜‘I×%Ñ%Ó'€GÕ(r+swrapconvertsinkcór‡—||«}|jdk(rGˆfd„d|j«Š‰|_|S)Nshgcó"•‡—eZdZˆˆfd„ZˆxZS)úconvertsink..lfssinkc ó:•‡ —t‰ |�} | ||||||||«} d|jjvrg|j| Š t ˆ fd„|D««rD|jjj d«t j|j«| S)Nr!c3óV•K—|] \}}|‰vxr‰|j«–—Œ"y­wr‘)r‰)Ú.0ÚfÚnr˜s €r)Ú z9convertsink..lfssink.putcommit..;s,øèø€ÐIÁ5¹4¸1¸a˜1 ˜8Ò6¨¨A©¯ © «Ó6Á5ùsƒ&))ÚsuperÚ putcommitr5r"Úanyr%rÚwritereporequirements)r;ÚfilesÚcopiesÚparentsÚcommitÚsourceÚrevmapÚfullÚcleanp2Úpcrhr˜Ú __class__Úlfssinks @€€r)r§z&convertsink..lfssink.putcommits“ù€ô˜7 DÑ3�ÙØØØØØØØØó �ð §¡×!7Ñ!7Ñ7ØŸ)™) D™/�CôÓIÁ5ÓIÔIØŸ ™ ×.Ñ.×2Ñ2°6Ô:Ü×5Ñ5°d·i±iÔ@à� r+)Ú__name__Ú __module__Ú __qualname__r§Ú __classcell__)r³r´s@€r)r´rŸs ù„÷ ñ r+r´)Úrepotyper³)r'Úsinkr´s @r)Ú convertsinkr»s7ø€á �‹:€DØ ‡}�}˜Òö! �d—n‘nô! ðF!ˆŒà €Kr+s__init__c ó—|||«|jj«D]&\}}|jd«sŒ||j|<Œ(dD]0}tj||«sŒt ||t ||««Œ2y)Nr!)r1ólfsremoteblobstore)rrr^rJrr2rr)r'r;ÚothervfsrPrcrQs r)Úvfsinitr¿Hsq€áˆˆxÔà× Ñ ×&Ñ&Ö(‰ˆˆ1Ø �<‰<˜Õ ؈D�L‰L˜ŠOð)ó >ˆÜ × Ñ ˜H dÕ +Ü �D˜$¤¨°$Ó 7Õ 8ñ>r+có—tj|jd«syg}t«}|jj}|D]™\}}||}|j |«D]{}t ||«} | sŒ| j«|vsŒ%|j| j««rŒE|| _ |j| «|j| j««Œ}Œ›|r&tj|«j||«yy)zSEnsure that required LFS blobs are present, fetching them as a group if needed.r1N)rr2r3ÚsetrCÚwalkÚpointerfromctxrArDrEr4r%rÚremoterG) r5Ú revmatchesÚpointersÚoidsÚ localstorergÚmatchr˜r£rMs r)Ú_prefetchfilesrÊVsÙ€ô × Ñ ˜DŸI™IÐ';Ô <Øà€HÜ ‹5€DØ—‘×,Ñ,€Jã ‰ ˆˆUØ�3‰iˆØ—‘˜%–ˆAܘs AÓ&ˆAÚ�Q—U‘U“W DÒ(°·±ÀÇÁÃÕ1HØ�” Ø—‘ Ô"Ø—‘˜Ÿ™›Õ!ñ !ð!ñô ×јÓ×(Ñ(¨°:Õ>ðr+có —tj|jd«syt|jjt j «S)Nr½T©rr2r3Ú isinstancerFrÚ _nullremote©r5s r)Ú_canskipuploadrÐos9€ä × Ñ ˜DŸI™IÐ'<Ô =Øô �d—i‘i×2Ñ2´I×4IÑ4IÓ JÐJr+có¢—tj|jd«syt|jjt j « S)Nr½FrÌrÏs r)Ú candownloadrÒxs<€ä × Ñ ˜DŸI™IÐ'<Ô =Øô˜$Ÿ)™)×6Ñ6¼ ×8MÑ8MÓNÐ NÐNr+cóL—t|«ryt||«}t||«y)zuupload lfs blobs introduced by revs Note: also used by other extensions e. g. infinitepush. avoid renaming. N)rÐÚextractpointersÚ uploadblobs)r5ÚrevsrÆs r)Úuploadblobsfromrevsr×�s%€ô �dÔØÜ˜t TÓ*€HÜ��hÕr+cóV—t|j|jj«S)zÍPrepush 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. )r×r5ÚoutgoingÚmissing)Úpushops r)ÚprepushrÜŒs€ô ˜vŸ{™{¨F¯O©O×,CÑ,CÓ DÐDr+spushcóÒ—d|jvr·|j«s?|jd«s.td«}t j |dztd«¬«‚|j j} tj||j««|j _|||g|¢­i|¤Ž||j _S|||g|¢­i|¤ŽS#||j _wxYw)z�bail 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"ÚlocalÚcapablerr ÚAbortr3rFrrÄÚurl)r'r5rÄÚargsr(ÚmÚ remotestores r)Úpushræ–sÑ€ð�×"Ñ"Ñ"ð�|‰|Œ~ f§n¡n°VÔ&<ôÐOÓPˆAÜ—+‘+Ø�F‘ ¤Ð#LÓ!Môð ð—i‘i×2Ñ2ˆ ð 7Ü+4×+;Ñ+;¸DÀ&Ç*Á*Ã,Ó+OˆD�I‰IÔ (Ù˜˜fÐ6 tÒ6¨vÑ6à+6ˆD�I‰IÕ (á�D˜&Ð2 4Ò2¨6Ñ2Ð2øð,7ˆD�I‰IÕ (ús Á5?CÃC&swritenewbundlecóP—t||j«|||||||g|¢­i|¤ŽS)z;upload LFS blobs added by outgoing revisions on 'hg bundle')r×rÚ) r'r-r5r®rEÚ bundletyperÙrãr(s r)Úwritenewbundleré´s>€ô ˜˜h×.Ñ.Ô/Ù Ø ˆD�&˜( J°ð Ø;?ò ØCIñ ðr+có°—|jjd«i}|jj}|td«td«t |««5}|D]H}||}t |«j «D]}|||j«<Œ|j«ŒJt|j «d„¬«cddd«S#1swYyxYw)z1return a list of lfs pointers added by given revss&lfs: computing set of blobs to upload s lfs searchs changesetscó"—|j«Sr‘)rA)rMs r)r‹z!extractpointers..Ís €°q·u±u´wr+)ÚkeyN) r-ÚdebugÚ makeprogressrrKÚpointersfromctxÚvaluesrAÚ incrementÚsorted)r5rÖrÆrîÚprogressÚrr˜rMs r)rÔrÔ¿s²€à‡G�G‡M�MÐ<Ô=Ø€Hà—7‘7×'Ñ'€LÙ Ü ˆ-Óœ!˜MÓ*¬C°«Iô à ÛˆAØ�q‘'ˆCÜ$ SÓ)×0Ñ0Ö2�Ø$%�˜Ÿ™›Ò!ð3à × Ñ Õ ð ô �h—o‘oÓ'Ñ->Ô?÷ ÷ ò ús ÁA)C à Cc ó—|}||vrJ|sy||j«vr|j«}n$||j«vr|j«}ny||}t|j«j|j ««sy t j|j««}||k(r|SiS#t j$r@}tjtd«|t|j««|fz«‚d}~wwxYw)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 )rvrwrnr’rqr“rr@r~ÚInvalidPointerr rárrrh)r˜r£ÚremovedÚ_ctxrŒrMÚexs r)rÃrÃÐsç€ð €DØ��|ÙØØ �—‘“‰=Ø—6‘6“8‰DØ �#—&‘&“(‰]Ø—6‘6“8‰DàØ �‰7€DÜ �$—,‘,“.×(Ñ(¨$¯-©-«/Ô :Øð  Ü × Ñ  § ¡ £Ó /ˆØ �$Š;؈H؈ øÜ × !Ñ !ò Ü�k‰kÜ Ð5Ó 6Ø”%˜Ÿ ™ › Ó$ bÐ)ñ *ó ð ûð ús )B6Â4B6Â6D à ;DÄD có®—i}|j«j«}|j«D]!}||«sŒ t|||¬«}|€Œ|||<Œ#|S)z¹return 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. )r÷)r5Ú narrowmatchrªrÃ)r˜r÷Úresulträr£rMs r)rïrïñs\€ð €FØ �‰‹ ×ÑÓ €Að�Y‰YŽ[ˆÙ�ŒtØ Ü ˜3 ¨7Ô 3ˆØ ‰=؈F�1ŠIð ð €Mr+có‚—|sy|jj}|j||jj«y)z*upload given pointers from local blobstoreN)r3rFÚ writebatchrC)r5rÆÚ remoteblobs r)rÕrÕs1€á Øà—‘×-Ñ-€JØ×ј( D§I¡I×$?Ñ$?Õ@r+sfinishdatamigrationcó—|||||«tj|jd«rÓtj|jd«r²|jjj}|jjj}|j «D]^\}}} | D]S} |j td«| z«tj|j| «|j| ««ŒUŒ`yyy)Nr1scopying lfs blob %s ) rr2r3rCrrÂr[rrruÚjoin) r'r-ÚsrcrepoÚdstrepor"Ú srclfsvfsÚ dstlfsvfsÚdirpathÚdirsrªrAs r)Úupgradefinishdatamigrationr s̀ለW�g˜|Ô,ô ×ÑØ� ‰ Ð*ôä × Ñ ˜7Ÿ<™<Ð)=Ô >Ø—L‘L×2Ñ2×6Ñ6ˆ Ø—L‘L×2Ñ2×6Ñ6ˆ à$-§N¡NÖ$4Ñ ˆG�T˜5Û�Ø—‘œÐ3Ó4°sÑ:Ô;Ü— ‘ ˜IŸN™N¨3Ó/°·±ÀÓ1DÕEññ%5ð ?ðr+spreservedrequirementsssupporteddestrequirementscóT—||«}d|jvr|jd«|S)Nr!)r"r%)r'r5Úreqss r)Úupgraderequirementsr s,€ñ �‹:€DØ �×"Ñ"Ñ"Ø �‰�ÔØ €Kr+)NN)F)KrXÚmercurial.i18nrÚmercurial.noderrrÚmercurial.pycompatrrÚ mercurialr r r r r rrrrrrrÚvfsmodrÚmercurial.upgrade_utilsrÚupgrade_actionsrÚupgrade_engineÚmercurial.interfacesrÚmercurial.utilsrrÚ largefilesrÚrrÚehÚ wrapfunctionr*r/r8r=rRrernÚREVIDX_DEFAULT_FLAGSr|rr‚r‡Ú basefilectxr�r�r”rœr»Ú readonlyvfsr¿rÊrÐrÒr×rÜrærérÔrÃrïrÕrr r$r+r)Úrs�ðóåß*Ñ*÷÷ ÷÷õ÷ õ ,÷õ  ÷ð €Y×ÑÓ€ð‡��Ð.Ó/ñHó0ðHð‡��Ð5Ó6ñó7ðð ‡�Ð"Ð$4Ó5ñ ó6ð òòò:ó> 1ð.Ø Ø × %Ñ %ó%òR òð‡��Ð,Ó-ñ%ó.ð%ð$‡��×$Ñ$ fÓ-ñó.ðð‡��×$Ñ$ kÓ2ñó3ðò;ð‡��Ð0Ó1ñ)ó2ð)ð ‡��Ð,Ó-ñ)ó.ð)ð\‡��×#Ñ# [Ó1ñ 9ó2ð 9ò?ò2KòOò òEð‡��˜7Ó#ñ3ó$ð3ð:‡��Ð+Ó,ñó-ðò@ó" óBò&Að‡��Ð!7Ó8ñ Fó9ð Fð ‡��Ð":Ó;؇��Ð">Ó?ñó@ó<ñr+