
    wBfaC                       d Z ddlm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 dd	lmZmZmZ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dlmZ ddlm Z  ddl!m"Z" ddl#m$Z$m%Z%m&Z&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6  ee7      Z8 G d de9      Z: G d de:      Z;d Z<d Z=d!d Z>y)"z@Tools for managing the packages installed within an environment.    )annotationsN)	getLogger)basenamelexists)Path   )ValidationError)CONDA_ENV_VARS_UNSET_VARCONDA_PACKAGE_EXTENSIONSPREFIX_MAGIC_FILEPREFIX_STATE_FILE)context)NULL)time_recorder)#get_python_site_packages_short_pathwin_path_ok)get_site_packages_anchor_files)	json_load)
deprecated)BasicClobberErrorCondaDependencyErrorCorruptedEnvironmentErrormaybe_raise)write_as_json_to_file)rm_rf)read_python_record)file_path_is_writable)	MatchSpec)PrefixGraph)PackageRecordPrefixRecordc                  .     e Zd ZdZ	 d	 	 	 d fdZ xZS )PrefixDataTypez-Basic caching of PrefixData instance objects.c                    t        |t              r|S t        |      x}t        j                  v rt        j                  |   S t        |   ||      }|t        j                  |<   |S N)
isinstance
PrefixDatar   _cache_super__call__)clsprefix_pathpip_interop_enabledprefix_data_instance	__class__s       6lib/python3.12/site-packages/conda/core/prefix_data.pyr*   zPrefixDataType.__call__0   sg    
 k:.!+..k:3E3EE%%k22#(7#3KAT#U .BJ{+''    r%   )r,   str | os.PathLike | Pathr-   bool | None)__name__
__module____qualname____doc__r*   __classcell__)r/   s   @r0   r#   r#   -   s'    7
 ,0(-( )( (r1   r#   c                      e Zd ZU i Zded<   	 d	 	 	 ddZ ee       d        Zd Zd Z	d	 Z
d
 ZefdZd Zd Zd Zd Zed        Zd Zed        Z edd      d        Zed        Zd Zd Zd Zd Zd Zd Zy)r'   zdict[Path, PrefixData]r(   Nc                t    || _         d | _        t        | _        ||| _        y t        j
                  | _        y r%   )r,   _PrefixData__prefix_recordsr   _PrefixData__is_writabler   r-   _pip_interop_enabled)selfr,   r-   s      r0   __init__zPrefixData.__init__B   sD     ' $! #.   	! ,, 	!r1   )module_namec                    i | _         | j                  dz  }t        |      r;d d t        j                  |      D        D        }|D ]  }| j                  |        | j                  r| j                          y y )N
conda-metac              3  0   K   | ]  }|d d dk(  r|  yw)N.json ).0ps     r0   	<genexpr>z"PrefixData.load.<locals>.<genexpr>W   s&      %RS6W$ %s   c              3  4   K   | ]  }|j                     y wr%   )path)rG   entrys     r0   rI   z"PrefixData.load.<locals>.<genexpr>Y   s     N%**Ns   )r;   r,   r   osscandir_load_single_recordr=   _load_site_packages)r>   _conda_meta_dirconda_meta_json_paths	meta_files       r0   loadzPrefixData.loadR   sy     "**\9?#%N"**_2MN%!
 3 4	((34$$$$& %r1   c                &    | j                          | S r%   )rT   r>   s    r0   reloadzPrefixData.reloada   s    		r1   c                    |j                   }d}t        dz   D ](  }|j                  |      s|j                  |d      }d}* |st	        d|z        |dz   S )NF)z
