ó
    6°h¸2  ã                  óÎ  • % S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKJrJ	r	J
r
Jr  SSKJr  SSKJrJrJrJrJr  SSKJr  \R.                  " SS	S
S9r\R2                  " S5      rSS jr " S S5      r S         SS jjrSS jrSS jrSS jr  " S S\RB                  5      r"\#" \S5      (       a  \RD                  r"\b  \r"\RH                  r$\RJ                  r%S\&S'   g)é    )ÚannotationsN)ÚAnyÚCallableÚIteratorÚOptionalé   )Ú_)ÚencodingÚerrorÚpolicyÚpycompatÚutil)ÚmiscÚdirstateÚDirsT)Úpyo3Úparsersc                óJ   • [         R                  " U R                  5       5      $ ©N)r
   ÚhfsignorecleanÚlower)Úss    Ú4/usr/lib/python3/dist-packages/mercurial/pathutil.pyÚ_lowercleanr      s   € Ü×"Ò" 1§7¡7£9Ó-Ð-ó    c                  óˆ   • \ rS rSrSrSS jrSSS jjr\ S     SS jj5       rSS jr	\
R                  S 5       rS	 rS
rg)Úpathauditoré#   a  ensure that a filesystem path contains no banned components.
the following properties of a path are checked:

- ends with a directory separator
- under top-level .hg
- starts at the root of a windows drive
- contains ".."

More check are also done about the file system states:
- traverses a symlink (e.g. a/symlink_here/b)
- inside a nested repository (a callback can be used to approve
  some nested repositories, e.g., subrepositories)

The file system checks are only done when 'realfs' is set to True (the
default). They should be disable then we are auditing path for operation on
stored history.

