<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
B
    a                 @   s   d Z ddlmZmZ ddlZddlZddlmZ ddlm	Z	 ddl
mZ ddl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 ddlmZmZ G dd deZeeG dd deZG dd deZG dd de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
    )absolute_importunicode_literalsN)ABCMeta)contextmanager)sha256)ReentrantFileLock)safe_delete)ensure_text)extract)__version__   )AppDataContentStorec               @   s   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dS )AppDataDiskFolderzH
    Store the application data on the disk within a folder layout.
    FTc             C   s   t || _d S )N)r   lock)selffolder r   T/opt/alt/python37/lib/python3.7/site-packages/virtualenv/app_data/via_disk_folder.py__init__4   s    zAppDataDiskFolder.__init__c             C   s   d t| j| jjS )Nz{}({}))formattype__name__r   path)r   r   r   r   __repr__7   s    zAppDataDiskFolder.__repr__c             C   s   t | jjS )N)strr   r   )r   r   r   r   __str__:   s    zAppDataDiskFolder.__str__c             C   s    t d| jj t| jj d S )Nzreset app data folder %s)loggingdebugr   r   r   )r   r   r   r   reset=   s    zAppDataDiskFolder.resetc             C   s   dS )z
do nothingNr   )r   r   r   r   closeA   s    zAppDataDiskFolder.closec          	   c   s&   | j | }| |jV  W d Q R X d S )N)r   r   )r   r   Z	path_lockr   r   r   lockedD   s    
zAppDataDiskFolder.lockedc          	   c   sb   |d k	rt | }n| jd t }||j* |j|j }| sNt|| |V  W d Q R X d S )Nunzip)r   r   r   lock_for_keynamer   existsr
   )r   r   Z	to_folderrootdestr   r   r   r
   J   s    
zAppDataDiskFolder.extractc             C   s   | j d d S )Npy_info1)r   )r   r   r   r   
py_info_atV   s    zAppDataDiskFolder.py_info_atc             C   s   t | j|S )N)PyInfoStoreDiskr*   )r   r   r   r   r   r(   Z   s    zAppDataDiskFolder.py_infoc             C   s`   | j }|L xD|j D ]6}|jdkr||j | rD|  W dQ R X qW W dQ R X dS ) z.jsonN)r*   r   Ziterdirsuffixr#   Zstemr%   unlink)r   Zpy_info_folderfilenamer   r   r   py_info_clear]   s    
zAppDataDiskFolder.py_info_clearc             C   s   t | jd | d d |S )NwheelZembed3) EmbedDistributionUpdateStoreDiskr   )r   distributionfor_py_versionr   r   r   embed_update_logg   s    z"AppDataDiskFolder.embed_update_logc             C   s"   | j jd d }|jddd |S )Nr1   houseT)parentsexist_ok)r   r   mkdir)r   r   r   r   r   r7   j   s    zAppDataDiskFolder.housec             C   s   | j jd | d d | S )Nr1   Zimager)   )r   r   )r   r5   r$   r   r   r   wheel_imagep   s    zAppDataDiskFolder.wheel_imageN)r   
__module____qualname____doc__Z	transientZ
can_updater   r   r   r   r    r   r!   r
   propertyr*   r(   r0   r6   r7   r;   r   r   r   r   r   ,   s    
r   c               @   sL   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dS )JSONStoreDiskc             C   s$   || _ || _|| _|| jf | _d S )N)	in_folderkeymsgfilemsg_args)r   rA   rB   rC   rE   r   r   r   r   v   s    zJSONStoreDisk.__init__c             C   s   | j jd| j S )Nz{}.json)rA   r   r   rB   )r   r   r   r   rD   |   s    zJSONStoreDisk.filec             C   s
   | j  S )N)rD   r%   )r   r   r   r   r%      s    zJSONStoreDisk.existsc             C   s   d\}}y.t | j }tjd| jf| j  |S  t	k
rN   d}Y n t
k
r`   Y nX |ry|   W n tk
r   Y nX d S )N)NFzgot {} from %sT)jsonloadsrD   Z	read_textr   r   r   rC   rE   
ValueError	ExceptionremoveOSError)r   data
bad_formatr   r   r   read   s    zJSONStoreDisk.readc             C   s(   | j   tjd| jf| j  d S )Nzremoved {} at %s)rD   r.   r   r   r   rC   rE   )r   r   r   r   rJ      s    
zJSONStoreDisk.removec          	   c   s$   | j | j d V  W d Q R X d S )N)rA   r#   rB   )r   r   r   r   r!      s    zJSONStoreDisk.lockedc             C   sP   | j j}|jddd | j ttj|ddd tjd	| j
f| j  d S )NT)r8   r9      )	sort_keysindentzwrote {} at %s)rD   parentr:   Z
write_textr	   rF   dumpsr   r   r   rC   rE   )r   contentr   r   r   r   write   s    zJSONStoreDisk.writeN)r   r<   r=   r   r?   rD   r%   rN   rJ   r   r!   rU   r   r   r   r   r@   t   s   r@   c                   s   e Zd Z fddZ  ZS )r+   c                s@   t tjrt|dnt| }tt| ||d|f d S )Nzutf-8zpython info of %s)	r   sixPY3r   encode	hexdigestsuperr+   r   )r   rA   r   rB   )	__class__r   r   r      s    $zPyInfoStoreDisk.__init__)r   r<   r=   r   __classcell__r   r   )r[   r   r+      s   r+   c                   s   e Zd Z fddZ  ZS )r3   c                s   t t| ||d|f d S )Nzembed update of distribution %s)rZ   r3   r   )r   rA   r4   )r[   r   r   r      s
    
z)EmbedDistributionUpdateStoreDisk.__init__)r   r<   r=   r   r\   r   r   )r[   r   r3      s   r3   )r>   
__future__r   r   rF   r   abcr   
contextlibr   hashlibr   rV   Zvirtualenv.util.lockr   Zvirtualenv.util.pathr   Zvirtualenv.util.sixr	   Zvirtualenv.util.zipappr
   Zvirtualenv.versionr   baser   r   r   Zadd_metaclassr@   r+   r3   r   r   r   r   <module>   s$   H/