
    @dc              	          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m	Z	m
Z
 d dlmZmZ edk    rXd dlZej                            ej                             e
ej                            e          d                               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 d d
l m!Z!m"Z"  ej#        d          Z$ ej%        dej&                  Z' ej%        dej&                  Z( ej%        dej&                  Z) ej%        dej&                  Z*dddddZ+d Z,ed             Z-	 	 d,dZ.d Z/	 	 d-dZ0	 	 d-dZ1d Z2d Z3d Z4 ej%        d          Z5 ej%        d           Z6d! Z7d" Z8d# Z9d$ Z:edk    rej;        <                    d%d&          Z=ej>        d'd         D ]Z?ej        @                    e?          rY	  eAd(
                     e0e=e?          d)                              L# eB$ r!ZCe$D                    d*e?eC           Y dZC[CmdZC[Cww xY w	  eA e.e=e?          pd+           # eB$ r!ZCe$D                    d*e?eC           Y dZC[CdZC[Cww xY wdS dS ).    N)partial)existsisdirjoin)PIPEPopen__main__z..)PKG_PREFIX_MAPPUBLIC_DIR_REPYDIST_DIRSPYDIST_OVERRIDES_FNAMESPYDIST_DPKG_SEARCH_TPLS)ComplexEnvironmentMarkerparse_environment_marker)memoize)get_requested_versionsVersion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 interval minimum/maximum version
            \s*
            ,
            \s*
            (?P<operator2><=?|>=?|==|!=)
            \s*
            (?P<version2>(\w|[-.])+)
        )?
    )?
    \)?  # optional closing parenthesis
    \s*
    (?:;  # optional environment markers
        (?P<environment_marker>.+)
    )?
    zx
    ;
    \s*
    extra
    \s*
    ==
    \s*
    (?P<quote>['"])
    (?P<section>[a-zA-Z0-9-_.]+)
    (?P=quote)
    z
    ^
    \[
    (?P<section>[a-zA-Z0-9-_.]+)?
    \s*
    (?::
        (?P<environment_marker>.+)
    )?
    \]
    \s*
    $
    =<<z>>>=)==<>~=c           	      x   t          | d          5 }|D ]}|                                }|                    d          s|s.t                              |          sDt
                              d|                     dd          d         |            ddd           d	S 	 ddd           n# 1 swxY w Y   d
S )z Check if pydist file looks good.utf-8encoding#z"invalid pydist data in file %s: %s/   NFT)openstrip
startswith	PYDIST_REmatchlogerrorrsplit)fpathfplines      '/usr/share/dh-python/dhpython/pydist.pyvalidater0   p   s"   	eg	&	&	& " 	 	D::<<Ds## 4 ??4(( 		>,,sA..r2D: : :       
		               4s   BB/!B//B36B3c           
      l   t          j        |           }t          |          r|g}ng }t          j        |           t	                    r3|                    fdt          j                  D                        t          j                            dd          }t          |d
                    |                     }t          |          r|                    |           i }|D ]F}t          |d          5 }|D ]}|                                }|                    d          s|s/t                              |          }	|	st#          d|d	|d
          |	                                }	t'          |	d                   }
t)          | |	d                   |	d<   |	d                                         |	d<   |	d         r|	d                             d          |	d<   ng |	d<   |                    |
g                               |	           	 ddd           n# 1 swxY w Y   H|S )zLoad information about installed Python distributions.

    :param impl: interpreter implementation, f.e. cpython2, cpython3, pypy
    :type impl: str
    c              3   8   K   | ]}t          |          V  d S N)r   ).0idnames     r/   	<genexpr>zload.<locals>.<genexpr>   s+      BB1UABBBBBB    DH_PYTHON_DISTz/usr/share/dh-python/dist/z{}_fallbackr   r   r    zinvalid pydist line: z (in )namevrangeversions
