
 X)                 @   s  d  d l  Z  d  d l Z d  d l m Z d  d l m Z d  d l m Z m Z m	 Z	 d  d l
 m Z d  d l m Z m Z e j d  Z e j d  Z e j d	  Z e j d
  Z e j d  Z e j d  Z Gd d   d e  Z d d   Z e j e  d S)    N)urlparse)Link)rmtreedisplay_pathcall_subprocess)logger)vcsVersionControlzurl="([^"]+)"zcommitted-rev="(\d+)"z	URL: (.+)zRevision: (.+)z\s*revision="(\d+)"z<url>(.*)</url>c                   s   e  Z d  Z d Z d Z d Z d' Z d Z d	 Z d
 d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z   f d d   Z d d   Z d d   Z d  d!   Z d" d#   Z d$ d% d&  Z   S)(
Subversionsvnz.svncheckoutsvn+sshsvn+http	svn+httpssvn+svnzsvn-checkout.txtzg# This was an svn checkout; to make it a checkout again run:
svn checkout --force -r %(rev)s %(url)s .
c             C   s  | j  d  j |  j  s, t d |   t |  j d | g d d d i d d 6} t j |  } | s t j	 d	 t
 |   t j d
 |  d S| j d  j   } t j |  } | s t j	 d t
 |   t j d
 |  | d f S| | j d  f S)z/Returns (url, revision), where both are strings/zBad directory: %sinfoshow_stdoutFextra_environCLANGz'Cannot determine URL of svn checkout %sz!Output that cannot be parsed: 
%sN   z,Cannot determine revision of svn checkout %s)NN)rstripendswithdirnameAssertionErrorr   cmd_svn_url_researchr   warnr   r   groupstrip_svn_revision_re)selflocationoutputmatchurl r(   =/home/ubuntu/projects/ifolica/build/pip/pip/vcs/subversion.pyget_info   s    ,(
zSubversion.get_infoc             C   s   x | j    D] } | j   s | j   j d  r; q n  t j d |  } | sW d S| j d  } | | j   d   j   j d  d  d } | | f SWd S)N#z^-r\s*([^ ])?r   r   )NN)NN)
splitlinesr!   
startswithrer   r    endsplit)r#   contentliner&   revrestr(   r(   r)   parse_vcs_bundle_file,   s    ",z Subversion.parse_vcs_bundle_filec             C   s   |  j    \ } } t | |  } t j d | | f  t j d 7_ zS t j j |  ri t |  n  t	 |  j
 d g | | | g d |  j d d Wd t j d 8_ Xd S)z@Export the svn repository at the url to the destination locationz!Exporting svn repository %s to %s   exportfilter_stdoutr   FN)get_url_revget_rev_optionsr   notifyindentospathexistsr   r   r   _filter)r#   r$   r'   r3   rev_optionsr(   r(   r)   r7   8   s    zSubversion.exportc             C   s%   t  |  j d g | | | g  d  S)Nswitch)r   r   )r#   destr'   rA   r(   r(   r)   rB   I   s    zSubversion.switchc             C   s"   t  |  j d g | | g  d  S)Nupdate)r   r   )r#   rC   rA   r(   r(   r)   rD   M   s    zSubversion.updatec             C   s   |  j    \ } } t | |  } | r4 d | } n d } |  j | | | |  r t j d | | t |  f  t |  j d d g | | | g  n  d  S)Nz (to revision %s) zChecking out %s%s to %sr   z-q)r9   r:   check_destinationr   r;   r   r   r   )r#   rC   r'   r3   rA   rev_displayr(   r(   r)   obtainQ   s    	zSubversion.obtainc             C   s   x | D] } t  |  j } | s( q n  d | k r_ d j | j d  d  d   j   } n | } | | j k r | j d d  d Sq Wd  S)N-r   r+   r   )r   egg_fragmentjoinr0   lowerkey)r#   distdependency_linksr'   rK   rN   r(   r(   r)   get_location^   s    +zSubversion.get_locationc       
      C   s   d } x t  j |  D] \ } } } |  j | k rJ g  | d d  <q n  | j |  j  t  j j | |  j d  } t  j j |  s q n  |  j |  \ } } | | k r | d }	 n- | s | j |	  r g  | d d  <q n  t	 | |  } q W| S)zR
        Return the maximum revision for all files under a given location
        r   Nentriesr   )