.dist-info Tz<Attempted to make prefix record for unknown package type: %srE   )fnr   endswithreplace
ValueError)r>   prefix_recordrZ   	known_extexts        r0   _get_json_fnzPrefixData._get_json_fne   sn    	+o= 	!C{{3ZZR( 		! NQSS  G|r1   c                T   |j                   | j                  vsJ d|j                   z         | j                  dz  | j                  |      z  }t	        |      r+t        t        d |t              t               t        |       t        ||       || j                  |j                   <   y )NzPrefix record insertion error: a record with name %s already exists in the prefix. This is a bug in conda. Please report it at https://github.com/conda/conda/issuesrB   )source_pathtarget_pathr   )
name_prefix_recordsr,   ra   r   r   r   r   r   r   )r>   r^   prefix_record_json_paths      r0   insertzPrefixData.inserts   s    !!)=)== 	
46C6H6HI	
= |+d.?.?.NN 	  *+! $ 7#
  )*5}E3@]//0r1   c                    || j                   v sJ | j                   |   }| j                  dz  | j                  |      z  }| j                  rt	        |       | j                   |= y )NrB   )rf   r,   ra   is_writabler   )r>   package_namer^   rg   s       r0   removezPrefixData.remove   sm    t33333,,\: |+d.?.?.NN 	  )*  .r1   c                V    	 | j                   |   S # t        $ r |t        ur|cY S  w xY wr%   )rf   KeyErrorr   )r>   rk   defaults      r0   getzPrefixData.get   s7    	''55 	d"		s    ((c                H    t        | j                  j                               S r%   )iterrf   valuesrV   s    r0   iter_recordszPrefixData.iter_records   s    D((//122r1   c                ^    t        | j                               }t        |j                        S r%   )r   rt   rr   graph)r>   prefix_graphs     r0   iter_records_sortedzPrefixData.iter_records_sorted   s&    "4#4#4#67L&&''r1   c                    t               }| j                         D ]H  }|j                  j                  }|s||vs!t        j                  d||       |j                  |       J |S )Nzadding subdir url %s for %s)setrt   channel
subdir_urllogdebugadd)r>   subdir_urlsr^   r|   s       r0   all_subdir_urlszPrefixData.all_subdir_urls   sa    e!..0 	,M&..99Jj;		7]S
+		,
 r1   c                    |t        t              rt              t        t              rfd| j                         D        S t        t              sJ fd| j                         D        S )Nc              3  D   K   | ]  }j                  |      r|  y wr%   )matchrG   
prefix_recparams     r0   rI   z#PrefixData.query.<locals>.<genexpr>   s%      ;;z* s    c              3  .   K   | ]  }|k(  s	|  y wr%   rF   r   s     r0   rI   z#PrefixData.query.<locals>.<genexpr>   s      )JRWDW
s   
)r&   strr   rt   r    )r>   package_ref_or_match_specr   s     @r0   queryzPrefixData.query   sn    )eS!e$EeY'"&"3"3"5  e]333-1->->-@ r1   c                Z    | j                   xs | j                         xs | j                   S r%   )r;   rT   rV   s    r0   rf   zPrefixData._prefix_records   s$    $$L		Lt7L7LLr1   c                Z   t         j                  d|       t        |      5 }	 t        |j	                               }t        di |}	 t        |      d d j                  dd      \  }}}|||f|j                  |j                  |j                  fk7  r
t!               	 || j$                  |j                  <   d d d        y # t
        t        j                  f$ r t        | j                  |      w xY w# t         $ r! t         j#                  d|       Y d d d        y w xY w# 1 sw Y   y xY w)Nzloading prefix record %srD   -r   z'Ignoring malformed prefix record at: %srF   )r}   r~   openr   readUnicodeDecodeErrorjsonJSONDecodeErrorr   r,   r!   r   rsplitre   versionbuildr]   warnr;   )r>   rg   fh	json_datar^   nvbs           r0   rO   zPrefixData._load_single_record   sJ   		,.EF)* 	Fb%bggi0	 )595M"#:;CR@GGQO1aq!9!&&!))!''! 
 %,& 9FD!!-"4"45?	F 	F '(<(<=  0$$&= *  =?V ;	F 	F01	F 	FsF   D!CD!	AC4D!0C11D!4DD!DD!!D*c                    | j                   t        k(  r8| j                  t        z  }|j	                         sd }nt        |      }|| _         | j                   S r%   )r<   r   r,   r   is_filer   )r>   	test_pathrj   s      r0   rj   zPrefixData.is_writable   sP    %((+<<I$$&"3I>!,D!!!r1   z24.3z24.9c                    d| j                   v S )Npython)rf   rV   s    r0   _has_pythonzPrefixData._has_python   s    4////r1   c                X    t        d | j                  j                         D        d      S )z0Return the prefix record for the package python.c              3  >   K   | ]  }|j                   d k(  r|  ywr   Nre   )rG   r^   s     r0   rI   z0PrefixData._python_pkg_record.<locals>.<genexpr>   s&      ! %%1 s   N)nextr;   rs   rV   s    r0   _python_pkg_recordzPrefixData._python_pkg_record   s2     %)%:%:%A%A%C
 
 	
