Ë
    "ïàj7Z  ã                   ó*  — d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlmZmZ ddlmZ 	 ddlZdd	lmZmZ dd
lmZ dZ ej8                  e«      ZdZ G d„ de«      Z  G d„ de«      Z!y# e$ r  edej4                  ¬«       ‚ w xY w)a¤	  
DAV provider that publishes a Mercurial repository.

Note: This is **not** production code!

The repository is rendered as three top level collections.

edit:
    Contains the working directory, i.e. all files. This includes uncommitted
    changes and untracked new files.
    This folder is writable.
released:
    Contains the latest committed files, also known as 'tip'.
    This folder is read-only.
archive:
    Contains the last 10 revisions as sub-folders.
    This folder is read-only.

Sample layout::

    /<share>/
        edit/
            server/
                ext_server.py
            README.txt
        released/
        archive/
            19/
            18/
            ...

Supported features:

#. Copying or moving files from ``/edit/..`` to the ``/edit/..`` folder will
   result in a ``hg copy`` or ``hg rename``.
#. Deleting resources from ``/edit/..`` will result in a ``hg remove``.
#. Copying or moving files from ``/edit/..`` to the ``/released`` folder will
   result in a ``hg commit``.
   Note that the destination path is ignored, instead the source path is used.
   So a user can drag a file or folder from somewhere under the ``edit/..``
   directory and drop it directly on the ``released`` directory to commit
   changes.
#. To commit all changes, simply drag'n'drop the ``/edit`` folder on the
   ``/released`` folder.
#. Creating new collections results in creation of a file called ``.directory``,
   which is then ``hg add`` ed since Mercurial doesn't track directories.
#. Some attributes are published as live properties, such as ``{hg:}date``.


Known limitations:

#. This 'commit by drag-and-drop' only works, if the WebDAV clients produces
   MOVE or COPY requests. Alas, some clients will send PUT, MKCOL, ... sequences
   instead.
#. Adding and then removing a file without committing after the 'add' will
   leave this file on disk (untracked)
   This happens for example with lock files that Open Office Write and other
   applications will create.
#. Dragging the 'edit' folder onto 'released' with Windows File Explorer will
   remove the folder in the explorer view, although WsgiDAV did not delete it.
   This seems to be done by the client.


See:
    http://mercurial.selenic.com/wiki/MercurialApi
Requirements:
    ``easy_install mercurial`` or install the API as non-standalone version
    from here: http://mercurial.berkwood.com/
    http://mercurial.berkwood.com/binaries/mercurial-1.4.win32-py2.6.exe
é    N)Úmd5)Úpprint)Úutil)ÚHTTP_FORBIDDENÚDAVError)ÚDAVProviderÚ_DAVResource)ÚVirtualCollection)ÚcommandsÚhg)Úversionz@Could not import Mercurial API. Try 'easy_install -U mercurial'.)ÚfilezreStructuredText eni    c                   óÎ   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ fd„Zˆ fd„Zdd„Zd„ Zd„ Zd„ Zd„ Zddœd„Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZS ) Ú
HgResourcez&Abstract base class for all resources.c                 ó0  •— t         ‰| �  |||«       || _        || _        | j	                  «       | _        d| j                  vsJ ‚d| j
                  vsJ ‚|rd | _        y | j                  j                  | j                     }|| j                     | _        y )Nú\ú/)	ÚsuperÚ__init__ÚrevÚlocalHgPathÚ_getFilePathÚabsFilePathÚfctxÚproviderÚrepo)ÚselfÚpathÚis_collectionÚenvironr   r   ÚwdctxÚ	__class__s          €úN/srv/dav/.venv/lib/python3.12/site-packages/wsgidav/samples/hg_dav_provider.pyr   zHgResource.__init__o   s’   ø€ Ü‰Ñ˜˜}¨gÔ6ØˆŒØ&ˆÔØ×,Ñ,Ó.ˆÔØ˜4×+Ñ+Ñ+Ð+Ð+Ø˜$×*Ñ*Ñ*Ð*Ð*áØˆD�Ið —M‘M×&Ñ& t§x¡xÑ0ˆEØ˜d×.Ñ.Ñ/ˆD�Ió    c                 óÚ   — | j                   j                  d«      }|r|j                  |«       t        j                  j
                  | j                  j                  j                  g|¢­Ž S )Nr   )	r   ÚsplitÚextendÚosr   Újoinr   r   Úroot)r   ÚaddPartsÚpartss      r#   r   zHgResource._getFilePath†   sO   € Ø× Ñ ×&Ñ& sÓ+ˆÙØ�L‰L˜Ô"Ü�w‰w�|‰|˜DŸM™M×.Ñ.×3Ñ3Ð<°eÒ<Ð<r$   c                 óÜ   — | j                   j                  d«      xs d}t        j                  | j                  j
                  | j                  j                  | j                  d||¬«       y )Nzwsgidav.auth.user_nameÚ	AnonymousT)Ú	addremoveÚuserÚmessage)r    Úgetr   Úcommitr   Úuir   r   )r   r1   r0   s      r#   Ú_commitzHgResource._commitŒ   sT   € Ø�|‰|×ÑÐ 8Ó9ÒH¸[ˆÜ�‰Ø�M‰M×ÑØ�M‰M×ÑØ×ÑØØØö	
