o
    Wik                     @  s  d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	 ddl
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 ddlmZmZ erZddlmZ ddlmZ eeZ G dd deZ!G dd deeZ"G dd de"Z#G dd de"Z$g dZ%dS )u,  A rough layout of the current storage goes as:

::

    virtualenv-app-data
    ├── py - <version> <cache information about python interpreters>
    │  └── *.json/lock
    ├── wheel <cache wheels used for seeding>
    │   ├── house
    │   │   └── *.whl <wheels downloaded go here>
    │   └── <python major.minor> -> 3.9
    │       ├── img-<version>
    │       │   └── image
    │       │           └── <install class> -> CopyPipInstall / SymlinkPipInstall
    │       │               └── <wheel name> -> pip-20.1.1-py2.py3-none-any
    │       └── embed
    │           └── 3 -> json format versioning
    │               └── *.json -> for every distribution contains data about newer embed versions and releases
    └─── unzip <in zip app we cannot refer to some internal files, so first extract them>
         └── <virtualenv version>
             ├── py_info.py
             ├── debug.py
             └── _virtualenv.py

    )annotationsN)ABC)contextmanagersuppress)sha256)TYPE_CHECKINGAny)ReentrantFileLock)safe_delete)extract)__version__   )AppDataContentStore)	Generator)Pathc                   @  s   e Zd ZdZdZdZd/dd	Zd0d
dZd0ddZd1ddZ	d1ddZ
ed2ddZed3ddZed4ddZd5d d!Zd1d"d#Zd6d'd(Zed7d)d*Zd8d,d-Zd.S )9AppDataDiskFolderz>Store the application data on the disk within a folder layout.FTfolderstrreturnNonec                 C  s   t || _d S N)r	   lock)selfr    r   W/home/ubuntu/.local/lib/python3.10/site-packages/virtualenv/app_data/via_disk_folder.py__init__8   s   zAppDataDiskFolder.__init__c                 C  s   t | j d| jj dS )N())type__name__r   pathr   r   r   r   __repr__;   s   zAppDataDiskFolder.__repr__c                 C  s   t | jjS r   )r   r   r!   r"   r   r   r   __str__>      zAppDataDiskFolder.__str__c                 C  s    t d| jj t| jj d S )Nzreset app data folder %s)LOGGERdebugr   r!   r
   r"   r   r   r   resetA   s   zAppDataDiskFolder.resetc                 C  s   dS )zDo nothing.Nr   r"   r   r   r   closeE   s    zAppDataDiskFolder.closer!   r   Generator[None]c                 c  s>    | j | }| |jV  W d    d S 1 sw   Y  d S r   r   r!   )r   r!   	path_lockr   r   r   lockedH   s
   

"zAppDataDiskFolder.locked	to_folderPath | NoneGenerator[Path]c                 c  sx    |d ur
t | n| jd t }||j |j|j }| s't|| |V  W d    d S 1 s5w   Y  d S )Nunzip)r	   r   r   lock_for_keynamer!   existsr   )r   r!   r.   rootdestr   r   r   r   N   s    
"zAppDataDiskFolder.extractr	   c                 C  s   | j d d S )Npy_info4)r   r"   r   r   r   
py_info_atW   s   zAppDataDiskFolder.py_info_atPyInfoStoreDiskc                 C  s   t | j|S r   )r:   r9   r   r!   r   r   r   r7   [   r%   zAppDataDiskFolder.py_infoc              
   C  s   | j }|4 |j D ]%}|jdkr0||j | r!|  W d   n1 s+w   Y  qW d   dS 1 s<w   Y  dS )zclear py info..jsonN)r9   r!   iterdirsuffixr2   stemr4   unlink)r   py_info_folderfilenamer   r   r   py_info_clear^   s   