r1   c                   | j                   }|si S t        |j                        }| j                  t	        |      z  }|j                         si S t        | j                               }|j                  |      }t        ||      }t        ||      }t        |      }||z
  }	||z
  }
|	D ]w  }| j                  j                  ||   j                        }	 t        |j                         }| j                  dz  | dz  }	 t)        |       t*        j-                  d|       y i }|
D ]O  }	 t1        | j                  ||j                        }|s(|| j@                  |j                  <   |||j                  <   Q |S # t"        $ r5 dj%                  |j                  |j                  |j&                  f      }Y w xY w# t.        $ r t*        j-                  d|       Y 5w xY w# t.        $ r!}t*        j3                  d||       Y d}~d}~wt4        $ rn ddl}|j9                         \  }}}ddl}|j=                  |||      }t*        j?                  d	|       t*        j-                  d
dj%                  |             Y Yw xY w)a  
        Load non-conda-installed python packages in the site-packages of the prefix.

        Python packages not handled by conda are installed via other means,
        like using pip or using python setup.py develop for local development.

        Packages found that are not handled by conda are converted into a
        prefix record and handled in memory.

        Packages clobbering conda packages (i.e. the conda-meta record) are
        removed from the in memory representation.
        r   rB   rE   z$removed due to stale information: %sz*stale information, but couldn't remove: %sz6Python record ignored for anchor path '%s'
  due to %sNr   zProblem reading non-conda package record at %s. Please verify that you still need this, and if so, that this is still installed correctly. Reinstalling this package may help.zValidationError: 
%s

)!r   r   r   r,   r   is_dirr   rt   all_descendants"get_conda_anchor_files_and_recordsr   rz   rf   popre   r   extracted_package_dirAttributeErrorjoinr   r   r}   r~   OSErrorr   infor	   sysexc_info	tracebackformat_exceptionr   r;   )r>   python_pkg_recordsite_packages_dirsite_packages_pathrw   python_recordsconda_python_packagessp_anchor_filesconda_anchor_filesclobbered_conda_anchor_filesnon_conda_anchor_filesconda_anchor_filer   r   prefix_rec_json_pathnew_packagesafpython_recorder   exc_type	exc_valueexc_tracebackr   tbs                            r0   rP   zPrefixData._load_site_packages  s    !33 I?%%
 "--<M0NN!((*I #4#4#4#67%556GH B~!
 9 1
 !!67'9O'K$!03E!E "> 	X--11%&78==J(01Q1Q(R%   </5J4K52QQ !X*+ 		@BVW)	X. ( 	=B 2$$b*;*C*C!. !8ED!!-"4"45/<L++,9	=< a " (+__j&8&8*:J:JK)%  		@BV  MrST " 58\\^2)] //)]S: 	 		3TYYr]CsC   E; F<+!G";;F98F9<GG"	J+HA6J Jc                    | j                   t        z  }t        |      r9t        |      5 }t	        j
                  |j                               }d d d        |S i }|S # 1 sw Y   S xY wr%   )r,   r   r   r   r   loadsr   )r>   env_vars_filefprefix_states       r0   _get_environment_state_filez&PrefixData._get_environment_state_filek  sf    ((+<<=!m$ 4#zz!&&(34  L	4 s   $AA&c                z    | j                   t        z  }|j                  t        j                  |dd              y )NFc                    | j                   S r%   )__dict__)xs    r0   <lambda>z:PrefixData._write_environment_state_file.<locals>.<lambda>w  s
    AJJ r1   )ensure_asciiro   )r,   r   
write_textr   dumps)r>   stater   s      r0   _write_environment_state_filez(PrefixData._write_environment_state_filet  s2    ((+<<  JJu5:NO	
r1   c                    | j                         }t        |j                  di             }|j                         D ci c]  \  }}|t        k7  s|| }}}|S c c}}w Nenv_vars)r   dictrp   itemsr
   )r>   r   env_vars_allkr   r   s         r0   get_environment_env_varsz#PrefixData.get_environment_env_varsz  sf    779L,,Z<=)//1
