
    URg.                     :   d dl Z d dlZd dlmZ d dlZd dl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 dd	lmZmZmZ d d
lmZ dZej.                  j1                   ej2                         dd      ZdZdZ G d de      Z G d de      Z  G d de      Z!y)    N)Path)GLibGObject   _apt)_flatpak)FlatpakRemoteInfo)FlatpakPkgInfo
AptPkgInfo)print_timingdebugwarn)Optionalz#/var/cache/mintinstall/pkginfo.jsonmintinstallzpkginfo.jsoni:	    c                       e Zd ZdZy)CacheLoadingErrorz>Thrown when there was an issue loading the pickled package setN)__name__
__module____qualname____doc__     </usr/lib/python3/dist-packages/mintcommon/installer/cache.pyr   r      s    Hr   r   c                   :     e Zd Z fdZedefd       Zd Z xZS )
JsonObjectc                 j    t         t        |           t        | _        || _        || _        || _        y N)superr   __init__CACHE_SCHEMA_VERSIONschema_versionpkginfo_cachesection_listsflatpak_remote_infos)selfr$   r%   r&   	__class__s       r   r!   zJsonObject.__init__   s0    j$(*2**$8!r   	json_datac                    |j                  dd      }|t        k7  rt        d       y i }|d   j                         D ]O  }|d   |   }|d   j	                  d      rt        j                  |      ||<   8t        j                  |      ||<   Q i }|d   j                         D ]"  }|d   |   }t        j                  |      ||<   $  | ||d   |      S )	Nr#   r   z9PkgCache schema version doesn't match, regenerating cacher$   pkg_hashar&   r%   )	getr"   r   keys
startswithr   	from_jsonr   r
   )clsr)   r#   pkgcache_dictkeypkginfo_dataremotes_dictremote_datas           r   r0   zJsonObject.from_json#   s    "'7;11LM_-224 	LC$_5c:LJ'2237%/%9%9,%Gc"%3%=%=l%Kc"	L 3499; 	IC#$:;C@K 1 ; ;K HL	I =_-! 	!r   c                     | j                   S r   )__dict__r'   s    r   to_jsonzJsonObject.to_json<   s    }}r   )	r   r   r   r!   classmethoddictr0   r:   __classcell__r(   s   @r   r   r      s(    9 !$ ! !0r   r   c                        e Zd ZdZdZed fd	       Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zed        Zdee   fdZd Zd ZddZd ZddZd ZddZd Zd Z xZS )PkgCacher   r   c                    t         t        |           | j                  | _        || _        |t        |      | _        nd | _        |xr |dv | _        i | _	        t        j                         | _        	 | j                         \  }}}t        |      dkD  r| j                   | _        n| j                  | _        || _	        || _        || _        y # t        $ r	 i }i }i }Y Xw xY w)NfNr   )r    r@   r!   STATUS_EMPTYstatuscache_contentr   custom_cache_pathhave_flatpak_items	threadingLock
_item_lock_load_cacher   len	STATUS_OKsectionsr&   )r'   pkg_type
cache_pathrH   cacherP   r&   r(   s          r   r!   zPkgCache.__init__C   s    h&(''%!%)*%5D"%)D"(DX-D#..*	&484D4D4F1E81 u:>..DK++DK $8! ! 	&EH#% 	&s   4C C! C!c                 z    | j                   5  | j                  j                         cd d d        S # 1 sw Y   y xY wr   )rL   rI   r.   r9   s    r   r.   zPkgCache.keysd   s.    __ 	&;;##%	& 	& 	&   1:c                 z    | j                   5  | j                  j                         cd d d        S # 1 sw Y   y xY wr   )rL   rI   valuesr9   s    r   rW   zPkgCache.valuesh   s.    __ 	(;;%%'	( 	( 	(rU   c                 d    | j                   5  | j                  |   cd d d        S # 1 sw Y   y xY wr   rL   rI   r'   r3   s     r   __getitem__zPkgCache.__getitem__l   s*    __ 	$;;s#	$ 	$ 	$s   &/c                 d    | j                   5  || j                  |<   d d d        y # 1 sw Y   y xY wr   rY   )r'   r3   values      r   __setitem__zPkgCache.__setitem__p   s,    __ 	%$DKK	% 	% 	%s   &/c                 `    | j                   5  | j                  |= d d d        y # 1 sw Y   y xY wr   rY   rZ   s     r   __delitem__zPkgCache.__delitem__t   s*    __ 	!C 	! 	! 	!s   $-c                 b    | j                   5  || j                  v cd d d        S # 1 sw Y   y xY wr   rY   r'   r+   s     r   __contains__zPkgCache.__contains__x   s*    __ 	+t{{*	+ 	+ 	+s   %.c                 p    | j                   5  t        | j                        cd d d        S # 1 sw Y   y xY wr   )rL   rN   rI   r9   s    r   __len__zPkgCache.__len__|   s*    __ 	$t{{#	$ 	$ 	$s   ,5c              #      K   | j                   5  | j                  D ]	  }| |     	 d d d        y # 1 sw Y   y xY wwr   rY   rb   s     r   __iter__zPkgCache.__iter__   sA     __ 	 KK %8n$%	 	 	s   >2	>;>c                 ,   i }i }i }| j                   r?| j                  dv s| j                  | j                  k(  rt	        j
                  |      \  }}| j                  dv s| j                  | j                  k(  rt        j                  |      \  }}|||fS )NrB   )r,   N)rH   rF   rE   rD   r	   !process_full_flatpak_installationr   process_full_apt_cache)r'   rS   rP   r&   s       r   _generate_cachezPkgCache._generate_cache   s    ! $"4"4"Ct{{VZVgVgGg*2*T*TUZ*['E',t?P?P0P"99%@OE8h 444r   c                    | j                   y 	 t        j                  j                  t              }t        j
                         t        z
  |kD  s(t        j                  t        t        j                        st        d       d}	 t        j                  j                  t              }t        j
                         t        z
  |kD  rt        d       d}|dk(  r|dk(  ry d }||kD  rt        }t        d       t        |      S t        }t        d       t        |      S # t        $ r d}Y w xY w# t        $ r d}Y hw xY w)Nz>Installer: System pkgcache too old or not accessible, skippingr   z*Installer: User pkgcache too old, skippingz4Installer: System pkgcache is most recent, using it.z2Installer: User pkgcache is most recent, using it.)rG   ospathgetmtimeSYS_CACHE_PATHtimeMAX_AGEaccessR_OKr   OSErrorUSER_CACHE_PATHr   )r'   	sys_mtime
