Ë
    pziÍ4  ã                   óð   — d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlm	Z	  ej                  dej                  «      Z ej                  dej                  «      Z e j                  e«      Z G d„ d«      Zy)	é    N)ÚjoinÚsplit)Úexecute)ÚVersionzÉ
    (?:\#!\s*){0,1}  # shebang prefix
    (?P<path>
        .*?/bin/.*?)?
    (?P<name>
        python|pypy)
    (?P<version>
        \d[\.\d]*)?
    (?P<debug>
        -dbg)?
    (?P<options>.*)
    a-  
    (?P<name>.*?)
    (?:\.
        (?P<stableabi>abi\d+)
     |(?:\.
        (?P<soabi>
            (?P<impl>cpython|pypy)
            -
            (?P<ver>\d{2})
            (?P<flags>[a-z]*?)
        )
        (?:
            -(?P<multiarch>[^/]*?)
        )?
    ))?
    (?P<debug>_d)?
    \.so$c                   ó´   — e Zd ZdZdZdZdZdZdZi Z		 	 dd„Z
d„ Zd„ Zd	„ Zd
„ Ze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dd„Zdd„Zdd„Zy)ÚInterpreterNÚpythonFÚcpython© c                 ó®  — t        «       }|d= |d= t        |t        «      r+|j                  «       D ]  }	||	   �Œ	t	        ||	«      ||	<   Œ ne|rc|j                  dd«      j                  «       r|st        |«      |d<   n2| j                  |«      j                  «       D ]  \  }	}
||	   �Œ|
||	<   Œ |j                  «       D ]  \  }	}
t        | |	|
«       Œ y )NÚselfÚvalueú.Ú Úversion)ÚlocalsÚ
isinstancer   ÚkeysÚgetattrÚreplaceÚisdigitr   ÚparseÚitemsÚsetattr)r   r   ÚpathÚnamer   ÚdebugÚimplÚoptionsÚparamsÚkeyÚvals              ú+/usr/share/python3/debpython/interpreter.pyÚ__init__zInterpreter.__init__E   sÛ   € ä“ˆØ�6ˆNØ�7ˆOä�eœ[Ô)Ø—{‘{“}ò 6�Ø˜#‘;Ñ&Ü")¨%°Ó"5�F˜3’Kñ6ñ Ø�}‰}˜S "Ó%×-Ñ-Ô/¹Ü$+¨E£N��yÒ!à $§
¡
¨5Ó 1× 7Ñ 7Ó 9ò *‘H�C˜Ø˜c‘{Ñ*Ø&)˜˜sšð*ð Ÿ™›ò 	$‰HˆC�Ü�D˜#˜sÕ#ñ	$ó    c                 óF  — |dk(  rW|rU|j                  d«      rd| j                  d<   n |j                  d«      rd| j                  d<   d|v r"d| j                  d<   n|d	k(  r|�t        |«      }|d
v r |€t        t        |«      | j                  |<   y || j                  |<   y )Nr   r	   r
   r   Úpypyz-dbgTr   r   )r   r   r   r   )Ú
