B
    u9aޣ                 @   s  d dl Z d dlZd dlZd dlZd dlZd dlZyd dlZ[dZW n ek
rZ   dZY nX yd dl	Z	[	dZ
W n ek
r   dZ
Y nX yd dlZ[dZW n ek
r   dZY nX yd dlmZ W n ek
r   dZY nX yd dlmZ W n ek
r   dZY nX dddd	d
ddddddddddddddddddddgZG dd deZG d d deZG d!d deZG d"d deZG d#d$ d$eZG d%d& d&eZdd(dZd)d* Zdd+d,dZdd+d-dZee d.rdd+d/d0Znd1d0 Zdd+d2d	Z dd+d3d
Z!dd+d4dZ"d5d Z#dde"dfd6dZ$d7d8 Z%d9d: Z&e j'e je j(e j)he j*koze j+e j,koze je j-kZ.dd;dZ/e.e/_0d<d= Z1e"fd>dZ2d?d@ Z3dAdB Z4dCdD Z5ddFdGZ6ddHdIZ7dJe6dKgdLfiZ8er e6dMgdNfe8dO< e7g dPfe8dQ< e
re6dRgdSfe8dT< er,e6dUgdVfe8dW< dXd Z9ddZdZ:d[d Z;dd\dZ<d]d Z=d^d_ Z>dd`dZ?dad Z@dbdc ZAddde ZBdfdg ZCdhgeCg dLfdigeBg dPfdjZDerdkdlgeCg dNfeDdO< e
rdmdngeCg dSfeDdT< erdodpgeCg dVfeDdW< dqdr ZEddsdZFee dtrLeGdu eHdvdwZIdxeIjJ_KdyeIjL_KdzeIjM_Kd{du ZNn2e jOd|kr~d dlPZPeGdu eHdvdwZId}du ZNdd~dZQdddZRe jSe jTB dfddZUdS )    NTF)getpwnam)getgrnamcopyfileobjcopyfilecopymodecopystatcopycopy2copytreemovermtreeErrorSpecialFileError	ExecErrormake_archiveget_archive_formatsregister_archive_formatunregister_archive_formatget_unpack_formatsregister_unpack_formatunregister_unpack_formatunpack_archiveignore_patternschownwhichget_terminal_sizeSameFileErrorc               @   s   e Zd ZdS )r   N)__name__
__module____qualname__ r    r    /usr/lib/python3.7/shutil.pyr   7   s   c               @   s   e Zd ZdS )r   N)r   r   r   r    r    r    r!   r   :   s   c               @   s   e Zd ZdS )r   N)r   r   r   r    r    r    r!   r   =   s   c               @   s   e Zd ZdS )r   N)r   r   r   r    r    r    r!   r   A   s   c               @   s   e Zd ZdS )	ReadErrorN)r   r   r   r    r    r    r!   r"   D   s   r"   c               @   s   e Zd ZdS )RegistryErrorN)r   r   r   r    r    r    r!   r#   G   s   r#    @  c             C   s$   x|  |}|sP || qW d S )N)readwrite)fsrcfdstlengthbufr    r    r!   r   L   s
    
c             C   sX   t tjdr0ytj| |S  tk
r.   dS X tjtj| tjtj|kS )NsamefileF)hasattrospathr+   OSErrornormcaseabspath)srcdstr    r    r!   	_samefileT   s    r4   )follow_symlinksc         
   C   s   t | |rtd| |xL| |gD ]@}yt|}W n tk
rJ   Y q$X t|jr$td| q$W |stj	
| rtt| | n6t| d&}t|d}t|| W d Q R X W d Q R X |S )Nz{!r} and {!r} are the same filez`%s` is a named piperbwb)r4   r   formatr-   statr/   S_ISFIFOst_moder   r.   islinksymlinkreadlinkopenr   )r2   r3   r5   fnstr'   r(   r    r    r!   r   `   s    
c            C   sx   |s<t j| r<t j|r<tt dr6t jt j }}qZd S ntt drVt jt j }}nd S || }||t|j	 d S )Nlchmodchmod)
r-   r.   r<   r,   lstatrB   r9   rC   S_IMODEr;   )r2   r3   r5   Z	stat_funcZ
chmod_funcrA   r    r    r!   r   }   s    

	listxattrc            C   s   yt j| |d}W n: tk
