o
    �PÔa¸j  ã                	   @   sØ  d 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ddlZddlZddl	Z	ddl
ZddlmZ ddlmZmZmZmZ ddlZddlmZmZ ddlmZ ddlZddlmZmZ ddlmZmZ dd	l m!Z!m"Z" dd
lm#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z)m*Z*m+Z+m,Z, ddl-m.Z. ddl/m0Z0 e 1e2¡Z3ee4gee4 f Z5d^dd„Z6e 7d¡Z8e 7de4ej9ƒ› de4ej:ƒ› d�¡Z;e;e+dddd�7 Z;e <de'¡Z=e 7dej>› dej?› de=› d�¡Z@G d d!„ d!ejAƒZBG d"d#„ d#ƒZCd$ee4e4f dee4 fd%d&„ZDd$ee4e4f dee4 fd'd(„ZEd)ejFde#fd*d+„ZGd,ejHddfd-d.„ZId,ejHddfd/d0„ZJd1ejKddfd2d3„ZLd4e5ddfd5d6„ZMd4e5ddfd7d8„ZNd1ejKddfd9d:„ZOd4e5ddfd;d<„ZPd1ejKddfd=d>„ZQd4e5ddfd?d@„ZRd1ejKddfdAdB„ZSd1ejKddfdCdD„ZTd1ejKddfdEdF„ZUd4e5ddfdGdH„ZVd1ejKddfdIdJ„ZWdejHfdKdL„ZXdMee dNeYddfdOdP„ZZdefdQdR„Z[dSe\ddfdTdU„Z]d)ejFddfdVdW„Z^dXejFddfdYdZ„Z_de#fd[d\„Z`e2d]k�rêe ae`ƒ ¡ dS dS )_z"The command line interface to pipxé    N)ÚPath)ÚAnyÚCallableÚDictÚList)ÚInvalidRequirementÚRequirement©Úcanonicalize_name)ÚcommandsÚ	constants)Úhide_cursorÚshow_cursor)ÚboldÚgreen)ÚExitCode)Úhazard)ÚDEFAULT_PYTHON)Ú	PipxErrorÚmkdirÚ	pipx_wrapÚrmdir)ÚVenvContainer)Ú__version__Úreturnc                   C   s   t tƒ d S ©N)Úprintr   © r   r   ú+/usr/lib/python3/dist-packages/pipx/main.pyÚprint_version&   s   r   zË    The package name or specific installation source passed to pip.
    Runs `pip install -U SPEC`.
    For example `--spec mypackage==2.0.0` or `--spec  git+https://github.com/user/repo.git@branch`
    zã
    Install and execute apps from Python packages.

    Binaries can either be installed globally into isolated Virtual Environments
    or run directly in a temporary Virtual Environment.

    Virtual Environment location is z%.
    Symlinks to apps are placed in z.

    a°  
    optional environment variables:
      PIPX_HOME             Overrides default pipx location. Virtual Environments will be installed to $PIPX_HOME/venvs.
      PIPX_BIN_DIR          Overrides location of app installations. Apps are symlinked or copied here.
      USE_EMOJI             Overrides emoji behavior. Default value varies based on platform.
      PIPX_DEFAULT_PYTHON   Overrides default python used for commands.
    z                        T)Úsubsequent_indentÚkeep_newlinesÚPIPX__DOC_DEFAULT_PYTHONa  
    The install command is the preferred way to globally install apps
    from python packages on your system. It creates an isolated virtual
    environment for the package, then ensures the package's apps are
    accessible on your $PATH.

    The result: apps you can run from anywhere, located in packages
    you can cleanly upgrade or uninstall. Guaranteed to not have
    dependency version conflicts or interfere with your OS's python
    packages. 'sudo' is not required to do this.

    pipx install PACKAGE_NAME
    pipx install --python PYTHON PACKAGE_NAME
    pipx install VCS_URL
    pipx install ./LOCAL_PATH
    pipx install ZIP_FILE
    pipx install TAR_GZ_FILE

    The PACKAGE_SPEC argument is passed directly to `pip install`.

    The default virtual environment location is z°
    and can be overridden by setting the environment variable `PIPX_HOME`
    (Virtual Environments will be installed to `$PIPX_HOME/venvs`).

    The default app location is z“ and can be
    overridden by setting the environment variable `PIPX_BIN_DIR`.

    The default python executable used to install a package is
    zZ and can be overridden
    by setting the environment variable `PIPX_DEFAULT_PYTHON`.
    c                   @   s&   e Zd Zdededee fdd„ZdS )ÚLineWrapRawTextHelpFormatterÚtextÚwidthr   c                 C   s   | j  d|¡ ¡ }t ||¡S )Nú )Ú_whitespace_matcherÚsubÚstripÚtextwrapÚwrap)Úselfr$   r%   r   r   r   Ú_split_linesp   s   z)LineWrapRawTextHelpFormatter._split_linesN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚintr   r-   r   r   r   r   r#   o   s    r#   c                   @   s8   e Zd Zdeddfdd„Zdededee fdd	„ZdS )