dependencyrules;N)r   getr   r   r   extendoslistdirenvironr   formatappendr$   r%   r&   r'   search	Exception	groupdict	safe_namer   split
setdefault)implfnameto_checkfbdirfbnameresultr,   r-   r.   distr;   r6   s              @r/   loadrU   ~   sy    $'--Ee}} 7OD!!EU|| CBBBB
50A0ABBBBBBJNN+-IJJE%--d3344Ff~~  F 9 9%'*** 	9b 9 9zz||??3'' t  ''-- W#)uuu$UVVV~~'' f..#9$X#O#OZ %),%7%=%=%?%?\"= '$(M$7$7$<$<DMM$&DM!!$++22488889	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9" Ms    DH''H+	.H+	Fc                 p   |pi }t                               d||           t          |t                    rt	          |          }t          j        d                              |                                          \  }}t          |          |z   }t          |           }t                              |          }|s,t                               d           t          d|z            |                                }d}	|d         r't          ||d         |           }
|
du rd S |
du rnd	|
z   }	|d
         }|                    |                                          }|rt                               d           |D ]}|r||                    d|          vr|d         st                               d            d S |d                             d          r't                               d           |d         |	z   c S |d         dk    rY|d                             d          r>d|d<   |d                             dd          |d<   t                               d           |d         r<|d         s	|d         r+|d         dvr t)          |d                   }t+          |d         |d         |d                   }|d         d|d	|d|	}|d         rZ|d         dvrPt)          |d                   }t+          |d         |d         |d                   }|d|d         d|d	|d|	z  }nU|d         dk    rId}t+          t-          |d                   |d         |d                   }|d|d         d|d	|d|	z  }t                               d            |c S |r|d         r|d         dvrt)          |d                   }|d         d|d	|d         d|	}|d         r=|d         dvr3t)          |d                   }|d|d         d|d	|d         d|	z  }n8|d         dk    r,d}|d|d         d|d	t-          |d                   d|	z  }t                               d!           |c S |d         |v rod ||d                  v r_||d                  d          rKt                               d"           d#                    |d         ||d                  d          |	          c S t                               d$           |d         |	z   c S t0          |          \  }}|                    t3          t          |                              }t                               d%|           t5          d&d'|ft6          t6          (          }|                                \  }}|j        d)k    rt=                      }t          |d*          }|                    d+          D ]]}|                                 s|                    d,d-          \  }}|rt          j!        ||          sH|"                    |           ^tG          |          d-k    rt           $                    d.|           nk|st                               d/|           nMt                               d0           |%                                |	z   S t                               d1||           tM          | |          }t                               d2|t          |          |tN          |                     d S )3Nz,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: %s environment_markerFT r;   z(dependency: module seems to be installedr=   r>   zdependency: requirement ignoredr:   z5dependency: requirement already has hardcoded versionoperatorr   version*r   0z7dependency: translated wildcard version to semver limitstandardr?   )N!=z (version2	operator2, r   zdependency: constructed versionz(dependency: constructed upstream versionz/dependency: included in build-deps with limits z	{} ({}){}z"dependency: included in build-depszinvoking dpkg -S %sz/usr/bin/dpkgz-S)stdoutstderrr   r   
:r"   z,more than one package name found for %s distz#dpkg -S did not find package for %sz'dependency: found a result with dpkg -Sz'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" line to %s or add proper dependency to Depends by hand and ignore this info.)(r)   debug
isinstancestrr   recompiler(   groupsrK   rU   REQUIRES_REinforI   rJ   %check_environment_marker_restrictionsrA   lowerendswithreplace_translate_op
_translate_max_compatiblerF   r   	ci_regexpr   r   communicate
returncodesetrL   r%   rH   addlenr*   popsensible_pnamer   )rN   reqr[   bdepaccept_upstream_versionsr;   restdatareq_denv_marker_altsactiondetailsitemovdo2v2dpkg_query_tplregex_filter
dpkg_queryprocessrc   rd   rS   r.   pkgpathpnames                                r/   guess_dependencyr      s    :2DII<7  '3 #'"" 566<<SAAHHJJJD$
D//D
 C::Dc""E > ? 	@ 	@ 	@6<===OOEO!" 
+6&'  U??Ft^^!FlO=Dhhtzz||$$G A<		<=== ?	< ?	<D 7$((:w*G*GGG% 		;<<<L!**3// < 		QRRRL)O;;;;Z D((U9-=-F-Fs-K-K($(j!#(#3#;#;C#E#Ei 		STTTY .<T*%5 .<g .<*%\99!%
"344uY/gZ@PQQ&&&111oo?$ 	E{);;)N)N&u['9::B#E*$5tG}d:FVWWBA\***BBBOOE EAA:&$..B#OE)4D$E$EtG}VZ[eVfggBA\***BBBOOE EA		;<<<) <eI.> <*%[88!%
"344&&&5+;+;+;__N$ 	L{);;)N)N&u['9::BA\***BBBj0A0A0A') )AA :&$..BA\***BBB'i(89999??L LA 		DEEE%--tD$6777DlAS<TUY<Z7		"STTT*11 .T,5G0H0N+ -  - - - - 		>???L)O;;;; $;4#@ NL&&y4'A'ABBJII#Z000_dJ7. . .G((**NFFQVW%%LL&& 	 	D::<< 