r$   c                 ó:   — | j                   �t        t        «      ‚y)z0Raise HTTP_FORBIDDEN, if resource is unwritable.N)r   r   r   ©r   s    r#   Ú_check_write_accesszHgResource._check_write_access—   s   € à�8‰8Ðäœ>Ó*Ð*ð  r$   c                 óP   — | j                   ry | j                  j                  «       S ©N)r   r   Úsizer7   s    r#   Úget_content_lengthzHgResource.get_content_length�   s   € Ø×ÒØØ�y‰y�~‰~ÓÐr$   c                 óZ   — | j                   ry t        j                  | j                  «      S r:   )r   r   Úguess_mime_typer   r7   s    r#   Úget_content_typezHgResource.get_content_type¢   s%   € Ø×ÒØô
 ×#Ñ# D§I¡IÓ.Ð.r$   c                  ó   — y r:   © r7   s    r#   Úget_creation_datezHgResource.get_creation_date«   ó   € ð r$   c                 ó¸   — | j                   s| j                  j                  «       €| j                  S | j                  › d| j                  j                  «       › �S )Nú@)r   r   ÚfilerevÚnamer7   s    r#   Úget_display_namezHgResource.get_display_name°   sJ   € Ø×Ò §¡×!2Ñ!2Ó!4Ð!<Ø—9‘9ÐØ—)‘)�˜A˜dŸi™i×/Ñ/Ó1Ð2Ð3Ð3r$   c                 óÐ   — t        | j                  «      j                  «       dz   t        j                  | j                  «       «      z   dz   t        | j                  «       «      z   S )Nú-)r   r   Ú	hexdigestr   Úto_strÚget_last_modifiedÚstrr<   r7   s    r#   Úget_etagzHgResource.get_etagµ   s_   € ä�—	‘	‹N×$Ñ$Ó&Øñä�k‰k˜$×0Ñ0Ó2Ó3ñ4ð ñô �$×)Ñ)Ó+Ó,ñ	-ð	
r$   c                 óV   — | j                   ry | j                  j                  «       d   S )Nr   )r   r   Údater7   s    r#   rM   zHgResource.get_last_modified¾   s$   € Ø×ÒØà�y‰y�~‰~Ó Ñ"Ð"r$   c                  ó   — y)NFrA   r7   s    r#   Úsupport_rangeszHgResource.support_rangesÄ   s   € Ør$   c                 óð   — | j                   sJ ‚| j                  d   t        j                  | j                  «         }|d   }| j
                  |vrg S || j
                     d   || j
                     d   z   S )Núwsgidav.hg.cacheÚdirinfosr   é   )r   r    r   rL   r   r   )r   ÚcacherV   s      r#   Úget_member_nameszHgResource.get_member_namesÇ   sz   € Ø×!Ò!Ð!Ð!Ø—‘Ð/Ñ0´·±¸T¿X¹XÓ1FÑGˆØ˜Ñ$ˆØ×Ñ 8Ñ+ØˆIØ˜×(Ñ(Ñ)¨!Ñ,¨x¸×8HÑ8HÑ/IÈ!Ñ/LÑLÐLr$   c                 ó¦   — | j                   sJ ‚| j                  j                  t        j                  | j
                  |«      | j                  «      S r:   )r   r   Úget_resource_instr   Újoin_urir   r    )r   rG   s     r#   Ú
