
    2gj                        d Z ddlmZ ddlZ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 ddlmZmZ ddlZddlmZ ddlmZ d	d
lmZ d	dlmZ d	dlmZmZ dZdZdZd	Z G d de      Zy)z
The 'new' conda format, introduced in late 2018/early 2019.

https://docs.conda.io/projects/conda/en/latest/user-guide/concepts/packages.html
    )annotationsN)closing)Callable)
ZIP_STOREDZipFile)stream_conda_component)conda_reader_for_url   )utils)AbstractBaseFormat)_extract_list   ).tar.zstzstdzzstd:compression-level=19   c                      e Zd ZdZed        Zed        Zed
d       Ze	 	 	 d	 dd       Zed        Z	e
dd       Zedd	       Zy)CondaFormat_v2zIf there's another conda format or breaking changes, please create a new class and keep this
    one, so that handling of v2 stays working.c                $    | j                  d      S )N.conda)endswith)fns    @lib/python3.12/site-packages/conda_package_handling/conda_fmt.py	supportedzCondaFormat_v2.supported'   s    {{8$$    c                   t        j                  |j                  d            xs d}t        j                  j                  |       sOt        j                  j                  t        j                  j                  t        j                         |             } t        j                  j                  |      st        j                  |       t        t        |       t        |      |       y )N
componentsinfopkgr   )r   ensure_listgetospathisabsnormpathjoingetcwdisdirmakedirsr   str)r   dest_dirkwr   s       r   extractzCondaFormat_v2.extract+   s    &&rvvl';<O
ww}}R !!"'',,ryy{B"?@Bww}}X&KK!R#h-J?r   Nc                4    t         j                  | |dg      S )Nr   r!   )r   r/   )r   r-   s     r   extract_infozCondaFormat_v2.extract_info5   s    %%b(x%HHr   c           	        |t        j                         }t         j                  j                  |      r>t         j                  j	                  |      }t         j                  j                  |      }t         j                  j                  ||      }|d t        d        }t        j                  ||       }t        |      t        fd|D              }	|r|dk7  rt        d      |!d }|\  }
}rj                  d      rfd} G d d	      }t        |d
t              5 }t        j                   |       5  dt"        i}|j%                  dt'        j(                  |             d| d|fd| d|	ff} |       }|D ]  \  }}t+        j,                   |       d
      5 }|D ]#  }|j/                  |t        j0                         % 	 d d d        j2                  j4                  }|j7                  |d
d      5 }|j9                  ||d      }t+        j,                  |d
      }|D ]#  }|j/                  |t        j0                         % |j;                          |j;                          d d d         	 d d d        d d d        |S # 1 sw Y   xY w# 1 sw Y   %xY w# 1 sw Y   ,xY w# 1 sw Y   |S xY w)Nr   c              3  ,   K   | ]  }|vs|  y wN ).0fpkg_files_sets     r   	<genexpr>z(CondaFormat_v2.create.<locals>.<genexpr>L   s     IY!=2H!Ys   	NNNz<Supply one of compressor= or (deprecated) compression_tuple=c                 @    t        j                  t        t              S )Nlevelthreads)	zstandardZstdCompressorZSTD_COMPRESS_LEVELZSTD_COMPRESS_THREADSr5   r   r   <lambda>z'CondaFormat_v2.create.<locals>.<lambda>R   s    !9!9)-"r   zzstd:compression-level=c                 r    t        j                  t         j                  dd      d         t              S )N=r
   r<   )r?   r@   intsplitrB   )filter_optss   r   rC   z'CondaFormat_v2.create.<locals>.<lambda>Z   s-    Y%=%=k//Q7;<1&r   c                  "    e Zd ZdZd Zd Zd Zy))CondaFormat_v2.create.<locals>.NullWriterzL
            zstd uses less memory on extract if size is known.
            c                    d| _         y )Nr   sizeselfs    r   __init__z2CondaFormat_v2.create.<locals>.NullWriter.__init__d   s	    	r   c                T    | xj                   t        |      z  c_         t        |      S r4   )rN   len)rP   bytess     r   writez/CondaFormat_v2.create.<locals>.NullWriter.writeg   s    		SZ'	5z!r   c                    | j                   S r4   rM   rO   s    r   tellz.CondaFormat_v2.create.<locals>.NullWriter.tellk   s    yy r   N)__name__
