U 巀gV@sPddlZddlZddlZddlZddlZddlmZddlmZddl m Z m Z m Z m Z mZmZddlmZddlmZddlmZeedd d Zeee e e ddfd d d ZedddejZeedddZeedddZeee edddZeeeefdddZ eedddZ!eeeefdddZ"eedddZ#dS) N)contextmanager)NamedTemporaryFile)AnyBinaryIO GeneratorListUnioncast) get_path_uid) format_size)retry)pathreturncCstjdksttdsdStj|s(td}||krtj|rtdkrxz t |}Wnt k rnYdSX|dkSt |tj Sq,|tj |}}q,dS)Nwin32geteuidTrF)sysplatformhasattrosr isabsAssertionErrorlexistsrr OSErroraccessW_OKdirname)r previouspath_uidrL/opt/hc_python/lib/python3.8/site-packages/pip/_internal/utils/filesystem.pycheck_path_owners   r )r kwargsrc ksftfdtj|tj|dd|4}tt|}z |VW5|t| XW5QRXdS)a%Return a file-like object pointing to a tmp file next to path. The file is created securely and is ensured to be written to disk after the context reaches its end. kwargs will be passed to tempfile.NamedTemporaryFile to control the way the temporary file will be opened. Fz.tmp)deletedirprefixsuffixN) rrr rbasenamer rflushfsyncfileno)r r!fresultrrradjacent_tmp_file*s     r,g?)stop_after_delaywaitcCsHtj|s(tj|}||kr"q(|}qtjdkr@t|tjSt|S)zgCheck if a directory is writable. Uses os.access() on POSIX, tries creating files on Windows. posix)rr isdirrnamerr_test_writable_dir_win)r parentrrrtest_writable_dirHs   r5c sd}dtdD]}|dfddtdD}tj||}zt|tjtjBtjB}Wn*tk rtYqt k rYdSXt |t |d Sqt d dS) N(accesstest_deleteme_fishfingers_custard_$abcdefghijklmnopqrstuvwxyz0123456789 c3s|]}tVqdSN)randomchoice).0_alphabetrr `sz)_test_writable_dir_win..FTz3Unexpected condition testing for writable directory) rangejoinrr openO_RDWRO_CREATO_EXCLFileExistsErrorPermissionErrorcloseunlinkr)r r&r>r2filefdrr?rr3Zs     r3)r patternrcsBg}t|D].\}}t||}|fdd|Dq|S)zReturns a list of absolute paths of files beneath path, recursively, with filenames which match the UNIX-style shell glob pattern.c3s|]}tj|VqdSr:)rr rD)r=r*rootrrrA|szfind_files..)rwalkfnmatchfilterextend)r rOr+r>filesmatchesrrPr find_filesvs  rXcCstj|rdStj|S)Nr)rr islinkgetsizer rrr file_sizes r\cCs tt|Sr:)r r\r[rrrformat_file_sizesr]cCsBd}t|D].\}}}|D]}tj||}|t|7}qq|S)Ng)rrRr rDr\)r sizerQ_dirsrVfilename file_pathrrrdirectory_sizes rbcCs tt|Sr:)r rbr[rrrformat_directory_sizesrc)$rSros.pathr;r contextlibrtempfilertypingrrrrrr pip._internal.utils.compatr pip._internal.utils.miscr pip._internal.utils.retryr strboolr r,replacer5r3rXintfloatr\r]rbrcrrrrs*