startswithÚ__dict__r   r   r   )r   r   r   s      r#   Ú__setattr__zInterpreter.__setattr__Z   sž   € Ø�6Š>™eØ×Ñ Ô)Ø(1�—‘˜fÒ%Ø×!Ñ! &Ô)Ø(.�—‘˜fÑ%Ø˜‰Ø)-�—‘˜gÒ&Ø�YÒ 5Ð#4Ü˜E“NˆEØÐ7Ñ7¸E¸Mä")¬+°tÓ"<ˆD�M‰M˜$Òà"'ˆD�M‰M˜$Òr%   c                 ó¼   — | j                   xs d}|| j                  | j                  «      z  }| j                  r!|ddj	                  | j                  «      z   z  }|S )Nr   ú )r   Ú_vstrr   r   r   )r   Úresults     r#   Ú__repr__zInterpreter.__repr__j   sN   € Ø—‘’˜bˆØ�$—*‘*˜TŸ\™\Ó*Ñ*ˆØ�<Š<Ø�c˜CŸH™H T§\¡\Ó2Ñ2Ñ2ˆFØˆr%   c                 ó8   — | j                  | j                  «      S ©N)r-   r   )r   s    r#   Ú__str__zInterpreter.__str__q   s   € Ø�z‰z˜$Ÿ,™,Ó'Ð'r%   c                 óì   — | j                   dk(  r| j                  S |rLt        |«      | j                  vr5| j                  rdj	                  |«      S | j                  t        |«      z   S | j                  S )Nr'   zpython{}-dbg)r   r   Ústrr   Úformat©r   r   s     r#   r-   zInterpreter._vstrt   s_   € Ø�9‰9˜Òà—9‘9ÐÙ”s˜7“|¨4¯9©9Ñ4Ø�zŠzØ%×,Ñ,¨WÓ5Ð5Ø—9‘9œs 7›|Ñ+Ð+Ø�y‰yÐr%   c                 óž   — t         j                  | «      }|si S |j                  «       }d|v rt        |d   j	                  «       «      |d<   |S )a«  Return dict with parsed shebang

        >>> sorted(Interpreter.parse('pypy').items())
        [('debug', None), ('name', 'pypy'), ('options', ()), ('path', None), ('version', None)]
        >>> sorted(Interpreter.parse('/usr/bin/python3.3-dbg').items())
        [('debug', '-dbg'), ('name', 'python'), ('options', ()), ('path', '/usr/bin/'), ('version', '3.3')]
        >>> sorted(Interpreter.parse('#! /usr/bin/pypy --foo').items())
        [('debug', None), ('name', 'pypy'), ('options', ('--foo',)), ('path', '/usr/bin/'), ('version', None)]
        >>> sorted(Interpreter.parse('#! /usr/bin/python3.2').items())
        [('debug', None), ('name', 'python'), ('options', ()), ('path', '/usr/bin/'), ('version', '3.2')]
        >>> sorted(Interpreter.parse('/usr/bin/python3.2-dbg --foo --bar').items())
        [('debug', '-dbg'), ('name', 'python'), ('options', ('--foo', '--bar')), ('path', '/usr/bin/'), ('version', '3.2')]
        r   )Ú
SHEBANG_REÚsearchÚ	groupdictÚtupler   )Úshebangr.   s     r#   r   zInterpreter.parse~   sT   € ô  ×"Ñ" 7Ó+ˆÙØˆIØ×!Ñ!Ó#ˆØ˜Ñä % f¨YÑ&7×&=Ñ&=Ó&?Ó @ˆF�9ÑØˆr%   c                 óÐ   — t        |xs | j                  «      }| j                  dk(  rd}n*|t        d«      z  rd|z  }n|t        d«      z  rd|z  }nd}|rd|z  }|rd	|›|›�}|S )
aß  Return path to site-packages directory.

        Note that returned path is not the final location of .py files

        >>> i = Interpreter('python')
        >>> i.sitedir(version='3.1')
        '/usr/lib/python3/dist-packages/'
        >>> i.sitedir(version='2.5')
        '/usr/lib/python2.5/site-packages/'
        >>> i.sitedir(version=Version('2.7'))
        '/usr/lib/python2.7/dist-packages/'
        >>> i.sitedir(version='3.1', gdb=True, package='python3-foo')
        'debian/python3-foo/usr/lib/debug/usr/lib/python3/dist-packages/'
        >>> i.sitedir(version=Version('3.2'))
        '/usr/lib/python3/dist-packages/'
        >>> Interpreter('pypy').sitedir(version='2.0')
        '/usr/lib/pypy/dist-packages/'
        r'   z/usr/lib/pypy/dist-packages/ú2.6z /usr/lib/python%s/site-packages/z3.0z /usr/lib/python%s/dist-packages/z/usr/lib/python3/dist-packages/z/usr/lib/debug%szdebian/)r   r   r   )r   ÚgdbÚpackager   r   s        r#   ÚsitedirzInterpreter.sitedir—   sz   € ô& ˜'Ò1 T§\¡\Ó2ˆð �9‰9˜ÒØ1‰DØœ ›Ò&Ø5¸Ñ?‰DØœ ›Ò&Ø5¸Ñ?‰Dà4ˆDáØ%¨Ñ,ˆDÚÙ$+©TÐ2ˆDàˆr%   c           	      ó  — t        |xs | j                  «      }d| j                  v rdnd}|t        d«      k  r||z   S t        |«      \  }}|j	                  d«      s|dz  }t        |d|dd ›d	| j                  |«      ›d|›�«      S )