ÚInstalledVenvsCompleterÚvenv_containerr   Nc                 C   s   dd„ t | ¡ ƒD ƒ| _d S )Nc                 S   s   g | ]}t |jƒ‘qS r   )r1   Úname)Ú.0Úpr   r   r   Ú
<listcomp>w   s    z4InstalledVenvsCompleter.__init__.<locals>.<listcomp>)ÚsortedÚiter_venv_dirsÚpackages)r,   r4   r   r   r   Ú__init__v   s   z InstalledVenvsCompleter.__init__ÚprefixÚkwargsc                    s   ‡ fdd„| j D ƒS )Nc                    s2   g | ]}|  tˆ ƒ¡rˆ › |tˆ ƒd … › �‘qS r   )Ú
startswithr
   Úlen©r6   Úx©r=   r   r   r8   z   s    ýÿz/InstalledVenvsCompleter.use.<locals>.<listcomp>)r;   )r,   r=   r>   r   rC   r   Úusey   s   
þzInstalledVenvsCompleter.use)	r.   r/   r0   r   r<   r1   r   r   rD   r   r   r   r   r3   u   s    r3   Úparsed_argsc                 C   sV   g }|   d¡r|d| d g7 }|   d¡r|t |   dd¡¡7 }|   d¡r)|dg7 }|S )NÚ	index_urlú--index-urlÚpip_argsÚ Úeditableú
--editable)ÚgetÚshlexÚsplit)rE   rH   r   r   r   Úget_pip_args�   s   



rO   c                 C   s   g }|   d¡r|dg7 }|S )NÚsystem_site_packagesú--system-site-packages)rL   )rE   Ú	venv_argsr   r   r   Úget_venv_args�   s   

