
 XI                 @   sy  d  d l  Z  d  d l Z d  d l Z d  d l m Z d  d l Z d  d l Z d  d l 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 y d  d l Z Wn! e k
 r d  d l j Z Yn Xd  d l m Z m Z e e d d  d d  Z d	 d
   Z d d   Z d d   Z d d   Z d d   Z  e    Z! d d d  Z" d d   Z# d d d  Z$ d d   Z% d d   Z& Gd d   d e'  Z( Gd  d!   d! e(  Z) Gd" d#   d# e)  Z* Gd$ d%   d% e(  Z+ d d& d'  Z, Gd( d)   d) e'  Z- Gd* d+   d+ e-  Z. Gd, d-   d- e-  Z/ e0 d. k rux( e, e j1 d/  D] Z2 e3 e2  q^Wn  d S)0    N)log)unicode)TemporaryDirectory)unescape)PopenPIPEc             C   sp   y; t  |  d | d | d t j d k } | j   | } Wn t k
 rS d SYn Xt | |  } | j | f S)Nstdoutstderrshellwin32    )r   r   )_PopensysplatformcommunicateOSErrordecode_as_string
returncode)argsr   r	   encodingstreamprocdata r   F/home/ubuntu/projects/ifolica/build/setuptools/setuptools/svn_utils.py_run_command   s    	r   c             C   s0   |  j  d  d } d j d d   | j D  S)Nscheduler   r   c             S   s+   g  |  ]! } | j  | j k r | j  q Sr   )nodeType	TEXT_NODE	nodeValue).0tr   r   r   
<listcomp>2   s   	z'_get_entry_schedule.<locals>.<listcomp>)getElementsByTagNamejoin
childNodes)entryr   r   r   r   _get_entry_schedule0   s    r(   c             C   s0   |  j  d  d } d j d d   | j D  S)Npropertyr   r   c             S   s+   g  |  ]! } | j  | j k r | j  q Sr   )r   r   r    )r!   r"   r   r   r   r#   9   s   	z(_get_target_property.<locals>.<listcomp>)r$   r%   r&   )targetZproperty_textr   r   r   _get_target_property7   s    r+   c             C   s+   t  j d k  r! |  j d  } n |  } | S)N   r   zutf-8)r,   r   )r   version_infoencode)decoded_strr   r   r   r   _get_xml_data>   s    r0   c             G   s6   |  s |  d k r# t  j j |   St  j j |  |  S)N.)ospathr%   )prefixsuffixr   r   r   joinpathG   s    r6   c              C   s   yL t  j   }  |  s" |  d k r5 t  j   d }  n  |  rK t j |   n  Wn! t  j t f k
 ro d  }  Yn Xt j d k } |  s d d g | S|  j	 d  r | r d S|  Sd  S)NzUS-ASCIIr   darwinzutf-8zmac-)
localegetpreferredencodinggetdefaultlocalecodecslookupErrorLookupErrorr   r   
startswith)r   is_osxr   r   r   determine_console_encodingL   s    rA   c             C   sL   | d k r t  } n  t |  t  s6 |  j |  }  n  t j d |   }  |  S)a  
    Decode the console or file output explicitly using getpreferredencoding.
    The text paraemeter should be a encoded string, if not no decode occurs
    If no encoding is given, getpreferredencoding is used.  If encoding is
    specified, that is used instead.  This would be needed for SVN --xml
    output.  Unicode is explicitly put in composed NFC form.

    --xml should be UTF-8 (SVN Issue 2938) the discussion on the Subversion
    DEV List from 2007 seems to indicate the same.
    NZNFC)_console_encoding
isinstancer   decodeunicodedata	normalize)textr   r   r   r   r   i   s    	r   c             C   s   t  j j j t |    } t   } x| | D]t \ } } | d k r+ | j d k r+ | j |  t |  j	 d  s | j
 | j d  | j d  f  q q+ q+ W| d d  S)z+Parse the entries from a recursive info xmlSTART_ELEMENTr'   deleter3   kindr   N)xmldompulldomparseStringr0   listnodeName