rL } z|jtjtjtjfkr< d S d }~X Y nX xr|D ]j}y&t j| ||d}t j||||d W qT tk
r } z |jtj	tjtjtjfkr W d d }~X Y qTX qTW d S )N)r5   )
r-   rF   r/   errnoENOTSUPZENODATAZEINVALgetxattrsetxattrZEPERM)r2   r3   r5   namesenamevaluer    r    r!   
_copyxattr   s    	

rO   c              O   s   d S )Nr    )argskwargsr    r    r!   rO      s    c      	   
      s6  d d ddd |p,t j| o*t j| }|r@ fdd}n fdd}|d| |d}t|j}|d	||j|jf|d t| ||d y|d
|||d W n t	k
r   Y nX t
|dr2y|d||j|d W nP tk
r0 } z0x*dD ] }t
t|r|jtt|krP qW  W d d }~X Y nX d S )N)nsr5   c             W   s   d S )Nr    )rR   r5   rP   r    r    r!   _nop   s    zcopystat.<locals>._nopc                s   t t|  S )N)getattrr-   )rM   )rS   r    r!   lookup   s    zcopystat.<locals>.lookupc                s   t t|  }|tjkr|S  S )N)rT   r-   supports_follow_symlinks)rM   r@   )rS   r    r!   rU      s    
r9   )r5   utimerC   st_flagsZchflags)Z
EOPNOTSUPPrH   )r-   r.   r<   r9   rE   r;   st_atime_nsst_mtime_nsrO   NotImplementedErrorr,   rX   r/   rG   rT   )	r2   r3   r5   ZfollowrU   rA   modewhyerrr    )rS   r!   r      s,    
c            C   sB   t j|r"t j|t j| }t| ||d t| ||d |S )N)r5   )r-   r.   isdirjoinbasenamer   r   )r2   r3   r5   r    r    r!   r      s
    c            C   sB   t j|r"t j|t j| }t| ||d t| ||d |S )N)r5   )r-   r.   r_   r`   ra   r   r   )r2   r3   r5   r    r    r!   r	      s
    c                 s    fdd}|S )Nc                s,   g }x D ]}| t|| q
W t|S )N)extendfnmatchfilterset)r.   rK   ignored_namespattern)patternsr    r!   _ignore_patterns  s    
z)ignore_patterns.<locals>._ignore_patternsr    )rh   ri   r    )rh   r!   r     s    c             C   s  t | }|d k	r|| |}nt }t | g }x@|D ]6}	|	|krJq:t j| |	}
t j||	}yt j|
rt |
}|rt || t	|
|| d n:t j
|s|rw:t j|
rt|
|||| n
||
| n(t j|
rt|
|||| n
||
| W q: tk
r: } z||jd  W d d }~X Y q: tk
rp } z||
|t|f W d d }~X Y q:X q:W yt	| | W nJ tk
r } z*t|dd d kr|| |t|f W d d }~X Y nX |rt||S )N)r5   r   Zwinerror)r-   listdirre   makedirsr.   r`   r<   r>   r=   r   existsr_   r
   r   rb   rP   r/   appendstrrT   )r2   r3   symlinksignorecopy_functionZignore_dangling_symlinksrK   rf   errorsrM   ZsrcnameZdstnamelinktor^   r]   r    r    r!   r
     sL    $



 *&c          	   C   sP  y"t | }t|}W d Q R X W n* tk
rL   |t j| t  g }Y nX x|D ]}|j}y|jdd}W n tk
r   d}Y nX |ry| rtdW n* tk
r   |t jj	|t  wTY nX t
|| qTyt | W qT tk
r   |t j|t  Y qTX qTW yt |  W n( tk
rJ   |t j| t  Y nX d S )NF)r5   z%Cannot call rmtree on a symbolic link)r-   scandirlistr/   sysexc_infor.   is_dir
is_symlinkr<   _rmtree_unsafeunlinkrmdir)r.   onerror
scandir_itentriesentryfullnamerx   r    r    r!   rz   t  s8    


rz   c          
   C   s  y"t | }t|}W d Q R X W n: tk
r\ } z||_|t j|t  d S d }~X Y nX x|D ]}t j||j	}y,|j
dd}|r|jdd}	t|	j}W n tk
r   d}Y nX |ryt j|j	t j| d}
W n( tk
r   |t j|t  Y nX zt j|	t |
rnt|
|| yt j|j	| d W n( tk
rj   |t j|t  Y nX n8ytdW n* tk
r   |t jj|t  Y nX W d t |
 X qfyt j|j	| d W qf tk
r   |t j|t  Y qfX qfW d S )NF)r5   )dir_fdz%Cannot call rmtree on a symbolic link)r-   rt   ru   r/   filenamerv   rw   r.   r`   rM   rx   r9   S_ISDIRr;   r?   O_RDONLYsamestatfstat_rmtree_safe_fdr|   r<   closer{   )topfdr.   r}   r~   r   r^   r   r   rx   orig_stdirfdr    r    r!   r     sJ    
r   c          	   C   s  |rdd }n|d krdd }t rPt| tr8t| } yt| }W n& tk
rl   |tj| t  d S X yt	| tj
}W n& tk
r   |tj| t  d S X ztj|t|rt|| | yt|  W n( tk
r   |tj| t  Y nX n8ytdW n* tk
r<   |tjj| t  Y nX W d t| X nPytj| rhtdW n* tk
r   |tjj| t  d S X t| |S d S )Nc              W   s   d S )Nr    )rP   r    r    r!   r}     s    zrmtree.<locals>.onerrorc               W   s    d S )Nr    )rP   r    r    r!   r}     s    z%Cannot call rmtree on a symbolic link)_use_fd_functions
isinstancebytesr-   fsdecoderD   	Exceptionrv   rw   r?   r   r.   r   r   r   r|   r/   r<   r   rz   )r.   ignore_errorsr}   r   fdr    r    r!   r     sH    


