B YO,@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||_dS)N)rlock)selffolderrT/opt/alt/python37/lib/python3.7/site-packages/virtualenv/app_data/via_disk_folder.py__init__4szAppDataDiskFolder.__init__cCsdt|j|jjS)Nz{}({}))formattype__name__rpath)rrrr__repr__7szAppDataDiskFolder.__repr__cCs t|jjS)N)strrr)rrrr__str__:szAppDataDiskFolder.__str__cCs td|jjt|jjdS)Nzreset app data folder %s)loggingdebugrrr)rrrrreset=szAppDataDiskFolder.resetcCsdS)z do nothingNr)rrrrcloseAszAppDataDiskFolder.closec cs&|j|}||jVWdQRXdS)N)rr)rrZ path_lockrrrlockedDs zAppDataDiskFolder.lockedc csb|dk rt|}n|jdt}||j*|j|j}|sNt|||VWdQRXdS)Nunzip)rrr lock_for_keynamerexistsr )rrZ to_folderrootdestrrrr Js   zAppDataDiskFolder.extractcCs|jddS)Npy_info1)r)rrrr py_info_atVszAppDataDiskFolder.py_info_atcCs t|j|S)N)PyInfoStoreDiskr*)rrrrrr(ZszAppDataDiskFolder.py_infoc Cs`|j}|LxD|jD]6}|jdkr||j|rD|WdQRXqWWdQRXdS) z.jsonN)r*riterdirsuffixr#stemr%unlink)rZpy_info_folderfilenamerrr py_info_clear]s zAppDataDiskFolder.py_info_clearcCst|jd|dd|S)NwheelZembed3) EmbedDistributionUpdateStoreDiskr)r distributionfor_py_versionrrrembed_update_loggsz"AppDataDiskFolder.embed_update_logcCs"|jjdd}|jddd|S)Nr3houseT)parentsexist_ok)rrmkdir)rrrrrr9jszAppDataDiskFolder.housecCs|jjd|dd|S)Nr3Zimager))rr)rr7r$rrr wheel_imagepszAppDataDiskFolder.wheel_imageN)r __module__ __qualname____doc__Z transientZ can_updaterrrrr rr!r propertyr*r(r2r8r9r=rrrrr,s     rc@sLeZdZddZeddZddZddZd d Ze d d Z d dZ dS) JSONStoreDiskcCs$||_||_||_||jf|_dS)N) in_folderkeymsgfilemsg_args)rrCrDrErGrrrrvszJSONStoreDisk.__init__cCs|jjd|jS)Nz{}.json)rCrrrD)rrrrrF|szJSONStoreDisk.filecCs |jS)N)rFr%)rrrrr%szJSONStoreDisk.existscCsd\}}y.t|j}tjd|jf|j|St k rNd}Ynt k r`YnX|ry | Wnt k rYnXdS)N)NFzgot {} from %sT) jsonloadsrF read_textrrrrErG ValueError ExceptionremoveOSError)rdata bad_formatrrrreads zJSONStoreDisk.readcCs(|jtjd|jf|jdS)Nzremoved {} at %s)rFr0rrrrErG)rrrrrMs zJSONStoreDisk.removec cs$|j|j dVWdQRXdS)N)rCr#rD)rrrrr!szJSONStoreDisk.lockedcCsP|jj}|jddd|jttj|dddtjd |j f|j dS)NT)r:r;) sort_keysindentzwrote {} at %s) rFparentr< write_textr rHdumpsrrrrErG)rcontentrrrrwriteszJSONStoreDisk.writeN) rr>r?rrArFr%rQrMrr!rYrrrrrBts  rBcseZdZfddZZS)r+cs@ttjrt|dnt|}tt|||d|fdS)Nzutf-8zpython info of %s) rsixPY3rencode hexdigestsuperr+r)rrCrrD) __class__rrrs$zPyInfoStoreDisk.__init__)rr>r?r __classcell__rr)r_rr+sr+cseZdZfddZZS)r5cstt|||d|fdS)Nzembed update of distribution %s)r^r5r)rrCr6)r_rrrs  z)EmbedDistributionUpdateStoreDisk.__init__)rr>r?rr`rr)r_rr5sr5)r@ __future__rrrHrabcr contextlibrhashlibrrZZvirtualenv.util.lockrZvirtualenv.util.pathrZvirtualenv.util.sixr Zvirtualenv.util.zipappr Zvirtualenv.versionr baser rrZ add_metaclassrBr+r5rrrrs$        H/