3**IC BIlD$A$A JJsOOOOv;;??IIDdKKKK 	2II;TBBBBII?@@@::<</11		;T6JJJ4&&EHH C 9T??E+B4+H	J J J J Jr8   c                 .	   |dk    rt                               d|            dS 	 t          |          \  }}}n,# t          $ r t                               d|            Y dS w xY wdddt	          j                    fdd	d
}||v r^||         }|dv r5|dk    r||vs
|dk    r#||v rt                               d|||            dS nt                               d|            dS |dv r|}|                    d          }	|dk    rd}
n|dk    rd}
nt          |	          }
d|v r|		                    d          t          |	          dz
  k    rt                               d|            dS |	
                                 d                    |	          }|dk    r|dk    rd}d}
nS|dk     nL|dk    r(|dk    rd}d}
n;t                               d|            dS t                               d||            dS g }|	D ]u}|                                r#|                    t          |                     9d                    d |D                       }t                               d|||             t          |          |
k     r|                    d           |d z  }|                                }||
dz
  xx         dz  cc<   d                    d! |D                       }|                                }||
dz
  xx         dz  cc<   d                    d" |D                       }|d#k    r|g d$k    rdS d%                    |          S |d&k    rd%                    |          S |d'k    r|g d$k     rdS d(                    |          S |d)k    r|g d$k     rdS d(                    |          S |d*v r@|dk    s|dk    rd+                    ||          S t                               d,||            dS |d-k    rO|d.d         }|dxx         dz  cc<   d                    d/ |D                       }d+                    ||          S |dk    rt                               d0|            dS n%|d1k    rdS t                               d2|           dS dS )3zCheck wither we should include or skip a dependency based on its
    environment markers.

    Returns: True  - to keep a dependency
             False - to skip it
             str   - to append "| foo" to generated dependencies
    cpython3z3Ignoring environment markers for non-Python 3.x: %sFz'Ignoring complex environment marker: %s)cpythonpypy)posix)zGNU/kFreeBSDLinux)CPythonPyPy)gnukfreebsd8gnukfreebsd9gnukfreebsd10gnukfreebsd11gnukfreebsd12gnukfreebsd13linux)implementation_nameos_nameplatform_systemplatform_machineplatform_python_implementationsys_platform)r   r_   r   r_   z#Skipping requirement (%s != %s): %szESkipping requirement with unhandled environment marker comparison: %s)python_versionpython_full_versionimplementation_version.r      r      r\   r"   z3Skipping requirement with intermediate wildcard: %sz=~zAIgnoring wildcard != requirement, not representable in Debian: %sTz.Skipping requirement with %s on a wildcard: %sc              3   4   K   | ]}t          |          V  d S r3   ri   r4   xs     r/   r7   z8check_environment_marker_restrictions.<locals>.<genexpr>  s(      ";";a3q66";";";";";";r8   z-Truncating unparseable version %s to %s in %sr   z.0c              3   4   K   | ]}t          |          V  d S r3   r   r   s     r/   r7   z8check_environment_marker_restrictions.<locals>.<genexpr>  (      55qCFF555555r8   c              3   4   K   | ]}t          |          V  d S r3   r   r   s     r/   r7   z8check_environment_marker_restrictions.<locals>.<genexpr>  r   r8   r   )r   r   r   z| python3 (>> {})z<=r   z| python3 (<< {})r   )r   z===z#| python3 (<< {}) | python3 (>> {})zPSkipping requirement with %s environment marker, cannot model in Debian deps: %sr   Nc              3   4   K   | ]}t          |          V  d S r3   r   r   s     r/   r7   z8check_environment_marker_restrictions.<locals>.<genexpr>  s(      #A#AqCFF#A#A#A#A#A#Ar8   zMIgnoring != comparison in environment marker, cannot model in Debian deps: %sextraz8Skipping requirement with unknown environment marker: %s)r)   rn   r   r   platformmachinerg   rL   r{   indexr|   r   isdigitrG   intcopyrF   )r~   
marker_strrN   markeropvaluesupported_valuessvenv_ver	split_verversion_partsint_verver_partnext_verprev_verceq_next_vers                   r/   ro   ro   6  s    zFLLLu4Z@@EE#   :C@@@uu  34%-//1*=
 
 !!!f%tRd

u{{		?S* * *uHH!"%' ' ' 5	 2 
2 
2 KK$$	%%%MM,,,MM	NNM'>>s##s9~~q'888N  uMMOOOhhy))GTzz222-F$%MM$JJJt222-F$%MMHH ;<?A A A4IS" " "u! 	 	H!! s8}}----((";";7";";";;;H. . .w<<-''NN1tOG<<>>"###q(###8855H55555<<>>"###q(###8855H5555599)))##u&--g6664ZZ&--h7774ZZ""t&--g6663YY""t&--h777=  )))R4ZZ<CC+ + + /02C9 9 9 u4ZZ"2A2;LOOOq OOO88#A#AL#A#A#AAAL8??\+ + +4ZZHH 0146 6 64 
 