c             C   s&   t jjt jjpd }t j| |S )N )r-   r.   sepaltsepra   rstrip)r.   r   r    r    r!   	_basename
  s    r   c          	   C   s   |}t j|rTt| |r*t | | d S t j|t| }t j|rTtd| yt | | W n t	k
r   t j
| rt | }t || t |  nTt j| rt| |rtd| |f t| ||dd t|  n|| | t |  Y nX |S )Nz$Destination path '%s' already existsz.Cannot move a directory '%s' into itself '%s'.T)rq   ro   )r-   r.   r_   r4   renamer`   r   rl   r   r/   r<   r>   r=   r{   
_destinsrcr
   r   )r2   r3   rq   Zreal_dstrs   r    r    r!   r     s2    




c             C   sV   t j| } t j|}| t jjs2| t jj7 } |t jjsL|t jj7 }|| S )N)r-   r.   r1   endswithr   
startswith)r2   r3   r    r    r!   r   H  s    r   c             C   sN   t d ks| d krd S yt | }W n tk
r8   d }Y nX |d k	rJ|d S d S )N   )r   KeyError)rM   resultr    r    r!   _get_gidQ  s    
r   c             C   sN   t d ks| d krd S yt | }W n tk
r8   d }Y nX |d k	rJ|d S d S )Nr   )r   r   )rM   r   r    r    r!   _get_uid]  s    
r   gzipc                s   |d krd}nDt r |dkr d}n2tr2|dkr2d}n trD|dkrDd}ntd|dd l}	|rfd	| nd}
| d
 |
 }tj|}|rtj	|s|d k	r|
d| |st| |d k	r|
d tt  fdd}|s|	|d| }z|j||d W d |  X |S )Nr   r   Zgzbzip2bz2xzzCbad value for 'compress', or compression format not supported : {0}r   .z.tarzcreating %szCreating tar archivec                s,    d k	r | _ | _d k	r(| _| _| S )N)gidZgnameuiduname)Ztarinfo)r   groupownerr   r    r!   _set_uid_gid  s    z#_make_tarball.<locals>._set_uid_gidzw|%s)rd   )_ZLIB_SUPPORTED_BZ2_SUPPORTED_LZMA_SUPPORTED
ValueErrorr8   tarfiler-   r.   dirnamerl   infork   r   r   r?   addr   )	base_namebase_dircompressverbosedry_runr   r   loggerZtar_compressionr   Zcompress_extZarchive_namearchive_dirr   tarr    )r   r   r   r   r!   _make_tarballi  s<    

	
r   c          	   C   sz  dd l }| d }tj| }|rNtj|sN|d k	r@|d| |sNt| |d k	rd|d|| |sv|j|d|jd}tj	|}	|	tj
kr||	|	 |d k	r|d|	 xt|D ]\}
}}xFt|D ]:}tj	tj|
|}	||	|	 |d k	r|d|	 qW xT|D ]L}tj	tj|
|}	tj|	r||	|	 |d k	r|d|	 qW qW W d Q R X |S )Nr   z.zipzcreating %sz#creating '%s' and adding '%s' to itw)Zcompressionzadding '%s')zipfiler-   r.   r   rl   r   rk   ZipFileZZIP_DEFLATEDnormpathcurdirr&   walksortedr`   isfile)r   r   r   r   r   r   Zzip_filenamer   Zzfr.   dirpathZdirnames	filenamesrM   r    r    r!   _make_zipfile  s@    



 r   r   )r   Nzuncompressed tar file)r   r   zgzip'ed tar-fileZgztarzZIP filezip)r   r   zbzip2'ed tar-fileZbztar)r   r   zxz'ed tar-fileZxztarc              C   s   dd t  D } |   | S )Nc             S   s   g | ]\}}||d  fqS )r   r    ).0rM   registryr    r    r!   
