o
    ip&                     @   sB  d dl Z d dl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mZmZmZ d dlZG dd dZded	efd
dZdee	ef deeeef  fddZ	ddee	ef dee	ef dedeeef fddZdd Z	ddeeeee	f f deeeee	f f deee	f deeee	f  fddZdS )     N)datetime)BytesIOTextIOWrapper)Path)DictIterableOptionalUnionc                   @   s   e Zd ZdddZdd Zdd Zdd	 Zd
d ZddefddZ	dd Z
deejejf fddZdd ZdddZdddZdS )Archiverrc                 C   s   t |jdkrd| _n`t |jdkst |jddgkr%d| _|dkr$d}nFt |jdks5t |jddgkr?d| _|dkr>d	}n,t |jd
ksOt |jddgkrYd| _|dkrXd}nt |jdkrdd| _ntd| | jdkrztj||d| _d S | jdkrtj	||d| _d S tdt )Nz.tartarz.tgzz.gzwzw:gzz.tbz2z.bz2zw:bz2z.txzz.xzzw:xzz.zipzipz#Cannot detect archive format: type=modeNot supported: type=)
r   suffixtypesuffixes
ValueErrortarfileopenfopenzipfileZipFile)selffiler    r   Q/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/main_funcs/pack_funcs.py__init__   s2      

zArchiver.__init__c                 C   s   | S Nr   r   r   r   r   	__enter__*   s   zArchiver.__enter__c                 C      | j   d S r    r   close)r   exc_typeexc_valexc_tbr   r   r   __exit__-      zArchiver.__exit__c                 C   r#   r    r$   r!   r   r   r   r%   0   r*   zArchiver.closec                 C   s<   | j dkr
t| jS | j dkrt| j S td| j  Nr   r   r   )r   iterr   infolistr   r!   r   r   r   __iter__3   s
   


zArchiver.__iter__NT	recursivec                 C   s   |d urt d|  nt d|  |r?t| r?t|dD ]}| r)q"|d ur4t|| }nd }| || q"d S | jdkrK| j||S | jdkrW| j||S td| j )Nadding: z**/*r   r   r   )	printr   is_dirglobaddr   r   writer   )r   filenamearcnamer/   f_arcnamer   r   r   r4   ;   s"   

zArchiver.addc                 C   sX   t d| |  | jdkr| j||S | jdkr$| j|| S td| j )Nr0   r   r   r   )r1   get_name_from_infor   r   addfilewritestrreadr   )r   infofileobjr   r   r   r;   U   s   

zArchiver.addfilereturnc                 C   s   | j dkr'tt|}tjdkrt |_t |_	t
  |_||_|S | j dkrAtt|t
  dd }||_|S td| j  )z)Generate TarInfo using system informationr   posixr   N   r   )r   r   TarInfostrosnamegetgidgidgetuiduidr   now	timestampmtimesizer   ZipInfo	timetuple	file_sizer   )r   rF   rN   tarinfozipinfor   r   r   generate_info_   s   




 zArchiver.generate_infoc                 C   s`   | j dkrt|tjsJ t ||jS | j dkr(t|tjs%J t ||jS td| j  r+   )	r   
isinstancer   rC   rF   r   rO   r6   r   )r   r>   r   r   r   r:   q   s   

zArchiver.get_name_from_infoc                 C   s@   | j dkr| j||S | j dkr| j||S td| j  r+   )r   r   extractr   )r   r>   pathr   r   r   rV   {   s
   

zArchiver.extractc                 C   s^   | j dkr| j|}|dkrt|S |S | j dkr'|dkr d}| j||S td| j  )Nr   r   r   rbr   )r   r   extractfiler   r   r   )r   r>   r   r8   r   r   r   rY      s   

zArchiver.extractfile)r   )NTr    )__name__
__module____qualname__r   r"   r)   r%   r.   boolr4   r;   r	   r   rC   r   rO   rT   r:   rV   rY   r   r   r   r   r
      s    