expandNoder(   r?   appendgetAttribute)r/   docentrieseventnoder   r   r   parse_dir_entries   s    	rX   r   c       	      C   s  t  j j |  } t  j j |  } t j j j t |    } t	   } x | D] \ } } | d k rO | j
 d k rO | j |  t  j j | j d   } t  j j |  j |  r | t |  d d  } n  t |  } x- t |  D] } | j t | |   q WqO qO W| S)z!Parse a propget svn:externals xmlrH   r*   r3   r   N)r2   r3   normpathnormcaserK   rL   rM   rN   r0   rO   rP   rQ   rS   r?   lenr+   parse_external_proprR   r6   )	r/   r4   rT   	externalsrV   rW   r3   r   externalr   r   r   parse_externals_xml   s    	!r_   c             C   s   g  } x |  j    D] } | j   } | s1 q n  t j d k  rR | j d  } n  t j |  } t j d	 k  r d d   | D } n  t j | d
  d r | d } n
 | d } t	 | d d } | j
 t j j |   q W| S)z
    Parse the value of a retrieved svn:externals entry.

    possible token setups (with quotng and backscaping in laters versions)
        URL[@#] EXT_FOLDERNAME
        [-r#] URL EXT_FOLDERNAME
        EXT_FOLDERNAME [-r#] URL
    r,   r   zutf-8c             S   s   g  |  ] } | j  d    q S)zutf-8)rD   )r!   xr   r   r   r#      s   	 z'parse_external_prop.<locals>.<listcomp>r   r   )r,   r   )r,   r   ra   )
splitlineslstripr   r-   r.   shlexspliturlparseurlsplitr   rR   r2   r3   rY   )linesr]   liner^   r   r   r   r\      s     	
r\   c       	   
   C   s   d } t  |  d  } d } z x t | j d  D] } | j   } t |  d k r1 | \ } } | j t |   } | d k r | | k r d } q | d k r | r Pq q1 q1 WWd  | j   X| S)NFrtr      KTV)openiterreadlinere   r[   readintclose)	filenamekeyfoundfr   ri   partsrJ   lengthr   r   r   parse_prop_file   s    	rz   c               @   s   e  Z d  Z d Z e d d    Z e j d e j  Z	 e
 d d d   Z d d d	  Z d
 d   Z e d d    Z e d d    Z d d   Z d d   Z d d d  Z d d   Z d d   Z d S)SvnInfoz
    Generic svn_info object.  No has little knowledge of how to extract
    information.  Use cls.load to instatiate according svn version.

    Paths are not filesystem encoded.
    c              C   sW   t    ( }  t d d |  d d g  \ } } Wd  QX| d k rO | rO | j   Sd Sd  S)Nsvnz--config-dirz	--versionz--quietr   r   )r   r   strip)tempdircoder   r   r   r   get_svn_version   s    
