a �DOgo�@s�ddlZddlZddlZddlZddlZddlZddlZgd�ZdZej � d�rVdZ ne� �Z Gdd�de �Zejdd ��Zd d �Zdd d �Zddd�Zdd�Zddd�Zedkr�e�dS)�N)� ZipAppError�create_archive�get_interpreterz8# -*- coding: utf-8 -*- import {module} {module}.{fn}() �win�utf-8c@s eZdZdS)rN)�__name__� __module__� __qualname__�r r �/usr/lib64/python3.9/zipapp.pyr!srccsLt|ttjf�rBt||��}|VWd�qH1s60Yn|VdS�N)� isinstance�str�os�PathLike�open)�archive�mode�fr r r � _maybe_open%s &rcCs$|r d|�t�d}|�|�dS)zWrite a shebang line.�#!� N)�encode�shebang_encoding�write)r� interpreterZshebangr r r �_write_file_prefix.src Cs�t|d��x}|�d�}|dkr*d}|��t|d��0}t||�|�|�t�||�Wd�n1sj0YWd�n1s�0Y|r�t|t�r�t � |t � |�j t j B�dS)z8Copy an application archive, modifying the shebang line.�rb�r��wbN)r�read�readlinerr�shutil� copyfileobjr rr�chmod�stat�st_mode�S_IEXEC)rZ new_archiver�srcZfirst_2�dstr r r � _copy_archive5s     Hr+Fc Cs d}t|d�rt|d�rd}nt�|�}|��r4d}|rHt|||�dS|��sXtd��|d��}|rt|rttd��|s�|s�td ��d}|r�|�d �\} } } td d �| � d �D��} tdd �| � d �D��} | d kr�| r�| s�td|��t j | | d�}|du�r |� d�}nt|d��s"t�|�}t |d���}t||�|�rDtjntj}tj|d|d��h}|�d�D]4}|�|�}|du�s�||��rf|�||����qf|�r�|�d|�d��Wd�n1�s�0YWd�n1�s�0Y|�rt|d��s|�|��jtjB�dS)abCreate 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"TNzSource does not existz __main__.pyz8Cannot specify entry point if the source has __main__.pyzArchive has no entry point�:css|]}|��VqdSr �� isidentifier��.0�partr r r � {rz!create_archive..�.css|]}|��VqdSr r-r/r r r r2|rzInvalid entry point: )�module�fnz.pyzrr �w)� compression�*r)�hasattr�pathlib�Path�is_filer+�existsr� partition�all�split� MAIN_TEMPLATE�format� with_suffixrr�zipfile� ZIP_DEFLATEDZ ZIP_STORED�ZipFile�rglob� relative_tor�as_posixZwritestrrr%r&r'r()�source�targetr�main�filter� compressedZsource_is_fileZhas_mainZmain_py�mod�sepr5Zmod_okZfn_ok�fdr7�z�childZarcnamer r r rLsX   �        � RrcCs\t|d��>}|�d�dkr:|�����t�Wd�SWd�n1sN0YdS)Nrrr)rr!r"�strip�decoder)rrr r r r�s rcCs<ddl}|��}|jddddd�|jdddd d�|jd d dd d�|jd dddd�|jddddd�|jddd�|�|�}|jr�tj�|j�s�t d��t |j�}t d� |p�d��t �d�tj�|j��r|jdu�stj�|j��r tj�|j|j��r t d��|j�rt d��t|j|j|j|j|jd�dS)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. rNz--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.)�actionrWz--infoFz)Display the interpreter from the archive.)rVrYrWrJz'Source directory (or existing archive).)rWz%Can only get info for an archive filezInterpreter: {}zz-In-place editing of archives is not supportedz,Cannot change the main function when copying)rrLrN)�argparse�ArgumentParser� add_argument� parse_args�infor�path�isfilerJ� SystemExitr�printrB�sys�exit�outputr=�samefilerLrZpython�compress)�argsrZ�parserrr r r rL�sL � � � � ��   � �rL�__main__)N)NNNNF)N)� contextlibrr:r#r&rcrD�__all__rA�platform� startswithr�getfilesystemencoding� ValueErrorr�contextmanagerrrr+rrrLrr r r r �s.   � J 1