o
    fo                     @   s   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Zg dZdZej	
dr+dZne ZG dd deZe jdd	 Zd
d ZdddZ		dddZdd ZdddZedkr`e  dS dS )    N)ZipAppErrorcreate_archiveget_interpreterz8# -*- coding: utf-8 -*-
import {module}
{module}.{fn}()
winutf-8c                   @   s   e Zd ZdS )r   N)__name__
__module____qualname__ r
   r
   /usr/lib/python3.10/zipapp.pyr   !   s    r   c                 c   sR    t | ttjfr$t| |}|V  W d    d S 1 sw   Y  d S | V  d S N)
isinstancestrosPathLikeopen)archivemodefr
   r
   r   _maybe_open%   s   "
r   c                 C   s(   |rd| t d }| | dS dS )zWrite a shebang line.   #!   
N)encodeshebang_encodingwrite)r   interpretershebangr
   r
   r   _write_file_prefix.   s   r   c              	   C   s   t | d<}|d}|dkrd}|  t |d}t|| || t|| W d   n1 s5w   Y  W d   n1 sDw   Y  |r_t|trat	
|t	|jtjB  dS dS dS )z8Copy an application archive, modifying the shebang line.rb   r       wbN)r   readreadliner   r   shutilcopyfileobjr   r   r   chmodstatst_modeS_IEXEC)r   new_archiver   srcfirst_2dstr
   r
   r   _copy_archive5   s   


r.   Fc              	   C   s  d}t | drt | drd}nt| } |  rd}|r$t| || dS |  s,td| d  }|r:|r:td|sB|sBtd	d}|r{|d
\}	}
}tdd |		dD }tdd |	dD }|
d
krn|rn|sttd| t
j|	|d}|du r| d}n
t |dst|}t|dU}t|| |rtjntj}tj|d|d0}| dD ]}|| }|du s||r|||  q|r|d|d W d   n1 sw   Y  W d   n1 sw   Y  |rt |ds	|| jtjB  dS dS dS )ab  Create an application archive from SOURCE.

    The SOURCE can be the name of a directory, or a filename or a file-like
    object referring to an existing archive.

    The content of SOURCE is packed into an application archive in TARGET,
    which can be a filename or a file-like object.  If SOURCE is a directory,
    TARGET can be omitted and will default to the name of SOURCE with .pyz
    appended.

    The created application archive will have a shebang line specifying
    that it should run with INTERPRETER (there will be no shebang line if
    INTERPRETER is None), and a __main__.py which runs MAIN (if MAIN is
    not specified, an existing __main__.py will be used).  It is an error
    to specify MAIN for anything other than a directory source with no
    __main__.py, and it is an error to omit MAIN if the directory has no
    __main__.py.
    Fr"   r#   TNzSource does not existz__main__.pyz8Cannot specify entry point if the source has __main__.pyzArchive has no entry point:c                 s       | ]}|  V  qd S r   isidentifier.0partr
   r
   r   	<genexpr>{       z!create_archive.<locals>.<genexpr>.c                 s   r0   r   r1   r3   r
   r
   r   r6   |   r7   zInvalid entry point: )modulefnz.pyzr   r!   w)compression*r   )hasattrpathlibPathis_filer.   existsr   	partitionallsplitMAIN_TEMPLATEformatwith_suffixr   r   zipfileZIP_DEFLATED
ZIP_STOREDZipFilerglobrelative_tor   as_posixwritestrr   r&   r'   r(   r)   )sourcetargetr   mainfilter
compressedsource_is_filehas_mainmain_pymodsepr:   mod_okfn_okfdr<   zchildarcnamer
   r
   r   r   L   sd   





r   c                 C   s^   t | d }|ddkr|  tW  d    S W d    d S 1 s(w   Y  d S )Nr   r   r   )r   r"   r#   stripdecoder   )r   r   r
   r
   r   r      s   "r   c                 C   s2  ddl }| }|jddddd |jdddd	d |jd
dddd |jddddd |jddddd |jddd || } | jrbtj| jsOt	dt
| j}td|pZd td tj| jr| jdu s~tj| jrtj| j| jrt	d| jrt	dt| j| j| j| j| jd dS )zRun the zipapp command line interface.

    The ARGS parameter lets you specify the argument list directly.
    Omitting ARGS (or setting it to None) works as for argparse, using
    sys.argv[1:] as the argument list.
    r   Nz--outputz-ozAThe name of the output archive. Required if SOURCE is an archive.)defaulthelpz--pythonz-pzEThe name of the Python interpreter to use (default: no shebang line).z--mainz-mzLThe main function of the application (default: use an existing __main__.py).z
--compressz-c
store_truezQCompress files with the deflate method. Files are stored uncompressed by default.)actionrd   z--infoFz)Display the interpreter from the archive.)rc   rf   rd   rQ   z'Source directory (or existing archive).)rd   z%Can only get info for an archive filezInterpreter: {}z<none>z-In-place editing of archives is not supportedz,Cannot change the main function when copying)r   rS   rU   )argparseArgumentParseradd_argument
parse_argsinfor   pathisfilerQ   
SystemExitr   printrG   sysexitoutputrB   samefilerS   r   pythoncompress)argsrg   parserr   r
   r
   r   rS      sL   









rS   __main__r   )NNNNF)
contextlibr   r?   r$   r'   rp   rI   __all__rF   platform
startswithr   getfilesystemencoding
ValueErrorr   contextmanagerr   r   r.   r   r   rS   r   r
   r
   r
   r   <module>   s2    



J
1