rS   Úargsc                 C   sT  d| v r| j nd}tt| ƒƒ}tt| ƒƒ}ttjƒ}d| v rX| j}tj	 
|¡jr,tdƒ‚d| v rK| jd urKtj	 
| j¡jrKd| jvrK| jd|› � | _| |¡}t d|› �¡ d| v rdd	d
„ | jD ƒ}| jdkr¯d| v ru| jd uru| jn| jd }z
t| jd ƒj}	W n ty’   | jd }	Y nw | j }
t |	|| jdd … | j||| j||
¡	 tdƒS | jdkrÊtjd d | jtj| j|||| j | j!| j"d�S | jdkràtj#|d | j$||| j%| j!| j d�S | jdkrñtj&|||| j'| j d�S | jdk�rtj(||| j'|| j d�S | jdk�rt )|| j'| j*¡S | jdk�r t +|tj|¡S | jdk�r.t ,|tj|¡S | jdk�r?tj-|tj| j|d�S | jdk�rQtj.|tj| j||d�S | jdk�rh|�s^tdƒ‚t /||| j0| j ¡S | jdk�r“ztj1| j d �W S  t2�y’ } ztj3d!d"d#� tt4|ƒdd$�‚d }~ww | jd%k�r¢t5tj6ƒ tdƒS td&| j› �ƒ‚)'NÚverboseFÚpackagezPackage cannot be a urlÚspecz#egg=z Virtual Environment location is Úskipc                 S   s   g | ]}t |ƒ‘qS r   r	   rA   r   r   r   r8   «   s    z$run_pipx_command.<locals>.<listcomp>Úrunr   é   Úinstall)ÚforceÚinclude_dependenciesÚsuffixÚinject)rU   Úinclude_appsr]   r\   Úupgrade)Úinclude_injectedr\   úupgrade-all)rb   rX   r\   ÚlistÚ	uninstallúuninstall-allÚ	reinstall)Úvenv_dirÚlocal_bin_dirÚpythonrU   úreinstall-all)rX   Úrunpipz)Developer error: venv_dir is not defined.Ú
ensurepath)r\   úUncaught Exception:T©Úexc_info)Úwrap_messageÚcompletionszUnknown command )7rU   rO   ÚvarsrS   r   r   ÚPIPX_LOCAL_VENVSrV   ÚurllibÚparseÚurlparseÚschemer   rW   Úget_venv_dirÚloggerÚinforX   ÚcommandÚapp_with_argsr   r5   r   Úno_cacher   rY   rj   Ú
pypackagesr   r[   Úpackage_specÚLOCAL_BIN_DIRr\   Úinclude_depsr^   r_   Údependenciesr`   ra   rb   Úupgrade_allÚlist_packagesÚjsonre   Úuninstall_allrg   Úreinstall_allÚrun_pipÚpipargsÚensure_pipx_pathsÚ	ExceptionÚdebugr1   r   Úcompletion_instructions)rT   rU   rH   rR   r4   rV   rh   Ú	skip_listÚpackage_or_urlÚpackage_nameÚ	use_cacheÚer   r   r   Úrun_pipx_command—   sê   



ÿýý÷
õ
ø

ûûüû€þ
r”   Úparserc                 C   sD   | j dddd� | j dddd� | j d	d
ddd� | j ddd� d S )NrQ   Ú
store_truezDGive the virtual environment access to the system site-packages dir.©ÚactionÚhelprG   z-iz Base URL of Python Package Index©r™   rK   z-ez"Install a project in editable mode©r™   r˜   z
--pip-argszHArbitrary pip arguments to pass directly to pip install/upgrade commands©Úadd_argument©r•   r   r   r   Úadd_pip_venv_args  s    ýü
þrŸ   c                 C   s   | j dddd� d S )Nz--include-depsz"Include apps of dependent packagesr–   r›   rœ   rž   r   r   r   Úadd_include_dependencies+  s   
ÿr    Ú
subparsersc                 C   st   | j ddttd�}|jddd� t|ƒ |jddd	� |jd
dddd� |jdddd� |jdtdd� t|ƒ d S )Nr[   zInstall a package)r™   Úformatter_classÚdescriptionr€   z%package name or pip installation specrš   ú	--verboser–   ©r˜   ú--forceú-fú=Modify existing virtual environment and files in PIPX_BIN_DIRr—   z--suffixrI   z}Optional suffix for virtual environment and executable names. NOTE: The suffix feature is experimental and subject to change.©Údefaultr™   ú--pythonzlThe Python executable used to create the Virtual Environment and run the associated app/apps. Must be v3.6+.)Ú
add_parserr#   ÚINSTALL_DESCRIPTIONr�   r    r   rŸ   ©r¡   r7   r   r   r   Ú_add_install1  s4   üüüür¯   Úvenv_completerc                 C   st   | j dddd�}||jddd�_|jdd	d
d� |jdddd� t|ƒ t|ƒ |jddddd� |jddd� d S )Nr_   z5Install packages into an existing Virtual EnvironmentzBInstalls packages to an existing pipx-managed virtual environment.©r™   r£   rV   zDName of the existing pipx-managed Virtual Environment to inject intorš   rƒ   ú+z\the packages to inject into the Virtual Environment--either package name or pip package spec)Únargsr™   z--include-appsr–   z2Add apps from the injected packages onto your PATHr—   r¦   r§   r¨   r¤   r¥   )r¬   r�   Ú	completerr    rŸ   ©r¡   r°   r7   r   r   r   Ú_add_injectT  s<   ýýþýýür¶   c                 C   sX   | j dddd�}|| d¡_|jdddd	� |jd
dddd	� t|ƒ |jddd� d S )Nra   zUpgrade a packagezbUpgrade a package in a pipx-managed Virtual Environment by running 'pip install --upgrade PACKAGE'r±   rV   ú--include-injectedr–   ú>Also upgrade packages injected into the main app's environmentr—   r¦   r§   r¨   r¤   r¥   )r¬   r�   r´   rŸ   rµ   r   r   r   Ú_add_upgrades  s&   ýýür¹   c                 C   sV   | j dddd�}|jdddd� |jd	d
g dd� |jddddd� |jddd� d S )Nrc   zGUpgrade all packages. Runs `pip install -U <pkgname>` for each package.zbUpgrades all packages within their virtual environments by running 'pip install --upgrade PACKAGE'r±   r·   r–   r¸   r—   ú--skipr²   úskip these packages©r³   rª   r™   r¦   r§   r¨   r¤   r¥   ©r¬   r�   r®   r   r   r   Ú_add_upgrade_all‰  s$   ýýür¾   c                 C   s.   | j dddd�}|| d¡_|jddd� d S )	Nre   zUninstall a packagezbUninstalls a pipx-managed Virtual Environment by deleting it and any files that point to its apps.r±   rV   r¤   r–   r¥   )r¬   r�   r´   rµ   r   r   r   Ú_add_uninstallž  s   ýr¿   c                 C   s"   | j dddd�}|jddd� d S )Nrf   zUninstall all packagesz#Uninstall all pipx-managed packagesr±   r¤   r–   r¥   r½   r®   r   r   r   Ú_add_uninstall_all¨  s   ýrÀ   c                 C   sF   | j dtdt d¡d�}|| d¡_|jdtdd� |jd	d
d� d S )Nrg   zReinstall a packagezÉ
            Reinstalls a package.

            Package is uninstalled, then installed with pipx install PACKAGE
            with the same options used in the original install of PACKAGE.

            ©r¢   r™   r£   rV   r«   únThe Python executable used to recreate the Virtual Environment and run the associated app/apps. Must be v3.6+.r©   r¤   r–   r¥   )r¬   r#   r*   Údedentr�   r´   r   rµ   r   r   r   Ú_add_reinstall±  s   ÿüürÄ   c                 C   sL   | j dtdt d¡d�}|jdtdd� |jdd	g d
d� |jddd� d S )Nrk   zReinstall all packagesaV  
            Reinstalls all packages.

            Packages are uninstalled, then installed with pipx install PACKAGE
            with the same options used in the original install of PACKAGE.
            This is useful if you upgraded to a new version of Python and want
            all your packages to use the latest as well.

            rÁ   r«   rÂ   r©   rº   r²   r»   r¼   r¤   r–   r¥   )r¬   r#   r*   rÃ   r�   r   r®   r   r   r   Ú_add_reinstall_allÌ  s   ÿüürÅ   c                 C   sB   | j dddd�}|jdddd� |jd	dd
d� |jddd� d S )Nrd   zList installed packagesz*List packages and apps installed with pipxr±   r·   r–   z6Show packages injected into the main app's environmentr—   z--jsonz Output rich data in json format.r¤   r¥   r½   r®   r   r   r   Ú	_add_listé  s   ýýÿrÆ   c              	   C   sÂ   | j dtdt dtj› d�¡d�}|jdddd	� |jd
dtjdg d� |jdddd	� |jdt	d� |jddd� |jdt
dd� t|ƒ |j|d� t dd| ¡ ¡|_t dd|j¡|_d S )NrY   z«Download the latest version of a package to a temporary virtual environment, then run an app from it. Also compatible with local `__pypackages__` directory (experimental).zÀ
            Download the latest version of a package to a temporary virtual environment,
            then run an app from it. The environment will be cached
            and re-used for up to aë   days. This
            means subsequent calls to 'run' for the same package will be faster
            since they can re-use the cached Virtual Environment.

            In support of PEP 582 'run' will use apps found in a local __pypackages__
            directory, if present. Please note that this behavior is experimental,
            and acts as a companion tool to pythonloc. It may be modified or
            removed in the future. See https://github.com/cs01/pythonloc.
            rÁ   z
--no-cacher–   z5Do not re-use cached virtual environment if it existsr—   r}   zapp ...z5app/package name and any arguments to be passed to it)Úmetavarr³   r™   rª   z--pypackagesz9Require app to be run from local __pypackages__ directoryz--specrš   r¤   r¥   r«   z@The Python version to run package's CLI app with. Must be v3.6+.r©   )Ú	subparserz^usage: rI   z\.\.\.)r¬   r#   r*   rÃ   r   Ú#TEMP_VENV_EXPIRATION_THRESHOLD_DAYSr�   ÚargparseÚ	REMAINDERÚ	SPEC_HELPr   rŸ   Úset_defaultsÚrer(   Úformat_usageÚusager®   r   r   r   Ú_add_runú  sL   ýÿøýûýýrÑ   c                 C   sF   | j dddd�}||jddd�_|jdtjg dd	� |jd
dd� d S )Nrl   z7Run pip in an existing pipx-managed Virtual Environmentr±   rV   zCName of the existing pipx-managed Virtual Environment to run pip inrš   rŠ   z#Arguments to forward to pip commandr¼   r¤   r–   r¥   )r¬   r�   r´   rÊ   rË   rµ   r   r   r   Ú_add_runpip3  s$   ýýþürÒ   c                 C   s&   | j dddd�}|jddddd	� d S )
Nrm   zVEnsure directories necessary for pipx operation are in your PATH environment variable.a   Ensure directory where pipx stores apps is in your PATH environment variable. Also if pipx was installed via `pip install --user`, ensure pipx itself is in your PATH. Note that running this may modify your shell's configuration file(s) such as '~/.bashrc'.r±   r¦   r§   r–   zzAdd text to your shell's config file even if it looks like your PATH already contains paths to pipx and pipx-install apps.r—   r½   r®   r   r   r   Ú_add_ensurepathF  s   ù
ûrÓ   c                  C   sÖ   t tjƒ} t| ƒ}tjdttd�}t ¡ d |_	|j
ddd�}t|ƒ t||jƒ t||jƒ t|ƒ t||jƒ t|ƒ t||jƒ t|ƒ t|ƒ t|ƒ t||jƒ t|ƒ |jddd	d
� |jdddd� |S )NÚpipx)Úprogr¢   r£   rZ   r|   z.Get help for commands with pipx COMMAND --help)Údestr£   z	--versionr–   zPrint version and exitr—   rr   z9Print instructions on enabling shell completions for pipxr±   )r   r   rt   r3   rÊ   ÚArgumentParserr#   ÚPIPX_DESCRIPTIONÚ
splitlinesÚman_short_descriptionÚadd_subparsersr¯   r¶   rD   r¹   r¾   r¿   rÀ   rÄ   rÅ   rÆ   rÑ   rÒ   rÓ   r�   r¬   )r4   Úcompleter_venvsr•   r¡   r   r   r   Úget_command_parser`  s<   
ýÿýrÝ   Ú	file_listÚkeep_numberc              	   C   sN   t | ƒ} t| ƒ|kr#| d | … D ]}z| ¡  W q ty"   Y qw d S d S r   )r9   r@   ÚunlinkÚFileNotFoundError)rÞ   rß   Úexisting_filer   r   r   Údelete_oldest_logs†  s   ÿürã   c                  C   s¤   d} t jjddd� ttt j d¡ƒ| ƒ ttt j d¡ƒ| ƒ t d¡}t jd|› d� }d	}| ¡ rP|dk rPt jd|› d
|› d� }|d	7 }| ¡ rP|dk s8|S )Né
   T)ÚparentsÚexist_okzcmd_*[0-9].logzcmd_*_pip_errors.logz%Y-%m-%d_%H.%M.%SÚcmd_z.logrZ   Ú_)	r   ÚPIPX_LOG_DIRr   rã   rd   ÚglobÚtimeÚstrftimeÚexists)Úmax_logsÚdatetime_strÚlog_fileÚcounterr   r   r   Úsetup_log_file�  s   ÿ