r=   walkr   remover>   rL   r?   _get_svn_url_revr-   max)
r#   r$   revisionbasedirsfiles
entries_fndirurllocalrevbase_urlr(   r(   r)   get_revisionl   s"    zSubversion.get_revisionc                sA   t  t |   j   \ } } | j d  r7 d | } n  | | f S)Nzssh://zsvn+)superr
   r9   r-   )r#   r'   r3   )	__class__r(   r)   r9      s    zSubversion.get_url_revc             C   sx   | } x^ t  j j t  j j | d   sf | } t  j j |  } | | k r	 t j d |  d  Sq	 W|  j |  d S)Nzsetup.pyzGCould not find setup.py for directory %s (tried all parent directories)r   )r=   r>   r?   rL   r   r   r   rU   )r#   r$   orig_locationlast_locationr(   r(   r)   get_url   s    $	zSubversion.get_urlc       
      C   s  d d l  m } t t j j | |  j d   } | j   } | j   | j	 d  st | j	 d  st | j	 d  r t
 t t j | j d    } | d d =| d d } d	 d
   | D d g } n | j	 d  r7t j |  } | st d |   n  | j d  } d d
   t j |  D d g } n{ yY t |  j d d | g d d } t j |  j d  } d d
   t j |  D } Wn | k
 rd  g  } } Yn X| rt |  }	 n d }	 | |	 f S)Nr   )InstallationErrorrR   8910z

   c             S   s<   g  |  ]2 } t  |  d  k r | d  r t | d    q S)	   )lenint).0dr(   r(   r)   
<listcomp>   s   	 z/Subversion._get_svn_url_rev.<locals>.<listcomp>z<?xmlzBadly formatted data: %rr   c             S   s%   g  |  ] } t  | j d     q S)r   )rl   r    )rm   mr(   r(   r)   ro      s   	 r   z--xmlr   Fc             S   s%   g  |  ] } t  | j d     q S)r   )rl   r    )rm   rp   r(   r(   r)   ro      s   	 )pip.exceptionsre   openr=   r>   rL   r   readcloser-   listmapstrr,   r0   _svn_xml_url_rer   
ValueErrorr    _svn_rev_refinditerr   r   _svn_info_xml_url_re_svn_info_xml_rev_rerV   )
r#   r$   re   fdatar'   revsr&   xmlr3   r(   r(   r)   rU      s2    !
-!&! zSubversion._get_svn_url_revc             C   s   t  |  j d d | g d d } g  } xV | j   D]H } | j   } t | d  } | d j d  } | j | | f  q4 W| S)	Nlsz-vr   Fr   r   r   rJ   )r   r   r,   r0   rl   r!   append)r#   svn_tag_urlstdoutresultsr2   partsr3   tagr(   r(   r)   get_tag_revs   s    zSubversion.get_tag_revsc             C   sZ   d  } d  } xG | D]? \ } } | | k r | d  k sC | | k r | } | } q q W| S)Nr(   )r#   r3   tag_revsbest_match_revbest_tagr   tag_revr(   r(   r)   find_tag_match   s    zSubversion.find_tag_matchFc             C   s  |  j  |  } | d  k r d  S| j d  } | j   j d d  d } |  j |  } | d d k r d | | d f } n | d d k r d | j   | d | f } n | d d k rZd | j   | f } | r{d j | d  d   d }	 |  j |	  }
 |  j | |
  } | rWt j d |  d |	 | f } d | | f } qWq{n! t j	 d |  d | | f } d | | | f S)Nr   rI   r   r   r6   tagsr   z%s-%sbranchesbranchz	%s-%s-r%strunkz
%s-dev_r%sz/tagsz2trunk checkout %s seems to be equivalent to tag %sz%s/%sz?svn URL does not fit normal structure (tags/branches/trunk): %szsvn+%s@%s#egg=%s)ztagsztagrJ   r   )zbrancheszbranchrJ   rJ   rJ   )
rd   r0   egg_namer_   rL   r   r   r   r;   r   )r#   rO   r$   	find_tagsrepor   egg_project_namer3   full_egg_nametag_urlr   r&   r(   r(   r)   get_src_requirement   s.     zSubversion.get_src_requirement)zsvnr   r   r   r   )__name__
__module____qualname__namer   	repo_nameschemesbundle_fileguider*   r5   r7   rB   rD   rH   rQ   r_   r9   rd   rU   r   r   r   r(   r(   )ra   r)   r
      s(   !r
   c             C   s   | r d | g } n g  } t  j |   } t | d  rO | j | j } } nl | d } d | k r | j d  d } d | k r | j d d  \ } } q | d  } } n d	 \ } } | r | d | g 7} n  | r | d | g 7} n  | S)
Nz-rusernamer   @r   :z
--usernamez
--password)NN)r   urlsplithasattrr   passwordr0   )r'   r3   rA   rr   r   netlocauthr(   r(   r)   r:      s$    
r:   )r=   r.   Zpip.backwardcompatr   	pip.indexr   pip.utilr   r   r   pip.logr   pip.vcsr   r	   compilerx   rz   r   r"   r}   r|   r
   r:   registerr(   r(   r(   r)   <module>   s   