
>gTI)                 @   st  d  d l  Z  d  d l Z d  d l Z d  d l m Z m Z m Z d  d l m Z m	 Z	 d  d l
 m Z m Z m Z m Z m Z d  d l m Z m Z d  d l m Z e  j d  Z e j d e j  Z e j d	 e j  Z d
 d   Z e d d    Z d d d  Z d d   Z d d   Z d d   Z  d d   Z! e j d  Z" e j d  Z# d d   Z$ d d   Z% d S)    N)existsisdirjoin)PIPEPopen)PKG_PREFIX_MAPPUBLIC_DIR_REPYDIST_DIRSPYDIST_OVERRIDES_FNAMESPYDIST_DPKG_SEARCH_TPLS)get_requested_versionsVersion)memoizedhpythona  
    (?P<name>[A-Za-z][A-Za-z0-9_.\-]*)             # Python distribution name
    \s*
    (?P<vrange>(?:-?\d\.\d+(?:-(?:\d\.\d+)?)?)?) # version range
    \s*
    (?P<dependency>(?:[a-z][^;]*)?)              # Debian dependency
    (?:  # optional upstream version -> Debian version translator
        ;\s*
        (?P<standard>PEP386)?                    # PEP-386 mode
        \s*
        (?P<rules>(?:s|tr|y).*)?                 # translator rules
    )?
    a_  
    (?P<name>[A-Za-z][A-Za-z0-9_.]*)     # Python distribution name
    \s*
    (?P<enabled_extras>(?:\[[^\]]*\])?)  # ignored for now
    \s*
    \(?  # optional parenthesis
    (?:  # optional minimum/maximum version
        (?P<operator><=?|>=?|==|!=)
        \s*
        (?P<version>(\w|[-.])+)
    )?
    \)?  # optional closing parenthesis
    c             C   s   t  |  d d y } xo | D]g } | j d  } | j d  s | rM q n  t j |  s t j d |  j d d  d |  d Sq WWd	 QXd
 S)z Check if pydist file looks good.encodingzutf-8z
#z"invalid pydist data in file %s: %s/   FNT)openstrip
startswith	PYDIST_REmatchlogerrorrsplit)fpathfpline r    '/usr/share/dh-python/dhpython/pydist.pyvalidate>   s    	r"   c       
         s  t  j |   } t |  r' | g } n g  } t j |     t    rt | j   f d d   t j    D  n  d j |   } t |  r | j	 |  n  i  } x!| D]} t
 | d d  } x | D] } | j d  } | j d  s | r q n  t j |  } | s-t d | | f   n  | j   } t | d	  }	 t |  | d
  | d <| d j   | d <| d r| d j d  | d <n
 g  | d <| j |	 g   j	 |  q WWd QXq W| S)zLoad iformation about installed Python distributions.

    :param impl: interpreter implementation, f.e. cpython2, cpython3, pypy
    :type impl: str
    c             3   s   |  ] } t    |  Vq d  S)N)r   ).0i)dnamer    r!   	<genexpr>[   s    zload.<locals>.<genexpr>z%/usr/share/dh-python/dist/{}_fallbackr   zutf-8z
r   zinvalid pydist line: %s (in %s)nameZvrangeversions
dependencyrules;N)r
   getr   r	   r   extendoslistdirformatappendr   r   r   r   search	Exception	groupdict	safe_namer   split
setdefault)
implfnameZto_checkZfbnameresultr   r   r   Zdistr'   r    )r%   r!   loadL   s:    ,

'r;   c             C   s  t  j d | |  t | t  r1 t |  } n  t j d  j |  j   \ } } t	 |  | } t
 |   } t j |  } | s t  j d  t d |   n  | j   } | d } | j | j    } | rx | D] } | r| | j d |  k rq n  | d sd  S| d j d  r1| d S| d	 r| d
 sO| d r| d d k rt | d	 | d | d
  }	 d | d | d |	 f S| d Sq Wn  t |  j t t	 |    }
 t  j d |
  t d |
 d d d t d t } | j   \ } } | j d k rt   } t | d  } xC | j d  D]2 } | j   sWq?n  | j | j d  d  q?Wt |  d k rt  j d |  q| j    Sn t  j d | |  t! |  |  } t  j d | t	 |  | t" |   d  S)Nz,trying to find dependency for %s (python=%s)z([^!><= \(\)\[]+)(.*)z[please ask dh_python3 author to fix REQUIRES_RE or your upstream author to fix requires.txtzrequirement is not valid: %sr'   r(   r)   )versionstandardr*   operator==z
