+
    Ki&  c                   sB   ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtH	t	 ^ RI
Ht ^ RIHt ^ RIHt ^ RIHt  ! R R]4      tR$R	 R
 lltR tR tR tR%R R lltR R ltR&R R lltR R ltR R ltR R ltR R ltR R ltR R lt R  R! lt!R" R# lt"R# )'i    N)ListTuple)settings)MissingExecutableError)system)loggerc                   s    ] tR t^tRtRtR# )ExtractErrorz2Exception raised when and archive fails to extract N)Z__name__Z
__module__Z__qualname__Z__firstlineno__Z__doc__Z__static_attributes__r       8/usr/lib/python3.14/site-packages/lutris/util/extract.pyr   r      s    <r   r   c          
      sj    V ^8  d   QhR\         R\         R\        R\        \         \         3,          /# )   pathto_directorymerge_singlereturn)strboolr   format   "r	   __annotate__r      s5     7 7# 7S 7d 7fkloqtltfu 7r   c                 s   \         P                  P                  V 4      p \        P                  ! R W4       Vf   \        V 4      p\        V4      w  rE\         P                  P                  VR\        4       ,          4      ;rg \        WWEV4       T'       dM   \         P$                  ! T4      p	\'        T	4      ^8X  d'   \         P                  P                  Yi^ ,          4      p\         P                  P)                  T4      '       d   \         P                  P                  TX	^ ,          4      p
\         P                  P)                  T
4      '       d.   \        P*                  ! RT
4       \         P,                  ! T
4       \         P                  P/                  T
4      '       d&   \         P0                  ! Y\        4       ,           4       \2        P4                  ! Ya4       \         P6                  ! T4       EMQ\         P$                  ! T4       EF   p\         P                  P                  Yk4      p\         P                  P                  Y4      p
\8        P:                  ! T
4      '       d   \        P*                  ! RT
4       \         P                  P)                  T
4      '       d/   \         P,                  ! T
4       \2        P4                  ! Y4       K  \         P                  P/                  T
4      '       d    \8        P<                  ! Y4       EK  EK
  \2        P4                  ! Y4       EK#  	  \8        P>                  ! T4       \        P                  ! RY4       Y3#   \        \        P                  \        P                  \        3 d2   p\        P                  ! RT4       \!        \#        T4      4      ThRp?ii ; i  \         d3   p\        P                  ! RT
T4       \!        \#        T4      4      ThRp?ii ; i)zExtracting %s to %sNz.extract-%szExtraction failed: %szOverwrite existing file %szOverwrite existing path %sz%Failed to merge to destination %s: %szFinished extracting %s to %s) osr   Zabspathr   Zdebug_guess_extractor_get_archive_openerjoin
_random_id_do_extractZOSErrorzliberrortarfileZ	ReadErrorZEOFErrorr   r   listdirZlenZisfilewarningremoveZisdirZrenameshutilmoveZ
removedirsr   path_existsZmerge_foldersZdelete_folder)r   r   r   	extractoropenermodeZ	temp_pathZtemp_dirZexZ	extracteddestination_pathZarchive_fileZsource_paths   &&&&         r	   extract_archiver(      s   77??4 D
LL&;$T*	&y1LF77<<mjl6RSSI,DV9= JJy)	y>QY!=I	ww~~i  77<<ilC77>>*++NN79IJII&'77==)**II&:<(GHI,
hJJy1L'',,y?K!ww||LG !!"233;=MN77>>"233II./KK>WW]]#344<,,[K 5 K:+ 2, 	X&
LL/DW TZZ!2!2H= ,,b13r7#+,@ # <C,
 +3r73;<s0   M& ?O	&/O,OO	P-PPc                s   V P                  R4      '       d   RpV# V P                  R4      '       d   RpV# V P                  R4      '       d   RpV# V P                  R4      '       d   RpV# V P                  R4      '       d   RpV# V P                  R4      '       d   RpV# V P                  R	4      '       d   R
pV# V P                  R4      '       d   RpV# V P                  4       P                  R4      '       d   RpV# RpV# )z4Guess what extractor should be used from a file namez.tartartgztxztbz2tzst.gzgzipz.exeexez.debdebz	.appimageAppImageN)z.tar.gzz.tgz)z.tar.xzz.txzz	.tar.lzma)z.tar.bz2z.tbz2z.tbz)z.tar.zstz.tzst)ZendswithZcasefold)r   r$   s   & r	   r   r   N   s'   }}V	& % 
*	+	+	" ! 
7	8	8	  
4	5	5	  
,	-	-	  
u			  
v			  
v			
 	 
	!	!+	.	.	  	r   c                s   RpV R8X  d   \         P                  RrW!3# V R8X  d   \         P                  RrW!3# V R8X  d   \         P                  RrW!3# V R9   d   \         P                  RrW!3# V R	8X  d   \         P                  R