get_memberzHgResource.get_memberÑ   s@   € à×!Ò!Ð!Ð!Ø�}‰}×.Ñ.Ü�M‰M˜$Ÿ)™) TÓ*¨D¯L©Ló
ð 	
r$   c                 ó*   — | j                   rddiS ddiS )NÚtypeÚ	DirectoryÚFile)r   r7   s    r#   Úget_display_infozHgResource.get_display_infoØ   s!   € Ø×ÒØ˜KÐ(Ð(Ø˜ÐÐr$   c                óf   •— t         ‰| �  |¬«      }| j                  r|j                  g d¢«       |S )zqReturn list of supported property names in Clark Notation.

        See DAVResource.get_property_names()
        )Ú
is_allprop)ú{hg:}branchú	{hg:}dateú{hg:}descriptionú{hg:}filerevú{hg:}revú	{hg:}user)r   Úget_property_namesr   r'   )r   rd   ÚpropNameListr"   s      €r#   rk   zHgResource.get_property_namesÝ   s9   ø€ ô ‘wÑ1¸ZÐ1ÓHˆà�9Š9Ø×Ñòô	ð Ðr$   c                 ó4  •— |dk(  r| j                   j                  «       S |dk(  r0t        j                  | j                   j	                  «       d   «      S |dk(  r| j                   j                  «       S |dk(  r-t        j                  | j                   j                  «       «      S |dk(  r-t        j                  | j                   j                  «       «      S |dk(  r-t        j                  | j                   j                  «       «      S t        ‰| �)  |«      S )zJReturn the value of a property.

        See get_property_value()
        re   rf   r   rg   rh   ri   rj   )r   Úbranchr   rL   rQ   ÚdescriptionrF   r   r0   r   Úget_property_value)r   rG   r"   s     €r#   rp   zHgResource.get_property_valueò   sÜ   ø€ ð �=Ò Ø—9‘9×#Ñ#Ó%Ð%Ø�[Ò ä—;‘;˜tŸy™yŸ~™~Ó/°Ñ2Ó3Ð3ØÐ'Ò'Ø—9‘9×(Ñ(Ó*Ð*Ø�^Ò#Ü—;‘;˜tŸy™y×0Ñ0Ó2Ó3Ð3Ø�ZÒÜ—;‘;˜tŸy™yŸ}™}›Ó/Ð/Ø�[Ò Ü—;‘;˜tŸy™yŸ~™~Ó/Ó0Ð0ô ‰wÑ)¨$Ó/Ð/r$   c                 ó    — t        t        «      ‚)zTSet or remove property value.

        See DAVResource.set_property_value()
        )r   r   )r   rG   ÚvalueÚdry_runs       r#   Úset_property_valuezHgResource.set_property_value	  s   € ô
 ”~Ó&Ð&r$   c                 ó   — | j                   �yy)zHReturn True, to prevent locking.

        See prevent_locking()
        TF)r   r7   s    r#   Úprevent_lockingzHgResource.prevent_locking  s   € ð
 �8‰8ÐàØr$   c                 óº  — | j                   sJ ‚| j                  «        | j                  |«      }t        |d«      }|j	                  «        t        j                  | j                  j                  | j                  j                  |«       t        | j                  j                  d«      dz   |z   d| j                  | j                  | j                  dz   |z   «      S )z{Create and return an empty (length-0) resource as member of self.

        See DAVResource.create_empty_resource()
        Úwr   F)r   r8   r   ÚopenÚcloser   Úaddr   r4   r   r   r   Úrstripr    r   r   )r   rG   ÚfilepathÚfs       r#   Úcreate_empty_resourcez HgResource.create_empty_resource  s·   € ð
 ×!Ò!Ð!Ð!Ø× Ñ Ô"Ø×$Ñ$ TÓ*ˆÜ�˜3ÓˆØ	�‰Œ	Ü�‰�T—]‘]×%Ñ% t§}¡}×'9Ñ'9¸8ÔDô Ø�I‰I×Ñ˜SÓ! CÑ'¨$Ñ.ØØ�L‰LØ�H‰HØ×Ñ˜sÑ" TÑ)ó
