
    u*e4K                        d Z ddl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 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mZ  ej        e          ZdZdZdZededddedZi Ze                                D ]!\  Z Z! e"e!e#          re ee!<   e!D ]Z$e ee$<   "dhZ%dhZ& G d d          Z' G d d          Z(d Z)d Z*d Z+dS )z*
cache conda indexing metadata in sqlite.
    N)join)Any)
BadZipFile)package_streaming   )yaml)CONDA_PACKAGE_EXTENSION_V1CONDA_PACKAGE_EXTENSION_V2CONDA_PACKAGE_EXTENSIONS	checksums   )commonconvert_cacheinfo/index.jsonzinfo/icon.pngzinfo/paths.jsonzinfo/about.json)info/recipe/meta.yamlinfo/recipe/meta.yaml.renderedinfo/meta.yamlinfo/run_exports.jsoninfo/post_install.json)
index_jsonaboutpathsreciperun_exportspost_installiconr   c                   "    e Zd Zd ZddefdZdS )cacherc                     || _         d S N)wrapped)selfr!   s     =lib/python3.11/site-packages/conda_index/index/sqlitecache.py__init__zcacher.__init__H   s        Nreturnc                 n    |r2|                      |          }t          || j         j        |           |S | S r    )r!   setattr__name__)r"   instobjtypevalues       r#   __get__zcacher.__get__K   s<     	LL&&ED$,/777Lr%   r    )r)   
__module____qualname__r$   r   r-    r%   r#   r   r   G   sC           S      r%   r   c                       e Zd ZdZd Zd Zd Zedej	        fd            Z
d Zed             Zed	             Zd
 Zd ZddZd ZddZd Zd Zd Zd Zd Zd ZdS )CondaIndexCachefsc           
      B   || _         || _        t          j                            ||          | _        t          j                            | j        d          | _        t          j                            | j        d          | _        t          j                            | j                   | _	        t          j                            | j                  st          j
        | j                   t                              d| d| d| j         d| j	                    dS )z
        channel_root: directory containing platform subdir's, e.g. /clones/conda-forge
        subdir: platform subdir, e.g. 'linux-64'
        z.cachezcache.dbzCondaIndexCache channel_root=z	, subdir=z db_filename=z cache_is_brand_new=N)channel_rootsubdirospathr   subdir_path	cache_dirdb_filenameexistscache_is_brand_newmkdirlogdebug)r"   r5   r6   s      r#   r$   zCondaIndexCache.__init__V   s   
 )7<<f==d&6AA7<<
CC&(gnnT5E&F&F"Fw~~dn-- 	%HT^$$$		 XL  X  X6  X  XX\Xh  X  X  C  V  X  X	
 	
 	
 	
 	
r%   c                 *      fd j         D             S )z4
        Remove db connection when pickled.
        c                 8    i | ]}|d k    |j         |         S )db__dict__).0kr"   s     r#   
<dictcomp>z0CondaIndexCache.__getstate__.<locals>.<dictcomp>n   s'    HHHa4ii4=#iiir%   rD   r"   s   `r#   __getstate__zCondaIndexCache.__getstate__j   s"     IHHHT]HHHHr%   c                     || _         d S r    rD   )r"   ds     r#   __setstate__zCondaIndexCache.__setstate__p   s    r%   r&   c                     t          j        | j                  }|5  t          j        |           t          j        |           ddd           n# 1 swxY w Y   |S )z5
        Connection to our sqlite3 database.
        N)r   connectr;   r   createmigrate)r"   conns     r#   rC   zCondaIndexCache.dbs   s    
 ~d.// 	( 	( &&&!$'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( s   )AAAc                 l    | j                             dd          }|r|                                 dS dS )z;
        Remove and close @cached_property self.db
        rC   N)rE   popclose)r"   rC   s     r#   rU   zCondaIndexCache.close~   s>     ]tT** 	HHJJJJJ	 	r%   c                     dS )z>
        All paths must be prefixed with this string.
         r0   rI   s    r#   database_prefixzCondaIndexCache.database_prefix   s	    
 rr%   c                     | j         dz   S )zM
        Pass to LIKE to filter paths belonging to this subdir only.
        %rX   rI   s    r#   database_path_likez"CondaIndexCache.database_path_like   s    
 #c))r%   c                     | j          | S r    r[   )r"   fns     r#   database_pathzCondaIndexCache.database_path   s    &,,,,r%   c                 :    |                     dd          d         S )zE
        path with any database-specfic prefix stripped off.
        /r   )rsplit)r"   r8   s     r#   
