o
    cF                     @   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Zd dlm	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mZ eeZd Zed	Zd
Zdd ZeZ G dd de!Z"dS )    )BytesION)ZipInfo   )	sysconfigdetect_encodingZipFile)finder)FileOperatorget_export_entryconvert_pathget_executableget_platform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   sZ   d| v r+|  dr"| dd\}}d|v r | ds d||f } | S |  ds+d|  } | S )N z/usr/bin/env r   "z%s "%s"z"%s")
startswithsplit)
executableenv_executable r   H/opt/certbot/lib/python3.10/site-packages/pip/_vendor/distlib/scripts.pyenquote_executable5   s   

r   c                   @   s   e Zd ZdZeZdZ		d*ddZdd Ze	j
d	r#d
d Zdd Zdd Zd+ddZdd ZeZdd Zdd Z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seejd	kriejd#krid$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   s   || _ || _|| _d| _d| _tjdkptjdkotjdk| _t	d| _
|p)t|| _tjdkp9tjdko9tjdk| _tj| _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sysversion_info)selfr   r    r!   dry_runfileopr   r   r   __init__P   s   

zScriptMaker.__init__c                 C   s@   | ddr| jrtj|\}}|dd}tj||}|S )NguiFpythonpythonw)getr+   r$   pathr   replacejoin)r.   r   optionsdnfnr   r   r   _get_alternate_executablea   s
   z%ScriptMaker._get_alternate_executabler   c              	   C   sd   zt |}|ddkW  d   W S 1 sw   Y  W dS  ttfy1   td| Y dS w )zl
            Determine if the specified executable is a script
            (contains a #! line)
               z#!NzFailed to open %sF)openreadOSErrorIOErrorloggerwarning)r.   r   fpr   r   r   	_is_shelli   s   
(zScriptMaker._is_shellc                 C   sJ   |  |rdd l}|jjddkr|S d| S | dr!|S d| S )Nr   zos.nameLinuxz
jython.exez/usr/bin/env %s)rE   r   langSystemgetPropertylowerendswith)r.   r   r   r   r   r   _fix_jython_executableu   s   
z"ScriptMaker._fix_jython_executablec                 C   s   t jdkrd}nt|t| d }tjdkrd}nd}d|vo#||k}|r0d| | d	 }|S 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%   lenr,   platform)r.   r   post_interpsimple_shebangshebang_lengthmax_shebang_lengthresultr   r   r   _build_shebang   s    

zScriptMaker._build_shebang    c                 C   sn  d}| j r| j }d}nDt st }n<t r&tjtddt	d }n)tjt	ddt	dt	df }tj
|sOtjt	ddt	d }|rW| ||}tjd	rb| |}|rht|}|d
}tjdkr~d|vr~d|vr~|d7 }| ||}z|d
 W n ty   td| w |d
krz|| W |S  ty   td||f w |S )NTFscriptszpython%sEXEBINDIRz
python%s%sVERSIONr   utf-8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   is_python_buildr   r   r$   r6   r8   get_pathget_config_varisfiler<   r,   rS   r   rL   r   encoderY   decodeUnicodeDecodeError
ValueError)r.   encodingrT   r9   enquoter   shebangr   r   r   _get_shebang   sf   


zScriptMaker._get_shebangc                 C   s$   | j t|j|jdd |jd S )N.r   )module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$   r6   basenamemanifest)r.   exenamebaser   r   r   get_manifest   s   
zScriptMaker.get_manifestc                 C   s0  | j o| j}tjd}||s||7 }|s|| }nW|dkr&| d}n| d}t }	t|	d.}
tj	
d}|rTtt|d d }td|d}|
|| n|
d| W d    n1 sdw   Y  |	 }|| | }|D ]}tj| j|}|rtj|\}}|d	r|}d
| }z	| j|| W nr ty   td d| }tj|rt| t|| | j|| td zt| W n	 ty   Y nw Y n3w | jr|d| sd||f }tj|r| jstd| qu| j|| | j r| j!|g |"| qud S )Nr_   pytwSOURCE_DATE_EPOCH   z__main__.py)filename	date_timez.pyz%s.exez:Failed to write executable - trying to use .deleteme logicz%s.deletemez0Able to replace executable using .deleteme logicrm   z%s.%szSkipping existing file %s)#r!   r+   r$   linesepre   rK   _get_launcherr   r   environr5   timegmtimeintr   writestrgetvaluer6   r8   r    splitextr   r*   write_binary_file	ExceptionrB   rC   existsremoverenamedebugr#   r'   set_executable_modeappend)r.   namesrk   script_bytes	filenamesextuse_launcherr   launcherstreamzfsource_date_epochr   zinfozip_datar%   outnamenedfnamer   r   r   _write_script   sn   






