o w[eo@sddlZddlZddlZddlZddlZddlZddlZgdZdZej dr+dZ ne Z Gddde Zejdd Zd d Zdd d Z  dddZddZdddZedkr`edSdS)N) ZipAppErrorcreate_archiveget_interpreterz8# -*- coding: utf-8 -*- import {module} {module}.{fn}() winutf-8c@s eZdZdS)rN)__name__ __module__ __qualname__r r /usr/lib/python3.10/zipapp.pyr!srccsRt|ttjfr$t|| }|VWddS1swYdS|VdSN) isinstancestrosPathLikeopen)archivemodefr r r _maybe_open%s  " rcCs(|rd|td}||dSdS)zWrite a shebang line.#! N)encodeshebang_encodingwrite)r interpretershebangr r r _write_file_prefix.src Cst|d<}|d}|dkrd}|t|d}t||||t||Wdn1s5wYWdn1sDwY|r_t|trat |t |j t j BdSdSdS)z8Copy an application archive, modifying the shebang line.rbrwbN)rreadreadlinerrshutil copyfileobjr rrchmodstatst_modeS_IEXEC)r new_archiversrcfirst_2dstr r r _copy_archive5s     r.Fc Csd}t|drt|drd}n t|}|rd}|r$t|||dS|s,td|d}|r:|r:td|sB|sBtd d}|r{|d \} } } td d | d D} tdd | d D} | d krn| rn| sttd|t j | | d}|dur| d}n t|dst|}t |dU}t|||rtjntj}tj|d|d0}|dD]}||}|dus||r|||q|r|d|dWdn1swYWdn1swY|rt|ds ||jtjBdSdSdS)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:cs|]}|VqdSr  isidentifier.0partr r r {z!create_archive...csr0r r1r3r r r r6|r7zInvalid entry point: )modulefnz.pyzrr!w) compression*r)hasattrpathlibPathis_filer.existsr partitionallsplit MAIN_TEMPLATEformat with_suffixrrzipfile ZIP_DEFLATED ZIP_STOREDZipFilerglob relative_toras_posixwritestrrr&r'r(r))sourcetargetrmainfilter compressedsource_is_filehas_mainmain_pymodsepr:mod_okfn_okfdr<zchildarcnamer r r rLsd            rcCs^t|d }|ddkr|tWdSWddS1s(wYdS)Nrrr)rr"r#stripdecoder)rrr r r rs "rcCs2ddl}|}|jddddd|jdddd d|jd d dd d|jd dddd|jddddd|jddd||}|jrbtj|jsOt dt |j}t d |pZdt dtj|jr|jdus~tj|jrtj|j|jrt d|jrt dt|j|j|j|j|jddS)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. rNz--outputz-ozAThe name of the output archive. Required if SOURCE is an archive.)defaulthelpz--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.)actionrdz--infoFz)Display the interpreter from the archive.)rcrfrdrQz'Source directory (or existing archive).)rdz%Can only get info for an archive filezInterpreter: {}zz-In-place editing of archives is not supportedz,Cannot change the main function when copying)rrSrU)argparseArgumentParser add_argument parse_argsinforpathisfilerQ SystemExitrprintrGsysexitoutputrBsamefilerSrpythoncompress)argsrgparserrr r r rSsL          rS__main__r )NNNNF) contextlibrr?r$r'rprI__all__rFplatform startswithrgetfilesystemencoding ValueErrorrcontextmanagerrrr.rrrSrr r r r s2    J 1