U
    ]fB                     @   s   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mZm	Z	m
Z
 ddlmZ ddlmZmZmZmZmZ eeZd ZedZd	Zd
d ZG dd deZdS )    )BytesION   )	sysconfigdetect_encodingZipFile)finder)FileOperatorget_export_entryconvert_pathget_executablein_venva  
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <assemblyIdentity version="1.0.0.0"
 processorArchitecture="X86"
 name="%s"
 type="win32"/>

 <!-- Identify the application security requirements. -->
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
 <security>
 <requestedPrivileges>
 <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
 </requestedPrivileges>
 </security>
 </trustInfo>
</assembly>s   ^#!.*pythonw?[0-9.]*([ 	].*)?$z# -*- coding: utf-8 -*-
import re
import sys
from %(module)s import %(import_name)s
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(%(func)s())
c                 C   sX   d| krT|  drB| dd\}}d|krT| dsTd||f } n|  dsTd|  } | S )N z/usr/bin/env r   "z%s "%s"z"%s")
startswithsplit)
executableenvZ_executable r   1/usr/lib/python3/dist-packages/distlib/scripts.py_enquote_executable3   s    

r   c                   @   s   e Zd ZdZeZdZd'ddZdd Ze	j
d	rBd
d Zdd Zdd Zd(ddZdd ZeZdd Zdd Zd)ddZdd Zedd Zejdd Zejd ksejd	krejd krd!d" Zd*d#d$Zd+d%d&ZdS ),ScriptMakerz_
    A class to copy or create scripts from source scripts or callable
    specifications.
    NTFc                 C   sz   || _ || _|| _d| _d| _tjdkp:tjdko:tjdk| _t	d| _
|pRt|| _tjdkprtjdkortjdk| _d S )NFposixjava) X.Ynt)
source_dir
target_diradd_launchersforceclobberosname_nameset_modesetvariantsr   _fileop_is_nt)selfr   r   r   dry_runZfileopr   r   r   __init__L   s    

zScriptMaker.__init__c                 C   s@   | ddr<| jr<tj|\}}|dd}tj||}|S )NguiFpythonZpythonw)getr(   r!   pathr   replacejoin)r)   r   optionsZdnfnr   r   r   _get_alternate_executable\   s
    z%ScriptMaker._get_alternate_executabler   c              
   C   s\   z0t |}|ddkW  5 Q R  W S Q R X W n& ttfk
rV   td| Y dS X dS )zl
            Determine if the specified executable is a script
            (contains a #! line)
               z#!zFailed to open %sFN)openreadOSErrorIOErrorloggerwarning)r)   r   fpr   r   r   	_is_shelld   s    
&zScriptMaker._is_shellc                 C   sD   |  |r*dd l}|jjddkr<|S n| dr<|S d| S )Nr   zos.nameZLinuxz
jython.exez/usr/bin/env %s)r=   r   ZlangZSystemZgetPropertylowerendswith)r)   r   r   r   r   r   _fix_jython_executablep   s    
z"ScriptMaker._fix_jython_executablec                 C   s   t jdkrd}n8t|t| d }tjdkr4d}nd}d|koF||k}|r^d| | d	 }n d
}|d| | d 7 }|d7 }|S )a  
        Build a shebang line. In the simple case (on Windows, or a shebang line
        which is not too long or contains spaces) use a simple formulation for
        the shebang. Otherwise, use /bin/sh as the executable, with a contrived
        shebang which allows the script to run either under Python or sh, using
        suitable quoting. Thanks to Harald Nordgren for his input.

        See also: http://www.in-ulm.de/~mascheck/various/shebang/#length
                  https://hg.mozilla.org/mozilla-central/file/tip/mach
        r   T   darwini          s   #!   
s
   #!/bin/sh
s	   '''exec' s    "$0" "$@"
s   ' ''')r!   r"   lensysplatform)r)   r   post_interpZsimple_shebangZshebang_lengthZmax_shebang_lengthresultr   r   r   _build_shebang|   s    

zScriptMaker._build_shebang    c                 C   sT  d}| j r| j }d}n^t s&t }nNt rLtjtddt	d }n(tjt	ddt	dt	df }|r| 
||}tjd	r| |}|rt|}|d
}tjdkrd|krd|kr|d7 }| ||}z|d
 W n" tk
r   td| Y nX |d
krPz|| W n& tk
rN   td||f Y nX |S )NTFZscriptszpython%sZEXEZBINDIRz
python%s%sZVERSIONr   utf-8Zcliz	-X:Framesz-X:FullFramess
    -X:Framesz,The shebang (%r) is not decodable from utf-8z?The shebang (%r) is not decodable from the script encoding (%r))r   r   Zis_python_buildr   r   r!   r/   r1   Zget_pathZget_config_varr4   rG   rH   r   r@   r   encoderK   decodeUnicodeDecodeError
ValueError)r)   encodingrI   r2   Zenquoter   shebangr   r   r   _get_shebang   sX    