þrò   rU   c              	   C   s¨   t j ¡ rttdƒƒnd}tƒ tj_dddddœd|d ddœddddœd	œd
| r+dnd| r0dnddœddt	tjjƒdddœdœdddgddœiddœ}t
j |¡ d S )Nzpipx >rZ   zlogging.Formatterz	{message}ú{)ÚclassÚformatÚstylez ({funcName}:{lineno}): {message}z;{relativeCreated: >8.1f}ms ({funcName}:{lineno}): {message})Ústream_nonverboseÚstream_verboseÚfilezlogging.StreamHandlerrø   r÷   ÚINFOÚWARNING)rô   Ú	formatterÚlevelzlogging.FileHandlerrù   zutf-8ÚDEBUG)rô   rü   ÚfilenameÚencodingrý   )Ústreamrù   rÔ   r  )Úhandlersrý   F)ÚversionÚ
formattersr  ÚloggersÚincremental)ÚsysÚstdoutÚisattyr   r   rò   rÔ   r   Úpipx_log_filer1   ÚloggingÚconfigÚ
dictConfig)rU   Úpipx_strÚlogging_configr   r   r   Úsetup_logging¤  s>   
ýýýõ

ý
ûúÞ$r  c                 C   sâ   d| v r| j rtƒ  t d¡ td| v o| jƒ t t 	d¡› ¡ t d 
tj¡› ¡ t dt› �¡ t dttƒ› �¡ ttjƒ ttjƒ ttjƒ ttjdƒ tjd	 }| ¡ rot td
t› dt|ƒ› d�dd�¡ d S d S )Nr  r   rU   z%Y-%m-%d %H:%M:%Sr&   zpipx version is zDefault python interpreter is Fzpipx-appz
                zA  A virtual environment for pipx was detected at
                z“. The 'pipx-app' package has been
                renamed back to 'pipx'
                (https://github.com/pypa/pipx/issues/82).
                z    )r    )r  r   r  Úexitr  rU   rz   r�   rë   rì   ÚjoinÚargvr{   r   Úreprr   r   r   rt   r�   ÚPIPX_VENV_CACHEDIRr   ÚPIPX_TRASH_DIRrí   Úwarningr   r   r1   )rT   Úold_pipx_venv_locationr   r   r   ÚsetupÐ  s2   