zScriptMaker._write_script-c                 C   sn   t  }d| jv r|| d| jv r|d|| jd f  d| jv r5|d|| j| jd | jd f  |S )Nr   Xz%s%sr   r   z	%s%s%s.%sr   )r(   r)   addr-   variant_separator)r.   r%   rX   r   r   r   get_script_filenames,  s   



z ScriptMaker.get_script_filenamesc           
      C   s   d}|r| dg }|rdd| }|d}| jd||d}| |d}| |j}|r9| ddr9d	}	nd
}	| |||||	 d S )NrZ   interpreter_argsz %sr   r_   r9   r2   Fpywr}   )r5   r8   re   rl   rv   r   r%   r   )
r.   ru   r   r9   rT   argsrk   scriptscriptnamesr   r   r   r   _make_script7  s   
zScriptMaker._make_scriptc                 C   s  d}t j| jt|}t j| jt j|}| js*| j	||s*t
d| d S zt|d}W n ty@   | js< d }Y n#w | }|sOt
d| d S t|dd}|rcd}|dpbd	}|s|rk|  | j|| | jr|| j|g || d S t
d
|| j | jjst|j\}	}
|d | |	|}d|v rd}nd}t j|}| |g|| || |r|  d S d S )NFznot copying %s (up-to-date)rbz%s is an empty file (skipping)s   
rQ   Tr   rZ   zcopying and adjusting %s -> %sr   s   pythonwr   r}   ) r$   r6   r8   r   r   r    rx   r"   r*   newerrB   r   r>   rA   r/   readlinerC   FIRST_LINE_REmatchr7   groupclose	copy_filer'   r   r   infor   seekrl   r   r?   )r.   r   r   adjustr   f
first_liner   rT   ri   linesrk   r   r   r   r   r   _copy_scriptG  sV   
zScriptMaker._copy_scriptc                 C   s   | j jS rw   r*   r/   )r.   r   r   r   r/   z  s   zScriptMaker.dry_runc                 C   s   || j _d S rw   r   )r.   valuer   r   r   r/   ~  s   r   c                 C   st   t ddkr
d}nd}t dkrdnd}d|||f }td	d
d }t||}|s7d||f }t||jS )NP   6432z	win-arm64z-armr   z
%s%s%s.exerm   r   r   z(Unable to find resource %s in package %s)	structcalcsizer   __name__rsplitr   findrh   bytes)r.   kindbitsplatform_suffixr%   distlib_packageresourcemsgr   r   r   r     s   zScriptMaker._get_launcherc                 C   s8   g }t |}|du r| || |S | 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.
        Nr   )r
   r   r   )r.   specificationr9   r   ru   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.   specificationsr9   r   r   r   r   r   make_multiple  s   zScriptMaker.make_multiple)TFN)rZ   Nrw   )"r   
__module____qualname____doc__SCRIPT_TEMPLATErq   r   r1   r<   r,   rS   r   rE   rL   rY   rl   rv   _DEFAULT_MANIFESTry   r|   r   r   r   r   r   propertyr/   setterr$   r%   r&   r   r   r   r   r   r   r   r   G   s:    

E:
3


r   )#ior   loggingr$   rer   r,   r   zipfiler   compatr   r   r   	resourcesr   utilr	   r
   r   r   r   r   	getLoggerr   rB   stripr   compiler   r   r   _enquote_executableobjectr   r   r   r   r   <module>   s(    