7		tK	 	 	u4s   9 %A"!A"c                 "   |pg }|pg }|pg }t           |                              |          }d }|rO|                                r;t          |                    d                    dk    r|                    d          }t          t          | ||t          |dd                    }	g g g d}
dx}}dg }t          |dd	          5 }|D ]}|	                                }|r|
                    d
          r|                    |           D|
                    d          rt                              |          }|s?t                              d|           |                    |           t                      }|                    d          }d|                    d          r$t!          ||                    d          |           |                    |           |r,||v rd}n'||v rd}n ||v rd}n|                    |           Id}d }r |	|          }|rIt#          t$                    r4d                    fd|                    d          D                       }|r|
|                             |           d}|                    |           	 d d d            n# 1 swxY w Y   |rK|rIt          |dd	          5 }|                    d |D                        d d d            n# 1 swxY w Y   |
S )Nr"   r   FrN   r[   r   r   depends
recommendssuggestsTrr   r   r    [z+Skipping section %s, unable to parse headersectionrX   r   r   r   r~   rb   c              3   L   K   | ]}|                                 d z   z   V  dS )rY   N)r%   )r4   part
env_actions     r/   r7   zparse_pydep.<locals>.<genexpr>  sI       '7 '7 JJLL3&3'7 '7 '7 '7 '7 '7r8   ,wc              3       K   | ]	}|d z   V  
dS )re   N r4   r5   s     r/   r7   zparse_pydep.<locals>.<genexpr>  s&      66q!d(666666r8   )r   r(   rl   r{   groupr   r   getattrr$   r%   r&   rG   REQ_SECTIONS_REr)   rn   objectro   rh   ri   r   rL   
writelines)rN   rO   r   optionsdepends_secrecommends_secsuggests_sec
public_dirver
guess_depsrS   modifiedr   	processedr-   r.   m
result_keyr>   r   s                      @r/   parse_pydepr     s0   #K#)rN%2Lt$**511J
C "j'')) "c*2B2B12E2E.F.F!.K.Kq!!)c29$&@%3I 3IJ J JJ 22>>FHwJI	eS7	+	+	+ 0'r /	' /	'D::<<D 4??3//   &&&s## #))$// HHJ!# # #$$T***$hhG''),,!
77/00 !F 455" "J   &&& 'k))!*JJ..!-JJ,,!+JJ$$T***&
J 2'ZD111
 7jS99 7!YY '7 '7 '7 '7 * 0 0 5 5'7 '7 '7 7 7
  'z"))*555  &&&&_/	'0' 0' 0' 0' 0' 0' 0' 0' 0' 0' 0' 0' 0' 0' 0'b  7J 7%w/// 	72MM66I666666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7Ms%   	G!J77J;>J; LLLc                 "   |pg }|pg }|pg }t           |                              |          }d}|rO|                                r;t          |                    d                    dk    r|                    d          }t          t          | ||t          |dd                    }	g g g d}
d}t          |dd	          5 }t          j
        |                                          }ddd           n# 1 swxY w Y   |                    d
g           }|D ]v}t                              |          }d}|r-|                    d          }|r||v rd}n||v rd}n||v rd}nM |	|          }|r|
|                             |           w|
S )z3Extract dependencies from a dist-info/METADATA fileNr"   r   Fr   r   r   r   r   zRequires-Distr   r   r   r   r   )r   r(   rl   r{   r   r   r   r   r$   emailmessage_from_stringreadget_allEXTRA_RErH   rG   )rN   rO   r   r   r   r   r   r   r   r   rS   r   r-   metadatarequiresr~   r   r   r>   s                      r/   parse_requires_distr     s&    #K#)rN%2Lt$**511J
C "j'')) "c*2B2B12E2E.F.F!.K.Kq!!)c29$&@%3I 3IJ J JJ 22>>FG	eS7	+	+	+ 8r,RWWYY778 8 8 8 8 8 8 8 8 8 8 8 8 8 844H 2 2OOC  
 
	ggi((G k))!*JJ..!-JJ,,!+JJZC(((
 	2:%%j111Ms   'C55C9<C9c                 v    t          j        d                              d|                                           S )zEmulate distribute's safe_name.z[^A-Za-z0-9.]+_)rj   rk   subrp   r;   s    r/   rK   rK   =  s/    :&''++C66<<>>>r8   c                     t          |                              dd          }|                    d          r
|dd         }d                    t          |          |                                          S )z(Guess Debian package name from Egg name.r   -zpython-   Nz{}-{})rK   rr   r&   rF   r
   rp   )rN   egg_names     r/   r}   r}   B  se    ""**344H9%%  ABB<>>..0@0@AAAr8   c                 d    d                     d |                                 D                       S )z'Return case insensitive dpkg -S regexp.rW   c              3   v   K   | ]4}|                                 rd |                                |dn|V  5dS )r   ]N)isalphaupperr   s     r/   r7   zci_regexp.<locals>.<genexpr>L  sJ      YYq		BBqwwyyy!!!,,YYYYYYr8   )r   rp   r   s    r/   rv   rv   J  s+    77YYDJJLLYYYYYYr8   z[-.]?(alpha|beta|rc|dev|a|b|c)z\$(\d+)c                 8    t                               d|           S )zdConvert Perl RE patterns used in uscan to Python's

    >>> print(_pl2py('foo$3'))
    foo\g<3>
    z\\g<\1>)GROUP_REr   )patterns    r/   _pl2pyr	  S  s     <<
