o
    pf;                     @   s   d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	 ddl
mZ ddlmZ ejrIdd	lmZmZmZmZmZmZ dd
lmZ ddlmZ G dd dejZG dd deZG dd deZG dd deZdS )z;

Implements a thread pool for parallel copying of files.

    )unicode_literalsN)Queue   )copy_file_internalcopy_modified_time)BulkCopyFailed)copy_file_data)IOListOptionalTextTupleType)TracebackType)FSc                       s(   e Zd ZdZ fddZdd Z  ZS )_Workerz,Worker thread that pulls tasks from a queue.c                    s   || _ tt|   d| _d S )NT)copiersuperr   __init__daemon)selfr   	__class__ A/home/ertert/spirit/venv/lib/python3.10/site-packages/fs/_bulk.pyr      s   
z_Worker.__init__c              
   C   s   | j j}	 |jdd}z0z|d u rW W |  d S |  W n ty5 } z| j | W Y d }~nd }~ww W |  n|  w q)NT)block)r   queueget	task_done	Exception	add_error)r   r   taskerrorr   r   r   run#   s   
z_Worker.run)__name__
__module____qualname____doc__r   r#   __classcell__r   r   r   r   r      s    r   c                   @   s   e Zd ZdZdd ZdS )_TaskzBase class for a task.c                 C   s   dS )zTask implementation.Nr   r   r   r   r   __call__5   s    z_Task.__call__N)r$   r%   r&   r'   r+   r   r   r   r   r)   2   s    r)   c                   @   s    e Zd ZdZdd Zdd ZdS )	_CopyTaskz-A callable that copies from one file another.c                 C   s   || _ || _d S N)src_filedst_file)r   r.   r/   r   r   r   r   =   s   
z_CopyTask.__init__c                 C   sd   zt | j| jdd W z| j  W | j  d S | j  w z| j  W | j  w | j  w )Ni   )
chunk_size)r   r.   r/   closer*   r   r   r   r+   B   s   z_CopyTask.__call__N)r$   r%   r&   r'   r   r+   r   r   r   r   r,   :   s    r,   c                   @   sL   e Zd ZdZdddZdd Zdd	 Zd
d Zdd Zdd Z	dddZ
dS )CopierzCopy files in worker threads.   Fc                 C   s>   |dk rt d|| _|| _g | _d | _g | _g | _d| _d S )Nr   znum_workers must be >= 0F)
ValueErrornum_workerspreserve_time	all_tasksr   workerserrorsrunning)r   r5   r6   r   r   r   r   P   s   
zCopier.__init__c                    sL    j r!t j d _ fddt j D  _ jD ]}|  qd _dS )zStart the workers.)maxsizec                    s   g | ]}t  qS r   )r   ).0_r*   r   r   
<listcomp>`   s    z Copier.start.<locals>.<listcomp>TN)r5   r   r   ranger8   startr:   )r   workerr   r*   r   r@   \   s   


zCopier.startc                 C   sr   | j r4| jr4| jD ]}| jd q	| jD ]}|  q| jr)| jD ]}t|  q"| jdd= | j  d| _ dS )z6Stop the workers (will block until they are finished).NF)	r:   r5   r8   r   putjoinr6   r7   r   )r   _workerrA   argsr   r   r   stope   s   






zCopier.stopc                 C   s   | j | dS )z"Add an exception raised by a task.N)r9   append)r   r"   r   r   r   r    y   s   zCopier.add_errorc                 C   s   |    | S r-   )r@   r*   r   r   r   	__enter__}   s   zCopier.__enter__c                 C   s(   |    |d u r| jrt| jd S d S r-   )rF   r9   r   )r   exc_type	exc_value	tracebackr   r   r   __exit__   s   
zCopier.__exit__c           	      C   s   | j du rt||||| jd dS | j||||f ||d}z||d}W n ty5   |   w t||}| j 	| dS )z#Copy a file from one fs to another.N)r6   rw)
r   r   r6   r7   rG   openbinr   r1   r,   rB   )	r   src_fssrc_pathdst_fsdst_pathr6   r.   r/   r!   r   r   r   copy   s   


zCopier.copyN)r3   F)F)r$   r%   r&   r'   r   r@   rF   r    rH   rL   rT   r   r   r   r   r2   M   s    
	
r2   )r'   
__future__r   typing	threadingsix.moves.queuer   rT   r   r   r9   r   toolsr   TYPE_CHECKINGr	   r
   r   r   r   r   typesr   baser   Threadr   objectr)   r,   r2   r   r   r   r   <module>   s      