U e5do�@s�ddlZddlZddlZddlZddlZddlZddlZdddgZdZej � d�rXdZ ne� �Z Gdd�de �Zejd d ��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.8/zipapp.pyr!sc cs8t|ttjf�r.t||�� }|VW5QRXn|VdS�N)� isinstance�str�os�PathLike�open)�archive�mode�fr r r � _maybe_open%s rcCs$|r d|�t�d}|�|�dS)N�#!� )�encode�shebang_encoding�write)r� interpreterZshebangr r r �_write_file_prefix.src Cs�t|d��Z}|�d�}|dkr*d}|��t|d��&}t||�|�|�t�||�W5QRXW5QRX|r�t|t�r�t � |t � |�j t j B�dS)N�rb�r��wb)r�read�readlinerr�shutilZ copyfileobjr rr�chmod�stat�st_mode�S_IEXEC)rZ new_archiver�srcZfirst_2Zdstr r r � _copy_archive5s      r)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��} td d �| � d �D��} | d kr�| r�| s�td|��t j | | d�}|dk�r |� d�}nt|d��s"t�|�}t |d���}t||�|�rDtjntj}tj|d|d��^}|�d�D]4}|�|�}|dk�s�||��rf|�||����qf|�r�|�d|�d��W5QRXW5QRX|�r�t|d��s�|�|��jtjB�dS)NFr!r"TzSource 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 � {sz!create_archive..�.css|]}|��VqdSr r+r-r r r r0|szInvalid entry point: )�module�fnz.pyzrr �w)� compression�*r)�hasattr�pathlib�Path�is_filer)�existsr� partition�all�split� MAIN_TEMPLATE�formatZ with_suffixrr�zipfileZ ZIP_DEFLATEDZ ZIP_STOREDZZipFileZrglob� relative_torZas_posixZwritestrrr$r%r&r')�source�targetr�main�filter� compressedZsource_is_fileZhas_mainZmain_py�mod�sepr3Zmod_okZfn_ok�fdr5�zZchildZarcnamer r r rLsX   �        � &c CsFt|d��2}|�d�dkr8|�����t�W5QR�SW5QRXdS)Nrrr)rr!r"�strip�decoder)rrr r r r�s cCs<ddl}|��}|jddddd�|jddddd�|jd d dd d�|jd d ddd�|jddddd�|jddd�|�|�}|jr�tj�|j�s�t d��t |j�}t d� |p�d��t �d�tj�|j��r|jdk�stj�|j��r tj�|j|j��r t d��|j�rt d��t|j|j|j|j|jd�dS)Nrz--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.)�actionrOz--infoFz)Display the interpreter from the archive.)rNrQrOrCz'Source directory (or existing archive).)rOz%Can only get info for an archive filezInterpreter: {}zz-In-place editing of archives is not supportedz,Cannot change the main function when copying)rrErG)�argparse�ArgumentParser� add_argument� parse_args�infor�path�isfilerC� SystemExitr�printr@�sys�exit�outputr;�samefilerEr�python�compress)�argsrR�parserrr r r rE�sN � � � � ��   � �rE�__main__)N)NNNNF)N)� contextlibrr8r#r%r[rA�__all__r?�platform� startswithr�getfilesystemencoding� ValueErrorr�contextmanagerrrr)rrrErr r r r �s0    � J 1