
    3ik                    >   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rddlmZ ddlmZ  ej<                  e      Z  G d de      Z! G d dee      Z" G d de"      Z# G d de"      Z$g dZ%y)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                      e Zd ZdZdZdZddZddZddZddZ	ddZ
edd	       Zedd
       Zedd       ZddZddZddZedd       ZddZy)AppDataDiskFolderz>Store the application data on the disk within a folder layout.FTc                $    t        |      | _        y N)r
   lock)selffolders     V/var/www/opsc/venv/lib/python3.12/site-packages/virtualenv/app_data/via_disk_folder.py__init__zAppDataDiskFolder.__init__8   s    %f-	    c                `    t        |       j                   d| j                  j                   dS )N())type__name__r   pathr   s    r   __repr__zAppDataDiskFolder.__repr__;   s)    t*%%&a		'7q99r   c                @    t        | j                  j                        S r   )strr   r"   r#   s    r   __str__zAppDataDiskFolder.__str__>   s    499>>""r   c                    t         j                  d| j                  j                         t	        | j                  j                         y )Nzreset app data folder %s)LOGGERdebugr   r"   r   r#   s    r   resetzAppDataDiskFolder.resetA   s)    /@DIINN#r   c                     y)zDo nothing.N r#   s    r   closezAppDataDiskFolder.closeE   s    r   c              #  t   K   | j                   |z  }|5  |j                   d d d        y # 1 sw Y   y xY wwr   r   r"   )r   r"   	path_locks      r   lockedzAppDataDiskFolder.lockedH   s5     II$	 	!.. 	! 	! 	!s   8,	858c              #  .  K   |t         |             n| j                  dz  t        z  }|j                  |j                        5  |j
                  |j                  z  }|j                         st        ||       | d d d        y # 1 sw Y   y xY ww)Nunzip)r
   r   r   lock_for_keynamer"   existsr   )r   r"   	to_folderrootdests        r   r   zAppDataDiskFolder.extractN   sz     1:1F -DIIX_L_bmLmtyy) 	99tyy(D;;=d#J		 	 	s   AB:B	 	B	BBc                &    | j                   dz  dz  S )Npy_info4)r   r#   s    r   
py_info_atzAppDataDiskFolder.py_info_atW   s    yy9$s**r   c                .    t        | j                  |      S r   )PyInfoStoreDiskr>   r   r"   s     r   r<   zAppDataDiskFolder.py_info[   s    t55r   c                J   | j                   }|5  |j                  j                         D ]V  }|j                  dk(  s|j	                  |j
                        5  |j                         r|j                          ddd       X 	 ddd       y# 1 sw Y   lxY w# 1 sw Y   yxY w)zclear py info..jsonN)r>   r"   iterdirsuffixr5   stemr7   unlink)r   py_info_folderfilenames      r   py_info_clearzAppDataDiskFolder.py_info_clear^   s     	.*//779 .??g-'44X]]C .#??,$OO-. ..	. 	.. .	. 	.s(   -BB!B9
BBBB"c                F    t        | j                  dz  |z  dz  dz  |      S )Nwheelembed3) EmbedDistributionUpdateStoreDiskr   )r   distributionfor_py_versions      r   embed_update_logz"AppDataDiskFolder.embed_update_logh   s*    /		G0Cn0TW^0^ad0dfrssr   c                d    | j                   j                  dz  dz  }|j                  dd       |S )NrL   houseTparentsexist_ok)r   r"   mkdirrA   s     r   rT   zAppDataDiskFolder.housek   s.    yy~~''1

4$
/r   c                L    | j                   j                  dz  |z  dz  dz  |z  S )NrL   image1r0   )r   rQ   r6   s      r   wheel_imagezAppDataDiskFolder.wheel_imageq   s)    yy~~'.87BSH4OOr   N)r   r&   returnNone)r]   r&   r]   r^   )r"   r   r]   Generator[None])r"   r   r8   zPath | Noner]   zGenerator[Path])r]   r
   )r"   r   r]   r@   )rP   r&   rQ   r&   r]   rO   r]   r   )rQ   r&   r6   r&   r]   r   )r!   
__module____qualname____doc__	transient
can_updater   r$   r'   r+   r.   r   r2   r   propertyr>   r<   rJ   rR   rT   r\   r-   r   r   r   r   2   s    HIJ.:#$ ! !
   + +6.t  
Pr   r   c                  X    e Zd Zd	dZed
d       ZddZddZddZe	dd       Z
ddZy)JSONStoreDiskc                L    || _         || _        g || j                  | _        y r   )	in_folderkeyfilemsg_args)r   rk   rl   rn   s       r   r   zJSONStoreDisk.__init__v   s%    ".(.DII.r   c                N    | j                   j                  | j                   dz  S )NrC   )rk   r"   rl   r#   s    r   rm   zJSONStoreDisk.file{   s"    ~~""z%777r   c                6    | j                   j                         S r   )rm   r7   r#   s    r   r7   zJSONStoreDisk.exists   s    yy!!r   c                V   d\  }}	 t        j                  | j                  j                  d            }t	        j
                  dg| j                    |S # t        $ r d}Y nt        $ r Y nw xY w|r5t        t              5  | j                          d d d        y # 1 sw Y   y xY wy )N)NFutf-8encodingzgot %s %s from %sT)jsonloadsrm   	read_textr)   r*   rn   
ValueError	Exceptionr   OSErrorremove)r   data
bad_formats      r   readzJSONStoreDisk.read   s    &j	::dii1171CDD LL,=t}}=K  	J 		
 '" ts#   /A A0%A0/A0BB'c                x    | j                   j                          t        j                  dg| j                    y )Nzremoved %s %s at %s)rm   rG   r)   r*   rn   r#   s    r   r{   zJSONStoreDisk.remove   s(    		*;T]];r   c              #     K   | j                   j                  | j                        5  d  d d d        y # 1 sw Y   y xY wwr   )rk   r5   rl   r#   s    r   r2   zJSONStoreDisk.locked   s3     ^^((2 		 	 	s   &A6	A?Ac                    | j                   j                  }|j                  dd       | j                   j                  t	        j
                  |dd      d       t        j                  dg| j                    y )NTrU      )	sort_keysindentrr   rs   zwrote %s %s at %s)	rm   parentrX   
write_textru   dumpsr)   r*   rn   )r   contentr   s      r   writezJSONStoreDisk.write   s\    !!TD1		TZZ4JU\](94==9r   N)rk   r
   rl   r&   rn   ztuple[str, ...]r]   r^   ra   )r]   bool)r]   r	   r_   )r]   r`   )r   r	   r]   r^   )r!   rb   rc   r   rg   rm   r7   r~   r{   r   r2   r   r-   r   r   ri   ri   u   sC    /
 8 8" <  :r   ri   c                        e Zd Zd fdZ xZS )r@   c                    t        t        |      j                  d            j                         }t        |   ||d|f       y )Nrr   zpython info of)r   r&   encode	hexdigestsuperr   )r   rk   r"   rl   	__class__s       r   r   zPyInfoStoreDisk.__init__   s<    SY%%g./99;C*:D)ABr   )rk   r
   r"   r   r]   r^   r!   rb   rc   r   __classcell__r   s   @r   r@   r@      s    C Cr   r@   c                        e Zd Zd fdZ xZS )rO   c                ,    t         |   ||d|f       y )Nzembed update of distribution)r   r   )r   rk   rP   r   s      r   r   z)EmbedDistributionUpdateStoreDisk.__init__   s    +\:	
r   )rk   r
   rP   r&   r]   r^   r   r   s   @r   rO   rO      s    
 
r   rO   )r   ri   r@   )&rd   
__future__r   ru   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   ri   r@   rO   __all__r-   r   r   <module>r      s   4 #    /  % 2 , * * ')			8	$@P @PF*:L# *:ZCm C
} 
r   