xkd]= ddlmZddlZddlZddlZddlZddlmZmZddl Z ddl m Z m Z m Z mZmZmZddlZddlmZdedede efd ZGd d eZGd d eZGddeZGddeZdedeefdZGddeZedkreddZejej ej!D]Z"ejde"j#zejde"j$zejde"j%zejde"j&ze"j'ikr3ejde(e"j')ze"j*D]*Z+ejde+j#de+j$de+j,+e"j-D]Z.ejd e.j$zdSdS)!)print_functionN)PopenPIPE)castDictIteratorListOptionalTuple)gettexttemplatecsv_pathreturnc # Kt}tj|5}|D]}d|vr.||ddd|vr'd|dvrnQ||dt |Ed{V ddddS|D]!}d|vr||d" dddn #1swxYwYt|5}tttj |}dddn #1swxYwY|D]}|d|vr dV|d d d|d<tj|5}|D]}d|vs d|dvrd |vr=|d t fd |d dDrRt |jd i|D]}|d r|V dddn #1swxYwYtj|5}|D]}d|vr d|dvrn|D]8}d|vr d|dvrt |Ed{V9 ddddS#1swxYwYdS) 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|]p}|do tj|dddkp5|do tj|dddkVqdS)leNrge) startswithapt_pkgversion_compare).0fieldvers 5/usr/lib/python3/dist-packages/aptsources/distinfo.py z#_expand_template..bs  "",,T22L ' 7abb 3 G G! K ",,T22L ' 7abb 3 G G! K      )setrTagFileupdatesplitaddstr splitlinesopenreversedlistcsv DictReaderreplaceanyformatr) r r known_suitestmplsection csv_objectreleasesrelliners @r _expand_templater:.s55L  " "3d  G!W,,##G,>$?$E$Ed$K$KLLL'!!''***E  !12227||..00 0 0 0 0 0 0 0 0 33333333 3 3G'!!  !1222 3333333333333333& h>:D !;!;<<==>>>>>>>>>>>>>>> x=L ( ( Y//;;I _X & & $  '))S8H-H-H'))i.C    &-[%9%?%?%E%E      !!/CLL/66#66AACCD{33! JJJJ)                6  " " 1d  G'!!cWW-=&=&= 1 1G'!!cWW-=&=&=7||..00 0 0 0 0 0 0 0 0  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1sPB C/>$C//C36C3 /EE EBII I !AKKKc6eZdZddZdedefdZdedefdZdS) TemplaterNcd|_d|_g|_d|_d|_d|_d|_g|_g|_d|_ i|_ d|_ d|_ d|_ dSNFT)namechildparents match_name descriptionbase_uritype componentschildren match_uri mirror_set distribution availableofficialselfs r __init__zTemplate.__init__sj#'  ') )-*.'+ #' +-(* (,-/+/ r"compc(|d|jDvS)z6Check if the distribution provides the given componentc3$K|] }|jV dSN)r?)rcs r r!z)Template.has_component..s$881888888r")rF)rNrPs r has_componentzTemplate.has_components8888888r"urlct|\}}}||jvr!|j|||SdS)z6Check if a given url of a repository is a valid mirrorF) split_urlrIhas_repository)rNrVprotohostnamedirs r is_mirrorzTemplate.is_mirrorsC(~~x t & &?8,;;E3GG G5r")rN)__name__ __module__ __qualname__rOr)boolrUr]r#r"r r<r<sl 9#9$9999STr"r<c eZdZ ddedeedeedeefdZdeefdZd eddfd Zdeefd Zdeddfd Z deddfd Z deefdZ dS) ComponentNr?desc long_descparent_componentc>||_||_||_||_dSrS)r?rCdescription_longrf)rNr?rdrerfs r rOzComponent.__init__s)  ) 0r"rc|jSrSrfrMs r get_parent_componentzComponent.get_parent_component $$r"parentc||_dSrSrj)rNrms r set_parent_componentzComponent.set_parent_components &r"c>|j|jS|j|jSdSrS)rhrCrMs r get_descriptionzComponent.get_descriptions+  ,( (   )# #4r"c||_dSrS)rCrNrds r set_descriptionzComponent.set_descriptionsr"c||_dSrSrhrss r set_description_longzComponent.set_description_longs $r"c|jSrSrvrMs r get_description_longzComponent.get_description_longrlr")NNN) r^r_r`r)r rOrkrorqrtrwryr#r"r rcrcs-##'*. 1 1 1sm 1C= 1 #3- 1 1 1 1%hsm%%%%'3'4''''# C D    %%%%%%%hsm%%%%%%r"rcc eZdZdZ ddedededeefdZdededdfd Zdeded fd Z dedede fd Z deefd Z deefdZ deddfdZdS)Mirrorz&Storage for mirror related informationNrZr[r\locationc\||_g|_|||||_dSrS)r[ repositoriesadd_repositoryr|)rNrZr[r\r|s r rOzMirror.__init__s4! .0 E3'''  r"rcV|jt||dSrS)r~append RepositoryrNrZr\s r rzMirror.add_repositorys)   E3!7!788888r"rc*fd|jDS)Nc*g|]}|jk |Sr#)rZ)rrrZs r z5Mirror.get_repositories_for_proto..s%AAAa50@0@0@0@0@r"r~)rNrZs `r get_repositories_for_protoz!Mirror.get_repositories_for_protos AAAA4,AAAAr"cP|dS|jD]}|j|kr ||jvrdSdSr>)r~rZr\)rNrZr\rs r rYzMirror.has_repositorysB ;5"  Aw%C15LLttur"c*fdjDS)NcDg|]}|jSr#)get_urlr[)rrrNs r rz(Mirror.get_repo_urls..s'DDDQ $-((DDDr"rrMs`r get_repo_urlszMirror.get_repo_urlss DDDD$2CDDDDr"c|jSrSr|rMs r get_locationzMirror.get_locations }r"c||_dSrSr)rNr|s r set_locationzMirror.set_locations   r"rS)r^r_r`__doc__r)r rOrr rrarYrrrr#r"r r{r{sB00NR!!!$'!.1!=Ec]!!!!9C9c9d9999BB\8JBBBBCcdEtCyEEEEhsm!S!T!!!!!!r"r{cNeZdZdededdfdZdeeeffdZdedefdZdS) rrZr\rNc"||_||_dSrSrZr\rs r rOzRepository.__init__s r"c|j|jfSrSrrMs r get_infozRepository.get_infosz48##r"r[c*|jd|d|jS)Nz:///r)rNr[s r rzRepository.get_urls#zzz888TXX>>r")r^r_r`r)rOr rrr#r"r rrsc$%S/$$$$????????r"rrVctjd|d}t|dkr(|dt|dk(|S)zCsplit a given URL into the protocoll, the hostname and the dir partz:*\/+)maxsplitrN)rer'lenr)rVr's r rXrXsO HXsQ / / /E e**q.. T e**q.. Lr"cPeZdZ d deedefdZdedeeddfd ZdS) DistInfoN/usr/share/python-apt/templatesdistbase_dirc  d|_g|_tjd|_d}t jd}t jd}|s tgddt d }nL#ttf$r8}|jtjkrt!jd |zd }Yd}~nd}~wwxYw||_i}|d |d }d |} t+t,d} t+t.d} t1|| D]H} | dd} t5| dkr-| d }| d }|dkrt7||_||dkr||_|dkrR|| | t+t.d} t-} || _|| _d|z| _ |dkr|| _ |dkrRd| _!|jD]A}|j|kr4| j"#||j$#| BH|dkrtj%|| _&i|dkrtj%|| _'|dkr || _(|dkr| j)s || _)|d|jzkr || _)|dkr| j*s || _*|d|jzkr || _*|dks|d|jzkrhtVj,-|r|p#| t/|} |d&kr$| ?t7||d'kr$| @t7|-|d(kr| A|J|| | t+t,d} t+t.d} dS))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/{}.csv:r ChangelogURIMetaReleaseURIrz^%s$ MatchName ParentSuite AvailableOfficialRepositoryTypeBaseURIz BaseURI-%sMatchURIz MatchURI-%s MirrorsFilezMirrorsFile-%sc6g|]}|Sr#)strip)rxs r rz%DistInfo.__init__..`s $@$@$@1QWWYY$@$@$@r"z#WARNING: Failed to read mirror filez#LOC:z\1 DescriptionrcCompDescriptionCompDescriptionLongParentComponent)Bmetarelease_uri templatesrconfigfindarchrcompilerr communicaterOSErrorIOErrorerrnoENOENTloggingwarningrr2lowerrr<rcr:r'r_changelogs_urifinish_templater?rJrBr@rArrGstring_to_boolrKrLrErDrHospathisabsabspathjoinr+r-filtermatch ExceptionprintrsubrXrr{rIrCrUrFrtrwro)rNrrr| match_locmatch_mirror_lineexcmap_mirror_sets dist_fname csv_fnamer componentr9tokensrvaluenannyrIvalue_f mirror_datarZr[r\s r rOzDistInfo.__init__s ")+N''(;<< J~.. J &     333+/# ![]]1 & UWWW%   9 ,,O$Ls$RSSS  %-XXttt4 3::4::<<HH $''D)) $Z;;T 6T 6DZZQ''F6{{Q1IOO%%E1IOO%%E&&&'hh##***',$$'!!$$Xy999 D11 #:: % (,%&,un##+%%&+##-''!%!^88EzU** (//666--h777 8 +%%%,%;E%B%B""*$$$+$:5$A$A!!*** % )##H,=#$)!!,222$)!!*$$X-?$%*""-$)333%*""-''54Dty4P+P+PGMM%((Fwrw||He'D'DEE //46J )!%[[G*. &$5$;$@$@$@$@$@!"!"++K%)))CDDD&( )!,  ??733%'0}}UD'A'AH$1:4.##z11&x0??sKKKK39 %xh44Jx00.8OE*&5e&<##-'''(xx$$+%%:X%;%;IN%K%K:'..y999%e,, +++))!E((3333///..qxx8888+++..u555 Xy111$''D)) sO AB$$C-5.C((C-P#-P P#P P#P P##QQr rrc|sdS|j&|jr|jD]}|jr|j|_n|jikr&|jr|jD]}|jr|j|_n|r6||js|j|d}|jD]}|j|_|j |dS)zfinish the current tempalteN) rHr@rArIrUr?rFrrLr)rNr rts r rzDistInfo.finish_templates  F   %(. %%  ;)*H&E  " $ $ $%  ;*+,H'E  X33INCC    & &y 1 1 1I! + +A ! H   h'''''r")Nr) r^r_r`r r)rOr<rcrr#r"r rrs#9B*B*smB*B*B*B*B*H( (-5i-@( ((((((r"r__main__Ubunturz Suite: %szDesc: %sz BaseURI: %sz MatchURI: %sz Mirrors: %s z -z %s)/ __future__rr.rrr subprocessrrrtypingrrrr r r rr rr)r:objectr<rcr{rrXrr^dinforrr r?rCrDrHrIr-keysrFrPrhrGr@r#r"r rs0&%%%%%  """"""""  S1sS1cS1hsmS1S1S1S1lv<"%"%"%"%"%"%"%"%J ! ! ! ! !V ! ! !F ? ? ? ? ? ? ? ?349\(\(\(\(\(v\(\(\(~ z<==AGL!"""K 5 5 ]X]2333 Z("66777 ]X%66777 ^h&88999  " $ $ GLh.A.F.F.H.H)I)II J J J'  D GLL!%D,<,<,S>ST    & 5 5E GL%"33 4 4 4 4 5 5 5r"