%s (%s %s)zinvoking dpkg -S %sz/usr/bin/dpkg -S %sshellTstdoutstderrr   zutf-8
:r   z,more than one package name found for %s distz'dpkg -S did not find package for %s: %szCannot find package that provides %s. Please add package that provides it to Build-Depends or add "%s %s-fixme" line to %s or add proper  dependency to Depends by hand and ignore this info.)Nr@   )#r   debug
isinstancestrr   recompiler   groupsr5   r;   REQUIRES_REinfor3   r4   r,   lowerendswith
_translater   r0   	ci_regexpr   r   Zcommunicate
returncodesetr6   r   addlenr   popsensible_pnamer
   )r8   Zreqr=   r'   restdataZreq_dZdetailsitemvZqueryZprocessrB   rC   r:   r   Zpnamer    r    r!   guess_dependencyw   s\    	
$

		r\   c             C   s  t  |  j |  } | rF t | j d   d k rF | j d  } n d  } g  } d } } g  } t | d d d  } x | D] }	 |	 j   }	 |	 s |	 j d  r | j |	  q n  |	 j d  r d } n  | r | j |	  q n  t |  |	 |  }
 |
 r=| j |
  d	 |	 j	   k r-d } qJ| j |	  q | j |	  q WWd  QX| rt | d
 d d ! } | j
 d d   | D  Wd  QXn  | S)Nr   Frr   zutf-8r   [TZ
setuptoolswc             s   s   |  ] } | d  Vq d S)rD   Nr    )r#   r$   r    r    r!   r&      s    zparse_pydep.<locals>.<genexpr>)r   r   rU   groupr   r   r   r1   r\   rN   
writelines)r8   r9   Z
public_dirZverr:   ZmodifiedZoptional_sectionZ	processedr   r   r)   r    r    r!   parse_pydep   s:    !
		#rb   c             C   s   t  j d  j d |   j   S)zEmulate distribute's safe_name.z[^A-Za-z0-9.]+_)rI   rJ   subrN   )r'   r    r    r!   r5      s    r5   c             C   sT   t  |  j d d  } | j d  r: | d d  } n  d j t |  | j    S)z(Guess Debian package name from Egg name.rc   -zpython-   Nz{}-{})r5   replacer   r0   r   rN   )r8   Zegg_namer    r    r!   rW      s    rW   c             C   s    d j  d d   |  j   D  S)z'Return case insensitive dpkg -S regexp. c             s   s7   |  ]- } | j    r+ d  | j   | f n | Vq d S)z[%s%s]N)isalphaupper)r#   r$   r    r    r!   r&      s    zci_regexp.<locals>.<genexpr>)r   rN   )r'   r    r    r!   rQ      s    rQ   z[-.]?(alpha|beta|rc|dev|a|b|c)z\$(\d+)c             C   s   t  j d |   S)zdConvert Perl RE patterns used in uscan to Python's

    >>> print(_pl2py('foo$3'))
    foo\g<3>
    z\\g<\1>)GROUP_RErd   )patternr    r    r!   _pl2py   s    rm   c       	      C   sx  xP| D]H} | j  d  r~ | j  d  r1 d n d } | | d d  j | |  } |  j t j | d | d   }  q | j  d  r?| d d  j | d  } t j | d  } d } | d d  r| d } d | k r d } n  d	 | k rt j | d t j  } qn  | j t	 | d  |  |  }  q t
 j d
 |  q W| d k rtt j d |   }  n  |  S)a>  Translate Python version into Debian one.

    >>> _translate('1.C2betac', ['s/c//gi'], None)
    '1.2beta'
    >>> _translate('5-fooa1.2beta3-fooD',
    ...     ['s/^/1:/', 's/-foo//g', 's:([A-Z]):+$1:'], 'PEP386')
    '1:5~a1.2~beta3+D'
    >>> _translate('x.y.x.z', ['tr/xy/ab/', 'y,z,Z,'], None)
    'a.b.a.Z'
    tryr      Nr   sgr$   zunknown rule ignored: %sZPEP386z~\g<1>)rn   ro   )r   r6   	translaterH   	maketransrI   rJ   Ird   rm   r   warn
PRE_VER_RE)	r=   r*   r>   ZruleposZtmprl   countflagsr    r    r!   rP      s(    !&
	"rP   )&Zloggingr.   rI   os.pathr   r   r   
subprocessr   r   r   r   r   r	   r
   r   Zdhpython.versionr   r   Zdhpython.toolsr   Z	getLoggerr   rJ   VERBOSEr   rL   r"   r;   r\   rb   r5   rW   rQ   rw   rk   rm   rP   r    r    r    r!   <module>   s.   (+E$	