QQ:R5RAqD
 
 
s   AAc                    | j                         }|j                  d      }|r|j                  |       n||d<   | j                  |       |j                  d      S r   )r   rp   updater   )r>   r   env_state_filecurrent_env_varss       r0   set_environment_env_varsz#PrefixData.set_environment_env_vars  s[    99;)--j9##H-)1N:&**>:!!*--r1   c                    | j                         }|j                  d      }|r4|D ]  }||j                         v st        ||<     | j	                  |       |j                  d      S r   )r   rp   keysr
   r   )r>   r   r   r   env_vars        r0   unset_environment_env_varsz%PrefixData.unset_environment_env_vars  ss    99;)--j9# I.33550H$W-I ..~>!!*--r1   r%   )r,   r   r-   r3   )r4   r5   r6   r(   __annotations__r?   r   rT   rW   ra   rh   rl   r   rp   rt   rx   r   r   propertyrf   rO   rj   r   r   r   rP   r   r   r   r   r   rF   r1   r0   r'   r'   ?   s    &(G#(
 ,0

 )
  x(' )'A2/ )- 3(" M M!FF " " 0  0 	
 	
dL
..r1   r'   )	metaclassc           	        d}i }t        j                  dj                  t        j                  |       dj	                  d |D                          j
                  |D ]x  }t        fd|j                  D              }t        |      dkD  r?t        |t              d   }t        j                  d	|j                         |       |||<   n|sq|||d   <   z |S )
zAReturn the anchor files for the conda records of python packages.)z.egg-info/PKG-INFOz.dist-info/RECORDz	.egg-infoz^{}/[^/]+(?:{})$|c              3  F   K   | ]  }t        j                  |        y wr%   )reescape)rG   rZ   s     r0   rI   z5get_conda_anchor_files_and_records.<locals>.<genexpr>  s     BbiimBs   !c              3  4   K   | ]  } |      s|  y wr%   rF   )rG   fpathmatchers     r0   rI   z5get_conda_anchor_files_and_records.<locals>.<genexpr>  s     Vuwu~UVs      )keyr   z7Package %s has multiple python anchor files.
  Using %s)r   compileformatr   r   r   tuplefileslensortedr}   r   	record_id)site_packages_short_pathr   anchor_file_endingsr   r^   anchor_pathsanchor_pathr   s          @r0   r   r     s    Rjj""II./IIB.ABB	

 e  ( CV0C0CVV|q  37:KHHJ'')
 2?!+.5B!,q/2C ! r1   c                   d t        |       j                         D        }t        |d       }|y t        |d       }|t        d| z        |j                  d   j                         r|j                  d d S |j                  d d S )Nc              3  @   K   | ]  }|j                   d k(  s|  ywr   r   )rG   rcrds     r0   rI   z0get_python_version_for_prefix.<locals>.<genexpr>  s       dii8>Ss   z*multiple python records found in prefix %s      )r'   rt   r   r   r   isdigit)prefixpy_record_iterrecordnext_records       r0   get_python_version_for_prefixr    s    #F+88:N .$'F~~t,K"86A
 	
 
		"	"	$~~bq!!~~bq!!r1   c                    t        |       } t        t        j                  d      D ]&  }	 | j	                  |       t        j                  |=  y y# t
        $ r Y 5w xY w)z=Here, path may be a complete prefix or a dist inside a prefixT)reverseF)r   r   r'   r(   relative_tor]   )rK   r
  s     r0   delete_prefix_from_linked_datar    sd    :D++T: 	V$""6*	   		s   "A	AA)rK   r2   returnbool)?r7   
__future__r   r   rM   r   loggingr   os.pathr   r   pathlibr   auxlib.exceptionsr	   base.constantsr
   r   r   r   base.contextr   common.constantsr   	common.ior   common.pathr   r   common.pkg_formats.pythonr   common.serializer   deprecationsr   
exceptionsr   r   r   r   gateways.disk.creater   gateways.disk.deleter   gateways.disk.readr   gateways.disk.testr   models.match_specr   models.prefix_graphr   models.recordsr    r!   r4   r}   typer#   r'   r   r  r  rF   r1   r0   <module>r+     s    G "  	 	  %  /  # # % J F ( %  9 ( 3 6 ) - 8(T ($U.> U.p
!8"&r1   