__module____qualname____doc__rQ   rU   rW   r5   r   r   
NullWriterrK   _   s    "!r   r\   w)compressionconda_pkg_format_versionzmetadata.jsonzpkg-r   zinfo-)fileobjmode)filterT)force_zip64F)rN   closefd)r$   r)   r%   r&   dirnamebasenamer(   rS   r   filter_info_filessetlist
ValueError
startswithr   r   	tmp_chdirCONDA_PACKAGE_FORMAT_VERSIONwritestrjsondumpstarfileTarFileaddanonymize_tarinfor`   rN   openstream_writerclose)prefix	file_listout_fn
out_folder
compressorcompression_tupleconda_pkg_fnfile_id	pkg_files
info_filesextcomp_filterr\   
conda_filepkg_metadatacomponents_filescompress	componentfilessizerfilerN   component_filecomponent_streamcomponent_tarrI   r8   s                            @@r   createzCondaFormat_v2.create9   s    J77== 0JWW%%f-Fww||J7)CM>*++Iv>	IIYII
,0BB[\\J ->)Ck{556OP

	! 	! \3J?:uP
 78TULL1IJ y)95G9H-  "|H$4 	5 __Z\D %		$u/F/F	G !& E }}))__Y_F.'/'='=&T5 (> ($ %,OO<LSV$WM %%))$u7N7N)O !& "'')$**, GF %5!P
?J % ED
 GF1P
 P
?J sV   +J<A)J0*)J	2J0A4J#	:
J0J<J J0#J-(J00J9	5J<<Kc                    t        j                  |       }|j                  }t        j                  | d      \  }}|||dS )N)md5sha256)rN   r   r   )r$   statst_sizer   	checksums)in_filestat_resultrN   r   r   s        r   get_pkg_detailszCondaFormat_v2.get_pkg_details   s=    ggg&""oog/@AVSF;;r   c                   t        j                  |j                  d            xs d}d|v r| j                  |||      S t        j
                  j                  |      st        j
                  j                  |      }t        |||       y )Nr   r   z://)r   verbose)	r   r"   r#   _list_remote_contentsr$   r%   r&   abspathr   )clsr   r   r.   r   s        r   list_contentszCondaFormat_v2.list_contents   sn    &&rvvl';<O
B;,,RJPW,XXww}}R $BbZ9r   c           
        t        j                  |xs d      }i }t        |       \  }}t        |      5  t	        ||d      D ]k  \  }}|j
                  |j                         rdndz   }d|v rd}	|rt        j                  |j                         d|j                  xs |j                   d|j                  xs |j                   d|j                  dd}	|	dt        j                   |j"                        d	d
 z  z  }	|	|z   ||<   d|v s|j
                  dk(  st%        j&                  |j)                  |      j+                         j-                               }
|
j/                  dd      dk(  sJ |
       |
j/                  dd      D ]   }d}	|r|d   }d|dd}	|	|d   z   ||d   <   " n 	 d	d	d	       t1        t3        |j5                               D 	cg c]  \  }}	|		 c}	}ddi y	# 1 sw Y   ?xY wc c}	}w )a  
        List contents of a remote .conda artifact (by URL). It only fetches the 'info' component
        and uses the metadata to infer details of the 'pkg' component. Some fields like
        modification time or permissions will be missing in verbose mode.
        r   r   )r   /  10dz%d-%02d-%02d %02d:%02d:%02d N   r    zinfo/paths.jsonpaths_versionr
   pathsr5   size_in_bytesz?????????? ?/? z ????-??-?? ??:??:?? _pathsep
)r   r"   r	   r   r   namer*   r   filemodera   unameuidgnamegidrN   time	localtimemtimero   loadsextractfilereaddecoder#   printsorteditems)urlr   r   linesfilenamecondatarmemberr%   linedatarN   _s                r   r   z$CondaFormat_v2._list_remote_contents   s    &&z'D_E
.s3%U^5hQWXXV{{V\\^cDZ'D#}}V[[9:!%||9vzz:!FLL<VFJJ;WWX%{{3/q2 
  >PVP\P\A]^`_`Aa aa"&+E$KJ&6;;:K+K::coof&=&B&B&D&K&K&MND88OQ71<BdB< $" 5!"#'#8D%4T#J>S#TD/3d7m/Cd7m, !6  Y , 	F5;;=$9:$9D$9:EE- ^, ;s   CG2G2BG2G>
2G;r4   )NNr:   )r|   z-Callable[[], zstandard.ZstdCompressor] | None)F)Fr   )rX   rY   rZ   r[   staticmethodr   r/   r1   r   r   classmethodr   r   r5   r   r   r   r   #   s    2 % % @ @ I I 
 DH,Y
 BY Yv < < : : F Fr   r   ) r[   
__future__r   ro   r$   r   rq   r   
contextlibr   typingr   zipfiler   r   r?   )conda_package_streaming.package_streamingr   conda_package_streaming.urlr	   r   r   	interfacer   	streamingr   r   rm   DEFAULT_COMPRESSION_TUPLErA   rB   r   r5   r   r   <module>r      sd    #  	      '  L <  ) &  M    cF' cFr   