If 'cached' is set to True, audited paths and sub-directories are cached.
Be careful to not keep the cache of unmanaged directories for long because
audited paths may be replaced with symlinks.
Nc                ó*  • [        5       U l        [        5       U l        Xl        X0l        X@l        X l        [        R                  R                  U5      (       a1  [        R                  " U5      (       d  [        R                  U l        g S U l        g )Nc                ó   • U $ r   © )Úxs    r   Ú<lambda>Ú&pathauditor.__init__.<locals>.<lambda>D   s   € ¡ar   )ÚsetÚauditedÚdictÚ
auditeddirÚrootÚ_realfsÚ_cachedÚcallbackÚosÚpathÚlexistsr   ÚfscasesensitiveÚnormcase)Úselfr)   r,   ÚrealfsÚcacheds        r   Ú__init__Úpathauditor.__init__:   s]   € Ü“uˆŒÜ›&ˆŒØŒ	ØŒØŒØ ŒÜ�7‰7�?‰?˜4× Ñ ¬×)=Ò)=¸d×)CÑ)CÜ ŸM™MˆD�Má'ˆD�Mr   c                óš  • [         R                  " U5      nXR                  ;   a  g[         R                  " U5      (       a"  [        R
                  " [        S5      U-  5      e[         R                  " U5      n[        R                  R                  U5      S   (       d&  [        US   5      S;   d  [        R                  U;   a"  [        R
                  " [        S5      U-  5      eSU;   ar  U Hl  nSU;   d  M  UR                  SS5      u  pVUR                  5       (       d  M6  UR!                  5       S;   d  ML  [        R
                  " [        S5      U-  5      e   S	[        U5      ;   a•  U Vs/ s H  n[        U5      PM     nnS
 Ht  nXGSS ;   d  M  UR#                  U5      n[        R                  R$                  " USU 6 n	[        R
                  " [        S5      U[        R&                  " U	5      4-  5      e   U R(                  (       a„  [+        U5       Hu  n
X R,                  ;   a  U R,                  U
   nOJ[.        R1                  U R2                  X¡U R4                  5      nU R6                  (       a  X°R,                  U
'   U(       a  Mu    O   U R6                  (       a  U R                  R9                  U5        ggs  snf )zHCheck the relative path.
path may contain a pattern (e.g. foodir/**.txt)Ns$   path ends in directory separator: %sr   )ó   .hgó   .hg.r   s#   path contains illegal component: %só   ~r   )s   HGs   HG8B6Cr8   )r8   r9   ó"   path '%s' is inside nested repo %r)r   Ú	localpathr&   Úendswithsepr   Ú
InputErrorr	   Ú	splitpathr-   r.   Ú
splitdriver   r   ÚospardirÚsplitÚisdigitÚupperÚindexÚjoinÚbytestrr*   Úfinddirs_rev_norootr(   r   Ú_checkfs_existsr)   r,   r+   Úadd)r2   r.   ÚmodeÚpartsÚpÚfirstÚlastÚlpartsÚposÚbaseÚprefixÚress               r   Ú__call__Úpathauditor.__call__F   sG  € ô �~Š~˜dÓ#ˆØ—<‘<ÓØä×Ò˜D×!Ñ!Ü×"Ò"ÜÐ9Ó:¸TÑAóð ô —’˜tÓ$ˆä�G‰G×Ñ˜tÓ$ Q×'Ü˜5 ™8Ó$Ð(>Ó>Ü× Ñ  EÓ)ä×"Ò"ÜÐ8Ó9¸DÑ@óð ð �4‹<Û�Ø˜1•9Ø"#§'¡'¨$°Ó"2‘K�EØ—|‘|—~“~¨%¯+©+«-Ð;MÕ*MÜ#×.Ò.ÜÐDÓEÈÑLóð ñ	 ð ”[ Ó&Ó&Ù.3Ó4ªe¨”k !–n©eˆFÐ4Û$�Ø˜q˜r˜
•?Ø Ÿ,™, q›/�CÜŸ7™7Ÿ<š<¨¨t°¨Ð5�DÜ×*Ò*ÜÐ?Ó@Ø¤×!1Ò!1°$Ó!7Ð8ñ9óð ñ	 %ð �<�<ô .¨dÖ3�ØŸ_™_Ó,ØŸ/™/¨&Ñ1‘Cä%×5Ñ5ØŸ	™	 6°·±ó�Cð —|—|Ø25Ÿ™¨Ñ/ß�sÙñ 4ð �<�<Ø�L‰L×Ñ˜TÕ"ð ùò9 5s   Å4Kc                ó®  • [         R                  R                  X5      n [         R                  " U5      n[        R
                  " UR                  5      (       aN  [        S5      [        R                  " U5      [        R                  " U5      4-  n[        R                  " U5      e[        R                  " UR                  5      (       a�  [         R                  R                  [         R                  R                  US5      5      (       aM  U(       a  U" U5      (       d9  [        S5      n[        R                  " Xb[        R                  " U5      4-  5      eg! [         ak  nUR                  [        R                   :X  a   SnAgUR                  [        R                   [        R"                  [        R$                  4;  a  e  SnAgSnAff = f)zwraise exception if a file system backed check fails.

Return a bool that indicates that the directory (or file) exists.s"   path %r traverses symbolic link %rr8   r;   NFT)r-   r.   rF   ÚlstatÚstatÚS_ISLNKÚst_moder	   r   rG   r   ÚAbortÚS_ISDIRÚisdirÚOSErrorÚerrnoÚENOENTÚENOTDIRÚEINVAL)r)   rS   r.   r,   ÚcurpathÚstÚmsgÚerrs           r   rI   Úpathauditor._checkfs_exists„   sN  € ô —'‘'—,‘,˜tÓ,ˆð	NÜ—’˜'Ó"ˆBô �|Š|˜BŸJ™J×'Ñ'ÜÐ=Ó>Ü×$Ò$ TÓ*Ü×$Ò$ VÓ,ðBñ �ô —k’k #Ó&Ð&Ü—’˜bŸj™j×)Ñ)¬b¯g©g¯m©mÜ—‘—‘˜W fÓ-÷/ñ /ö  ¡x°×'8Ñ'8ÜÐAÓB�CÜŸ+š+ c´8×3CÒ3CÀFÓ3KÐ,LÑ&LÓMÐMØøô) ó 	Ø�y‰yœEŸL™LÓ(Üð �y‰y¤§¡¬u¯}©}¼e¿l¹lÐ KÓKØó Lð ûð)	ús   ¡E Å
GÅ)GÆ>GÇGc                óV   •  U " U5        g! [         [        R                  4 a     gf = f©NTF)r_   r   r\   )r2   r.   s     r   ÚcheckÚpathauditor.check§   s,   € ð	Ù�ŒJØøÜœŸ™Ð%ó 	Ùð	ús   ‚ ‹(§(c              #  óF  #   • U R                   (       a  S v •  g  SU l         S v •  U R                  R                  5         U R                  R                  5         SU l         g ! U R                  R                  5         U R                  R                  5         SU l         f = f7frj   )r+   r&   Úclearr(   ©r2   s    r   r4   Úpathauditor.cached®   so   é € à�<�<Üð%Ø#�”Ûà—‘×"Ñ"Ô$Ø—‘×%Ñ%Ô'Ø$�•øð —‘×"Ñ"Ô$Ø—‘×%Ñ%Ô'Ø$�•üs   ‚B!šA! ¥<B!Á!=BÂB!c                ól   • U R                   R                  5         U R                  R                  5         g)zLreset all audit cache

intended for debug and performance benchmark purposesN)r&   rn   r(   ro   s    r   Úclear_audit_cacheÚpathauditor.clear_audit_cache»   s$   € ð 	�‰×ÑÔØ�‰×ÑÕr   )r+   r*   r&   r(   r,   r1   r)   rj   r   )r.   ÚbytesrK   zOptional[Any]ÚreturnÚNone)rS   rt   r.   rt   r,   z!Optional[Callable[[bytes], bool]])r.   rt   ru   Úbool)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r5   rU   ÚstaticmethodrI   rk   Ú
contextlibÚcontextmanagerr4   rr   Ú__static_attributes__r!   r   r   r   r   #   sl   † ñô,
(ö<#ð| ð
 7;ð	 àð ð ð ð 4ô	 ó ð ôDð ×Ññ
%ó ð
%õ r   r   c                ó”  • [         R                  " U 5      (       a  U nOU [        R                  -   nUn[        R
                  R                  U5      (       d   [        R
                  R                  XU5      n[        R
                  R                  U5      nUc  [        U 5      nXT:w  aB  UR                  U5      (       a,  U[        U5      S nU" U5        [         R                  " U5      $ XP:X  a  g/ n  [         R                  " XP5      nU(       aS  U(       d  gUR                  5         [        R
                  R                  " U6 nU" U5        [         R                  " U5      $ [         R                   " U5      u  p‰UR#                  U	5        X…:X  a  OUnM¤  Sn
 X:w  aZ  [%        X X#5        [         R&                  " XS5      nUR)                  [        R                  5      (       a  USS n[+        S5      U-  n
[,        R.                  " [+        S5      X 4-  U
S9e! [         a    Sn GN f = f! [,        R.                   a     NKf = f)aP  return the canonical path of myname, given cwd and root

>>> def check(root, cwd, myname):
...     a = pathauditor(root, realfs=False)
...     try:
...         return canonpath(root, cwd, myname, a)
...     except error.Abort:
...         return 'aborted'
>>> def unixonly(root, cwd, myname, expected='aborted'):
...     if pycompat.iswindows:
...         return expected
...     return check(root, cwd, myname)
>>> def winonly(root, cwd, myname, expected='aborted'):
...     if not pycompat.iswindows:
...         return expected
...     return check(root, cwd, myname)
>>> winonly(b'd:\\repo', b'c:\\dir', b'filename')
'aborted'
>>> winonly(b'c:\\repo', b'c:\\dir', b'filename')
'aborted'
>>> winonly(b'c:\\repo', b'c:\\', b'filename')
'aborted'
>>> winonly(b'c:\\repo', b'c:\\', b'repo\\filename',
...         b'filename')
'filename'
>>> winonly(b'c:\\repo', b'c:\\repo', b'filename', b'filename')
'filename'
>>> winonly(b'c:\\repo', b'c:\\repo\\subdir', b'filename',
...         b'subdir/filename')
'subdir/filename'
>>> unixonly(b'/repo', b'/dir', b'filename')
'aborted'
>>> unixonly(b'/repo', b'/', b'filename')
'aborted'
>>> unixonly(b'/repo', b'/', b'repo/filename', b'filename')
'filename'
>>> unixonly(b'/repo', b'/repo', b'filename', b'filename')
'filename'
>>> unixonly(b'/repo', b'/repo/subdir', b'filename', b'subdir/filename')
'subdir/filename'
Nr   Féÿÿÿÿs   consider using '--cwd %s's   %s not under root '%s')Úhint)r   r=   r   Úossepr-   r.   ÚisabsrF   Únormpathr   Ú
startswithÚlenÚpconvertÚsamefiler_   ÚreverserB   ÚappendÚ	canonpathÚpathtoÚendswithr	   r   r\   )r)   ÚcwdÚmynameÚauditorÚrootsepÚnameÚrelr   ÚdirnameÚbasenamerƒ   Úrelpaths               r   r�   r�   Ã   sî  € ô^ ×Ò˜×ÑØ‰àœŸ™Ñ'ˆØ€DÜ�7‰7�=‰=˜×ÑÜ�w‰w�|‰|˜D tÓ,ˆÜ�7‰7×Ñ˜DÓ!€DØ�Ü˜dÓ#ˆØƒ˜4Ÿ?™?¨7×3Ñ3Ø”C˜“L�NÐ#ˆÙ�ŒÜ�}Š}˜TÓ"Ð"Ø	‹Øð ˆØðÜ—M’M $Ó-�ö ÞàØ—‘”Ü—w‘w—|’| SÐ)�Ù˜”Ü—}’} TÓ*Ð*Ü $§
¢
¨4Ó 0ÑˆGØ�J‰J�xÔ Ø‹ØØˆDñ# ð* ˆð	Ø‹{Ü˜$ fÔ6ÜŸ+š+ d°Ó5�Ø×#Ñ#¤H§N¡N×3Ñ3Ø% c r˜l�GÜÐ5Ó6¸Ñ@�ô �kŠkÜÐ'Ó(¨F¨>Ñ9Àñ
ð 	
øô; ó Ø“ðûô4 �{‰{ó 	Ùð	ús%   Ã6H ÆAH0 ÈH-È,H-È0IÉIc                óº   • [         R                  R                  U 5      u  p[        U5      [        [        R
                  5      :w  a  U [        R
                  -   $ U $ )aÄ  normalize the specified path as path prefix

Returned value can be used safely for "p.startswith(prefix)",
"p[len(prefix):]", and so on.

For efficiency, this expects "path" argument to be already
normalized by "os.path.normpath", "os.path.realpath", and so on.

See also issue3033 for detail about need of this function.

>>> normasprefix(b'/foo/bar').replace(pycompat.ossep, b'/')
'/foo/bar/'
>>> normasprefix(b'/').replace(pycompat.ossep, b'/')
'/'
)r-   r.   r@   rˆ   r   r„   )r.   ÚdrM   s      r   Únormasprefixr›   .  sC   € ô  �7‰7×Ñ˜dÓ#�D€AÜ
ˆ1ƒv””X—^‘^Ó$Ó$Ø”h—n‘nÑ$Ð$àˆr   c              #  ó†   #   • U R                  S5      nUS:w  a"  U S U v •  U R                  SSU5      nUS:w  a  M"  Sv •  g 7f)Nó   /r‚   r   r   )Úrfind©r.   rQ   s     r   Úfinddirsr    E  sH   é € Ø
�*‰*�TÓ
€CØ
�‹)Ø�4�CˆjÒØ�j‰j˜˜q #Ó&ˆð ��)ð ƒIùs
   ‚8A¼Ac              #  ó¼   #   • U R                  [        R                  5      nUS:w  a3  U S U v •  U R                  [        R                  US-   5      nUS:w  a  M2  g g 7f)Nr‚   r   )Úfindr   r„   rŸ   s     r   rH   rH   M  sK   é € Ø
�)‰)”H—N‘NÓ
#€CØ
�‹)Ø�4�CˆjÒØ�i‰iœŸ™¨¨a©Ó0ˆð ��)ùs   ‚AAÁAc                  óF   • \ rS rSrSrS
S jrSS jrSS jrS rSS jr	Sr
g	)ÚdirsiT  z6a multiset of directory names from a set of file pathsc                ó*  • 0 U l         U R                  n[        U[        5      (       a;  U(       a4  UR	                  5        H  u  pEUR
                  S:w  d  M  U" U5        M!     gU(       a  Sn[        R                  " U5      eU H  nU" U5        M     g)zC
a dict map indicates a dirstate while a list indicates a manifest
ó   rs3   `only_tracked` is only supported with a dict sourceN)Ú_dirsÚaddpathÚ
isinstancer'   ÚitemsÚstater   ÚProgrammingError)r2   ÚmapÚonly_trackedr¨   Úfr   rf   s          r   r5   Údirs.__init__W  ss   € ð ˆŒ
Ø—,‘,ˆÜ�cœ4× Ñ ¦\ØŸ	™	ž‘�Ø—7‘7˜d•?Ù˜A–Jò $ö ØHˆCÜ×(Ò(¨Ó-Ð-ã�Ù˜–
ò r   c                ó¶   • U R                   n[        U5       H>  nUR                  S5      (       a  [        SU-  5      eX2;   a  X#==   S-  ss'     g SX#'   M@     g )Nr�   z-found invalid consecutive slashes in path: %rr   )r§   r    r�   Ú
ValueError©r2   r.   r¤   rR   s       r   r¨   Údirs.addpathh  sY   € Ø�z‰zˆÜ˜T–NˆDØ�}‰}˜T×"Ñ"Ü ØCÀdÑJóð ð ‹|Ø“
˜a‘“
ÙØˆD‹Jò #r   c                óp   • U R                   n[        U5       H  nX#   S:”  a  X#==   S-  ss'     g X#	 M     g )Nr   )r§   r    r³   s       r   ÚdelpathÚdirs.delpatht  s5   € Ø�z‰zˆÜ˜T–NˆDØ‰z˜A‹~Ø“
˜a‘“
ÙØ’
ò	 #r   c                ó,   • [        U R                  5      $ r   )Úiterr§   ro   s    r   Ú__iter__Údirs.__iter__|  s   € Ü�D—J‘JÓÐr   c                ó   • XR                   ;   $ r   ©r§   )r2   rš   s     r   Ú__contains__Údirs.__contains__  s   € Ø—J‘J‰Ðr   r½   N)F)r.   rt   ru   rv   )rš   rt   ru   rw   )rx   ry   rz   r{   r|   r5   r¨   r¶   rº   r¾   r€   r!   r   r   r¤   r¤   T  s   † Ù@ôô"
ôò ÷r   r¤   zCallable[[bytes], bytes]r–   )r   rt   ru   rt   r   )
r)   rt   r�   rt   r‘   rt   r’   zOptional[pathauditor]ru   rt   )r.   rt   ru   rt   )r.   rt   ru   zIterator[bytes])'Ú
__future__r   r~   r`   r-   Ú	posixpathrY   Útypingr   r   r   r   Úi18nr	   Ú r
   r   r   r   r   Ú
interfacesr   Úint_miscÚ
importrustÚrustdirsÚ	importmodr   r   r   r�   r›   r    rH   ÚIDirsr¤   ÚhasattrrF   r–   Ú__annotations__r!   r   r   Ú<module>rÍ      s	  ðÞ "ã Û Û 	Û Û ÷ó õ ÷õ õ )à×Ò˜Z¨°dÑ;€Ø
×
Ò
˜9Ó
%€ô.÷] ñ ] ðH &*ð	h
Ø
ðh
à	ðh
ð ðh
ð #ð	h
ð
 õh
ôVô.ô1ô,ˆ8�>‰>ô ,ñ^ ˆ7�F×ÑØ�<‰<€DàÑØ€Dð ‡~�~€Ø$-×$5Ñ$5€Ð	!Ô 5r   