zSvnInfo.get_svn_versionz!(?:([\-0-9]+):)?(\d+)([a-z]*)\s*$r   c       
      C   sE  t  j j |  } t   ( } t d d | d | g  \ } } Wd  QXt  j j | d  } | p t  j j t  j j | d   } t |  j   j	 d   } y' t d d   | d  d	  D  }	 Wn t
 k
 r t   }	 Yn X| s t |  S| s|	 s|	 d k  r%t j d t  t |  S|	 d k  r;t |  St |  S)Nr|   z--config-dirinfoz.svnrU   r1   c             s   s   |  ] } t  |  Vq d  S)N)rr   )r!   r`   r   r   r   	<genexpr>  s    zSvnInfo.load.<locals>.<genexpr>rk   r   r,   z?No SVN 1.3+ command found: falling back on pre 1.7 .svn parsing   )r   r,   )r   r   )r2   r3   rY   r   r   r%   isfiletupler   re   
ValueErrorr{   warningswarnDeprecationWarningSvnFileInfo	Svn13Info	Svn15Info)
clsdirnamenormdirr~   r   r   Zsvn_dirZ	is_svn_wdsvn_versionZbase_svn_versionr   r   r   load   s,    !'
	

zSvnInfo.loadc             C   s   | |  _  d  |  _ d  |  _ d  S)N)r3   _entries
_externals)selfr3   r   r   r   __init__)  s    		zSvnInfo.__init__c             C   sh   t  d d |  j g  \ } } | r5 t j d  d S|  j j |  } | r` t | j d   Sd Sd S)z<Retrieve the directory revision informatino using svnversionZ
svnversionz-czsvnversion failedr   rk   N)r   r3   r   r   revision_rematchrr   group)r   r   r   parsedr   r   r   get_revision.  s    zSvnInfo.get_revisionc             C   s(   |  j  d  k r! |  j   |  _  n  |  j  S)N)r   get_entries)r   r   r   r   rU   ;  s    zSvnInfo.entriesc             C   s(   |  j  d  k r! |  j   |  _  n  |  j  S)N)r   get_externals)r   r   r   r   r]   A  s    zSvnInfo.externalsc             c   s   x |  j  D] } | Vq
 Wd S)zR
        Iterate over the svn:external references in the repository path.
        N)r]   )r   itemr   r   r   iter_externalsG  s    zSvnInfo.iter_externalsc             c   s8   x1 |  j  D]& \ } } | j   d k r
 | Vq
 q
 Wd S)zR
        Iterate over the non-deleted file entries in the repository path
        fileN)rU   lower)r   r   rJ   r   r   r   