a¦  Given path to a .py file, return path to its .pyc/.pyo file.

        This function is inspired by Python 3.2's imp.cache_from_source.

        :param fpath: path to file name
        :param version: Python version

        >>> i = Interpreter('python')
        >>> i.cache_file('foo.py', Version('3.1'))
        'foo.pyc'
        >>> i.cache_file('bar/foo.py', '3.2')
        'bar/__pycache__/foo.cpython-32.pyc'
        z-OÚoÚcú3.1z.pyÚ__pycache__Néýÿÿÿr   )r   r   r   r   Úendswithr   Ú	magic_tag)r   Úfpathr   Ú	last_charÚfdirÚfnames         r#   Ú
cache_filezInterpreter.cache_file½   s‘   € ô ˜'Ò1 T§\¡\Ó2ˆØ 4§<¡<Ñ/‘C°Sˆ	Ø”g˜e“nÒ$Ø˜9Ñ$Ð$ä˜E“l‰ˆˆeØ�~‰~˜eÔ$Ø�U‰NˆEÜ�D˜-Ø˜3˜B’Z §¡°Õ!8¹)ð*Eó Fð 	Fr%   c                 ó\  — t        |xs | j                  «      }| j                  |«      \  }}|j                  dd«      d   }|r*|dj	                  |«      z  }|r|dj	                  |«      z  }| j
                  r"| j                  dk(  r|t        d«      z  r|dz  }d	j	                  |«      S )