rW!3# V R8X  d   RpW!3# V R8X  d   RpW!3# V R8X  d   RpW!3# V R8X  d   RpW!3# V R8X  d   RpW!3# RpW!3# )z<Return the archive opener and optional mode for an extractorNr)   zr:r*   zr:gzr+   zr:xzzr:bz2r-   zr:zstr/   gzZgoginnoextractr0   r1   r2   7zip)r,   Zbz2)r   open)r$   r&   r%      &  r	   r   r   g   s,   DE||T* <) 
e	||V& <% 
e	||V" <! 
o	%||W < 
f	||W < 
f	 < 
e	 < 
e	 < 
e	
 <	 
j	  < <r   c                 sL    \        \        P                  ! 4       4      R,          # )zReturn a random ID:Ni   N)r   uuidZuuid4r   r   r	   r   r      s    tzz|R  r   c                @    V ^8  d   QhR\         R\         R\         RR/# )r
   archivedestr&   r   Nr   r   r   r	   r   r      s)       C s VZ r   c                 sL   VR 8X  d   \        W4       R# VR8X  d   \        WVR7       R# VR8X  d   \        W4       R# VR8X  d   \        W4       R# VR8X  d   \	        W4       R# VR8X  d   \        W4       R# V! W4      pVP                  V4       VP                  4        R# )r3   r5   archive_typer0   r4   r1   r2   N)_decompress_gz_extract_7zip_extract_exe_extract_gog_extract_deb_extract_AppImageZ
extractallclose)r:   r;   r%   r&   r$   Zhandlers   &&&&& r	   r   r      s    ~w%	6	g)<	5W#	=	 W#	5W#	:	'('4 r   c                s0    V ^8  d   QhR\         R\         /# )r
   	file_path	dest_pathr<   r   r   r	   r   r      s      c c r   c                s   V'       dB   \         P                  P                  V\         P                  P                  V RR 4      4      pMV RR p\         P                  ! \         P                  P                  V4      RR7       \        VR4      ;_uu_ 4       p\        P                  ! V R4      pVP                  VP                  4       4       VP                  4        RRR4       R#   + '       g   i     R# ; i)zDecompress a gzip file.NT)Zexist_okZwbZrbi)r   r   r   ZbasenamemakedirsZdirnamer6   r/   ZwriteZreadrE   )rF   rG   Zdest_filenameZ	dest_fileZgzipped_file   &&   r	   r?   r?      s    Y0@0@3B0PQ!#2KK.>	mT	"	"iyyD1))+, 
#	"	"	"s   AC))C:	c                r9   )r
   r   r;   r>   r   Nr<   r   r   r	   r   r      s(       3 c T r   c                 s|   \         P                  P                  \        P                  R 4      p\
        P                  ! V4      '       g   \
        P                  ! R4      pVRV RP                  V4      R.pV'       d(   VR8w  d!   VP                  RP                  V4      4       \        P                  ! V4       R# )zp7zip/7zZ7zZxz-o{}z-aoaZautoz-t{}N)r   r   r   r   RUNTIME_DIRr   r#   find_required_executabler   Zappend
subprocesscall)r   r;   r>   
_7zip_pathcommands   &&&  r	   r@   r@      s    h22J?Jj))44T:
3fmmD&96BG.v}}\23OOGr   c                4    V ^8  d   QhR\         R\         RR/# r
   r   r;   r   Nr<   r   r   r	   r   r      s&     T Ts T# T$ Tr   c                 sr   \        V 4      '       d   \        W4       R# \        P                  P	                  \
        P                  R 4      p\        P                  ! V4      '       g   \        P                  ! R4      pVRV .p\        P                  ! V4      pV^ 8X  d   \        W4       R# \        R4      h)z	p7zip/7zaZ7zaZtz1specified exe is not an archive or GOG setup fileN)_check_inno_exe_decompress_gogr   r   r   r   rJ   r   r#   rK   rL   rM   r@   RuntimeError)r   r;   rN   rO   return_coderI   r	   rA   rA      s    t# WW\\("6"6D
!!*--88?JsD) oog.!$%RSSr   c                $    V ^8  d   QhR\         /# r
   r   )r   r   r   r	   r   r      s     
 
T 
r   c                s     \        4       pTRT .p\        P
                  ! T4      pT^ 8H  #   \         d    \        P                  ! RT 4        R# i ; i)z1Check if a path in a compatible innosetup archivez9Innoextract not found, can't determine type of archive %sFz-i)_get_innoextract_pathr   r   r   rL   rM   )r   innoextract_pathrO   rU   s   &   r	   rR   rR      s[    02
  t,G//'*K! " RTXYs   