"zAppDataDiskFolder.py_info_cleardistributionfor_py_version EmbedDistributionUpdateStoreDiskc                 C  s   t | jd | d d |S )Nwheelembed3)rF   r   )r   rD   rE   r   r   r   embed_update_logh      z"AppDataDiskFolder.embed_update_logc                 C  s"   | j jd d }|jddd |S )NrG   houseTparentsexist_ok)r   r!   mkdirr;   r   r   r   rL   k   s   zAppDataDiskFolder.houser3   c                 C  s   | j jd | d d | S )NrG   image1r+   )r   rE   r3   r   r   r   wheel_imageq   rK   zAppDataDiskFolder.wheel_imageN)r   r   r   r   )r   r   r   r   )r!   r   r   r*   )r!   r   r.   r/   r   r0   )r   r	   )r!   r   r   r:   )rD   r   rE   r   r   rF   r   r   )rE   r   r3   r   r   r   )r    
__module____qualname____doc__	transient
can_updater   r#   r$   r(   r)   r   r-   r   propertyr9   r7   rC   rJ   rL   rS   r   r   r   r   r   2   s*    








r   c                   @  sZ   e Zd Zdd	d
ZedddZdddZd ddZd!ddZe	d"ddZ
d#ddZdS )$JSONStoreDisk	in_folderr	   keyr   msg_argstuple[str, ...]r   r   c                 C  s"   || _ || _g || jR | _d S r   )r]   r^   filer_   )r   r]   r^   r_   r   r   r   r   v   s   zJSONStoreDisk.__init__r   c                 C  s   | j j| j d S )Nr<   )r]   r!   r^   r"   r   r   r   ra   {   s   zJSONStoreDisk.fileboolc                 C  s
   | j  S r   )ra   r4   r"   r   r   r   r4      s   
zJSONStoreDisk.existsr   c                 C  s   d\}}zt | jjdd}W n ty   d}Y n ty#   Y nw tjdg| jR   |S |rKt	t
 |   W d    d S 1 sFw   Y  d S )N)NFutf-8encodingTzgot %s %s from %s)jsonloadsra   	read_text
ValueError	Exceptionr&   r'   r_   r   OSErrorremove)r   data
bad_formatr   r   r   read   s"   


zJSONStoreDisk.readc                 C  s"   | j   tjdg| jR   d S )Nzremoved %s %s at %s)ra   r@   r&   r'   r_   r"   r   r   r   rl      s   
zJSONStoreDisk.remover*   c                 c  s<    | j | j d V  W d    d S 1 sw   Y  d S r   )r]   r2   r^   r"   r   r   r   r-      s   "zJSONStoreDisk.lockedcontentc                 C  sJ   | j j}|jddd | j jtj|ddddd tjdg| jR   d S )NTrM      )	sort_keysindentrc   rd   zwrote %s %s at %s)	ra   parentrP   
write_textrf   dumpsr&   r'   r_   )r   rp   r   r   r   r   write   s   zJSONStoreDisk.writeN)r]   r	   r^   r   r_   r`   r   r   rU   )r   rb   )r   r   rT   )r   r*   )rp   r   r   r   )r    rV   rW   r   r[   ra   r4   ro   rl   r   r-   rw   r   r   r   r   r\   u   s    



r\   c                         e Zd Zd	 fddZ  ZS )
r:   r]   r	   r!   r   r   r   c                   s.   t t|d }t ||d|f d S )Nrc   zpython info of)r   r   encode	hexdigestsuperr   )r   r]   r!   r^   	__class__r   r   r      s   zPyInfoStoreDisk.__init__)r]   r	   r!   r   r   r   r    rV   rW   r   __classcell__r   r   r|   r   r:          r:   c                      rx   )
rF   r]   r	   rD   r   r   r   c                   s   t  ||d|f d S )Nzembed update of distribution)r{   r   )r   r]   rD   r|   r   r   r      s
   z)EmbedDistributionUpdateStoreDisk.__init__)r]   r	   rD   r   r   r   r~   r   r   r|   r   rF      r   rF   )r   r\   r:   )&rX   
__future__r   rf   loggingabcr   
contextlibr   r   hashlibr   typingr   r   virtualenv.util.lockr	   virtualenv.util.pathr
   virtualenv.util.zipappr   virtualenv.versionr   baser   r   collections.abcr   pathlibr   	getLoggerr    r&   r   r\   r:   rF   __all__r   r   r   r   <module>   s,    
C-	