user_mtimemost_recents       r   _get_best_load_pathzPkgCache._get_best_load_path   s   !!-	((8Iw&)3BIInVXV]V]<^VW		))/:J		g%3BC

 >jAo z!(KHI
 K   *KFGK  5  	I	  	J	s%   A6D AD/ D,+D,/D=<D=c                    d}d}d}| j                         }|t        	 |j                  dd      5 }t        j	                  t        j                  |            }|j                  }|j                  }|j                  }ddd       |t        |||fS # 1 sw Y   xY w# t        $ r!}t        dt        |             d}Y d}~>d}~ww xY w)z
        The cache pickle file can be in either a system or user location,
        depending on how the cache was generated.  If it exists in both places, take the
        most recent one.  If it's more than MAX_AGE, generate a new one anyhow.
        Nrutf8modeencodingz'Installer: Error loading pkginfo cache:)rz   r   openr   r0   jsonloadr$   r%   r&   	Exceptionr   str)r'   rS   rP   r&   rn   rC   json_objes           r   rM   zPkgCache._load_cache   s     #'')<##	f5 E%//		!= ..#11'/'D'D$	E =##h 444E E
  	:CFCE	s/   B! AB B! BB! !	C*CCreturnc                 P   | j                   | j                   S 	 t        t              }|j                  j	                  dd       |j                  d       |S # t        $ rB 	 t        t              }|j                  j	                  dd       |cY S # t        $ r Y Y y w xY ww xY w)NT)parentsexist_ok)r   )	rG   r   rp   parentmkdirtouchPermissionErrorrv   r   )r'   rn   s     r   _get_best_save_pathzPkgCache._get_best_save_path   s    !!-)))	'DKKdT:JJJ%K 	O,!!$!> 	s/   ?A 	B%$-BB%	B!B% B!!B%c                 B   | j                         }dt        _        dt        _        dt        _        	 |j                  dd      5 }t        j                  ||d d       d d d        y # 1 sw Y   y xY w# t        $ r}t        d	t        |             Y d }~y d }~ww xY w)
Nzinstaller.pkgInfozinstaller._flatpakwr}   r~   c                 "    | j                         S r   )r:   )os    r   <lambda>z&PkgCache._save_cache.<locals>.<lambda>   s    199; r      )defaultindentz Installer: Could not save cache:)r   r   r   r   r
   r   r   dumpr   r   r   )r'   
