o
    …9jo  ã                   @   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ƒs�t |¡}t|dƒ�U}t||ƒ |rŸtjntj}tj|d|d��0}|  d¡D ]}| | ¡}|du s¿||ƒrÇ| || ¡ ¡ q°|rÓ| d| d¡¡ W d  ƒ n1 sÝw   Y  W d  ƒ n1 sìw   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¡r‚tj | j| j¡r‚t	dƒ‚| jr‰t	dƒ‚t| j| j| j| j| jd� dS )zÞRun 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
ÿ