ð 	
r$   c                 óˆ  — | j                   sJ ‚| j                  «        | j                  |«      }t        j                  |«       | j                  |d«      }t        |d«      }|j                  d«       |j                  «        t        j                  | j                  j                  | j                  j                  |«       y)z�Create a new collection as member of self.

        A dummy member is created, because Mercurial doesn't handle folders.
        z
.directoryrx   zCreated by WsgiDAV.N)r   r8   r   r(   Úmkdirry   Úwriterz   r   r{   r   r4   r   )r   rG   Úcollpathr}   r~   s        r#   Úcreate_collectionzHgResource.create_collection/  s“   € ð
 ×!Ò!Ð!Ð!Ø× Ñ Ô"Ø×$Ñ$ TÓ*ˆÜ
�‰�ÔØ×$Ñ$ T¨<Ó8ˆÜ�˜3ÓˆØ	�‰Ð%Ô&Ø	�‰Œ	Ü�‰�T—]‘]×%Ñ% t§}¡}×'9Ñ'9¸8ÕDr$   c                 ó|   — | j                   rJ ‚| j                  j                  «       }t        j                  |«      S )zUOpen content as a stream for reading.

        See DAVResource.get_content()
        )r   r   Údatar   ÚStringIO)r   Úds     r#   Úget_contentzHgResource.get_content>  s2   € ð
 ×%Ò%Ð%Ð%Ø�I‰I�N‰NÓˆÜ�}‰}˜QÓÐr$   N)Úcontent_typec                óx   — | j                   rJ ‚| j                  «        d}t        | j                  |t        «      S )zUOpen content as a stream for writing.

        See DAVResource.begin_write()
        Úwb)r   r8   ry   r   ÚBUFFER_SIZE)r   rŠ   Úmodes      r#   Úbegin_writezHgResource.begin_writeG  s;   € ð
 ×%Ò%Ð%Ð%Ø× Ñ Ô"Øˆô �D×$Ñ$ d¬KÓ8Ð8r$   c                óœ   — |sJt        j                  | j                  j                  | j                  j                  | j
                  «       yy)zSCalled when PUT has finished writing.

        See DAVResource.end_write()
        N)r   r{   r   r4   r   r   )r   Úwith_errorss     r#   Ú	end_writezHgResource.end_writeT  s6   € ñ
 Ü�L‰L˜Ÿ™×)Ñ)¨4¯=©=×+=Ñ+=¸t×?OÑ?OÕPð r$   c                  ó   — y)z]Return True, if delete() may be called on non-empty collections
        (see comments there).TrA   r7   s    r#   Úsupport_recursive_deletez#HgResource.support_recursive_deletec  rC   r$   c                 óÆ   — | j                  «        | j                  «       }t        j                  | j                  j
                  | j                  j                  |d¬«       y)z!Remove this resource (recursive).T©ÚforceN)r8   r   r   Úremover   r4   r   )r   r}   s     r#   ÚdeletezHgResource.deleteh  sB   € à× Ñ Ô"Ø×$Ñ$Ó&ˆÜ�‰˜Ÿ™×(Ñ(¨$¯-©-×*<Ñ*<¸hÈdÖSr$   c                óè  — t        j                  |«      \  }}|j                  d«      }| j                  j                  }| j                  j
                  }t        j                  d| j                  › d|› �«       | j                  €*|dk(  r%t        j                  ||| j                  |d¬«       y| j                  €(|dk(  r#| j                  d| j                  › d|› d	�«       yt        t        «      ‚)
zHandle a COPY request natively.r   úhandle_copy ú -> ÚeditTr–   ÚreleasedzWsgiDAV commit (COPY ú))r   Úpop_pathÚstripr   r4   r   Ú_loggerÚinfor   r   r   Úcopyr5   r   r   r   )r   Ú	dest_pathÚdepth_infinityÚdestTypeÚ
destHgPathr4   r   s          r#   Úhandle_copyzHgResource.handle_copyn  sÚ   € ä#Ÿ}™}¨YÓ7Ñˆ�*Ø×%Ñ% cÓ*ˆ
Ø�]‰]×ÑˆØ�}‰}×!Ñ!ˆÜ�‰�| D×$4Ñ$4Ð#5°T¸*¸ÐFÔGØ�8‰8Ð ¨FÒ 2ä�M‰M˜"˜d D×$4Ñ$4°jÈÕMð ð �X‰XÐ (¨jÒ"8ð �L‰LÐ0°·±°¸4À	¸{È!ÐLÔMð ô œ>Ó*Ð*r$   c                 óè  — t        j                  |«      \  }}|j                  d«      }| j                  j                  }| j                  j
                  }t        j                  d| j                  › d|› �«       | j                  €*|dk(  r%t        j                  ||| j                  |d¬«       y| j                  €(|dk(  r#| j                  d| j                  › d|› d	�«       yt        t        «      ‚)
zHandle a MOVE request natively.r   r›   rœ   r�   Tr–   rž   zWsgiDAV commit (MOVE rŸ   )r   r    r¡   r   r4   r   r¢   r£   r   r   r   Úrenamer5   r   r   r   )r   r¥   r§   r¨   r4   r   s         r#   Úhandle_movezHgResource.handle_move�  sÚ   € ä#Ÿ}™}¨YÓ7Ñˆ�*Ø×%Ñ% cÓ*ˆ
Ø�]‰]×ÑˆØ�}‰}×!Ñ!ˆÜ�‰�| D×$4Ñ$4Ð#5°T¸*¸ÐFÔGØ�8‰8Ð ¨FÒ 2ä�O‰O˜B  d×&6Ñ&6¸
È$ÕOð ð �X‰XÐ (¨jÒ"8ð �L‰LÐ0°·±°¸4À	¸{È!ÐLÔMð ô œ>Ó*Ð*r$   ©F) Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r5   r8   r<   r?   rB   rH   rO   rM   rS   rY   r]   rb   rk   rp   rt   rv   r   r„   r‰   r�   r’   r”   r™   r©   r¬   Ú__classcell__©r"   s   @r#   r   r   l   s–   ø„ Ù0ô0ò.=ò	
ò+ò ò
/òò
4ò

ò#òòMò
ò ô
ô*0ó.'òò
ò*Eò ð +/ô 9òQòò
Tòö&r$   r   c                   ó8   ‡ — e Zd ZdZˆ fd„Zdd„Zdd„Zd„ Zˆ xZS )ÚHgResourceProviderzG
    DAV provider that serves a VirtualResource derived structure.
    c           	      ó  •— t         ‰| �  «        || _        t        dt        z  «       t
        j                  j                  «       | _        t        j                  | j                  |«      | _	        | j                  j                  d| j                  j                  z  «       | j                  j                  | _        t        j                  | j                  j                  «       t        j                  d| j                  j                  z  «       t!        j"                  | j                  | j                  «       t        d«       t%        | j                  j                  «       «       | j                  j                  j                  d| j                  j                  j'                  «       z  «       | j                  j                  d| j                  j                  j)                  |«      z  «       t        d«       | j                  j+                  «        t!        j,                  | j                  | j                  d¬	«       | j                  j/                  «       j1                  «       }|j3                  d