G,,,r8   c                     t          |           }d|_        d|_        |j        d|_        t	          |dz             S d|_        t	          |dz             S )ak  Return the maximum version compatible with `version` in PEP440 terms,
    used by ~= requires version specifiers.

    https://www.python.org/dev/peps/pep-0440/#compatible-release

    >>> _max_compatible('2.2')
    '3'
    >>> _max_compatible('1.4.5')
    '1.5'
    >>> _max_compatible('1.3.alpha4')
    '2'
    >>> _max_compatible('2.1.3.post5')
    '2.2'

    Nr"   )r   serialreleaselevelmicrori   minor)r[   r   s     r/   ru   ru   \  sU      	AAHANw1q5zzAGq1u::r8   c                 ,   |D ]n}|                     d          rz|                     d          rdnd}||dz   d                             ||                   }|                     t                              |d         |d                             } |                     d          r|dd                             |d                   }t          j        |d                   }d}|dd         r7|d         }d|v rd}d	|v r%t          j        |d         t
          j                  }|                    t          |d                   | |          } St                              d
|           p|dk    rt                              d|           } | 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  r"   r   Nr   sgr5   zunknown rule ignored: %sPEP386z~\g<1>)r&   rL   	translateri   	maketransrj   rk   Ir   r	  r)   warn
PRE_VER_RE)	r[   r?   r^   rulepostmpr  countflagss	            r/   rt   rt   v  s{     7 7??;'' 	7s++2!!CsQwxx.&&tCy11C''c!fc!f(E(EFFGG__S!! 	7qrr(..a))CjQ((GE122w 7A%<<E%<< jQ66Gkk&Q..'5AAGGHH/66668..G44Nr8   c                 8    t                               | |           S )zTranslate Python version operator into Debian one.

    >>> _translate_op('==')
    '='
    >>> _translate_op('<')
    '<<'
    >>> _translate_op('<=')
    '<='
    )DEB_VERS_OPSrA   )rZ   s    r/   rs   rs     s     Hh///r8   IMPLr   r"   rb   r   z%s: cannot guess (%s)rW   )NNF)NNNNN)Er   loggingr   rC   rj   	functoolsr   os.pathr   r   r   
subprocessr   r   __name__sysr   rG   abspathdirname__file__r   r
   r   r   r   r   dhpython.markersr   r   dhpython.toolsr   dhpython.versionr   r   	getLoggerr)   rk   VERBOSEr'   rm   r   r   r   r0   rU   r   ro   r   r   rK   r}   rv   r  r  r	  ru   rt   rs   rE   rA   rN   argvr5   isfileprintrI   errr*   r   r8   r/   <module>r4     s  ,    				 				       ' ' ' ' ' ' ' ' ' ' " " " " " " " "zJJJHOOBGOODD)B)BD$I$IJJKKKB B B B B B B B B B B B B B O O O O O O O O " " " " " " < < < < < < < <g
##BJ  
 	 bj 0 
1 2 2: 
 

 
 "*  
  


	    	( ( 	(V 48.3HJ HJ HJ HJXR R Rj 15DHG G G GT KO:>% % % %P? ? ?
B B BZ Z Z
 RZ9::
2:j!!- - -  4" " "J
0 
0 
0 z:>>&*--DXabb\ 
; 
;7>>! 		;;diiD! 4 4Y ?@@AAAA ; ; ;		11c::::::::;;&&tQ//526666 ; ; ;		11c::::::::; 
; 
;s0   .G22H7HHH44I9II