zScriptMaker._get_shebangc                 C   s$   | j t|j|jdd |jd S )N.r   )moduleZimport_namefunc)script_templatedictprefixsuffixr   )r)   entryr   r   r   _get_script_text   s    
zScriptMaker._get_script_textc                 C   s   t j|}| j| S N)r!   r/   basenamemanifest)r)   Zexenamebaser   r   r   get_manifest   s    zScriptMaker.get_manifestc                 C   s  | j o
| j}tjd}||s*||7 }|s8|| }nZ|dkrL| d}n
| d}t }	t|	d}
|
	d| W 5 Q R X |	
 }|| | }|D ]V}tj| j|}|rxtj|\}}|dr|}d| }z| j|| W n tk
rt   td d	| }tj|r&t| t|| | j|| td
 zt| W n tk
rn   Y nX Y nX nl| jr|d| sd||f }tj|r| jstd| q| j|| | jr| j|g || qd S )NrM   pytwz__main__.pyz.pyz%s.exez:Failed to write executable - trying to use .deleteme logicz%s.deletemez0Able to replace executable using .deleteme logicrU   z%s.%szSkipping existing file %s)r   r(   r!   lineseprN   r?   _get_launcherr   r   Zwritestrgetvaluer/   r1   r   splitextr   r'   Zwrite_binary_file	Exceptionr:   r;   existsremoverenamedebugr    r$   set_executable_modeappend)r)   namesrS   Zscript_bytes	filenamesextZuse_launcherrf   ZlauncherstreamZzfZzip_datar"   outnameneZdfnamer   r   r   _write_script   sX    







zScriptMaker._write_scriptc                 C   s   d}|r0| dg }|r0dd| }|d}| jd||d}| |d}|j}t }	d| jkrp|	| d| jkr|	d	|t	j
d
 f  d| jkr|	d|t	j
d
 t	j
d f  |r| ddrd}
nd}
| |	||||
 d S )NrL   Zinterpreter_argsz %sr   rM   r2   r   Xz%s%sr   r   z%s-%s.%sr   r,   Fpywrc   )r.   r1   rN   rT   r]   r"   r%   r&   addrG   version_inforx   )r)   r\   rr   r2   rI   argsrS   scriptr"   Zscriptnamesrs   r   r   r   _make_script  s,    




zScriptMaker._make_scriptc                 C   s  d}t j| jt|}t j| jt j|}| jsT| j	||sTt
d| d S zt|d}W n  tk
r   | jsz d }Y nLX | }|st
d|  | d S t|dd}|rd}|dpd	}|s|r|  | j|| | jr| j|g || nt
d
|| j | jjst|j\}	}
|d | |	|}d|kr^d}nd}t j|}| |g||  || |r|  d S )NFznot copying %s (up-to-date)rbz"%s: %s is an empty file (skipping)s   
rE   Tr   rL   zcopying and adjusting %s -> %sr   s   pythonwr{   rc   )!r!   r/   r1   r   r
   r   r_   r   r'   Znewerr:   rn   r6   r9   r*   readliner;   Zget_command_nameFIRST_LINE_REmatchr0   groupcloseZ	copy_filer$   ro   rp   infor   seekrT   rx   r7   )r)   r   rr   Zadjustru   fZ
first_liner   rI   rR   linesrS   rs   rv   r   r   r   _copy_script2  sX    
 


zScriptMaker._copy_scriptc                 C   s   | j jS r^   r'   r*   )r)   r   r   r   r*   f  s    zScriptMaker.dry_runc                 C   s   || j _d S r^   r   )r)   valuer   r   r   r*   j  s    r   c                 C   s`   t ddkrd}nd}d||f }tddd }t||}|sZd	||f }t||jS )
NP   Z64Z32z%s%s.exerU   r   r   z(Unable to find resource %s in package %s)structZcalcsize__name__rsplitr   findrQ   bytes)r)   Zkindbitsr"   Zdistlib_packageresourcemsgr   r   r   rg   r  s    zScriptMaker._get_launcherc                 C   s6   g }t |}|dkr"| || n| j|||d |S )a  
        Make a script.

        :param specification: The specification, which is either a valid export
                              entry specification (to make a script from a
                              callable) or a filename (to make a script by
                              copying from a source location).
        :param options: A dictionary of options controlling script generation.
        :return: A list of all absolute pathnames written to.
        Nry   )r	   r   r   )r)   specificationr2   rr   r\   r   r   r   make  s    zScriptMaker.makec                 C   s$   g }|D ]}| | || q|S )z
        Take a list of specifications and make scripts from them,
        :param specifications: A list of specifications.
        :return: A list of all absolute pathnames written to,
        )extendr   )r)   Zspecificationsr2   rr   r   r   r   r   make_multiple  s    zScriptMaker.make_multiple)TFN)rL   N)N)N)N) r   
__module____qualname____doc__SCRIPT_TEMPLATErX   r   r+   r4   rG   rH   r   r=   r@   rK   rT   r]   _DEFAULT_MANIFESTr`   rb   rx   r   r   propertyr*   setterr!   r"   r#   rg   r   r   r   r   r   r   r   C   s6       

@4
4


r   )ior   Zloggingr!   rer   rG   compatr   r   r   Z	resourcesr   utilr   r	   r
   r   r   Z	getLoggerr   r:   stripr   compiler   r   r   objectr   r   r   r   r   <module>   s   


