o $"b@sdZddlmZmZddlZddlZddlmZddlm Z ddl m Z ddl Z ddl mZddlmZdd lmZdd lmZdd lmZd d lmZmZGdddeZe eGdddeZGdddeZGdddeZdS)u A rough layout of the current storage goes as: virtualenv-app-data ├── py - │   └── *.json/lock ├── wheel │   ├── house │ │ └── *.whl │ └── -> 3.9 │ ├── img- │ │ └── image │ │ └── -> CopyPipInstall / SymlinkPipInstall │ │ └── -> 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 └── ├── py_info.py ├── debug.py └── _virtualenv.py )absolute_importunicode_literalsN)ABCMeta)contextmanager)sha256)ReentrantFileLock) safe_delete) ensure_text)extract) __version__)AppData ContentStorec@seZdZdZdZdZddZddZdd Zd d Z d d Z e ddZ e ddZ eddZddZddZddZeddZddZdS)AppDataDiskFolderzH Store the application data on the disk within a folder layout. FTcCst||_dSN)rlock)selffolderrE/usr/lib/python3/dist-packages/virtualenv/app_data/via_disk_folder.py__init__4szAppDataDiskFolder.__init__cCsdt|j|jjS)Nz{}({}))formattype__name__rpathrrrr__repr__7szAppDataDiskFolder.__repr__cCs t|jjSr)strrrrrrr__str__: zAppDataDiskFolder.__str__cCs td|jjt|jjdS)Nzreset app data folder %s)loggingdebugrrrrrrrreset=szAppDataDiskFolder.resetcCsdS)z do nothingNrrrrrcloseAszAppDataDiskFolder.closeccs>|j|}| |jVWddS1swYdSrrr)rr path_lockrrrlockedDs   "zAppDataDiskFolder.lockedccsz|dur t|}n|jdt}||j|j|j}|s(t|||VWddS1s6wYdS)Nunzip)rrr lock_for_keynamerexistsr )rr to_folderrootdestrrrr Js   "zAppDataDiskFolder.extractcCs|jddS)Npy_info1)rrrrr py_info_atVszAppDataDiskFolder.py_info_atcCs t|j|Sr)PyInfoStoreDiskr0rrrrrr.ZrzAppDataDiskFolder.py_infoc Cs|j}|4|jD]%}|jdkr0||j|r!|Wdn1s+wYq WddS1scstt|||d|fdS)Nzembed update of distribution %s)rmr>r)rrQr?rnrrrs z)EmbedDistributionUpdateStoreDisk.__init__rprrrnrr>rrr>)rL __future__rrrVr abcr contextlibrhashlibrrivirtualenv.util.lockrvirtualenv.util.pathrvirtualenv.util.sixr virtualenv.util.zipappr virtualenv.versionr baser rr add_metaclassrPr1r>rrrrs&        H/