\eo< ddlZddlZddlZddlZddlZddlmZddlmZm Z ddl m Z ddl Z ddl m Zdededeefd ZGd d ZGd d ZGddZGddZdedeefdZGddZedk(rqeddZej4ej6ej8D];Zej4dej<zej4dej>zej4dej@zej4dejBzejDik7r3ej4deejDjGzejHD];Z%ej4de%j<de%j>de%jL=ejND]!Z(ej4d e(j>z#>yy)!N)Iterator)PIPEPopen)cast)gettexttemplatecsv_pathreturnc # Kt}tj|5}|D]k}d|vr#|j|dj dd|vrd|dvrnA|j |dt |jEd{m dddy|D]}d|vs|j |d dddt|5}tttj|}dddD]}|d|vr d|djd d|d<tj|5}|D]}d|vsd|dvrd |vr,|d t fd |d j dDr?t |jd i|jD]}|j!d r| dddtj|5}|D]}d|vsd|dvsn|D]/}d|vrd|dvrt |jEd{1 dddy7#1swYxYw#1swYTxYw#1swY_xYw7:#1swYyxYww) a~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. zX-Exclude-Suitesz, Suite{Nseriesversionz LTSz X-Versionc3K|]d}|jdxrtj|dddkxs/|jdxrtj|dddkDfyw)leNrge) startswithapt_pkgversion_compare).0fieldvers 5/usr/lib/python3/dist-packages/aptsources/distinfo.py z#_expand_template..Ys "",,T2L ' 7 7ab 3 G! K ",,T2L ' 7 7ab 3 G! K  sA*A-)setrTagFileupdatesplitaddstr splitlinesopenreversedlistcsv DictReaderreplaceanyformatr) rr known_suitestmplsection csv_objectreleasesrelliners @r_expand_templater4%s5L  "3d G!W,##G,>$?$E$Ed$KL'!''**  !127|..0 0 0  33 3G'!  !12 33& h>:D !;<=> x=L ( Y//;I __X & $ ')S8H-H')i.C &-[%9%?%?%E  !/CL//6#6AACD{3 J)    @  " 1d G'!cWW-=&=  1G'!cWW-=&=7|..0 0 0  1 1 1[ 133&>>  N 1 1 1s I4A*H? H<H? I4 H?(H??I4(I :AI4BI I4( I(3I(;0I(+I&,I(3 I4<H??I I4 II4I# I4&I((I1-I4c4eZdZddZdedefdZdedefdZy) Templater Ncd|_d|_g|_d|_d|_d|_d|_g|_g|_d|_ i|_ d|_ d|_ d|_ yNFT)namechildparents match_name descriptionbase_uritype componentschildren match_uri mirror_set distribution availableofficialselfs r__init__zTemplate.__init__|sf $  ') &*'+$( $ +-(* %)-/(, compc,|d|jDvS)z6Check if the distribution provides the given componentc34K|]}|jywN)r9)rcs rrz)Template.has_component..s818s)r@)rHrKs r has_componentzTemplate.has_components8888rJurlc|t|\}}}||jvr|j|j||Sy)z6Check if a given url of a repository is a valid mirrorF) split_urlrChas_repository)rHrQprotohostnamedirs r is_mirrorzTemplate.is_mirrors=(~x t &??8,;;E3G GrJ)r N)__name__ __module__ __qualname__rIr#boolrPrXrrJrr6r6{s- 9#9$9STrJr6c eZdZ ddededzdedzdedzfdZdedzfdZd eddfd Zdedzfd Zdeddfd Zdeddfd Z dedzfdZ y) ComponentNr9desc long_descparent_componentc<||_||_||_||_yrN)r9r=description_longra)rHr9r_r`ras rrIzComponent.__init__s#  ) 0rJr c|jSrNrarGs rget_parent_componentzComponent.get_parent_component$$$rJparentc||_yrNre)rHrhs rset_parent_componentzComponent.set_parent_components &rJcd|j |jS|j |jSyrN)rcr=rGs rget_descriptionzComponent.get_descriptions5  ,(( (    )## #rJc||_yrN)r=rHr_s rset_descriptionzComponent.set_descriptions rJc||_yrNrcrns rset_description_longzComponent.set_description_longs $rJc|jSrNrqrGs rget_description_longzComponent.get_description_longrgrJ)NNN) rYrZr[r#rIrfrjrlrorrrtrrJrr^r^s $'+ 1 1Dj 1: 1 * 1%cDj%'3'4't C D %%%%cDj%rJr^c eZdZdZ ddededededzfdZdededdfd Zdeded fd Zdedede fd Z deefd Z dedzfdZ deddfdZ y)Mirrorz&Storage for mirror related informationNrUrVrWlocationcR||_g|_|j||||_yrN)rV repositoriesadd_repositoryrw)rHrUrVrWrws rrIzMirror.__init__s*! .0 E3'  rJr cN|jjt||yrN)ryappend RepositoryrHrUrWs rrzzMirror.add_repositorys   E3!78rJr}c`|jDcgc]}|j|k(s|c}Scc}wrN)ryrU)rHrUrs rget_repositories_for_protoz!Mirror.get_repositories_for_protos',,Aa50@AAAs++cl|y|jD]"}|j|k(s||jvs"yyr8)ryrUrW)rHrUrWrs rrTzMirror.has_repositorys= ;"" Aww%C155L rJcr|jDcgc]}|j|jc}Scc}wrN)ryget_urlrV)rHrs r get_repo_urlszMirror.get_repo_urlss)262C2CDQ $--(DDDs"4c|jSrNrwrGs r get_locationzMirror.get_locations }}rJc||_yrNr)rHrws r set_locationzMirror.set_locations   rJrN)rYrZr[__doc__r#rIrzr'rr\rTrrrrrJrrvrvs0KO!!$'!.1!=@4Z!9C9c9d9BB\8JBCcdEtCyEcDj!S!T!rJrvcFeZdZdededdfdZdeeeffdZdedefdZy) r}rUrWr Nc ||_||_yrNrUrWr~s rrIzRepository.__init__s rJc2|j|jfSrNrrGs rget_infozRepository.get_infoszz488##rJrVc>|jd|d|jS)Nz:///r)rHrVs rrzRepository.get_urls!**S !DHH:66rJ)rYrZr[r#rItuplerrrrJrr}r}sCc$%S/$777rJr}rQctjd|d}t|dkr |jdt|dkr |S)zCsplit a given URL into the protocoll, the hostname and the dir partz:*\/+)maxsplitrN)rer!lenr|)rQr!s rrSrSs= HHXsQ /E e*q. T e*q. LrJcBeZdZ d dedzdefdZdededzddfdZy) DistInfoNdistbase_dirc  d|_g|_tjj d|_d}t jd}t jd}|s4 tgddtjdj}||_i}|d |d }d |j%d} t't(d} t't*d} t-|| D]} | j/dd} t1| dkr%| dj}| dj}|dk(rt3||_a|dk(r||_n|dk(rE|j7| | t't*d} t)} || _|| _d|z| _|dk(r|| _|dk(r`d| _|jD]H}|j8|k(s| j@jC||jDjC| J*|dk(rtjF|| _$K|dk(rtjF|| _%l|dk(r || _&z|dk(r| jNs || _'|d|j zk(r || _'|dk(r| jPs || _(|d|j zk(r || _(|dk(s|d |j zk(r.tRjTjW|xr|xs=tRjTjYtRjTj[||}||vri} t]|5}t_ta|jb|Dcgc]}|jc}}dddD]`} | jid"r|jkd#| }'tm| \}}}||vr||jo||Ptq||||||<b|||<||| _9*|d$k(rt3|| _:A|d%k(rE| r6| jw| j8s| jxjC| t+|} |d&k(r| j{t3||d'k(r| j}t3||d(k(s| j||j7| | t't(d} t't*d} y#t$rB}|jtjk7rtj d |zd }Yd}~d}~wwxYwcc}w#1swYxYw#td$rtgd!|g}YwxYw))NrzAPT::Architecturez ^#LOC:(.+)$zS^(#LOC:.+)|(((http)|(ftp)|(rsync)|(file)|(mirror)|(https))://[A-Za-z0-9/\.:\-_@]+)$) lsb_releasez-iz-sT)universal_newlinesstdoutrz&lsb_release failed, using defaults: %sDebianrz.infoz/usr/share/distro-info/z.csv:r ChangelogURIMetaReleaseURIr z^%s$ MatchName ParentSuite AvailableOfficialRepositoryTypeBaseURIz BaseURI-%sMatchURIz MatchURI-%s MirrorsFilezMirrorsFile-%sz$WARNING: Failed to read mirror file z#LOC:z\1 Descriptionr^CompDescriptionCompDescriptionLongParentComponent)@metarelease_uri templatesrconfigfindarchrcompilerr communicatestripOSErrorerrnoENOENTloggingwarningrlowerrr6r^r4r!r_changelogs_urifinish_templater9rDr<r:r;r|rAstring_to_boolrErFr?r>rBospathisabsabspathjoinr%r'filtermatch ExceptionprintrsubrSrzrvrCr=rPr@rorrrj)rHrrrw match_locmatch_mirror_lineexcmap_mirror_sets dist_fname csv_fnamer componentr3tokensrvaluenannyrCvalue_fx mirror_datarUrVrWs rrIzDistInfo.__init__s ")+NN''(;< JJ~. JJ &   3+/# ![]1 & UW  z4&. -djjl^4@ $'D) $Z;T 6DZZQ'F6{Q1IOO%E1IOO%E&&'h#**',$'!$$Xy9 D1 #: % (,%&,un#+%&+#-'!%!^^8EzzU* ((//6--h7 8 +%%,%;%;E%B"*$$+$:$:5$A!** % )#H,=,=$)!,22$)!*$X-?-?%*"-$))33%*"-'54Dtyy4P+PGGMM%(Fwwrww||He'DE /46J )!%[G*. &$5$;$;8?$@1QWWY$@!"+K!, ??73'0}}UD'AH$1:4.##z1&x0??sK39 %xh4Jx0 .8OE*&5e&<#-''(x$+%X%;%;INN%K''..y9%e, ++))!E(3//..qx8++..u5iT 6j Xy1$'D) M 99 ,OO$Ls$RS J%A %) DUGLM&( )sT"3T U!U0U UU! U  7UU UU U!!U>=U>rrr c|sy|j<|jr0|jD]!}|js|j|_n|jik(r<|jr0|jD]!}|js|j|_n|r8|j |j s|j j|d}|jD]}|j|_|jj|y)zfinish the current tempalteN) rBr:r;rCrPr9r@r|rFr)rHrrts rrzDistInfo.finish_templatezs     %(..%% ;;)*H&    " $%% ;;*+,,H'  X33INNC    & &y 1I!! +A ! H  + h'rJ)N/usr/share/python-apt/templates)rYrZr[r#rIr6r^rrrJrrrsI 9B*DjB*B*H((Y=M(RV(rJr__main__Ubunturz Suite: %szDesc: %sz BaseURI: %sz MatchURI: %sz Mirrors: %s z -z %s))r(rrrrcollections.abcr subprocessrrtypingrrrrr#r4r6r^rvr}r'rSrrYdinforrrr9r=r>rBrCkeysr@rKrcrAr:rrJrrs0  $" S1sS1cS1hsmS1l<"%"%J ! !F 7 7349Z(Z(z z<=AGLL!!"KK 5 ]X]]23 Z("6"667 ]X%6%667 ^h&8&889   " $ GLLh.A.A.F.F.H)II J'' WD GLL1TYYKr$*:*:);2d>S>S=TU V W&& 5E GLL%"3"33 4 5 5rJ