o ]Lb<@sddlmZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z ddlmZmZmZmZddlmZmZmZdd lmZejsSddlZd d Zd d ZddZdSddZddZddZ dTddZ!ddZ"ddZ#ddZ$dd Z%d!d"Z&d#d$Z'ej(e)ej*fej+e)ej*fiZ,d%d&Z-d'd(Z.d)d*Z/d+d,Z0Gd-d.d.ej1Z2d/d0Z3dUd1d2Z4d3d4Z5d5d6Z6d7d8Z7d9d:Z8dSd;d<Z9d=d>Z:d?d@Z;dAdBZdGdHZ?dIdJZ@dUdKdLZAdMdNZBdOdPZCdQdRZDdS)V)absolute_importN)_)open)hex)errorpycompatrevlogutil)hashutil storageutil stringutil) constantscCs tj|jvS)z>returns whether the repository is remotefilelog enabled or not)rSHALLOWREPO_REQUIREMENT requirements)reporA/usr/lib/python3/dist-packages/hgext/remotefilelog/shallowutil.py isenabled$s rcCs4tt|}tj||dd|dd|S)Nrr sha1digestospathjoin)reponamefileidpathhashrrr getcachekey)s"r cCs tt|}tj||SNr)rrrrrr getlocalkey.sr"FcCs0|dd}|s|r dSttdt|S)N remotefilelogs cachepaths4could not find config option remotefilelog.cachepath)configrAbortrr expandpath)ui allowempty cachepathrrr getcachepath3s  r*cCs:t|j}|tjkrtj||jd|Stj||jdSNspacks)r*r'rFILEPACK_CATEGORYrrrname)rcategoryr)rrrgetcachepackpath?s  r/cCstj|d|Sr+)rrr)baser.rrrgetlocalpackpathGsr1cCs6i}|s |dr|r||d<||d<t||}|S)zRreturns a string that matches the revlog contents in a traditional revlog  scopyscopyrev) startswithr packmeta)textcopyfromcopyrevmetarrrcreaterevlogtextKs r9cCs@t|\}}|dr|dd}||dd}|pi|fS)z parse mercurial filelog metadatar2rN)r parsemetar3index)r5r8sizesrrrr:Ys    r:cGs@tdd}|D]}t|D] \}}|||7<qq |S)zAdds all the values of *dicts together into one dictionary. This assumes the values in *dicts are all summable. e.g. [{'a': 4', 'b': 2}, {'b': 3, 'c': 1}] -> {'a': 4, 'b': 5, 'c': 1} cSsdSNrrrrrrhszsumdicts..) collections defaultdictr iteritems)dictsresultdictkvrrrsumdictsbs rHcCs(i}t|D] \}}||||<q|S)z;Returns ``dict`` with ``prefix`` prepended to all its keys.)rrB)rEprefixrDrFrGrrr prefixkeysosrJcGsBdd|D}tt||d}|j|ddfit|dS)NcSsg|]}|qSr) getmetrics).0r=rrr xsz%reportpackmetrics.._s _packsizes )rJrHlogr strkwargs)r'rIstoresrCrErrrreportpackmetricsws"rScCsi}d}t|}||dkrG|||d}|d7}td||d}|d7}|||kr1td||||}|||<||7}||dks||krOtd|S)aparse datapack meta, bytes () -> dict The dict contains raw content - both keys and values are strings. Upper-level business may want to convert some of them to other types like integers, on their own. raise ValueError if the data is corrupted rr !Hrs%corrupted metadata: incomplete buffers"corrupted metadata: redundant data)lenstruct unpack_from ValueError)metabufmetadictoffsetbuflenkeymetalenvaluerrr_parsepackmeta}s"     racCs~d}tt|piD]1\}}t|dkrtd|t|dkr*tdt|||7}|tdt|7}||7}q |S)anreverse of _parsepackmeta, dict -> bytes () The dict contains raw content - both keys and values are strings. Upper-level business may want to serialize some of other types (like integers) to strings before calling this function. raise ProgrammingError when metadata key is illegal, or ValueError if length limit is exceeded r spackmeta: illegal key: %sis)metadata value is too long: 0x%x > 0xffferU) sortedrrBrVrProgrammingErrorrYrWpack)r[rZrFrGrrr_buildpackmetas     rfcCsvi}t|piD]-\}}t|tf}t||s td|t|vr2|t j kr.|dkr.q t |}|||<q t |S)zlike _buildpackmeta, but typechecks metadict and normalize it. This means, METAKEYSIZE and METAKEYSIZE should have integers as values, and METAKEYFLAG will be dropped if its value is 0. spackmeta: wrong type of key %sr) rrB_metaitemtypesgetbytes isinstancerrdintr METAKEYFLAGint2binrf)r[newmetarFrG expectedtyperrr buildpackmetas  rpcCs@t|}t|D]\}}|tvrtt|vrt|||<q |S)zlike _parsepackmeta, but convert fields to desired types automatically. This means, METAKEYFLAG and METAKEYSIZE fields will be converted to integers. )rarrBrgrkbin2int)rZr[rFrGrrr parsepackmetas  rrcCs6t}|dkr|d|d@|dL}|dkst|S)z3convert a non-negative integer to raw binary bufferr) bytearrayinsertri)nbufrrrrms rmcCs&d}t|D] }|dK}||O}q|S)z=the reverse of int2bin, convert a binary buffer to an integerrrt)ru)rxxbrrrrqs   rqc@seZdZdZdS)BadRemotefilelogHeaderz@Exception raised when parsing a remotefilelog blob header fails.N)__name__ __module__ __qualname____doc__rrrrr{sr{cCstj}d}z|d}Wn tytdw|d|}|drZ|drT|dD]%}|tjrAt |t tjd}q-|tj rRt |t tj d}q-n td|t |}|durftd|d ||fS) zgiven a remotefilelog blob, return (headersize, rawtextsize, flags) see remotefilelogserver.createfileblob for the format. raise RuntimeError if the content is illformed. Nz/unexpected remotefilelog header: illegal formatvsv1 rOs$unsupported remotefilelog header: %sz.unexpected remotefilelog header: no size foundr ) rREVIDX_DEFAULT_FLAGSr;rYr{r3splitr METAKEYSIZErkrVrl)rawflagsr<r;headerr=rrrparsesizeflagss8      rcCsd|dur tt|}|dkrdtj|tj|f}|S|dkr+|r%tdd|}|Std|)zreturn the header of a remotefilelog blob. see remotefilelogserver.createfileblob for the format. approximately the reverse of parsesizeflags. version could be 0 or 1, or None (auto decide). Nr s v1 %s%d %s%drs!fileblob v0 does not support flags%dsunknown fileblob version %d)rkboolrrrlrrd)r<rversionrrrrbuildfileblobheaders    rc Cst|\}}}||}i}|t|kr[|d|d}|||d}||d|d}||d|d} ||d|d} ||d|} || | | f||<|d}|t|ks|S)NrP(<r )rrVr;) rr\r<rstartmappingdivider currentnodep1p2linknoder6rrr ancestormap0s   rcCsFt|d}z|}|st|td||W|S|w)Nsrbsempty file: %s)rreadrremoveIOErrorclose)rfrDrrrreadfileDs   rcCs"tjr t|tjt|dSr!)r iswindowsrchmodstatS_IWUSRunlink)filepathrrr unlinkfileSsrcCsHtjrt|tjtj|rt|tjt|t ||dSr!) rrrrrrrisfilerrename)source destinationrrr renamefileZs   rc Cs tj|\}}tj|s/zt|Wnty.}z |jtjkr$WYd}~nd}~wwtj d||d\}}t |z/t |d}| || |rTd} n td} t| | } t||t|| WdStyzt|WtyYww)Ns.%s-)rIdirswbi$r)rrrexistsmakedirsOSErrorerrnoEEXISTtempfilemkstemprr posixfilewriteumaskrr Exceptionr) rcontentreadonlydirnamefilenameexfdtemprmodeoldumaskrrr writefilefs@            rc sti}i}g}D])}fdd||D}t|||<|D] }||t|q!|s5||q |g}|rl|d}||||vrj||} | D]} || } | |t| dkri|d| qR|s>|S)zUTopologically sorts the nodes, using the parentfunc to find the parents of nodes.csg|]}|vr|qSrr)rLpnodesrrrMszsortnodes..r) set setdefaultaddappendsortpoprrVrv) r parentfuncchildmap parentmaprootsrwparentsrresultschildrenc childparentsrrr sortnodess6       rcCs4||}t||krttdt||f|S)z=read n bytes from stream.read and abort if less was availables5stream ended unexpectedly (got %d bytes, expected %d))rrVrr%r)streamrwr=rrr readexactlys   rcCst|t|}t||Sr!)rrWcalcsizeunpack)rfmtdatarrr readunpacks rcCs(t|tj}ttj|d}t||Sr>)rr FILENAMESIZErWrFILENAMESTRUCT)rrawlenpathlenrrrreadpaths  rccsBt|tj}ttj|d}t|D] }t|tjVqdSr>) rr NODECOUNTSIZErWrNODECOUNTSTRUCTrxrangeNODESIZE)rr nodecountirrr readnodelists  rccs>t|tj}ttj|d}t|D]}t|VqdSr>) rr PATHCOUNTSIZErWrPATHCOUNTSTRUCTrrr)rr pathcountrrrr readpathlists   rcCs.z tt|j}|WStyYdSwr!)grpgetgrnamrfsdecodegr_gidKeyError) groupnamegidrrrgetgids  rc Cs~|durdSzt|d|t|dWdSttfy>}z|r3|td||fWYd}~dSWYd}~dSd}~ww)Ns unable to chown/chmod on %s: %s )rchownrrrr)rrwarnrrrrsetstickygroupdirs"rc Cs`d}|dd}|rt|}|dur|td|d}zt|}Wn ty-Ynw|rE|jd@dks<|j|krCt |||jdSt d}z_|g}tj |}|rotj |so||tj |}|rotj |r\t|D]"}zt|Wqsty}z |jtjkrWYd}~qsd}~ww|D] }t |||jqWt |dSt |w)ziCreates the given directory (if it doesn't exist) and give it a particular group with setgid enabled.Nr#s cachegroups!unable to resolve group name: %s rr)r$rrrrrrst_modest_gidrrrrrrreversedmkdirrr)r'rrrstr missingdirsrrrrmkstickygroupdirsJ         rcCs&zt|WStyYdSw)Nunknown)r shortuserusernamer)r'rrr getusernames  rcCs |dd}|rtj|SdS)Nspathssdefaultr)r$rrbasename)r'rrrr getreponames  r)F)NNr!)E __future__rr@rrrrWrmercurial.i18nrmercurial.pycompatrmercurial.noder mercurialrrrr mercurial.utilsr r r rrrrr r"r*r/r1r9r:rHrJrSrarfrlrklongrrgrprrrmrq StorageErrorr{rrrrrrrrrrrrrrrrrrrrrrsl                % &%   -