<listcomp>  s    z'get_archive_formats.<locals>.<listcomp>)_ARCHIVE_FORMATSitemssort)formatsr    r    r!   r     s    r   c             C   sx   |d krg }t |s td| t|ttfs6tdx.|D ]&}t|ttfrZt|dkr<tdq<W |||ft| < d S )NzThe %s object is not callablez!extra_args needs to be a sequencer   z+extra_args elements are : (arg_name, value))callable	TypeErrorr   tupleru   lenr   )rM   function
extra_argsdescriptionZelementr    r    r!   r     s    	
c             C   s
   t | = d S )N)r   )rM   r    r    r!   r     s    c	          
   C   s  t  }	|d k	r>|d k	r$|d| t j| } |s>t | |d krLt j}||d}
yt| }W n" tk
r   t	d| d Y nX |d }x|d D ]\}}||
|< qW |dkr||
d< ||
d< z|| |f|
}W d |d k	r|d k	r|d	|	 t |	 X |S )
Nzchanging into '%s')r   r   zunknown archive format '%s'r      r   r   r   zchanging back to '%s')
r-   getcwddebugr.   r1   chdirr   r   r   r   )r   r8   Zroot_dirr   r   r   r   r   r   Zsave_cwdrQ   format_infofuncargvalr   r    r    r!   r   	  s6    

c              C   s   dd t  D } |   | S )Nc             S   s"   g | ]\}}||d  |d fqS )r      r    )r   rM   r   r    r    r!   r   F  s    z&get_unpack_formats.<locals>.<listcomp>)_UNPACK_FORMATSr   r   )r   r    r    r!   r   @  s    c       	      C   sv   i }x.t  D ]"\}}x|d D ]}|||< q W qW x,| D ]$}||kr:d}t|||| f q:W t|srtdd S )Nr   z!%s is already registered for "%s"z*The registered function must be a callable)r   r   r#   r   r   )	
extensionsr   r   Zexisting_extensionsrM   r   ext	extensionmsgr    r    r!   _check_unpack_optionsK  s    
r   c             C   s,   |d krg }t ||| ||||ft| < d S )N)r   r   )rM   r   r   r   r   r    r    r!   r   ]  s    c             C   s
   t | = d S )N)r   )rM   r    r    r!   r   s  s    c             C   s&   t j| }t j|s"t | d S )N)r-   r.   r   r_   rk   )r.   r   r    r    r!   _ensure_directoryw  s    r   c       	   	   C   s   dd l }|| std|  || }zx| D ]}|j}|ds4d|krRq4tjj	|f|
d }|spq4t| |ds4||j}t|d}z|| W d |  ~X q4W W d |  X d S )Nr   z%s is not a zip file/z..r7   )r   Z
is_zipfiler"   r   Zinfolistr   r   r-   r.   r`   splitr   r   r%   r?   r&   r   )	r   extract_dirr   r   r   rM   targetdatafr    r    r!   _unpack_zipfile}  s*    