r
   srctgtc                    sf   t | tr fdd|  D S t | ttfr" fdd| D S t | tr1t| t kr1S | S )Nc                    s   i | ]\}}|t | qS r   !find_path_and_change_it_recursive.0kvr^   r_   r   r   
<dictcomp>   s    z5find_path_and_change_it_recursive.<locals>.<dictcomp>c                    s   g | ]}t | qS r   r`   rc   re   rf   r   r   
<listcomp>   s    z5find_path_and_change_it_recursive.<locals>.<listcomp>)rU   dictitemslisttuplerD   r   )valuer^   r_   r   rf   r   ra      s   
ra   metar@   c           	      C   s  t | } | jj}|  sd S | jdddb}t|}t|ts&J t||d }|d }t|ts9J t|t|tsDJ t|i }t	|
 t	|
  D ]\}}||  se W d    d S t|| ||< qR|W  d    S 1 szw   Y  d S )Nr   utf-8encoding
yaml_filesfiles)r   parentexistsr   yaml	safe_loadrU   rj   r   rl   rk   rD   )	ro   outpathr8   drs   rt   retvalkeyrn   r   r   r   get_dict_from_cache   s&   
 $r}   Tinput_archivery   	use_cachec              
   C   s  t | } t |}t| }|D ]f}t ||jdkru|rB|t ||  rBt|t || }|durB|  W  d   S t||}t	|t
sUJ t||d }|d }t	|t
shJ t|t	|t
ssJ t| nqtd|D ]\}||}	||	 }
|
jjddd |	t| v rt||}|D ]}||}t||t|| }q|
jdd	d
}t|| W d   n1 sw   Y  q||j||d q|i }t| t|  D ]\}}t|| ||< q|W  d   S 1 sw   Y  dS )zScan all files in the archive file and return as a dict of files.

    Examples:
        tarfile:
           model.pth
           some1.file
           some2.file

        >>> unpack("tarfile", "out")
        {'asr_model_file': 'out/model.pth'}
    	meta.yamlNrs   rt   z!Format error: not found meta.yamlTparentsexist_okr   rp   rq   )rW   )r   r
   r:   rF   rv   r}   rw   rx   rY   rU   rj   r   RuntimeErrorru   mkdirsetvaluesra   rD   r   	safe_dumprV   rl   rk   )r~   ry   r   archiver>   r{   rz   rs   rt   fnameoutnameinfo2rF   r8   r|   rn   r   r   r   unpack   sV   


 &r   c                 C   sB   t |  }z|t d }W t|S  ty    Y t|S w )N.)r   resolverelative_tor   rD   )r8   pr   r   r   _to_relative_or_resolve   s   r   r   rt   rs   optionc                 C   s  t |  t |  t | D ]}t| std| qdd |  D } dd | D }dd |D }t| |t 	 t
jd}zdd l}|jt|jd	 W n	 ty^   Y nw zdd l}|j|jd
 W n	 tyu   Y nw t|jjddd t|dd9}tt| }	|d|	 j}
|j|
|	d t | t |   t | D ]}|| qW d    n1 sw   Y  td|  d S )NzNo such file or directory: c                 S      i | ]	\}}|t |qS r   r   rb   r   r   r   rg         zpack.<locals>.<dictcomp>c                 S   r   r   r   rb   r   r   r   rg   	  r   c                 S   s   g | ]}t |qS r   r   rh   r   r   r   ri   
  s    zpack.<locals>.<listcomp>)rt   rs   rL   pythonr   )torch)espnetTr   r   r   r   )r?   z
Generate: )rl   r   r   rv   FileNotFoundErrorrk   rj   r   rK   rL   sysversionr   updaterD   __version__ImportErrorr   ru   r   r
   r   rw   r   encoderT   	getbuffernbytesr;   r4   r1   )rt   rs   ry   r   re   	meta_objsr   r   r   r?   r>   r8   r   r   r   pack   sF   $
$	r   )T)r   )rE   r   r   r   r   ior   r   pathlibr   typingr   r   r   r	   rw   r
   rD   ra   r}   r]   r   r   r   r   r   r   r   <module>   sD     &



>