plain_pathzCondaIndexCache.plain_path   s     {{3""2&&r%   Fc                    | j         s|rt          j        | j        t          j        | j                             | j        5  t          j        | j                   ddd           n# 1 swxY w Y   |                                  dS dS )z4
        Load filesystem cache into sqlite.
        N)r=   r   rC   extract_cache_filesystemr:   remove_prefixrU   )r"   forces     r#   convertzCondaIndexCache.convert   s    
 " 
	e 
	'6t~FF  
  5 5+DG4445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 JJLLLLL
	 
	s   A((A,/A,c                 >    |                      |||j        |          S )zN
        fn_info: object with .fn, .st_size, and .st_msize properties
        )stat_result)_extract_to_cacher^   )r"   r5   r6   fn_infos       r#   extract_to_cache_info_objectz,CondaIndexCache.extract_to_cache_info_object   s,     %%&'*' & 
 
 	
r%   Nc                    t          ||          }t          ||          }|t          j        |          }|j        }|j        }|||d f}		 t
                              d||           |                     ||||          }
||||
f}	nI# t          t          t          j        t          t          f$ r t
                              d|           Y nw xY w|	S )Nzcache %s/%szError extracting %s)r   r7   statst_sizest_mtimer?   r@   extract_to_cache_unconditionalKeyErrorEOFErrorjsonJSONDecodeErrorr   OSError	exception)r"   r5   r6   r^   rk   r9   abs_fnsizemtimeretvalr   s              r#   rl   z!CondaIndexCache._extract_to_cache   s    <00k2&&'&//K"$UD$&	5IImVR000<<RuUUJj0FF 
 	5 	5 	5 MM/44444	5 s   :B ACCc           
      6   |                      |          }t          t                    t          z
  }h d}i }t	          t          j        |                    }	|	D ]2\  }
}|j        |v r|                    |j                   |
	                    |          }|&t                              | d|j         d           f|                                ||j        <   |j        t          k    r?t          j        ||j                           }|                    d          |t"          hz
  }|j        |v r't%          ||j                           ||j        <   ||z
  }|s/|	                                 t                              d|           4|rH|dhk    rAt                              | d| d	t          |                                                      t          j        |d
                   }	 |                    t.                    }n# t0          $ r d}Y nw xY wt3          |          |d<   t5          |d          \  }}| j        5  |D ]}t          |         }|t8          v s|dk    r||                    |          d}|t"          k    rd}n|d         
d| d| d}nd| d}	 | j                            ||           z# t<          j        $ r t                               d||            w xY wh dfd|!                                D             }|||d}|"                    |           | j                            d|t          j#        |          d           | $                    ||||           ddd           n# 1 swxY w Y   |S )z
        Add or replace fn into cache, disregarding whether it is already cached.

        Return index.json as dict, with added size, checksums.
        >   r   r   r   Nra   z was not a regular filer   z%s early closer   z	 missing z has r   rW   r   )md5sha256r   )r8   dataz
                                INSERT OR REPLACE into icon (path, icon_png)
                                VALUES (:path, :data)
                                r   z8
                                INSERT OR REPLACE INTO z (path, z^)
                                VALUES (:path, json(:data))
                                zDELETE FROM z WHERE path = :pathztable=%s parameters=%s>
   target-tripletucsarchr|   binstarmachineplatform
