^c-WddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlmZmZddlmZmZmZmZejdZejjZejjZejjZ ejZn#e$rdZYnwxYwejZejZej Z ej!Z!dZ"ej#dZ#ej#e#eZ$d Z%d Z&d Z'd Z(d Z)dZ*dZ+d=dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8ej9j:Z;e8Zdkr&e?gd d!"Z@d#Z8ej9jAZ;e8Zd.ZNd>d/ZOd0ZPd1ZQd2ZRd3ZSd?d4ZTd5ZUGd6d7ZVd8ZWd9ZXd:ZYd;ZZd<Z[dS)@N)_)getattropen)encodingerrorpolicypycompatosutilc@ttjd||fz)Ns!hardlinks not supported: %s to %s)OSErrorerrnoEINVAL)srcdsts 1/usr/lib/python3/dist-packages/mercurial/posix.pyoslinkr/s% L>#sK   Fc|dd}t|dkrd|fS|dd}|r ||dfS|ddz|dfS)aSame as posixpath.split, but faster >>> import posixpath >>> for f in [b'/absolute/path/to/file', ... b'relative/path/to/file', ... b'file_alone', ... b'path/to/directory/', ... b'/multiple/path//separators', ... b'/file_at_root', ... b'///multiple_leading_separators_at_root', ... b'']: ... assert split(f) == posixpath.split(f), f /rrr)rsplitlenrstrip)phtnhs rsplitrAsq $  B 2ww!||Av Ad  B 2a5y a54<A rcdS)z@return true if it is safe to hold open file handles to hardlinksTrrr openhardlinksr Xs 4rc4tj|jS)z-return number of hardlinks for the given file)oslstatst_nlinknames rnlinksr']s 8D>> ""rc|dd}tjdkr|ddkr |dd}n8|dr#|drd |vr |dd}|S) zns  -Xt , 5D tBQBxk E F F M    d  D 6j..55 KrcBtj|jdzdkS)z"check whether a file is executable@r)r"r#st_mode)fs risexecrC{s 8A;;  &! ++rctj|}|j}|rtj|st |d5}|}dddn #1swxYwYt| tj||nM#t$r@t |d5}| |dddn #1swxYwYYnwxYwdStj|rktj |}t|t |d5}| |dddn #1swxYwYdtz}|dz}|j dkrt|t|krt |d5}|}dddn #1swxYwYt|t |d5}| |dddn #1swxYwY|r+|s)tj|||dzdz tzzdS|s|rtj||dzdSdSdS)Nsrbswbr@ri$)r"r#rAstatS_ISLNKrreadunlinksymlinkr writereadlinkumaskr$boolchmod)rBlxstsfpdatasxs rsetflagsrXs !B A|A #a !2wwyy ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1III # 4#### # # #!U^^#rHHTNNN############### #  |A{1~~q !U^^ r HHTNNN                UFN UB {Q477d2hh.. !U^^ r7799D               q !U^^ r HHTNNN                 AUq(E61122222 2 AIs~A##A'*A'>BC.C CC CC CC*E  EE"GG G-HHHc tj|jdz}n!#t$r|}|t}|dz}YnwxYw|}|r|t jz}tj||dS)zCopy the file mode from the file at path src to dst. If src doesn't exist, we're using mode instead. If mode is None, we're using umask.NrE)r"r#rAFileNotFoundErrorrNrGS_IWUSRrP)rrmodeenforcewritablerAnew_modes rcopymoder`s(3--'%/  ?fG5  H!DL HS(s ==cx tjtjztjz}tj|d}tj|d}tj|d}tj|sm t j|tj|rt||nt||n#ttf$rYnwxYwtj |rtj|d}tj|d} t j|j }||zdkr t j|j }nK#t$r>t|dt j|j }YnwxYw||zdkrdSt#|t#|n#t$rYnwxYw|}n|}d }t%j|d \} } t j| t j| j }||zdkrjt j| |d z|zt j| j |zdkr/|t j| |d } | t#| dSdS| t#| d Sd S#| t#| wwxYw#ttf$rYd SwxYw)z} Check whether the given path is on a filesystem with UNIX-like exec flags Requires a directory (like /foo/.hg) .hgwcachesstores checkisexecs checknoexecrwTNs hg-checkexec-dirprefixrZF)rGS_IXUSRS_IXGRPS_IXOTHr"pathjoinexistsmkdirr`IOErrorr isdirrAr[rcloserJr mkstemprPrename) rk EXECFLAGSbasedircachedirstoredir checkisexec checknoexecmcheckdirfhfns r checkexecr~s;BL4</$,> ',,tV,,7<<337<<22w~~h''  """7>>(++0Xx0000Wh///W%     7== " " ',,x@@K',,x@@K $GK((0 y=A%%9GK008,999[$//55777GK00899}))#t;'''{####%%    * HHHK!h7GHHHB  HRLLL #A9}!!QY233372;;&2a77". "k222!~r ~r~r ~r~r  W uusB%L$(AC=<L$=DL$DA#L$5H' L$F21L$2AG:7L$9G:: L$L$' H41L$3H44#L$B L #L$8L$ L!!L$$L98L9c tj|dd}tj|d}tj|rdStj|r|}n|}d}t jtj|d}tj |} d}|;tj |d}tj |j }nWd } tj||}t|d n#t$rYd SwxYw tj|||t#|n6 tj||n#t&$rt#|YnwxYw ||dSdS#t($rY||wxYw#||wwxYw#t*$rYd St&$rN}|jt,jkr.tj|rt#|Yd}~d Sd}~wwxYw) z?check whether the given path is on a symlink-capable filesystemTrbrcs checklinkNz checklink-res hg-checklink-schecklink-targetrdF)r"rkrlislinkrptempfilemktempr fsdecodefsencode namedtempfilebasenamer&rrqPermissionErrorrKrJrsr FileExistsErrorAttributeErrorrEIOrm) rkrv checklinkr{r&fdtargetfullpathinsts rrrs:7<<fi88GLL<88 7>>) $ $ 4 7== " " HHHH!(++M    &&+ B+ )9))"'22- !!w||Hf==H4((..0000&!!! !55 !  64(((#4LLLL% $ 2222"%%%t % >HHJJJJJ"> #   >HHJJJ  >HHJJJJ"   55   zUY&&27>>$+?+?&t 55555  sAH AE H EHEH'GFGF85G7F88G<H G: G=!H9G::G==HH I=& I=/AI88I=cdS)zCheck that the base-relative path is a valid filename on this platform. Returns None if the path is ok, or a UI string describing the problem.Nrrks rcheckosfilenamerQs  4rcBttdd|S)zGet the filesystem mount point from a directory (best-effort) Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc. getfsmountpointcdSNrrRs rz!getfsmountpoint..\srrr dirpaths rrrWs# >76,nn = =g F FFrcBttdd|S)zGet the filesystem type name from a directory (best-effort) Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc. getfstypecdSrrrs rrzgetfstype..ds$rrrs rrr_s" 876; 7 7 @ @@rcNtjtjdS)N)r strtolocalgetpassrrr get_passwordrgs  wr22 3 33rcdSrr)rs r setbinaryrkDrc|Srrrs rpconvertro Krc|Srrrs r localpathrsrrcBtj||S)zwReturns whether path1 and path2 refer to the same file. This is only guaranteed to work for files, not directories.)r"rksamefile)fpath1fpath2s rrrws 7  FF + ++rcrtj|}tj|}|j|jkS)zyReturns whether fpath1 and fpath2 are on the same device. This is only guaranteed to work for files, not directories.)r"r#st_dev)rrst1st2s r samedevicer}s1 (6  C (6  C : ##rc*|Sr)lowerrs rnormcasers ::<<rcj tj|S#t$rt|cYSwxYw)a Normalize a filename for OS X-compatible comparison: - escape-encode invalid characters - decompose to NFD - lowercase - omit ignored characters [200c-200f, 202a-202e, 206a-206f,feff] >>> normcase(b'UPPER') 'upper' >>> normcase(b'Caf\xc3\xa9') 'cafe\xcc\x81' >>> normcase(b'\xc3\x89') 'e\xcc\x81' >>> normcase(b'\xb8\xca\xc3\xca\xbe\xc8.JPG') # issue3918 '%b8%ca%c3\xca\xbe%c8.jpg' )r asciilowerUnicodeDecodeErrornormcasefallbackrs rrrsG$ *&t,, ,! * * *#D)) ) ) ) *s 22c  |d}n#t$rd}d}t|}||krf tj||}|t|z }n2#t $r%dt |||dzz}|dz }YnwxYw||z }||kf|d}YnwxYwtjd| d}tj |S)Nzutf-8rrs%%%02XrNFD) decoderrr getutf8char ValueErrorord unicodedata normalizerencodehfsignoreclean)rkurTposrQcencs rrrs. " G$$AA! " " "ACD A'' ,T377A3q66MCC!!CS37](;$<$<$'' '$ 9 9B??2&& GGE E{hn,,HN4<888888-~d###rcdSNFrrs rr~r~urcdSrrrs rrrrrctjdkrd|zSttjdja|rt|s|Sd|ddzS)Nr*s"%s"s[^a-zA-Z0-9._/+-]s'%s'r-s'\'')r r/_needsshellquoterecompilesearchreplacerTs rr8r8sjz)){:&;<<C3!!$$342222rc.tj|dS)z7Parse a command string in POSIX shell way (best-effort)T)posix)r shlexsplitrs r shellsplitrs  q - - --rctjdkrdS tj|ddS#t$r}|jt jkcYd}~Sd}~wwxYw)z5return False if pid dead, True if running or not surer*TrN)r r/r"killr rESRCH)pidrs rtestpidr skz))t) Qt )))zU[((((((()s+ AA AAc:|jtjkS)z;Return True if the stat object st is from the current user.)st_uidr"getuidrSs risownerrs 9 ##rctjdkr|Sd}tj|vr ||Stjdkr)|tjd|St jdd tj D]1}|tj||}||cS2dS)zFind executable for command searching like which does. If command is a basename then PATH is searched for command. PATH isn't searched if command is an absolute or relative path. If command isn't found None is returned.r*c tj|r!tj|tjr|SdSr)r"rkisfileaccessX_OK) executables r findexistingzfindexe..findexisting$s;2 7>>* % % ")J*H*H  trsplan9s/binsPATHrN) r r/rr"rkrlrenvirongetr ospathsep)commandrrkrs rfindexers z)) ~  |G$$$x''|BGLL'::;;; $$Wc22889KLL!\"',,tW"="=>>  !    " 4rcdSrrrrrsetsignalhandlerr7rrc#Ktj}tj}|D]E} ||}||jt vrd}n#t tf$rd}YnwxYw|VFdS)zqStat each file in files. Yield each stat, or None if a file does not exist or has a type we don't care about.N)r"r#rGS_IFMTrA _wantedkindsr[NotADirectoryError)filesr#getkindnfrSs r statfilesr>s HEkG rBwrz"",66!#56   BBB s$AAAcLtjtjS)zreturn name of current user)r rrgetuserrrrrrMs  W_.. / //rc|tj} tjt j|dS#t $rd|zcYSwxYw)ziReturn the name of the user with the given uid. If uid is None, return the name of the current user.Nrs%d)r"rr rpwdgetpwuidKeyError)uids rusernamerRsd  {ikk c!2!21!5666 s{s+AAAc|tj} tjt j|dS#t $rtj|cYSwxYw)zkReturn the name of the group with the given gid. If gid is None, return the name of the current group.Nr)r"getgidr rgrpgetgrgidrbytestr)gids r groupnamer_sk  {ikk% c!2!21!5666 %%%$$$$$%s+AA$#A$ctj|}tjtjt t j|jS)zkReturn the list of members of the group with the given name, KeyError if the group does not exist. )r rrapplyrlistr getgrnamgr_memr%s r groupmembersrls>  T " "D ?8,d3<3E3E3L.M.M N NNrc|tjtjttddz|d|S)NP_DETACHr)r"spawnvpP_NOWAITr)r=s r spawndetachedrts- :bkGB A$>$>>Q N NNrc*tjddS)Nr)sysargvrrrgethgcmdrxs 8BQB<rc.tj|dSr)r"rn)rk notindexeds rmakedirr!|sHTNNNNNrcdSrr)keyr&scopes r lookupregr%s 4rcdS)zHide current shell window. Used to hide the window opened when starting asynchronous child process under Windows, unneeded on other systems. Nrrrr hidewindowr's  Drc4eZdZdZdZejZdZdZdS) cachestatc8tj||_dSr)r"rG)selfrks r__init__zcachestat.__init__sGDMM rc4t|jjSr)rOrGst_ino)r+s r cacheablezcachestat.cacheablesDI$%%%rcR |jj|jjko|jj|jjko|jj|jjko|jj|jjko|jj|jjko|jj|jjkoy|jj|jjko_|jtj|jtjko/|jtj |jtj kS#t$rYdSwxYwr) rGrAr.rr$rst_gidst_sizeST_MTIMEST_CTIMErr+others r__eq__zcachestat.__eq__s   !UZ%77JI$ (99JI$ (99JI&%**==JI$ (99 J I$ (99 J I%);; JIdm, 4=0IIJIdm, 4=0II    55 sDD D&%D&c||k Srrr5s r__ne__zcachestat.__ne__s5=  rN) __name__ __module__ __qualname__r,r/object__hash__r7r9rrrr)r)sY"""&&&H*!!!!!rr)c8|otj|jS)z(check whether a stat result is a symlink)rGrHrArs r statislinkr@s *$,rz***rc"|o |jdzdkS)z1check whether a stat result is an executable filer@r)rArs r statisexecrBs +2:%*+rc  tj|||}n#t$rtwxYwtt t t |gS)zblock until something happens on any file descriptor This is a generic helper that will check for any activity (read, write. exception) and return the list of touched files. In unsupported cases, it will raise a NotImplementedError)selectrNotImplementedErrorsortedrsetsum)fdsress rpollrKsi$mCc** $$$!###$ $s3sB<<(()) * **s2ctj|tj}|tjz}tj|tj|} g} |}|sn'||n#t$rYnwxYw?d|tj|tj|S#tj|tj|wxYw)z$Read all available data from a pipe.Tr) fcntlF_GETFLr" O_NONBLOCKF_SETFLrIappendrorl)pipeflagsoldflagschunksrTs rreadpiperVs Kem , ,E R]E{466H 3  IIKK a          xx D%-2222 D%-2222s<CB*C+BC B C BC"C)cxtj|\}}d} |r3tjdtj}tj||||rtj||rtj|dSdS#|rtj|wwxYw)z1Bind the UNIX domain socket to the specified pathN.) r"rkrr O_DIRECTORYchdirbindfchdirrq)sockrkdirnamerbakwdfds rbindunixsocketr`s  d++GXG   gdBN33G HW    (   Ig      HW       7  HW     s A B B9rr)NN)\rrMrr r"rrrDrGrrri18nrr rrrrrr importmodr rknormpathsamestatabspathlinkrrrMrJrs removedirs expandglobsrN posixfilerr r'r4r>rCrXr`r~rrrrrrrrrrr normcasespecsr normcasespecrisdarwinr/rFrr6rr8rrrrrS_IFREGS_IFLNKrrrrrrrrr!r%r'r)r@rBrKrVr`rrrrosC    ( # # 7  7  '/  WFF          ;   ]     . ###      ,,, )))X(MMM`>>>B GGGAAA444   ,,, $$$ %+  1,***.)/L,,,2 9$$     $$$&)/L   3 3 3... )))$$$ 6    dl+    000     % % % %OOOOOO   !!!!!!!!D+++ ,,, + + +3332sBBB