U
    ¨ýc¼  ã                   @   sr   d dl Z d dlZd dlZd dlZd dlZd dlZe ¡ Zejd
dd„ƒZ	eje j
dfdd„ƒZdd„ Zdd	„ ZdS )é    Nc                 c   s˜   t Š | d k	rZt| tjd6 |d k	rHt|tjd d V  W 5 Q R X nd V  W 5 Q R X n0|d k	r„t|tjd d V  W 5 Q R X nd V  W 5 Q R X d S )N)ÚtoÚstdio)Ú_REDIRECTED_STDIO_LOCKÚ_redirected_fdÚsysÚstdoutÚstderr)r   r   © r	   úDlib/python3.8/site-packages/qiime2-2023.2.0-py3.8.egg/qiime2/util.pyÚredirected_stdio   s    r   c                 c   s¶   |d krt j}t|ƒ}t t |¡d¡„}| ¡  zt t| ƒ|¡ W n: tk
r€   t	| dƒ}t | 
¡ |¡ W 5 Q R X Y nX z
|V  W 5 | ¡  t | 
¡ |¡ X W 5 Q R X d S )NÚwb)r   r   Ú_get_filenoÚosÚfdopenÚdupÚflushÚdup2Ú
ValueErrorÚopenÚfileno)r   r   Zstdio_fdZcopiedZto_filer	   r	   r
   r   &   s     
r   c                    s,   t ˆ d‡ fdd„ƒƒ }t|tƒs(tdƒ‚|S )Nr   c                      s   ˆ S )Nr	   r	   ©Ú
file_or_fdr	   r
   Ú<lambda>@   ó    z_get_fileno.<locals>.<lambda>z2Expected a file (`.fileno()`) or a file descriptor)ÚgetattrÚ
isinstanceÚintr   )r   Úfdr	   r   r
   r   ?   s    
r   c              
   C   sÀ   t j | ¡rttjd| ƒ‚t j |¡r4ttjd|ƒ‚t j |¡rRttjd| d|ƒ‚zt  | |¡ W nX tk
rº } z:|jtj	krŽt
 | |¡ n|jtjkr¨t
 | |¡ n‚ W 5 d}~X Y nX dS )zãAlternative to shutil.copyfile, this will use os.link when possible.

    See shutil.copyfile for documention. Only `src` and `dst` are supported.
    Unlike copyfile, this will not overwrite the destination if it exists.

    zIs a directoryzFile existsN)r   ÚpathÚisdirÚOSErrorÚerrnoZEISDIRÚexistsZEEXISTÚlinkZEXDEVÚshutilZcopyfileZEPERM)ÚsrcZdstÚer	   r	   r
   Ú	duplicateF   s    r'   )NN)r   r   r!   r$   Z	threadingÚ
contextlibZLockr   Úcontextmanagerr   Údevnullr   r   r'   r	   r	   r	   r
   Ú<module>	   s   