
    8.g:              
          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 SK	J
r  S\S\S\\   4S jr " S	 S
5      r " S S5      r " S S5      r " S S5      rS\S\\   4S jr " S S5      r\S:X  Gax  \" SS5      r\R.                  " \R0                  5        \R2                   GHA  r\R.                  " S\R6                  -  5        \R.                  " S\R8                  -  5        \R.                  " S\R:                  -  5        \R.                  " S\R<                  -  5        \R>                  0 :w  a3  \R.                  " S\" \R>                  RA                  5       5      -  5        \RB                   H<  r"\R.                  " S\"R6                   S\"R8                   S\"RF                   35        M>     \RH                   H"  r%\R.                  " S\%R8                  -  5        M$     GMD     gg)     N)Iterator)cast)gettexttemplatecsv_pathreturnc           	   #     ^	#    [        5       n[        R                  " U 5       nU Hr  nSU;   a#  UR                  US   R	                  S5      5        SU;   a  SUS   ;   a    OCUR                  US   5        [        U5      R                  5        Sh  vN   Mt      SSS5        gU H  nSU;   d  M  UR                  US   5        M!     SSS5        [        U5       n[        [        [        R                  " U5      5      5      nSSS5        W H  nUS   U;   a  M  Sv   US   R                  S	S5      US'   [        R                  " U 5       nU H  nSU;  d	  SUS   ;  a  M  S
U;   a3  US   m	[        U	4S jUS
   R	                  S5       5       5      (       a  MM  [        U5      R                  " S0 UD6R                  5        H  nUR!                  S
5      (       a  M  Uv   M!     M     SSS5        M     [        R                  " U 5       nU H  nSU;   d  M  SUS   ;   d  M    O   U H5  nSU;   a  SUS   ;   a  M  [        U5      R                  5        Sh  vN   M7     SSS5        g GN! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GM  = f NK! , (       d  f       g= f7f)ab  Expand the given template.

A template file consists of a header, followed by paragraphs
of templated suites, followed by a footer. A templated suite
is any paragraph where the Suite field contains {.

This function expands all templated suites using the information
found in the CSV file supplied by distro-info-data.

It yields lines of template info.
zX-Exclude-Suitesz, Suite{Nseries versionz LTSz	X-Versionc              3     >#    U  Hv  nUR                  S 5      =(       a    [        R                  " USS T5      S:  =(       d5    UR                  S5      =(       a    [        R                  " USS T5      S:  v   Mx     g7f)le   Nr   ge)
startswithapt_pkgversion_compare).0fieldvers     5/usr/lib/python3/dist-packages/aptsources/distinfo.py	<genexpr>#_expand_template.<locals>.<genexpr>X   s      
 &FE ",,T2 L ' 7 7ab	3 G! K
 ",,T2 L ' 7 7ab	3 G! K &Fs   A>B )setr   TagFileupdatesplitaddstr
splitlinesopenreversedlistcsv
DictReaderreplaceanyformatr   )
r   r   known_suitestmplsection
csv_objectreleasesrelliner   s
            @r   _expand_templater3   $   s     5L 
	"dG!W,##G,>$?$E$Ed$KL'!''**  !127|..000   
#	" G'!  !12  
#& 
h:D
!;<= 
 x=L(Y//;I__X&$')S8H-H')i.C 
 &-[%9%?%?%E
 
 
 !L//6#6AACD{33 J D)   '& @ 
	"dG'!cWW-=&=  G '!cWW-=&=7|..000  
#	"[ 1 
#	"& 
 '&N 1 
#	"s   !KA0I8I5	I8	K'	I84I8K)J
A
KB J2"K
J1"J1-6J1#J/$J1,	K5I88
JK

JK
J,	&	K/J11
J?;Kc                   B    \ rS rSrS
S jrS\S\4S jrS\S\4S jrS	r	g)Templatez   r   Nc                     S U l         SU l        / U l        S U l        S U l        S U l        S U l        / U l        / U l        S U l	        0 U l
        S U l        SU l        SU l        g NFT)namechildparents
match_namedescriptionbase_uritype
componentschildren	match_uri
mirror_setdistribution	availableofficialselfs    r   __init__Template.__init__{   sf     $	
')&*'+$( $	+-(*%)-/(,    compc                 .    US U R                    5       ;   $ )z6Check if the distribution provides the given componentc              3   8   #    U  H  oR                   v   M     g 7fN)r9   )r   cs     r   r   )Template.has_component.<locals>.<genexpr>   s     81s   )r@   )rH   rL   s     r   has_componentTemplate.has_component   s    8888rK   urlc                 z    [        U5      u  p#nX0R                  ;   a  U R                  U   R                  X$5      $ g)z6Check if a given url of a repository is a valid mirrorF)	split_urlrC   has_repository)rH   rT   protohostnamedirs        r   	is_mirrorTemplate.is_mirror   s7    (~&??8,;;EGGrK   )rE   r>   r:   rA   r@   r=   rD   r<   rB   rC   r9   rF   r;   r?   )r   N)
__name__
__module____qualname____firstlineno__rI   r"   boolrR   r[   __static_attributes__r   rK   r   r5   r5   z   s-     9# 9$ 9S T rK   r5   c            
           \ rS rSr   SS\S\S-  S\S-  S\S-  4S jjrS\S-  4S	 jrS
\SS4S jrS\S-  4S jrS\SS4S jr	S\SS4S jr
S\S-  4S jrSrg)	Component   Nr9   desc	long_descparent_componentc                 4    Xl         X l        X0l        X@l        g rO   )r9   r=   description_longrh   )rH   r9   rf   rg   rh   s        r   rI   Component.__init__   s     	 ) 0rK   r   c                     U R                   $ rO   rh   rG   s    r   get_parent_componentComponent.get_parent_component       $$$rK   parentc                     Xl         g rO   rm   )rH   rq   s     r   set_parent_componentComponent.set_parent_component   s     &rK   c                 h    U R                   b  U R                   $ U R                  b  U R                  $ g rO   )rj   r=   rG   s    r   get_descriptionComponent.get_description   s5      ,((()###rK   c                     Xl         g rO   )r=   rH   rf   s     r   set_descriptionComponent.set_description   s    rK   c                     Xl         g rO   rj   ry   s     r   set_description_longComponent.set_description_long   s     $rK   c                     U R                   $ rO   r}   rG   s    r   get_description_longComponent.get_description_long   rp   rK   )r=   rj   r9   rh   )NNN)r]   r^   r_   r`   r"   rI   rn   rs   rv   rz   r~   r   rb   r   rK   r   rd   rd      s       $'+
1
1 Dj
1 :	
1
 *
1%cDj %'3 '4 't  C  D  % % %%cDj %rK   rd   c            
           \ rS rSrSr SS\S\S\S\S-  4S jjrS\S\S	S4S
 jrS\S	\S   4S jr	S\S\S	\
4S jrS	\\   4S jrS	\S-  4S jrS\S	S4S jrSrg)Mirror   z&Storage for mirror related informationNrX   rY   rZ   locationc                 L    X l         / U l        U R                  X5        X@l        g rO   )rY   repositoriesadd_repositoryr   )rH   rX   rY   rZ   r   s        r   rI   Mirror.__init__   s$     !.0E' rK   r   c                 L    U R                   R                  [        X5      5        g rO   )r   append
RepositoryrH   rX   rZ   s      r   r   Mirror.add_repository   s      E!78rK   r   c                 h    U R                    Vs/ s H  o"R                  U:X  d  M  UPM     sn$ s  snf rO   )r   rX   )rH   rX   rs      r   get_repositories_for_proto!Mirror.get_repositories_for_proto   s+    ,,A,a50@,AAAs   //c                 x    Uc  gU R                    H&  nUR                  U:X  d  M  X#R                  ;   d  M&    g   gr8   )r   rX   rZ   )rH   rX   rZ   r   s       r   rW   Mirror.has_repository   s6    ;""Aww%C55L # rK   c                 v    U R                    Vs/ s H  oR                  U R                  5      PM     sn$ s  snf rO   )r   get_urlrY   )rH   r   s     r   get_repo_urlsMirror.get_repo_urls   s-    262C2CD2CQ		$--(2CDDDs   $6c                     U R                   $ rO   r   rG   s    r   get_locationMirror.get_location   s    }}rK   c                     Xl         g rO   r   )rH   r   s     r   set_locationMirror.set_location   s     rK   )rY   r   r   rO   )r]   r^   r_   r`   __doc__r"   rI   r   r&   r   ra   rW   r   r   r   rb   r   rK   r   r   r      s    0 KO!!$'!.1!=@4Z!9C 9c 9d 9B B\8J BC c d EtCy EcDj !S !T !rK   r   c                   T    \ rS rSrS\S\SS4S jrS\\\4   4S jrS\S\4S	 jrS
r	g)r      rX   rZ   r   Nc                     Xl         X l        g rO   rX   rZ   r   s      r   rI   Repository.__init__   s    
rK   c                 2    U R                   U R                  4$ rO   r   rG   s    r   get_infoRepository.get_info   s    zz488##rK   rY   c                 >    U R                    SU SU R                   3$ )Nz:///r   )rH   rY   s     r   r   Repository.get_url   s!    **S
!DHH:66rK   )rZ   rX   )
r]   r^   r_   r`   r"   rI   tupler   r   rb   r   rK   r   r   r      sC    c   $%S/ $7 7 7rK   r   rT   c                     [         R                  " SU SS9n[        U5      S:  a"  UR                  S5        [        U5      S:  a  M"  U$ )zCsplit a given URL into the protocoll, the hostname and the dir partz:*\/+   )maxsplitr   N)rer    lenr   )rT   r    s     r   rV   rV      s=    HHXsQ/E
e*q.T e*q.LrK   c                   P    \ rS rSr  SS\S-  S\4S jjrS\S\S-  SS4S	 jrS
r	g)DistInfo   Ndistbase_dirc                 
   SU l         / U l        [        R                  R	                  S5      U l        S n[        R                  " S5      n[        R                  " S5      nU(       d  [        R                  " 5       nUS   nXl
        0 nU SU S3nSUR                  5        S	3n	[        [        S 5      n
[        [        S 5      n[        X5       GH2  nUR!                  S
S5      n[#        U5      S:  a  M'  US   R%                  5       nUS   R%                  5       nUS:X  a  ['        U5      U l        Me  US:X  a  Xl         Ms  US:X  aC  U R+                  X5        [        [        S 5      n[        5       n
Xl        Xl        SU-  U
l        M  US:X  a  Xl        M  US:X  ae  SU
l        U R                   HK  nUR,                  U:X  d  M  U
R4                  R7                  U5        UR8                  R7                  U
5        MM     GM5  US:X  a  [        R:                  " U5      U
l        GMY  US:X  a  [        R:                  " U5      U
l        GM}  US:X  a	  Xl         GM  US:X  a  U
RB                  (       d	  Xl!        GM  USU R
                  -  :X  a	  Xl!        GM  US:X  a  U
RD                  (       d	  Xl"        GM  USU R
                  -  :X  a	  Xl"        GM  US:X  d  USU R
                  -  :X  GaE  [F        RH                  RK                  U5      =(       a    U=(       d<    [F        RH                  RM                  [F        RH                  RO                  X/5      5      nX;  a  0 n [Q        U5       n[S        [U        URV                  U Vs/ s H  nUR%                  5       PM     sn5      5      nS S S 5        W Hj  nUR]                  S5      (       a  UR_                  S U5      nM-  [a        U5      u  nnnUU;   a  UU   Rc                  UU5        MY  [e        UUUU5      UU'   Ml     UX'   X   U
l3        GMc  US!:X  a  ['        U5      U
l4        GM|  US":X  aP  U(       a;  U
Rk                  UR,                  5      (       d  U
Rl                  R7                  U5        [        U5      nGM  US#:X  a  URo                  ['        U5      5        GM  US$:X  a  URq                  ['        U5      5        GM  US%:X  d  GM!  URs                  U5        GM5     U R+                  X5        [        [        S 5      n
[        [        S 5      ng s  snf ! , (       d  f       GN= f! [X         a    [[        SU 35        / n GNf = f)&Nr   zAPT::Architecturez^#LOC:(.+)$zS^(#LOC:.+)|(((http)|(ftp)|(rsync)|(file)|(mirror)|(https))://[A-Za-z0-9/\.:\-_@]+)$IDr   z.infoz/usr/share/distro-info/z.csv:   r   r   ChangelogURIMetaReleaseURIr
   z^%s$	MatchNameParentSuiteT	AvailableOfficialRepositoryTypeBaseURIz
BaseURI-%sMatchURIzMatchURI-%sMirrorsFilezMirrorsFile-%sz$WARNING: Failed to read mirror file z#LOC:z\1Descriptionrd   CompDescriptionCompDescriptionLongParentComponent):metarelease_uri	templatesr   configfindarchr   compileplatformfreedesktop_os_releaser   lowerr   r5   rd   r3   r    r   strip_changelogs_urifinish_templater9   rD   r<   r:   r;   r   rA   string_to_boolrE   rF   r?   r>   rB   ospathisabsabspathjoinr$   r&   filtermatch	Exceptionprintr   subrV   r   r   rC   r=   rR   r@   rz   r~   rs   )rH   r   r   r   	match_locmatch_mirror_lineinfomap_mirror_sets
dist_fname	csv_fnamer   	componentr2   tokensr   valuenannyrC   value_fxmirror_datarX   rY   rZ   s                           r   rI   DistInfo.__init__   s   
  ")+NN''(;<	JJ~.	JJ&
 224D:D	 z4&.
-djjl^4@	 $'D)	$Z;DZZQ'F6{Q1IOO%E1IOO%E&&'h#**',$'!$$X9 D1	#: %(,%&,un#+%&+#-'!%!^^EzzU* ((//6--h7	 ,
 +%%,%;%;E%B"*$$+$:$:5$A!** %)#H,=,=$)!,22$)!*$X-?-?%*"-$))33%*"-'54Dtyy4P+P GGMM%( Fwwrww||H'DE 
 /46J
)!%[G*. &$5$;$;8?$@1QWWY$@!"+K ) !,??733'0}}UD'AH$1:4.##z1&x0??sK39 %xh4Jx0 !, .8O*&5&<#-''(x$+%X%;%;INN%K%K''..y9%e,	++))!E(3//..qx8++..u5i <j 	X1$'D)	C %A	 )[ % ) DUGLM&()sB   "U-T?T:!T?,U:T??
U		UUU/.U/r   r   r   c                 t   U(       d  gUR                   cH  UR                  (       a7  UR                   H'  nUR                   (       d  M  UR                   Ul           O   UR                  0 :X  aH  UR                  (       a7  UR                   H'  nUR                   (       d  M  UR                  Ul          O   U(       a=  UR	                  UR
                  5      (       d  UR                  R                  U5        SnUR                   H  nUR                  Ul        M     U R                  R                  U5        g)zfinish the current tempalteN)
rB   r:   r;   rC   rR   r9   r@   r   rF   r   )rH   r   r   ts       r   r   DistInfo.finish_templatem  s    %(..%%;;;)*H& & "$%%;;;*+,,H' & X33INNCC&&y1I!!A !

H "h'rK   )r   r   r   r   r   )N/usr/share/python-apt/templates)
r]   r^   r_   r`   r"   rI   r5   rd   r   rb   r   rK   r   r   r      sI      9v*Djv* v*p( (Y=M (RV (rK   r   __main__Ubuntur   z

Suite: %szDesc: %szBaseURI: %szMatchURI: %szMirrors: %s z -z  %s)&r'   loggingr   r   r   collections.abcr   typingr   r   r   r   r"   r3   r5   rd   r   r   r&   rV   r   r]   dr   r   r   r   r9   r=   r>   rB   rC   keysr@   rL   rj   rA   r:   r   rK   r   <module>r      s  0   	  	 $    S1s S1c S1hsm S1l <"% "%J !  !F	7 	73 49 N( N(b z<=ALL!!"KK]X]]23Z("6"667]X%6%667^h&8&889"$LLh.A.A.F.F.H)IIJ''DLL1TYYKr$*:*:);2d>S>S=TUV (&&ELL%"3"334 '   rK   