«      D �cg c]  }t5        |j3                  dd«      «      ‘Œ }}t%        |«       t        d«       | j                  j+                  «        t!        j6                  | j                  | j                  dddd¬«       | j                  j/                  «       j1                  «       }|j3                  d
«      D �cg c]  }t5        |j3                  dd«      «      ‘Œ }}t%        |«       | j9                  «        y c c}w c c}w )NzMercurial version %szConnected to repository %s
zVerify repository '%s' tree...zStatus:z0the default user_name to be used in commits: %s
zExpandpath: %s
z Working directory state summary:F)Úremoteú
ú:rW   zRepository state summary:T)ÚnumÚidrn   Útags)r   r   ÚrepoRootÚprintÚ	hgversionÚ	mercurialr4   r   Ú
repositoryr   Ústatusr*   r(   Úchdirr¢   Úwarningr   Úverifyr   Ú	user_nameÚ
expandpathÚ
pushbufferÚsummaryÚ	popbufferr¡   r&   ÚtupleÚidentifyÚ_get_log)r   r½   ÚresÚlineÚreslinesr"   s        €r#   r   zHgResourceProvider.__init__Ÿ  sZ  ø€ Ü‰ÑÔØ ˆŒÜÐ$¤yÑ0Ô1Ü—,‘,—/‘/Ó#ˆŒÜ—M‘M $§'¡'¨8Ó4ˆŒ	Ø�‰�‰Ð5¸¿	¹	¿¹ÑFÔGØŸ	™	Ÿ™ˆŒô 	�‰�—‘—‘Ô ô 	�‰Ð8¸4¿9¹9¿>¹>ÑIÔJÜ�‰˜Ÿ™ §¡Ô+ô 	ˆiÔÜˆt�y‰y×ÑÓ!Ô"Ø�	‰	�‰×ÑØ?Ø�i‰i�l‰l×$Ñ$Ó&ñ'ô	
ð
 	�‰�‰Ð)¨D¯I©I¯L©L×,CÑ,CÀHÓ,MÑMÔNäÐ0Ô1Ø�‰×ÑÔÜ×Ñ˜Ÿ™ $§)¡)°EÕ:Ø�g‰g×ÑÓ!×'Ñ'Ó)ˆØ:=¿)¹)ÀD»/ÖJ°$”E˜$Ÿ*™* S¨!Ó,Õ-ÐJˆÐJÜˆxÔäÐ)Ô*Ø�‰×ÑÔÜ×Ñ˜$Ÿ'™' 4§9¡9°$¸4ÈÐSWÕXØ�g‰g×ÑÓ!×'Ñ'Ó)ˆØ:=¿)¹)ÀD»/ÖJ°$”E˜$Ÿ*™* S¨!Ó,Õ-ÐJˆÐJÜˆxÔà�‰�ùò Kùò Ks   Ê"N Í "Nc                 ól  — | j                   j                  «        t        j                  | j                   | j                  |ddd¬«       | j                   j                  «       j                  «       }g }|j                  d«      D ]¬  }i }|j                  |«       |j                  d«      D ]>  }|j                  dd«      \  }}|dv sJ ‚|j                  «       ||j                  «       <   Œ@ t        j                  |d   «      |d	<   |d
   j                  d«      \  }	}
