
    AiO)                        S SK r S SKrS SKrS SKrS SKrS SKrS SKJr  S SKJr  S SK	r	Sr
Sr\ R                  R                  S5      rSrSrS	rS
r\ R&                  " \SS9  \ R&                  " \
SS9  S rS rS rS rS rS rS rS rS rS\S\4S jr\" SS5        \" SS5        S%S jrS&S jr S'S jr!S(S jr"S  r#S! r$S" r%S# r&S$ r'g))    N)urlparse)tqdmz/tmp/fempkgbuildz/var/lib/fempkg/pkgsz/var/lib/fempkg/repoz/var/lib/fempkg/manifestsz!/var/lib/fempkg/manifest-versionsz/var/lib/fempkg/local-manifestsz/var/lib/fempkg/binpkgTexist_okc                      [         R                  " U SS9  g ! [         a)  nUR                  [        R                  :w  a  e  S nAg S nAff = f)NTr   )osmakedirsOSErrorerrnoEEXIST)pathes     /usr/bin/utils.py_ensure_dirr   (   s=    
D4( 77ell" #s    
AAAc                 *    S nU" U 5      U" U5      :  $ )Nc                     U R                  SS5      R                  S5      n/ nU H4  nUR                  UR                  5       (       a  [	        U5      OU5        M6     U$ )N-.)replacesplitappendisdigitint)vpartsparsedps       r   parse version_satisfies.<locals>.parse0   sM    		#s#))#.AMMAIIKK#a&Q7      )	installedlatestr   s      r   version_satisfiesr$   /   s     uV},,r    c                  `   [         R                  R                  S5      S:X  a  [        R                  " 5       n SU l        [        R                  U l        [        R                  R                  [        R                  R                  U S95      n[        R                  R                  U5        gg)z2Sets up insecure SSL handling if FEMPKG_INSECURE=1FEMPKG_INSECURE1F)contextN)r   environgetsslcreate_default_contextcheck_hostname	CERT_NONEverify_modeurllibrequestbuild_openerHTTPSHandlerinstall_opener)ctxopeners     r   %_install_insecure_opener_if_requestedr7   8   sw    	zz~~'(C/((*"--,,V^^-H-HQT-H-UV%%f- 0r    c                     [        U 5      n[        R                  R                  UR                  5      nU=(       d    S$ )Nzdownloaded.file)r   r   r   basename)urlr   names      r   _safe_basename_from_urlr<   A   s/    c]F77FKK(D$$$r    c                     S H*  nU R                  U5      (       d  M  U S [        U5      *  s  $    [        R                  R	                  U 5      S   $ )N)z.tar.gzz.tar.bz2z.tar.xzz.tgzz.tarr   )endswithlenr   r   splitext)r;   exts     r   _strip_archive_extrB   F   sK    A==
#c(## B 77D!!$$r    c                    [         R                  R                  [         R                  R                  U 5      5      S   n[         R                  R	                  [
        U5      n[         R                  R                  U5      (       a  [        R                  " U5        [         R                  " [
        SS9  [        R                  " SSX/5        U$ )z%Clone a git repository into BUILD_DIRr   Tr   gitclone)r   r   r@   r9   join	BUILD_DIRexistsshutilrmtreer	   
subprocess
check_call)r:   	repo_namedests      r   _clone_git_reporO   L   s      !1!1#!67:I77<<	9-D	ww~~ddKK	D)5'356Kr    c                    [        5         [        R                  " [        R                  R	                  U5      SS9  [        R
                  R                  S5      S:g  nSS0n[        R                  " XSUS9 nUR                  5         [        UR                  R                  SS	5      5      nS
n[        US5       n[        USSS[        R                  R                  U5       3S9 nUR                  US9 H7  n	U	(       d  M  UR                  U	5        UR!                  [#        U	5      5        M9     S S S 5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g = f)NTr   r&   r'   z
User-AgentzeMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36)headersstreamverifyzcontent-lengthr   i   wbBzDownloading )totalunit
unit_scaledesc)
chunk_size)r7   r   r	   r   dirnamer)   r*   requestsraise_for_statusr   rQ   openr   r9   iter_contentwriteupdater?   )
r:   rN   
verify_sslrQ   r
total_sizerZ   fpbarchunks
             r   download_torh   W   s(   )+KK%5  12c9J 	}G 
c4
	Kq	'7;<
 
$D 0 0 678	%

 :>5GGENKKE
+ ?%
 
L	K
%
 %
 
L	KsC   9AE0=-E*E/E5E=E0
EE
E-	)E00
E>c                    [        5         US:X  a  [        U 5      $ [        U 5      n[        R                  R                  [        U5      n[        R                  R                  U5      (       d  [        X5        [        R                  R                  [        [        U5      5      n[        R                  R                  U5      (       a  [        R                  " U5        [        R                  " U5        U$ )NrD   )r7   rO   r<   r   r   rF   PKG_DIRrH   rh   rG   rB   rI   rJ   r	   )r:   source_typer9   tarball_pathdest_dirs        r   download_extractrn   s   s    )+es##&s+H77<<2L77>>,''C&ww||I'9('CDH	ww~~hhKKOr    c                    [         R                  R                  U 5      (       ao  [         R                  R                  U 5      n[         R                  R	                  U5      (       a  [
        R                  " USS9  [         R                  " U 5        g[         R                  R	                  U 5      (       a  [
        R                  " U SS9  gg)z*Remove path recursively or symlink target.Tignore_errorsN)r   r   islinkrealpathrH   rI   rJ   unlink)r   	real_paths     r   safe_rmtreerv      s{    	ww~~dGG$$T*	77>>)$$MM)48
		$			d$/ 
r    srctargetc                 x   [         R                  R                  U 5      (       a2  [         R                  " U 5      U:X  a  g [         R                  " U 5        O9[         R                  R                  U 5      (       a  [        R                  " U SS9  [         R                  " USS9  [         R                  " X5        g )NTrp   r   )
r   r   rr   readlinkrt   rH   rI   rJ   r	   symlink)rw   rx   s     r   _ensure_symlinkr|      so    	ww~~c;;sv%IIcN			c.KK&JJvr    z/tmp/fempkgz/var/tmp/fempkgz/var/tmp/fempkgbuildc                    U  S3n[        SU 35         [        R                  " 5        nUR                  U5      nUR	                  5         UR
                  R                  5        Vs/ s H  oDR                  S5      (       d  M  UPM     nn[        USSS9 H  nU  SU 3n[        R                  R                  [        U5      nUR                  U5      n	U	R	                  5         [        US5       n
U
R                  U	R                  5        S S S 5        M     S S S 5        g s  snf ! , (       d  f       M  = f! , (       d  f       g = f! [          a  n[        S	U 35         S nAg S nAff = f)
N
/index.txtzFetching recipe index from z
.recipe.pyRecipesfilerY   rW   /rT   zError fetching index/recipes: )printr\   Sessionr*   r]   text
splitlinesr>   r   r   r   rF   RECIPE_CACHE_DIRr^   r`   content	Exceptionrepo_url	index_urlsessionrespr   entriesentryr:   	dest_pathrc   re   s              r   fetch_all_recipesr      s2   *J'I	'	{
3447;;y)D!!#"&))"6"6"8U"8QJJ|<Tq"8GUgIFC!
!E7+GGLL)95A	KK$""$)T*aGGAII& +* D   V +*    4.qc2334e   E >D;(D$D$A(D;3D)D;E $D;)
D83D;;
E	E 	E 
E.E))E.c                    U  S3n[        SU 35         [        R                  " 5        nUR                  U5      nUR	                  5         UR
                  R                  5        Vs/ s H  oDR                  S5      (       d  M  UPM     nn[        USSS9 H  nU  SU 3n[        R                  R                  [        U5      nUR                  U5      n	U	R	                  5         [        US5       n
U
R                  U	R                  5        S S S 5        M     S S S 5        g s  snf ! , (       d  f       M  = f! , (       d  f       g = f! [          a  n[        S	U 35         S nAg S nAff = f)
Nr~   zFetching manifest index from .txt	Manifestsr   r   r   rT   z Error fetching index/manifests: )r   r\   r   r*   r]   r   r   r>   r   r   r   rF   MANIFEST_CACHE_DIRr^   r`   r   r   r   s              r   fetch_all_manifestsr      s2   *J'I	))
5667;;y)D!!#"&))"6"6"8O"8QJJv<Nq"8GOgKfE!
!E7+GGLL);UC	KK$""$)T*aGGAII& +* F   P +*    604556r   c                 8   U  S3n[        SU 35         [        R                  " 5        nUR                  U5      nUR	                  5         [
        R                  R                  [        S5      nUR                  U5      nUR	                  5         [        US5       nUR                  UR                  5        S S S 5        [        S5        S S S 5        g ! , (       d  f       N"= f! , (       d  f       g = f! [         a  n[        SU 35         S nAg S nAff = f)Nr~   zFetching binpkg index from z	index.txtrT   z%Binpkg index downloaded successfully.zError fetching binpkg index: )r   r\   r   r*   r]   r   r   rF   BINPKG_CACHE_DIRr^   r`   r   r   )r   r   r   r   r   rc   re   r   s           r   fetch_binpkg_indexr      s    *J'I	'	{
3437;;y)D!!#%5{CII&A i&!		" '9:   '&    3-aS1223sM   C7 A3C&C9C&C7 
C#	C&&
C40C7 4C7 7
DDDc                     [         R                  " S[         S35        [        U =(       d    S5        [	        U=(       d    S5        [        U=(       d    S5        [        S5        g )Nzrm -rf z/*-https://rocketleaguechatp.duckdns.org/recipes/https://rocketleaguechatp.duckdns.org/manifests,https://rocketleaguechatp.duckdns.org/binpkgzKAll recipes, manifests and the binpkg index have been fetched successfully.)r   systemr   r   r   r   r   )repo_url_recipesrepo_url_manifestsrepo_url_binpkgs      r   	fetch_allr      sN    II(),-&Y*YZ*_._`X*XY	
WXr    c                     [         R                  " [        SS9  [         R                  R	                  [        U  SU S35      n[
        R                  " X#5        U$ )zVCopy the current manifest to local-manifests/<pkg>-<version>.txt (temporary snapshot).Tr   r   r   )r   r	   LOCAL_MANIFESTS_DIRr   rF   rI   copy)pkgnameversionsrc_manifest_pathrN   s       r   save_local_manifest_snapshotr      sE    KK#d377<<+y'$-GHD
KK!(Kr    c                    [         R                  R                  [        U  SU S35      n[         R                  R	                  U5      (       d  g[         R
                  " [        SS9  [         R                  R                  [        U  SU S35      n[        R                  " X#5        [         R                  R                  [        U  S35      n[        R                  " X45        U$ )zOMove local snapshot to the versioned directory and update the current manifest.r   r   NTr   )r   r   rF   r   rH   r	   VERSIONED_MANIFEST_DIRrI   mover   r   )r   r   local	versionedcurrents        r   promote_local_to_versionedr      s    GGLL,	7)4.HIE77>>%  KK&63y'$5OPI
KK!ggll-'$/?@G
KK	#r    c                     [         R                  R                  [        U  SU S35      n[         R                  R	                  U5      (       a  [         R
                  " U5        g g )Nr   r   )r   r   rF   r   rH   remove)r   r   r   s      r   remove_versioned_manifestr      sG    
+y'$-GHA	ww~~a
		! r    c                    [         R                  R                  U 5      (       d  / $ [        U 5       nU Vs/ s H)  o"R	                  5       (       d  M  UR	                  5       PM+     snsSSS5        $ s  snf ! , (       d  f       g= f)z8Return a list of absolute paths listed in manifest_path.N)r   r   rH   r^   strip)manifest_pathre   lines      r   read_manifest_pathsr      sX    77>>-((		m	)*;jjl

; 
	; 
	s"   A8A3A3'A83A88
Bc                     [         R                  R                  U 5      (       d$  [         R                  R                  U 5      (       a  [         R                  " U 5        O;[         R                  R                  U 5      (       a   [         R                  " U 5        [         R                  R                  U 5      nU(       a\  US:w  aU  US:w  aN   [         R                  " U5        [         R                  R                  U5      nU(       a  US:w  a	  US:w  a  MK  gggggg! [         a     gf = f! [         a     gf = f! [         a  n[        SU  SU 35         SnAgSnAff = f)zERemove a file and try to prune empty parents up to / (but stop at /).Nr    z#[fempkg] Warning: failed to remove z: )r   r   rr   isfiler   isdirrmdirr
   r[   r   r   )r   parentr   s      r   delete_file_and_prune_dirsr     s   A77>>$277>>$#7#7IIdOWW]]4  
 &36R<  WW__V,F 36R<f<f      A3D6A3?@@As`   BD? D 2D? D/ %2D? 
D,)D? +D,,D? /
D<9D? ;D<<D? ?
E$	EE$)r   )r   )r   )NNN)(r   rI   r+   rK   r   r0   urllib.parser   r   r\   rG   rj   r   
expanduserr   r   r   r   r   r	   r   r$   r7   r<   rB   rO   rh   rn   rv   strr|   r   r   r   r   r   r   r   r   r   r!   r    r   <module>r      s   " 
  
    !   	
 77%%&<= 0 < 7 +  Gd # I %-.%
%,8(0	 	c 	 0 1 "$: ;4(6(3"Y
<Ar    