iter_filesN  s    zSvnInfo.iter_filesTc             c   sI   | r |  j  Vn  x1 |  j D]& \ } } | j   d k r | Vq q Wd S)zR
        Iterate over the non-deleted file entries in the repository path
        dirN)r3   rU   r   )r   Zinclude_rootr   rJ   r   r   r   	iter_dirsV  s
    zSvnInfo.iter_dirsc             C   s   g  S)Nr   )r   r   r   r   r   `  s    zSvnInfo.get_entriesc             C   s   g  S)Nr   )r   r   r   r   r   c  s    zSvnInfo.get_externalsN)__name__
__module____qualname____doc__staticmethodr   recompileIr   classmethodr   r   r   r)   rU   r]   r   r   r   r   r   r   r   r   r   r{      s   (
r{   c               @   s(   e  Z d  Z d d   Z d d   Z d S)r   c             C   sK   t  d d d d |  j g d d \ } } | rA t j d  g  St |  S)Nr|   r   z-Rz--xmlr   zutf-8zsvn info failed)r   r3   r   debugrX   )r   r   r   r   r   r   r   h  s    zSvn13Info.get_entriesc             C   s   d d d g } g  } x |  j    D] } t | | g d d \ } } | d k rd t j d  g  SxK t |  D]= } | r t j j | |  } n  | j t j j	 |   qq Wq" W| S)Nr|   propgetzsvn:externalsr   zutf-8r   zsvn propget failed)
r   r   r   r   r\   r2   r3   r%   rR   rY   )r   cmdresultfolderr   rh   r^   r   r   r   r   r  s    !zSvn13Info.get_externalsN)r   r   r   r   r   r   r   r   r   r   g  s   
r   c               @   s   e  Z d  Z d d   Z d S)r   c             C   si   d d d |  j  d d g } t | d d \ } } | rJ t j d  g  St | d	 t j  j |  j   S)
Nr|   r   zsvn:externalsz-Rz--xmlr   zutf-8zsvn propget failedr4   )r3   r   r   r   r_   r2   abspath)r   r   r   rh   r   r   r   r     s    zSvn15Info.get_externalsN)r   r   r   r   r   r   r   r   r     s   r   c                   sa   e  Z d  Z d   f d d  Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z   S)r   r   c                s,   t  t |   j |  d  |  _ d  |  _ d  S)N)superr   r   Z_directories	_revision)r   r3   )	__class__r   r   r     s    	zSvnFileInfo.__init__c             c   s   t  | d d  } t j j |  r t j |  } | d | j   f Vx | j   D]x } t |  } t  | |  } t j j |  r | d d  f VqT t j j	 |  rT x |  j
 |  D] } | Vq WqT qT Wn  d  S)Nz.svnrU   FT)r6   r2   r3   r   SVNEntriesFiler   parse_revisionget_undeleted_recordsr   isdir	_walk_svn)r   base
entry_filerU   r3   r   r   r   r   r     s    zSvnFileInfo._walk_svnc             C   s   t    } d } xa |  j |  j  D]M \ } } } | rM | j | d f  q" | j | d f  t | |  } q" W| |  _ | |  _ d  S)Nr   r   r   )rO   r   r3   rR   maxr   r   )r   rU   revr3   r   Zdir_revr   r   r   _build_entries  s    	"	zSvnFileInfo._build_entriesc             C   s#   |  j  d  k r |  j   n  |  j  S)N)r   r   )r   r   r   r   r     s    zSvnFileInfo.get_entriesc             C   s#   |  j  d  k r |  j   n  |  j  S)N)r   r   )r   r   r   r   r     s    zSvnFileInfo.get_revisionc             C   s   d d g d d g g } g  } x |  j    D] } d  } x8 | D]0 } t | |  } t j j |  r> | } q> q> W| d  k	 r+ t | d  } t | d d } | j t |   q+ q+ W| S)Nz.svnzdir-prop-basez	dir-propszsvn:externalsr   zutf-8)	r   r6   r2   r3   r   rz   r   extendr\   )r   Z
prop_filesr]   r   Z	prop_fileZ	rel_partsrt   Zext_propr   r   r   r     s    	zSvnFileInfo.get_externals)	r   r   r   r   r   r   r   r   r   r   r   )r   r   r     s   r   c             c   sq   t  j |   } x | j   D] } | Vq Wx? | j   D]1 } t  j |  } x | j   D] } | VqZ Wq8 Wd  S)N)r{   r   r   r   )r   r   r3   Zsub_infoZsub_pathr   r   r   
svn_finder  s    	r   c               @   sL   e  Z d  Z d d   Z e d d    Z e d d    Z d d   Z d	 S)
r   c             C   s   | |  _  d  S)N)r   )r   r   r   r   r   r     s    zSVNEntriesFile.__init__c          
   C   sI   t  j j | d d  } t |  } z t j |  } Wd  | j   X| S)Nz.svnrU   )r2   r3   r%   rn   r   rq   rs   )class_r   rt   rw   r   r   r   r   r     s    zSVNEntriesFile.loadc             C   s5   | j    } | j d  } t t g | }  |  |  S)Nz<?xml)rq   r?   SVNEntriesFileTextSVNEntriesFileXML)r   fileobjr   Zis_xmlr   r   r   rq     s    zSVNEntriesFile.readc             C   s   |  j    d g } t |  S)Nr   )parse_revision_numbersr   )r   Zall_revsr   r   r   r     s    zSVNEntriesFile.parse_revisionN)r   r   r   r   r   r   rq   r   r   r   r   r   r     s   
r   c               @   ss   e  Z d  Z i d d 6d d 6d d 6Z d d   Z d	 d
   Z d d   Z d d   Z d d   Z d d   Z	 d S)r      z1.4.x	   z1.5.x
   z1.6.xc             C   s   |  j  S)N)sections)r   r   r   r   Z__get_cached_sections  s    z(SVNEntriesFileText.__get_cached_sectionsc             C   s   d } |  j  j |  } d d   t t j |  D } yE t | d j d   } | |  j j   k r{ t	 j
 d |  n  Wn t k
 r d  SYn X| |  _ |  j |  _ |  j S)Nz
c             S   s   g  |  ] } |  q Sr   r   )r!   r`   r   r   r   r#     s   	 z3SVNEntriesFileText.get_sections.<locals>.<listcomp>r   zUnknown subversion verson %d)r   re   mapstrrb   rr   popknown_svn_versionsvaluesr   r   r   r   (_SVNEntriesFileText__get_cached_sectionsget_sections)r   ZSECTION_DIVIDERr   r   r   r   r   r     s    		zSVNEntriesFileText.get_sectionsc             C   s   t  |  j    S)N)boolr   )r   r   r   r   is_valid  s    zSVNEntriesFileText.is_validc             C   s   |  j    d d S)Nr      )r   )r   r   r   r   get_url  s    zSVNEntriesFileText.get_urlc                s)   d     f d d   |  j    D } | S)Nr   c                s<   g  |  ]2 } t  |    k r |   r t |     q Sr   )r[   rr   )r!   section)revision_line_numberr   r   r#     s   	z=SVNEntriesFileText.parse_revision_numbers.<locals>.<listcomp>)r   )r   Zrev_numbersr   )r   r   r     s    z)SVNEntriesFileText.parse_revision_numbersc                s/   d d       f d d   |  j    D } | S)Nc             S   s0   |  o/ |  d o/ t  |   d k  p/ |  d d k S)Nr      r   rI   )r[   )sr   r   r   <lambda>"  s    z:SVNEntriesFileText.get_undeleted_records.<locals>.<lambda>c                s&   g  |  ] }   |  r | d   q S)r   r   )r!   r   )	undeletedr   r   r#   $  s   	z<SVNEntriesFileText.get_undeleted_records.<locals>.<listcomp>)r   )r   r   r   )r   r   r   !  s    z(SVNEntriesFileText.get_undeleted_recordsN)
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   

