a :iE@sdZddlZddlZddlmZddlmZddlmZddl m Z ddl m Z ddl mZdd lmZd d lmZmZGd d d eZGdddeedZGdddeZGdddeZgdZdS)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 N)ABCMeta)contextmanager)sha256)ReentrantFileLock) safe_delete)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)selffolderrG/usr/lib/python3.9/site-packages/virtualenv/app_data/via_disk_folder.py__init__/szAppDataDiskFolder.__init__cCst|jd|jjdS)N())type__name__rpathrrrr__repr__2szAppDataDiskFolder.__repr__cCs t|jjSr )strrrrrrr__str__5szAppDataDiskFolder.__str__cCs td|jjt|jjdS)Nzreset app data folder %s)loggingdebugrrrrrrrreset8szAppDataDiskFolder.resetcCsdS)z do nothingNrrrrrclose<szAppDataDiskFolder.closeccs:|j|}||jVWdn1s,0YdSr rr)rrZ path_lockrrrlocked?s zAppDataDiskFolder.lockedccsv|durt|}n|jdt}||j4|j|j}|sNt|||VWdn1sh0YdS)NZunzip)rrr lock_for_keynamerexistsr)rrZ to_folderrootdestrrrrEs   zAppDataDiskFolder.extractcCs|jddS)Npy_info1)rrrrr py_info_atQszAppDataDiskFolder.py_info_atcCs t|j|Sr )PyInfoStoreDiskr*rrrrrr(UszAppDataDiskFolder.py_infoc Cs|j}|f|jD]J}|jdkr||j |rB|Wdq1sV0YqWdn1sv0YdS) .jsonN)r*riterdirsuffixr#stemr%unlink)rZpy_info_folderfilenamerrr py_info_clearXs zAppDataDiskFolder.py_info_clearcCst|jd|dd|S)NwheelZembed3) EmbedDistributionUpdateStoreDiskr)r distributionfor_py_versionrrrembed_update_logbsz"AppDataDiskFolder.embed_update_logcCs"|jjdd}|jddd|S)Nr5houseTparentsexist_ok)rrmkdirr,rrrr;eszAppDataDiskFolder.housecCs|jjd|dd|S)Nr5Zimager)r!)rr9r$rrr wheel_imagekszAppDataDiskFolder.wheel_imageN)r __module__ __qualname____doc__Z transientZ can_updaterrrrr rr"rpropertyr*r(r4r:r;r@rrrrr 's(     r c@sLeZdZddZeddZddZddZd d Ze d d Z d dZ dS) JSONStoreDiskcCs$||_||_||_||jf|_dSr ) in_folderkeymsgfilemsg_args)rrFrGrHrJrrrrpszJSONStoreDisk.__init__cCs|jj|jdS)Nr.)rFrrGrrrrrIvszJSONStoreDisk.filecCs |jSr )rIr%rrrrr%zszJSONStoreDisk.existscCsd\}}z8t|jjdd}tjd|jdg|jR|WStyVd}Ynt yfYn0|rz | Wnt yYn0dS)N)NFutf-8encodingzgot z from %sT) jsonloadsrI read_textrrrHrJ ValueError ExceptionremoveOSError)rdataZ bad_formatrrrread}s    zJSONStoreDisk.readcCs,|jtjd|jdg|jRdS)Nzremoved  at %s)rIr2rrrHrJrrrrrSs zJSONStoreDisk.removeccs8|j|jdVWdn1s*0YdSr )rFr#rGrrrrr"szJSONStoreDisk.lockedcCsT|jj}|jddd|jjtj|dddddtjd|jdg|j RdS) NTr<)Z sort_keysindentrKrLzwrote rW) rIparentr? write_textrNdumpsrrrHrJ)rZcontentrrrrwriteszJSONStoreDisk.writeN) rrArBrrDrIr%rVrSrr"r]rrrrrEos  rE) metaclasscseZdZfddZZS)r+cs.tt|d}t||d|fdS)NrKzpython info of %s)rrencodeZ hexdigestsuperr)rrFrrG __class__rrrszPyInfoStoreDisk.__init__rrArBr __classcell__rrrarr+sr+cseZdZfddZZS)r7cst||d|fdS)Nzembed update of distribution %s)r`r)rrFr8rarrrs z)EmbedDistributionUpdateStoreDisk.__init__rcrrrarr7sr7)r rEr+)rCrNrabcr contextlibrZhashlibrZvirtualenv.util.lockrZvirtualenv.util.pathrZvirtualenv.util.zipapprZvirtualenv.versionrbaser r r rEr+r7__all__rrrrs       H/