t        |	«      |d<   |
|d<   Œ® |S )z-Read log entries into a list of dictionaries.N)ÚlimitrQ   r   r0   z

r¸   r¹   rW   )Ú	changesetÚtagr0   rQ   rÉ   rQ   Úparsed_daterÓ   Úlocal_idÚunid)r4   rÈ   r   Úlogr   rÊ   r¡   r&   Úappendr   Úparse_time_stringÚint)r   rÒ   rÎ   ÚlogListÚlogentryrØ   rÏ   ÚkÚvrÖ   r×   s              r#   rÍ   zHgResourceProvider._get_logÌ  s  € à�‰×ÑÔÜ�‰�T—W‘W˜dŸi™i¨u¸4ÀTÐPTÕUØ�g‰g×ÑÓ!×'Ñ'Ó)ˆàˆØŸ	™	 &Ó)ò 
	ˆHØˆCØ�N‰N˜3ÔØ Ÿ™ tÓ,ò +�Ø—z‘z # qÓ)‘��1ØÐKÑKÐKÐKØ!"§¡£��A—G‘G“I’ð+ô "&×!7Ñ!7¸¸F¹Ó!DˆC�ÑØ  Ñ-×3Ñ3°CÓ8‰NˆH�dÜ! (›mˆC�
‰OØˆC�ŠKð
	ð ˆr$   c                 óX  — |j                  di «      }|j                  t        j                  |«      «      �0t        j                  d|z  «       |t        j                  |«         S t        j                  «       }| j                  j                  «        t        j                  | j                  | j                  |«       | j                  j                  «       }g }i }i }	|j                  d«      D ]×  }