to_be_jsonrn   rC   r   s        r   _save_cachezPkgCache._save_cache   s    '')$7! 3
';$	=f5 R		*a1FqQR R R 	=3SV<<	=s5   A6 A*!A6 *A3/A6 3A6 6	B?BBc                 T   t        d       | j                         \  }}}| j                  5  | j                  dk(  r^| j                  j                         D cg c]  }|j                  d      s| c}D ]  }| j                  |   ||<    | j                  }n`| j                  dk(  rQ| j                  j                         D cg c]  }|j                  d      s| c}D ]  }| j                  |   ||<    d d d        t        |      dkD  r| j                  t        |||             | j                  5  || _        || _        || _        d d d        t        |      dk(  r| j                  | _        y | j                  | _        y c c}w c c}w # 1 sw Y   xY w# 1 sw Y   QxY w)Nz"Installer: Generating new pkgcacherC   r,   r   )r   rk   rL   rF   rI   r.   r/   rP   rN   r   r   r&   rD   rE   rO   )r'   rS   rP   r&   r3   s        r   _new_cache_commonzPkgCache._new_cache_common   sv   23040D0D0F-x- __ 	2!!S(+/;;+;+;+=UCPSATCU 2C!%S!1E#J2==##s*+/;;+;+;+=UCPSATCU 2C!%S!1E#J2	2 u:>Zx9MNO__ 	=DK$DM(<D%	=
 u:?++DK..DK% V V	2 	2	= 	=sB   ,FF/F3AFFF F8F
FFF'c                 T    | j                          |t        j                  |       y y r   )r   r   idle_add)r'   callbacks     r   _generate_cache_threadzPkgCache._generate_cache_thread  s'     X&  r   c                     | j                   5  | j                  j                         D ci c]  \  }}|j                  |      s|| c}}cd d d        S c c}}w # 1 sw Y   y xY wr   )rL   rI   itemsr/   )r'   rQ   kvs       r   get_subset_of_typezPkgCache.get_subset_of_type  sY    __ 	T%)[[%6%6%8STQALL<RAqDS	T 	TS	T 	Ts"   AAA
AAA&c                 j    t        j                  | j                  d|i      }|j                          y )Nr   )targetkwargs)rJ   Threadr   start)r'   idle_callbackthreads      r   force_new_cache_asynczPkgCache.force_new_cache_async!  s,    !!)D)D*4})EGr   c                 $    | j                          y r   )r   r9   s    r   force_new_cachezPkgCache.force_new_cache&  s     r   c                     |dk(  r|j                  d      sd|z   }	 | |   S # t        $ r6 |dd dk(  rY y | j                  rt        j                  | ||      }||cY S Y y w xY w)Nr,   zapt:r   r   )r/   KeyErrorrH   r	   find_pkginfo)r'   stringrQ   remotepkginfos        r   r   zPkgCache.find_pkginfo)  sz    s?6#4#4V#<f_F	#< 	#a{f$  "//ffE&"N	#s   " A!'A! A!c                    d}t         j                  j                  |      syddl}	 |j	                  |d      j                         j                  d      j                         }|D cg c]  }|j                  d      s|dd  }}|syd	d
lm} | j                  d      D cg c]  }|dd 	 }} |j                         D cg c];  }|j                   r-|j"                  s!|j$                  |vr|j$                  |v rd|z  = }	}|	S # t        $ r!}t        dt        |      z         Y d}~yd}~ww xY wc c}w c c}w c c}w )z
        Generate list of manually installed Debian package.
        Requires a package list provided by the installer.
            Currently knows only Ubiquity's /var/log/installer/initial-status.gz
        z$/var/log/installer/initial-status.gzNr   r|   zutf-8z^Could not get initial installed packages list (check /var/log/installer/initial-status.gz): %sz	Package: 	   r   r   r,   r   zapt:%s)rm   rn   isfilegzipr   readdecode
splitlinesr   r   r   r/    r   r   get_apt_cache	installedis_auto_installed	shortname)
r'   installer_logr   r   xinitial_statusr   pkgcachepkgcurrent_statuss
             r   _get_manually_installed_debsz%PkgCache._get_manually_installed_debs8  s9    ?ww~~m,	 IImS9>>@GGP[[]M
 *7TA!,,{:S!AB%TT#'#:#:3#?@aAabE@@4FD4F4F4H (S]]%%MM/MMX%	 #S. ( (
   	qtwxytzz{	 U A(s0   =D
 )D7 D7%D<A E
	D4D//D4c                     d}| j                         }|r$|}|| j                  d      D cg c]  }| c}z  }|S c c}w )z? Get list of all manually installed packages (apt and flatpak) NrC   )r   r   )r'   installed_packagesinstalled_packages_aptr   s       r   get_manually_installed_packagesz(PkgCache.get_manually_installed_packagesT  sM    !!%!B!B!D!!7d.E.Ec.J"K1"KK!! #Ls   	;)NTr   )NN)r   r   r   rD   rO   r   r!   r.   rW   r[   r^   r`   rc   re   rg   rk   rz   rM   r   r   r   r   r   r   r   r   r   r   r   r   r=   r>   s   @r   r@   r@   ?   s    LI9 9@&($%!+$5%!N 5 5<Xd^ $=)<'T
!8"r   r@   )"rq   rm   pathlibr   r   rJ   gi.repositoryr   r   r   r   r	   r
   pkgInfor   r   miscr   r   r   typingr   rp   rn   joinget_user_cache_dirrv   rr   r"   r   r   objectr   r@   r   r   r   <module>r      s     	    '   ' / + + 6'',,6t668-X
 I	 I# #J\"v \"r   