ÿþùÿÿr  Úparsed_pipx_argsc                 C   sH   | j dkr | jr| jd dkr| j d¡ | js"| j d¡ d S d S d S )NrY   r   z--z)the following arguments are required: app)r|   r}   ÚpoprÈ   Úerror)r  r   r   r   Ú
check_argsñ  s   
ÿør  c               
   C   s4  z�z:t ƒ  tƒ } t | ¡ |  ¡ }t|ƒ t|ƒ |js.|  ¡  t	dƒW W t
 d¡ tƒ  S t|ƒW W t
 d¡ tƒ  S  tym } z&tt|ƒtjd� t
jd|› �dd� t	dƒW  Y d}~W t
 d¡ tƒ  S d}~w ty‚   t	dƒ Y W t
 d¡ tƒ  S  ty�   t
jddd� ‚ w t
 d¡ tƒ  w )	zEntry point from command linerZ   zpipx finished.)rù   zPipxError: Tro   Nrn   )r   rÝ   ÚargcompleteÚautocompleteÚ
parse_argsr  r  r|   Ú
print_helpr   rz   r�   r   r”   r   r   r1   r  ÚstderrÚKeyboardInterruptrŒ   )r•   r  r“   r   r   r   Úcliÿ  s@   



ô
õ
€ù
ûþ
r$  Ú__main__)r   N)bÚ__doc__rÊ   r  Úlogging.configÚosrÎ   rM   r  r*   rë   Úurllib.parseru   Úpathlibr   Útypingr   r   r   r   r  Úpackaging.requirementsr   r   Úpackaging.utilsr
   Úpipx.constantsrÔ   r   r   Úpipx.animater   r   Úpipx.colorsr   r   r   Úpipx.emojisr   Úpipx.interpreterr   Ú	pipx.utilr   r   r   r   Ú	pipx.venvr   Úpipx.versionr   Ú	getLoggerr.   rz   r1   ÚVenvCompleterr   rÃ   rÌ   rt   r�   rØ   ÚgetenvÚDOC_DEFAULT_PYTHONÚDEFAULT_PIPX_HOMEÚDEFAULT_PIPX_BIN_DIRr­   ÚRawDescriptionHelpFormatterr#   r3   rO   rS   Ú	Namespacer”   r×   rŸ   r    Ú_SubParsersActionr¯   r¶   r¹   r¾   r¿   rÀ   rÄ   rÅ   rÆ   rÑ   rÒ   rÓ   rÝ   r2   rã   rò   Úboolr  r  r  r$  r  r   r   r   r   Ú<module>   s¨   

ÿúùÿ÷ìèäÿ# #
	9&
,!
ÿ