, "AAc                rP   )r
   rF   r'   r   Nr<   r   r   r	   r   r      s&     	K 	Ks 	Kc 	Kd 	Kr   c           	      s:   \        4       p\        P                  ! V4       \        P                  ! VR RRVRV .RR7      pVP
                  ^ 8w  dK   VP                  P                  4       P                  4       p\        P                  ! RV4       \        R4      hR# )	z-mz-gz-dz-eT)Zcapture_outputz0Innoextract failed to extract GOG setup file: %sz,innoextract failed to extract GOG setup fileN)rX   r   create_folderrL   ZrunZ
returncodestderrZdecodeZstripr   r   rT   )rF   r'   rY   Zprocessr[   rI   r	   rS   rS      s    ,.
)*nn	4t-=tYO`dG Q&&(..0GPIJJ r   c                rV   rW   r<   r   r   r	   r   r      s     
 
s 
r   c                 s   \         P                  ! \        P                  4       U u. uF  q P	                  R4      '       g   K  V NK  	  pp V FR  p\         P
                  P                  \        P                  VR4      p\        P                  ! V4      '       g   KP  Vu # 	  \        P                  ! R4      p\        P                  ! R4       V# u up i )z.Return the path where innoextract is installedr4   zJinnoextract not available in the runtime folder, using some random version)r   r   r   rJ   Z
startswithr   r   r   r#   rK   r   r   )r   Z	inno_dirsZinno_dirZ	inno_paths       r	   rX   rX      s    "$**X-A-A"Be"B$ooVcFd"BIeGGLL!5!5xO	i(( 
 //>I
NN_` fs   CCc                rP   rQ   r<   r   r   r	   r   r      s&     D Ds D# D$ Dr   c                 sT    \        V 4      '       d   \        W4       R# \        R 4      h)z%specified exe is not a GOG setup fileN)rR   rS   rT   r   r;      &&r	   rB   rB      s!    t#BCCr   c                rP   )r
   r:   r;   r   Nr<   r   r   r	   r   r      s!      # S T r   c                s   \        WRR7       \        P                  P                  VR4      p\        P                  ! V4       . ROpV Fo  p\        P                  P                  VRP                  V4      4      p\        P                  P                  V4      '       g   KY  \        P                  ! WR4        M	  . ROpV F{  p\        P                  P                  VRP                  V4      4      p\        P                  P                  V4      '       g   KY  \        Wq4       \        P                  ! V4        R# 	  R# )	z:Extract the contents of a deb file to a destination folderZarr=   Zdebianzcontrol.tar{}z
data.tar{}N)r.   .xz.zst )r.   r^   r_   z.bz2z.lzmar`   )r@   r   r   r   rH   r   Zexistsr!   r"   r(   r    )r:   r;   Zdebian_folderZcontrol_file_extsZ	extensionZcontrol_tar_pathZdata_file_extsZdata_tar_paths   &&      r	   rC   rC      s    'd3GGLLx0MKK2&	77<<o.D.DY.OP77>>*++KK(8	 ' AN#	T<+>+>y+IJ77>>-((M0IIm$ $r   c                rP   rQ   r<   r   r   r	   r   r     s!      C s t r   c                s^    \         P                  ! V4       \        P                  ! W4       R# )zoThis is really here to prevent 7-zip from extracting the AppImage;
we want to just use this sort of file as-is.N)r   rZ   r!   Zcopyr\   r]   r	   rD   rD     s     
KKr   c                sF    V ^8  d   QhR\         R\        \         ,          /# )r
   rF   r   )r   r    r   r   r	   r   r     s     = =C =DI =r   c                s    \         P                  ! \        4       RV .4      pVP                  R4       Uu. uF  q"'       g   K  VR,          NK  	  up# u upi )z3Return the list of files contained in a GOG archivez-lmqZ
:i   NN)r   Zread_process_outputrX   Zsplit)rF   ZoutputZliner7   r	   get_innoextract_listra     sJ    '')>)@&)(TUF!'d!3<!3tHDHH!3<<<s   	AA)Z.TN)NN)N)#r/   r   r!   rL   r   r8   r   Ztypingr    r   Zlutrisr   Zlutris.exceptionsr   Zlutris.utilr   Zlutris.util.logr   Z	Exceptionr   r(   r   r   r   r   r?   r@   rA   rR   rS   rX   rB   rC   rD   ra   r   r   r	   <module>rb      s     	        4  "=9 =7t28!
&T 
	K
D,=r   