r   c               @   s@   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 S)
r   c             C   s   d S)NTr   )r   r   r   r   r   ,  s    zSVNEntriesFileXML.is_validc             C   s(   t  j d  } | j |  j  j d  S)zGet repository URLzurl="([^"]+)"r   )r   r   searchr   r   )r   Zurlrer   r   r   r   /  s    zSVNEntriesFileXML.get_urlc             C   s,   t  j d  } d d   | j |  j  D S)Nzcommitted-rev="(\d+)"c             S   s%   g  |  ] } t  | j d     q S)r   )rr   r   )r!   mr   r   r   r#   7  s   	z<SVNEntriesFileXML.parse_revision_numbers.<locals>.<listcomp>)r   r   finditerr   )r   Zrevrer   r   r   r   4  s    	z(SVNEntriesFileXML.parse_revision_numbersc             C   s8   t  j d t  j  } d d   | j |  j  D } | S)Nz%name="([^"]+)"(?![^>]+deleted="true")c             S   s%   g  |  ] } t  | j d     q S)r   )r   r   )r!   r   r   r   r   r#   ?  s   	z;SVNEntriesFileXML.get_undeleted_records.<locals>.<listcomp>)r   r   r   r   r   )r   Zentries_patternresultsr   r   r   r   ;  s    	z'SVNEntriesFileXML.get_undeleted_recordsN)r   r   r   r   r   r   r   r   r   r   r   r   +  s   r   __main__r   )4r2   r   r   	distutilsr   Zxml.dom.pulldomrK   rd   r8   r;   rE   r   Zsetuptools.compatr   Zsetuptools.py31compatr   xml.sax.saxutilsr   rf   ImportErrorurllib.parseparse
subprocessr   r   r   Z_PIPEr   r(   r+   r0   r6   rA   rB   r   rX   r_   r\   rz   objectr{   r   r   r   r   r   r   r   r   argvnameprintr   r   r   r   <module>   sP   		$
B3