z5Return extension name with soname and multiarch tags.r   é   r   z.{}z-{}r
   Ú3Ú_dz{}.so)r   r   Ú_get_configr   r5   r   r   )r   r   r   ÚsoabiÚ	multiarchr.   s         r#   Úext_filezInterpreter.ext_fileÖ   s¡   € ä˜'Ò1 T§\¡\Ó2ˆØ×+Ñ+¨GÓ4ÑˆˆyØ—‘˜C Ó# AÑ&ˆÙØ�e—l‘l 5Ó)Ñ)ˆFÙØ˜%Ÿ,™, yÓ1Ñ1�Ø�:Š:˜$Ÿ)™) yÒ0Øœw s›|Ò+Ø�d‰NˆFØ�~‰~˜fÓ%Ð%r%   c                 óª   — t        |xs | j                  «      }| j                  dk(  r|t        d«      z  ry| j                  d|«      }t	        |«      S )zReturn magic number.r
   rQ   r   z9import importlib.util; print(importlib.util.MAGIC_NUMBER))r   r   r   Ú_executeÚeval)r   r   r.   s      r#   Úmagic_numberzInterpreter.magic_numberä   sK   € ä˜'Ò1 T§\¡\Ó2ˆØ�9‰9˜	Ò! g´¸³Ò&=ØØ—‘ÐZÐ\cÓdˆÜ�F‹|Ðr%   c                 ó”   — t        |xs | j                  «      }| j                  dk(  r|t        d«      z  ry| j                  d|«      S )z«Return Python magic tag (used in __pycache__ dir to tag files).

        >>> i = Interpreter('python')
        >>> i.magic_tag(version='3.2')
        'cpython-32'
        r
   ú3.2r   z/import sys; print(sys.implementation.cache_tag))r   r   r   rX   r6   s     r#   rI   zInterpreter.magic_tagì   sD   € ô ˜'Ò1 T§\¡\Ó2ˆØ�9‰9˜	Ò! g´¸³Ò&?ØØ�}‰}ÐNÐPWÓXÐXr%   c                 ó®   — t        |xs | j                  «      }	 | j                  |«      \  }}|S # t        $ r t        j                  dd¬«       Y yw xY w)zReturn multiarch tag.zcannot get multiarchT©Úexc_infor   ©r   r   rS   Ú	ExceptionÚlogr   ©r   r   rT   rU   s       r#   rU   zInterpreter.multiarchø   s\   € ä˜'Ò1 T§\¡\Ó2ˆð	Ø#×/Ñ/°Ó8ÑˆE�9ð
 Ðøô	 ò 	Ü�I‰IÐ,°tˆIÔ<áð	úó   ›1 ± AÁAc                 ó¨   — t        |xs | j                  «      }| j                  dk(  r*|t        d«      z	  rdj                  |j                  «      S y y )Nr
   r\   zabi{})r   r   r   r5   Úmajorr6   s     r#   Ú	stableabizInterpreter.stableabi  sH   € Ü˜'Ò1 T§\¡\Ó2ˆà�9‰9˜	Ò! g´¸³Ò&?Ø—>‘> '§-¡-Ó0Ð0ð '@Ð!r%   c                 ó®   — t        |xs | j                  «      }	 | j                  |«      \  }}|S # t        $ r t        j                  dd¬«       Y yw xY w)z›Return SOABI flag (used to in .so files).

        >>> i = Interpreter('python')
        >>> i.soabi(version=Version('3.3'))
        'cpython-33m'
        zcannot get soabiTr^   r   r`   rc   s       r#   rT   zInterpreter.soabi	  s]   € ô ˜'Ò1 T§\¡\Ó2ˆð	Ø#×/Ñ/°Ó8ÑˆE�9ð
 ˆøô	 ò 	Ü�I‰IÐ(°4ˆIÔ8áð	úrd   c                 ó  — t        |xs | j                  «      }d|v r|j                  dd«      \  }}nd}t        j	                  |«      }|sy|j                  «       }|d   ryt        | |¬«      }|d   r#dj                  |d   d	   |d   d   «      |_        |j                  s|d
   sd|d   xs dv rd|_        	 |j                  «       \  }}|d   }|j                  dk(  r%|j                  dz	  r|j                  d«      r|dd }|d   s|r9dj                  ||d   xs |«      }|d   s|rdj                  ||d   xs |«      }|dz  }||k(  ryt        ||«      S # t        $ r t        j                  dd¬«       Y yw xY w)aˆ  Return extension file name if file can be renamed.

        >>> i = Interpreter('python')
        >>> i.check_extname('foo.so', version='3.3') # doctest: +ELLIPSIS
        'foo.cpython-33m-....so'
        >>> i.check_extname('foo.abi3.so', version='3.3')
        >>> i.check_extname('foo/bar/bazmodule.so', version='3.3') # doctest: +ELLIPSIS
        'foo/bar/baz.cpython-33m-....so'
        ú/rP   r   Nrg   )r   Úverz{}.{}r   r   ÚdÚflagsTzcannot get soabi/multiarchr^   r   r
   r\   ÚmoduleiúÿÿÿrT   rU   z{}-{}z.so)r   r   ÚrsplitÚ
EXTFILE_REr9   r:   r   r5   r   rS   ra   rb   r   rH   r   )	r   rM   r   rL   ÚinfoÚirT   rU   r.   s	            r#   Úcheck_extnamezInterpreter.check_extname  s•  € ô ˜'Ò1 T§\¡\Ó2ˆà�%‰<ØŸ,™, s¨AÓ.‰KˆD‘%àˆDä× Ñ  Ó'ˆÙØØ�~‰~Óˆà�Òàä˜ gÔ.ˆØ�Š;ØŸ™ t¨E¡{°1¡~°t¸E±{À1±~ÓFˆAŒIØ�wŠw˜D šM¨S°T¸'±]Ò5HÀbÑ-IØˆAŒGð	Ø Ÿ}™}›ÑˆE�9ð �f‘ˆØ�6‰6�YÒ 1§9¡9°Ò#5¸&¿/¹/È(Ô:SØ˜C˜R�[ˆFØ�Š=™EØ—^‘^ F¨D°©MÒ,B¸UÓCˆFØ�KÒ ¡IØ Ÿ™¨°°[Ñ0AÒ0NÀYÓO�à�%‰ˆØ�FŠ?ØÜ�D˜&Ó!Ð!øô ò 	Ü�I‰IÐ2¸TˆIÔBÙð	ús   Â=E  Å  FÆFc                 ó@  — t        |xs | j                  «      }| j                  dk(  s#| j                  dk(  r|dz	  r|dz  s
|dz	  s|dk(  rd}nd}|dz  }| j                  ||«      j	                  d	«      }	 t
        j                  d
   |d<   |S # t        $ r Y |S w xY w)Nr'   r
   r>   rQ   rE   zimport sysconfig as s;z%from distutils import sysconfig as s;zOprint("__SEP__".join(i or "" for i in s.get_config_vars("SOABI", "MULTIARCH")))Ú__SEP__ÚDEB_HOST_MULTIARCHrP   )r   r   r   rX   r   ÚosÚenvironÚKeyError)r   r   ÚcmdÚ	conf_varss       r#   rS   zInterpreter._get_configK  sº   € Ü˜'Ò1 T§\¡\Ó2ˆð �9‰9˜Ò $§)¡)¨yÒ"8Ø˜5Ò  W°¢^Ø˜eÒ# w°#¢~Ø*‰Cà9ˆCØð Dñ 	Dˆà—M‘M # wÓ/×5Ñ5°iÓ@ˆ	ð	ÜŸ:™:Ð&:Ñ;ˆI�a‰Lð Ðøô ò 	ØØÐð	ús   Á8B Â	BÂBc                 óÚ  — t        |xs | j                  «      }| j                  |«      d|f}|r1|| j                  j                  v r| j                  j                  |   S t        |«      }|d   dk7  r6t        j                  |d   «       t        dj                  ||d   «      «      ‚|d   j                  «       }t        |«      dk(  r|d   }|r|| j                  j                  |<   |S )Nz-cÚ
returncoder   Ústderrz{} failed with status code {}ÚstdoutrP   )r   r   r-   Ú	__class__Ú_cacher   rb   r   ra   r5   Ú
splitlinesÚlen)r   Úcommandr   ÚcacheÚoutputr.   s         r#   rX   zInterpreter._execute^  sÞ   € Ü˜'Ò1 T§\¡\Ó2ˆØ—:‘:˜gÓ&¨¨gÐ6ˆÙ�W §¡× 5Ñ 5Ñ5Ø—>‘>×(Ñ(¨Ñ1Ð1ä˜Ó!ˆØ�,Ñ 1Ò$Ü�I‰I�f˜XÑ&Ô'ÜÐ;×BÑBÀ7ÈFÐS_ÑL`ÓaÓbÐbà˜Ñ!×,Ñ,Ó.ˆäˆv‹;˜!ÒØ˜A‘YˆFáØ-3ˆD�N‰N×!Ñ! 'Ñ*àˆr%   )NNNNNNN)FNNr1   )NT)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r�   r$   r*   r/   r2   r-   Ústaticmethodr   rA   rN   rV   rZ   rI   rU   rg   rT   rs   rS   rX   r   r%   r#   r   r   <   s“   „ Ø€DØ€DØ€GØ€EØ€DØ€GØ€FàAEØ04ó$ò*(ò ò(òð ñó ðó0$óLFó2&óó
Yó	ó1óó"/"óbô&r%   r   )Úloggingrw   ÚreÚos.pathr   r   Ú	debpythonr   Údebpython.versionr   ÚcompileÚVERBOSEr8   rp   Ú	getLoggerr‡   rb   r   r   r%   r#   ú<module>r“      sw   ðó* Û 	Û 	ß Ý Ý %àˆR�Z‰Zð ð 
�‰ó€
ð ˆR�Z‰Zð ð  �j‰jó!€
ð" €g×Ñ˜Ó!€÷uò ur%   