|
j                  «       dk(  rŒ|
j                  dd«      }
|
j                  d«      }t!        |«      dk\  r‹d}t#        dt!        |«      dz
  «      D ]E  }||   }|j                  |g g f«      }||d   vr|d   j%                  |«       |dk(  r|}Œ?|› d|› �}ŒG |j                  |g g f«      d   j%                  |d	   «       d
|	|
<   ŒÙ |j'                  «        |||	dœ}||t        j                  |«      <   t        j)                  d|› dt        j                  «       |z
  d›�«       |S )a‹  Return a dictionary containing all files under source control.

        dirinfos:
            Dictionary containing direct members for every collection.
            {folderpath: (collectionlist, filelist), ...}
        files:
            Sorted list of all file paths in the manifest.
        filedict:
            Dictionary containing all files under source control.

        ::

            {'dirinfos': {'': (['wsgidav',
                                'tools',
                                'WsgiDAV.egg-info',
                                'tests'],
                               ['index.rst',
                                'wsgidav MAKE_DAILY_BUILD.launch',
                                'wsgidav run_server.py DEBUG.launch',
                                'wsgidav-paste.conf',
                                ...
                                'setup.py']),
                          'wsgidav': (['addons', 'samples', 'server', 'interfaces'],
                                      ['__init__.pyc',
                                       'dav_error.pyc',
                                       'dav_provider.pyc',
                                       ...
                                       'wsgidav_app.py']),
                           },
             'files': ['.hgignore',
                       'ADDONS.txt',
                       'wsgidav/samples/mysql_dav_provider.py',
                       ...
                       ],
             'filedict': {'.hgignore': True,
                           'README.txt': True,
                           'WsgiDAV.egg-info/PKG-INFO': True,
                           }
                           }
        rU   z_get_repo_info(%s): cache hit.r¸   Ú r   r   rW   r   éÿÿÿÿT)ÚfilesrV   Úfiledictz_getRepoInfo(z) took z.3f)Ú