r   c             C   sX   dd l }y|| }W n" |jk
r8   td|  Y nX z|| W d |  X d S )Nr   z/%s is not a compressed or uncompressed tar file)r   r?   ZTarErrorr"   Z
extractallr   )r   r   r   Ztarobjr    r    r!   _unpack_tarfile  s    r   z.tarz.zip)r   r   z.tar.gzz.tgzz.tar.bz2z.tbz2z.tar.xzz.txzc             C   s:   x4t  D ](\}}x|d D ]}| |r|S qW q
W d S )Nr   )r   r   r   )r   rM   r   r   r    r    r!   _find_unpack_format  s
    
r   c             C   s   |d krt  }t |}t | } |d k	r~yt| }W n$ tk
r\   td|d Y nX |d }|| |ft|d  nHt| }|d krt	d| t| d }tt| d }|| |f| d S )NzUnknown unpack format '{0}'r   r   zUnknown archive format '{0}')
r-   r   fspathr   r   r   r8   dictr   r"   )r   r   r8   r   r   rQ   r    r    r!   r     s"    

statvfs
disk_usageusageztotal used freezTotal space in byteszUsed space in byteszFree space in bytesc             C   s@   t | }|j|j }|j|j }|j|j |j }t|||S )N)r-   r   f_bavailf_frsizef_blocksf_bfree_ntuple_diskusage)r.   rA   freetotalusedr    r    r!   r     s
    
ntc             C   s"   t | \}}|| }t|||S )N)r   Z_getdiskusager   )r.   r   r   r   r    r    r!   r     s    c             C   s   |d kr|d krt d|}|}|d kr.d}n(t|trVt|}|d krVtd||d krdd}n(t|tst|}|d krtd|t	| || d S )Nzuser and/or group must be setzno such user: {!r}zno such group: {!r})
r   r   rn   r   LookupErrorr8   intr   r-   r   )r.   userr   Z_user_groupr    r    r!   r     s"    

P      c          
   C   s   yt tjd }W n ttfk
r.   d}Y nX yt tjd }W n ttfk
r^   d}Y nX |dksp|dkryttj }W n$ t	tt
fk
r   t| }Y nX |dkr|j}|dkr|j}t||fS )NCOLUMNSr   ZLINES)r  r-   environr   r   r   rv   
__stdout__filenoAttributeErrorr/   terminal_sizecolumnslines)fallbackr  r  sizer    r    r!   r   1  s$    

c          	      s^  dd }t j r&| |r" S d S |d krrt jdd }|d krryt d}W n ttfk
rp   t j}Y nX |szd S |	t j
}tjdkrt j|kr|dt j t jdd	t j
}t fd	d
|D r܈ g}q fdd|D }n g}t }x\|D ]T}t j|}||kr|| x,|D ]$}	t j||	}
||
|r,|
S q,W qW d S )Nc             S   s&   t j| o$t | |o$t j|  S )N)r-   r.   rl   accessr_   )r@   r\   r    r    r!   _access_checkk  s    zwhich.<locals>._access_checkPATHCS_PATHwin32r   ZPATHEXTr   c             3   s    | ]}   |  V  qd S )N)lowerr   )r   r   )cmdr    r!   	<genexpr>  s    zwhich.<locals>.<genexpr>c                s   g | ]} | qS r    r    )r   r   )r  r    r!   r     s    zwhich.<locals>.<listcomp>)r-   r.   r   r  getconfstrr  r   defpathr   pathseprv   platformr   insertanyre   r0   r   r`   )r  r\   r.   r  ZpathextfilesseendirZnormdirZthefilerM   r    )r  r!   r   ^  sB    






)r$   )FN)r   r   r   NNN)r   r   N)Nr   )NNr   r   NNN)Nr   )NN)NN)r  )Vr-   rv   r9   rc   collectionsrG   zlibr   ImportErrorr   r   Zlzmar   pwdr   Zgrpr   __all__r/   r   r   r   r   r"   r   r#   r   r4   r   r   r,   rO   r   r   r	   r   r
   rz   r   r?   r{   r|   supports_dir_fdrt   supports_fdrV   r   r   Zavoids_symlink_attacksr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rm   
namedtupler   r   __doc__r   r   r   rM   r   r   r   F_OKX_OKr   r    r    r    r!   <module>   s   






<Y#/

=8	 
@
-




 
6 
"






(




-