
[YE                 @   si  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 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- e. d- k rex( e* e j/ d.  D] Z0 e1 e0  qNWn  d S)/    N)log)unicode)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   G/home/kubikplay/www/django_dtb/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    r/   c             G   s6   |  s |  d k r# t  j j |   St  j j |  |  S)N.)ospathr$   )prefixsuffixr   r   r   joinpathG   s    r5   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    r@   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&   deleter2   kindr   N)xmldompulldomparseStringr/   listnodeName
expandNoder'   r>   appendgetAttribute)r.   docentrieseventnoder   r   r   parse_dir_entries   s    	rW   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 xmlrG   r)   r2   r   N)r1   r2   normpathnormcaserJ   rK   rL   rM   r/   rN   rO   rP   rR   r>   lenr*   parse_external_proprQ   r5   )	r.   r3   rS   	externalsrU   rV   r2   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)rC   )r    xr   r   r   r"      s   	 z'parse_external_prop.<locals>.<listcomp>r   r   )r+   r   )r+   r   r`   )
splitlineslstripr   r,   r-   shlexspliturlparseurlsplitr   rQ   r1   r2   rX   )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readlinerd   rZ   readintclose)	filenamekeyfoundfr   rh   partsrI   lengthr   r   r   parse_prop_file   s    	ry   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   s?   t  d d d g  \ }  } |  d k r7 | r7 | j   Sd Sd  S)Nsvnz	--versionz--quietr   r   )r   strip)coder   r   r   r   get_svn_version   s    
zSvnInfo.get_svn_versionz!(?:([\-0-9]+):)?(\d+)([a-z]*)\s*$r   c       	      C   sh  t  j j |  } t d d | g  \ } } t  j j | d  } t  j j t  j j | d   p t  j j t  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  rHt j d t  t |  S| d k  r^t |  St |  S)Nr{   infoz.svnrT   z	dir-propszdir-prop-baser0   c             s   s   |  ] } t  |  Vq d  S)N)rq   )r    r_   r   r   r   	<genexpr>  s    zSvnInfo.load.<locals>.<genexpr>rj   r   r+   z?No SVN 1.3+ command found: falling back on pre 1.7 .svn parsing   )r   r+   )r   r   )r1   r2   rX   r   r$   isfiletupler~   rd   
ValueErrorrz   warningswarnDeprecationWarningSvnFileInfo	Svn13Info	Svn15Info)	clsdirnamenormdirr}   r   Zsvn_dirZhas_svnsvn_versionZbase_svn_versionr   r   r   load   s(    !!!'
	

zSvnInfo.loadc             C   s   | |  _  d  |  _ d  |  _ d  S)N)r2   _entries
_externals)selfr2   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   rj   N)r   r2   r   r   revision_rematchrq   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   rT   (  s    zSvnInfo.entriesc             C   s(   |  j  d  k r! |  j   |  _  n  |  j  S)N)r   get_externals)r   r   r   r   r\   .  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_externals4  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)rT   lower)r   r   rI   r   r   r   
iter_files;  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)r2   rT   r   )r   Zinclude_rootr   rI   r   r   r   	iter_dirsC  s
    zSvnInfo.iter_dirsc             C   s   g  S)Nr   )r   r   r   r   r   M  s    zSvnInfo.get_entriesc             C   s   g  S)Nr   )r   r   r   r   r   P  s    zSvnInfo.get_externalsN)__name__
__module____qualname____doc__staticmethodr~   recompileIr   classmethodr   r   r   r(   rT   r\   r   r   r   r   r   r   r   r   r   rz      s   
rz   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   r2   r   debugrW   )r   r}   r   r   r   r   r   U  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[   r1   r2   r$   rQ   rX   )r   cmdresultfolderr}   rg   r]   r   r   r   r   _  s    !zSvn13Info.get_externalsN)r   r   r   r   r   r   r   r   r   r   T  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 failedr3   )r2   r   r   r   r^   r1   abspath)r   r   r}   rg   r   r   r   r   s  s    zSvn15Info.get_externalsN)r   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   r2   )	__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.svnrT   FT)r5   r1   r2   r   SVNEntriesFiler   parse_revisionget_undeleted_recordsr   isdir	_walk_svn)r   base
entry_filerT   r2   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   )rN   r   r2   rQ   maxr   r   )r   rT   revr2   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   r5   r1   r2   r   ry   r   extendr[   )r   Z
prop_filesr\   r   Z	prop_fileZ	rel_partsrs   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)rz   r   r   r   )r   r   r2   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.svnrT   )r1   r2   r$   rm   r   rp   rr   )class_r   rs   rv   r   r   r   r   r     s    zSVNEntriesFile.loadc             C   s5   | j    } | j d  } t t g | }  |  |  S)Nz<?xml)rp   r>   SVNEntriesFileTextSVNEntriesFileXML)r   fileobjr   Zis_xmlr   r   r   rp     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   rp   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   rd   mapstrra   rq   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   )rZ   rq   )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   rH   )rZ   )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   )rq   r   )r    mr   r   r   r"   $  s   	z<SVNEntriesFileXML.parse_revision_numbers.<locals>.<listcomp>)r   r   finditerr   )r   Zrevrer   r   r   r   !  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   )2r1   r   r   	distutilsr   Zxml.dom.pulldomrJ   rc   r7   r:   rD   r   Zsetuptools.compatr   xml.sax.saxutilsr   re   ImportErrorurllib.parseparse
subprocessr   r   r   Z_PIPEr   r'   r*   r/   r5   r@   rA   r   rW   r^   r[   ry   objectrz   r   r   r   r   r   r   r   r   argvnameprintr   r   r   r   <module>   sN   		$t
B3