setdefaultr2   r   rL   r¢   ÚdebugÚtimer4   rÈ   r   Úmanifestr   rÊ   r&   r¡   ÚreplaceÚlenÚrangerÙ   Úsortr£   )r   r    r   ÚreloadÚcachesÚ
start_timerÎ   rã   rV   rä   r   ÚparentsÚp1ÚiÚp2ÚdirrX   s                    r#   Ú_get_repo_infoz!HgResourceProvider._get_repo_infoá  s   € ðR ×#Ñ#Ð$6¸Ó;ˆØ�:‰:”d—k‘k #Ó&Ó'Ð3Ü�M‰MÐ:¸SÑ@ÔAØœ$Ÿ+™+ cÓ*Ñ+Ð+ä—Y‘Y“[ˆ
Ø�‰×ÑÔÜ×Ñ˜$Ÿ'™' 4§9¡9¨cÔ2Ø�g‰g×ÑÓ!ˆØˆØˆØˆØ—I‘I˜d“Oò 	"ˆDØ�z‰z‹|˜rÒ!ØØ—<‘<  cÓ*ˆDà—j‘j “oˆGÜ�7‹|˜qÒ Ø�Ü˜q¤# g£,°Ñ"2Ó3ò *�AØ  ™�BØ"×-Ñ-¨b°2°r°(Ó;�CØ  Q¡Ñ'Ø˜A™Ÿ™ bÔ)Ø˜R’xØ™à "˜t 1 R D˜\™ð*ð ×#Ñ# B¨¨R¨Ó1°!Ñ4×;Ñ;¸GÀB¹KÔHØ!ˆH�TŠNð%	"ð& 	�
‰
Œà¨XÀ8ÑLˆØ#(ˆŒt�{‰{˜3ÓÑ Ü�‰�} S E¨´·±³¸zÑ1IÈ#Ð0NÐOÔPØˆr$   c                 óÐ  — | xj                   dz  c_         |j                  d«      }d}t        j                  |«      \  }}|dk(  rt	        ||dg d¢«      S |dk(  r|j                  d«      }d}n¡|dk(  r|j                  d«      }d	}nˆ|d
k(  r‚|dk(  rE| j                  d¬«      }|D �cg c]  }t        j                  |d   «      ‘Œ }	}t	        ||d|	«      S t        j                  |«      \  }
}	 t        |
«       |
}|j                  d«      }ny| j                  ||«      }||d   v rt        |d|||«      S ||d   v s|dk(  rt        |d|||«      S yc c}w # t        $ r Y yw xY w)zXReturn HgResource object for path.

        See DAVProvider.get_resource_inst()
        rW   r   Nrá   r*   )r�   rž   Úarchiver�   rž   Útipr÷   é
   )rÒ   rÖ   Ú	Revisionsrä   FrV   T)Ú_count_get_resource_instr¡   r   r    r
   rÍ   rL   rÛ   Ú	Exceptionrõ   r   )r   r   r    r   r   ÚcmdÚrestÚloglistÚmÚmembersÚrevidrX   s               r#   r[   z$HgResourceProvider.get_resource_inst=  s‹  € ð
 	×%Ò%¨Ñ*Õ%ð —j‘j “oˆØˆÜ—M‘M $Ó'‰	ˆˆTà�"Š9Ü$Ø�g˜vÒ'Fóð ð �FŠ]ØŸ*™* S›/ˆKØ‰CØ�JÒØŸ*™* S›/ˆKØ‰CØ�IÒØ�sŠ{àŸ-™-¨b˜-Ó1�Ø?FÖG¸!œ4Ÿ;™; q¨¡}Õ5ÐG�ÐGÜ(¨¨w¸ÀWÓMÐMÜŸ-™-¨Ó-‰KˆE�4ðÜ�E”
ð
 ˆCØŸ*™* S›/‰Kàð ×#Ñ# G¨SÓ1ˆà˜% 
Ñ+Ñ+ä˜d E¨7°C¸ÓEÐEà˜% 
Ñ+Ñ+¨{¸bÒ/@ä˜d D¨'°3¸ÓDÐDØùò1 Høô
 ò áðús   Â(EÃ0E Å	E%Å$E%r:   r­   )	r®   r¯   r°   r±   r   rÍ   rõ   r[   r²   r³   s   @r#   rµ   rµ   š  s   ø„ ñô+óZó*Möx2r$   rµ   )"r±   r(   Úsysrç   Úhashlibr   r   Úwsgidavr   Úwsgidav.dav_errorr   r   Úwsgidav.dav_providerr   r	   Ú"wsgidav.samples.dav_provider_toolsr
   Úmercurial.uirÀ   r   r   Úmercurial.__version__r   r¿   ÚImportErrorr¾   ÚstderrÚ__docformat__Úget_module_loggerr®   r¢   r�   r   rµ   rA   r$   r#   ú<module>r     s›   ðñEóN 
Û 
Û Ý Ý å ß 6ß :Ý @ð
Ûß&Ý:ð &€à
 ˆ$×
 Ñ
  Ó
*€à€ôf�ô fô\	U˜õ Uøð	 ò 
Ù	ØJØ�Z‰Zõð 
ð
ús   ¸A7 Á7B