has_prefixoperatingsystemrequires_featuresc                 $    i | ]\  }}|v	||S r0   r0   )rF   rG   vfilter_fieldss      r#   rH   zBCondaIndexCache.extract_to_cache_unconditional.<locals>.<dictcomp>:  s)    XXX41a-AWAW!QAWAWAWr%   )r   r   r{   zVINSERT OR REPLACE INTO index_json (path, index_json) VALUES (:path, json(:index_json)))r8   r   )%r_   setPATH_TO_TABLECOMPUTEDiterr   stream_conda_infonameremoveextractfiler?   warnreadINDEX_JSON_PATHrv   loadsget	ICON_PATH_cache_reciperU   r@   keysrT   
PATHS_PATHrt   _cache_post_install_detailsr   rC   TABLE_NO_CACHEexecutesqlite3OperationalErrorry   itemsupdatedumpsstore_index_json_stat)r"   r^   rz   r{   r|   r_   wantedrecipe_want_onehavepackage_streamtarmemberreaderr   	paths_strr   r   	have_pathtable
parametersquerynew_infor   s                         @r#   rs   z.CondaIndexCache.extract_to_cache_unconditional   sm    **2..]##h.
 
 
 /A&IIJJ) 	0 	0KC{f$$fk***00>HHMMMMMNNN$*KKMMV[! ;/11!%D,=!>!>J!~~f--5!'9+!5;/11(5d6;6G(H(HD%#o5F 0$$&&&		*B/// 	Gf!8 999IIEEfEE3tyy{{3C3CEEFFFZ%6 788
	,,II 	 	 	III	)DY)O)O%&  (9::VW 4	O 4	O!  	%i0N**e|.C.C&3TXXi=P=PQQ
	))$EE  '3$8=$ $GL$ $ $EE
 JUIIIEGOOE:6666/   MM":E:NNN  M YXXX:+;+;+=+=XXXJ"fdCCHh''' GOOh&dj6L6LMM  
 &&}eT:NNNi4	O 4	O 4	O 4	O 4	O 4	O 4	O 4	O 4	O 4	O 4	O 4	O 4	O 4	O 4	Ol s>   5H HHA N/K
N-K88B
NNNc                 p   | j         }	 | j                            d| j        |                     |          d                                          }|d         }n# t          t          f$ rv t          	                    d|           	 t          j        t          ||                    j        }n/# t          $ r" t          	                    d|           i cY cY S w xY wY nw xY wd}| j                            |d|                     |          i                                          }t!          |          dk     sJ i }	 |d	         }d
D ]7}	||	         r-|                    t%          j        ||	                              8n# t          $ r d }Y nw xY w||d<   |                    di           }
	 |                    d |
                                D                        n# t,          $ r Y nw xY wt/          |d           t/          |d           |rt%          j        |d         pd          ni |d<   |S )NzASELECT mtime FROM stat WHERE stage=:upstream_stage AND path=:path)upstream_stager8   r|   z%s mtime not found in cachez#%s not found in load_all_from_cachea  
        SELECT
            index_json,
            about,
            post_install,
            recipe,
            run_exports
            -- icon_png
        FROM
            index_json
            LEFT JOIN about USING (path)
            LEFT JOIN post_install USING (path)
            LEFT JOIN recipe USING (path)
            LEFT JOIN run_exports USING (path)
            -- LEFT JOIN icon USING (path)
        WHERE
            index_json.path = :path
        LIMIT 2
        r8   r   r   )r   r   r   r   sourcec                      i | ]\  }}d |z   |S )source_r0   )rF   rG   r   s      r#   rH   z7CondaIndexCache.load_all_from_cache.<locals>.<dictcomp>  s"    EEEdaQEEEr%   descriptionsummaryr   z{})r9   rC   r   r   r_   fetchonert   
IndexErrorr?   r   r7   rp   r   rr   FileNotFoundErrorfetchalllenr   rv   r   r   r   AttributeError_clear_newline_chars)r"   r^   r9   rp   r|   UNHOLY_UNIONrowsr   rowcolumnr   s              r#   load_all_from_cachez#CondaIndexCache.load_all_from_cacheJ  s   &	7??S#'#6@R@RSU@V@VWW  hjj  MEE*% 	 	 	HH2B777[" 5 566?$   >CCC					 	( w64#5#5b#9#9:
 

(** 	 4yy1}}}}	q'CK 9 9v; 9KK
3v; 7 78889  	 	 	CCC	 W(B''	KKEEfllnnEEEFFFF 	 	 	D	 	T=111T9--- ILSdj]);)CtDDDQS]s[   AA ,C!'B/.C!/'CC!CC! C! AF FF11G# #
G0/G0c                      j         }t                              d j                   d t	          j                  D              fd}t                              d j                    j        5   j                            dd|i            j                            d |                       ddd           dS # 1 swxY w Y   dS )	zS
        stat all files in subdir_path to compare against cached repodata.
        z
%s listdirc                 F    h | ]}|                     t                    |S r0   )endswithr   )rF   r^   s     r#   	<setcomp>z0CondaIndexCache.save_fs_state.<locals>.<setcomp>  s;     
 
 
{{344

 
 
r%   c               3      K   D ]h} t           j                            |           }t          j        |          }                    |           t          |j                  |j        dV  id S )N)r8   r|   r{   )r7   r8   r   rp   r_   intrr   rq   )r^   rz   rp   fns_in_subdirr"   r9   s      r#   listdir_statz3CondaIndexCache.save_fs_state.<locals>.listdir_stat  s      #  k266wv ..r22 // L      r%   z%s save fs statez:DELETE FROM stat WHERE stage='fs' AND path like :path_like	path_likezu
            INSERT INTO STAT (stage, path, mtime, size)
            VALUES ('fs', :path, :mtime, :size)
            N)	r\   r?   r@   r6   r7   listdirrC   r   executemany)r"   r9   r   r   r   s   ``  @r#   save_fs_statezCondaIndexCache.save_fs_state  sH    +	 			,,,,
 
j--
 
 
	 	 	 	 	 	 	 			$dk222W 	 	 GOOLi(   G   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   7ACC	C	c                 V    | j                             d| j        | j        d          }|S )z
        Compare upstream to 'indexed' state.

        Return packages in upstream that are changed or missing compared to 'indexed'.
        a  
            WITH
            fs AS
                ( SELECT path, mtime, size, sha256, md5 FROM stat WHERE stage = :upstream_stage ),
            cached AS
                ( SELECT path, mtime, size, sha256, md5 FROM stat WHERE stage = 'indexed' )

            SELECT fs.path, fs.mtime, fs.size, fs.sha256, fs.md5,
                cached.mtime as cached_mtime, cached.size as cached_size, cached.sha256 as cached_sha256, cached.md5 as cached_md5

            FROM fs LEFT JOIN cached USING (path)

            WHERE fs.path LIKE :path_like AND
                (fs.mtime != cached.mtime OR fs.size != cached.size OR cached.path IS NULL)
            )r   r   )rC   r   r\   r   )r"   r   s     r#   changed_packagesz CondaIndexCache.changed_packages  s=       "4"&"5 !
 
, r%   c                 B   i }i }| j                             d| j        f          D ]v}|\  }}t          j        |          }|                    t                    r|||<   ;|                    t                    r|||<   [t          	                    d|           w||fS )zO
        Return "packages" and "packages.conda" values from the cache.
        z
            SELECT path, index_json FROM stat JOIN index_json USING (path)
            WHERE stat.stage = ?
            ORDER BY path
            z$%s doesn't look like a conda package)
rC   r   r   rv   r   r   r	   r
   r?   r   )r"   new_repodata_packagesnew_repodata_conda_packagesr   r8   r   s         r#   indexed_packagesz CondaIndexCache.indexed_packages  s     !#&(# 7??
  "
 
 	G 	GC  #D*J//J}}788 G.8%d++9:: G4>+D11?FFFF$&AAAr%   c           	      ^    | j                             d||||d         |d         f           d S )NzuINSERT OR REPLACE INTO stat (stage, path, mtime, size, sha256, md5)
                VALUES ('indexed', ?, ?, ?, ?, ?)r   r   )rC   r   )r"   r_   r|   r{   r   s        r#   r   z%CondaIndexCache.store_index_json_stat  sA    5E4H)=z%?PQ	
 	
 	
 	
 	
r%   )Fr    )r)   r.   r/   r   r$   rJ   rM   r   r   
ConnectionrC   rU   propertyrX   r\   r_   rd   ri   rn   rl   rs   r   r   r   r   r   r0   r%   r#   r2   r2   S   ss       N
 
 
(I I I   G&    V     X * * X*- - -' ' '   "
 
 
   <t t tlG G GR( ( (T  <B B B6
 
 
 
 
r%   r2   c                 `   dddddddd}| rt          j        |                               dg           }|D ]}|                    d          r=|                    d          dk    rd|d<   n|                    d          d	k    rd|d
<   dD ]:}|                    |          s#|d                             d|           rd||<   ;dD ]O}|                    |          s8t	          j        |d         d| d          rd||                    dd          <   Pt          j        |          S )NF)binary_prefixtext_prefix
activate.ddeactivate.dpre_link	post_link
pre_unlinkr   prefix_placeholder	file_modebinaryTr   textr   )r   r   _pathz
etc/conda/)zpre-linkz	post-linkz
pre-unlinkz*/.*-z.*-_)rv   r   r   
startswithfnmatchreplacer   )paths_json_strpost_install_details_jsonr   frG   pats         r#   r   r     s   ! !  L
>**..w;;  	L 	LAuu)** D55%%11AE-o>>UU;''611?C-m<3 8 8044Q77 8AgJ<Q<Q$$$= = 8 48-a0> L L044S99 LgogJ? ? L HL-ckk#s.C.CD	L :/000r%   c                     t          j        |           }	 t          j        |          }nM# t          $ r@ |                    di                               d           t          j        |          }Y nw xY w|S )Nrequirementsbuild)r   determined_loadrv   r   	TypeErrorr   rT   )recipe_readerrecipe_jsonrecipe_json_strs      r#   r   r   "  s    &}55K2*[11 2 2 2++//888*[112 s   + AA54A5c                    || v r|	 | |                                                              dd          | |<   d S # t          $ r; | |         d                                                              dd          | |<   Y d S w xY wd S )N
 r   )stripr   r   )record
field_names     r#   r   r   .  s    V	R!'
!3!9!9!;!;!C!CD#!N!NF: 	R 	R 	R!'
!3A!6!<!<!>!>!F!FtS!Q!QF:	R s   19 AA>=A>),__doc__r   rv   loggingr7   os.pathr   r   typingr   zipfiler   conda_package_streamingr   rW   r   utilsr	   r
   r   r   r   r   	getLoggerr)   r?   r   r   r   TABLE_TO_PATHr   r   rG   r   
isinstancestrr8   r   r   r   r2   r   r   r   r0   r%   r#   <module>r     sU       				                     5 5 5 5 5 5                  $ # # # # # # #g!! $	
 " +, & !! $ $DAqz!S $a 	$ 	$D"#M$	$
 
 %%	 	 	 	 	 	 	 	h
 h
 h
 h
 h
 h
 h
 h
V!1 !1 !1H	 	 	R R R R Rr%   