
    dg/d                     Z   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r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 r " S S5      r " S S5      r " S	 S
5      r " S S5      r " S S5      r " S S5      r " S S5      r " S S5      rS r " S S5      r " S S\5      rg)    N)ALCLog)_c                 R    SSSSSS.nUR                  U R                  5       S5      $ )N            )critical	emergencyhighmediumlowc   )getlower)uurgency_maps     =/usr/lib/python3/dist-packages/apt_listchanges/DebianFiles.py_numeric_urgencyr   -   s1    !"!"!"!"!"	$K ??1779b))    c                   b    \ rS rSr/ SQrS r\S 5       r\S 5       r\S 5       r	\S 5       r
Srg	)
ControlStanza8   )PackageSourceVersionArchitectureStatusc           	      N   S nUR                  S5       H|  nU(       d    OtUS   S;   a&  U(       a  [        X[        X5      S-   U-   5        M9  M;  UR                  SS5      u  p$X R                  ;   a  [        XUR	                  5       5        Mz  S nM~     [        U SS 5      U l        g )N
r   ) 	:r   r   )splitsetattrgetattrfields_to_readlstriparch)selfsfieldlinevalues        r   __init__ControlStanza.__init__;   s    GGDMDAw+%D)=)Dt)KL   $zz#q1///D8 E " D.$7	r   c                 T    [        U SU R                  5      R                  S5      S   $ )Nr   r!   r   )r&   r   r$   r*   s    r   sourceControlStanza.sourceM   s%    tXt||4::3?BBr   c                    [        U SS5      nU(       d  U R                  $ UR                  S5      n[        U5      S:  a  U R                  $ US   nUR	                  S5      (       a  UR                  S5      (       d  g USS $ )	Nr    r!   r   r   ())r&   versionr$   len
startswithendswith)r*   r3   fieldsversion_exprs       r   source_versionControlStanza.source_versionQ   sz    x,<<c"v;?<<ay'',,1F1Fs1K1KAb!!r   c                 j    [        U S5      =(       a!    U R                  R                  S5      S   S:H  $ )Nr   r!   r   	installed)hasattrr   r$   r2   s    r   rC   ControlStanza.installed^   s2    tX& 5KKc"1%4	5r   c                     U R                   $ N)r   r2   s    r   r:   ControlStanza.versionc       ||r   )r)   N)__name__
__module____qualname____firstlineno__r'   r/   propertyr3   r@   rC   r:   __static_attributes__ r   r   r   r   8   s^    ON8$ C C 
" 
" 5 5  r   r   c                   2    \ rS rSrS rS rS rS rS rSr	g)	ControlParserh   c                      / U l         0 U l        g rG   )stanzasindexr2   s    r   r/   ControlParser.__init__i   s    
r   c                     0 U R                   U'   U R                   H<  n[        X!5      nU R                   U   R                  U/ 5      R	                  U5        M>     g rG   )rV   rU   r&   
setdefaultappend)r*   r,   stanzakeys       r   	makeindexControlParser.makeindexm   sL    

5llF&(CJJu((b188@ #r   c           	      n    [        USSS9 nU =R                  UR                  5       R                  S5       Vs/ s H  o3(       d  M  [	        U5      PM     sn-  sl        S S S 5        g s  snf ! , (       d  f       g = f! [
         a)  n[        [        S5      U[        U5      S.-  5      UeS nAff = f)Nutf-8replace)encodingerrors

'Error processing '%(what)s': %(errmsg)swhaterrmsg)	openrU   readr$   r   	ExceptionRuntimeErrorr   str)r*   filefxexs        r   readfileControlParser.readfiles   s    	JdWY?1./ffhnnV.D!K.D$M!$.D!K K @?!K @?  	Jq!JK(,B@ A BGIJ	JsK   B .A0
A+
	A+

A0"B +A00
A>:B >B 
B4$B//B4c                 2    SSU/[         R                  -   n[        R                  " U5      nU R                  R                  [        UR                  SS5      5      5        g ! [         a)  n[        [        S5      U[        U5      S.-  5      UeS nAff = f)Nzdpkg-debz-fr`   ra   re   rf   )r   r'   
subprocesscheck_outputrU   rZ   decoderk   rl   r   rm   )r*   debcommandoutputrq   s        r   readdebControlParser.readdeb|   s    	I!4-0L0LLG,,W5FLLfmmGY?@B 	Iq!JK(+s2w? @ AFHI	Is   A A# #
B-$BBc                    XR                   ;   a%  X R                   U   ;   a  U R                   U   U   $ g U R                   Vs/ s H(  n[        X15      (       d  M  [        X15      U:X  d  M&  UPM*     nnU(       a  U$ S $ s  snf rG   )rV   rU   rD   r&   )r*   r,   r.   r[   founds        r   findControlParser.find   s    JJ

5))zz%(//&*ll PlFF* /6v/E/N l Pu'4'Ps   A?A?,A?)rV   rU   N)
rJ   rK   rL   rM   r/   r]   rr   r{   r   rO   rP   r   r   rR   rR   h   s    AJI(r   rR   c                       \ rS rSr SS jrS rS r\S 5       r\S 5       r	\S 5       r
\S 5       r\S	 5       r\S
 5       r\S 5       r\S 5       r\S 5       rS r\rS rS rSrg)ChangelogEntry   c                     UR                  5       U l        X l        X0l        X@l        XPl        [        U5      U l        SU l        SU l        Xpl	        g )Nr6   )
strip_header_path_package_source_versionr   _trailer_content_binnmu)r*   headerpathpackager3   r:   urgencybinnmus           r   r/   ChangelogEntry.__init__   sC    ||~
 0 9r   c                 .    UR                  5       U l        g rG   )rstripr   )r*   trailers     r   set_trailerChangelogEntry.set_trailer   s    (r   c                     U R                   (       a  U =R                   U-  sl         g UR                  5       (       d  Xl         g g rG   )r   isspace)r*   contents     r   add_contentChangelogEntry.add_content   s.    ==MMW$M""#M #r   c                     U R                   $ rG   )r   r2   s    r   r   ChangelogEntry.path   s    zzr   c                     U R                   $ rG   )r   r2   s    r   r   ChangelogEntry.package       }}r   c                     U R                   $ rG   )r   r2   s    r   r3   ChangelogEntry.source   rI   r   c                     U R                   $ rG   )r   r2   s    r   r:   ChangelogEntry.version   r   r   c                     U R                   $ rG   )r   r2   s    r   numeric_urgencyChangelogEntry.numeric_urgency   s    $$$r   c                     U R                   $ rG   )r   r2   s    r   r   ChangelogEntry.binnmu   rI   r   c                     U R                   $ rG   )r   r2   s    r   r   ChangelogEntry.header   rI   r   c                     U R                   $ rG   )r   r2   s    r   r   ChangelogEntry.trailer   r   r   c                 6    U R                   R                  5       $ rG   )r   r   r2   s    r   r   ChangelogEntry.content   s    }}##%%r   c                     U R                   S-   U R                  -   S-   U R                  -   nU R                   (       a  U R                  (       a  U$ UR                  5       $ )Nrd   )r   r   r   r   )r*   results     r   __str__ChangelogEntry.__str__   sE    v%4v=L;;4<<M||~r   c                 p    [        U R                  U R                  U R                  U R                  45      $ rG   )hashr   r   r   r   r2   s    r   __hash__ChangelogEntry.__hash__   s&    T\\4<<MNNr   c                 f    U R                   UR                   :w  a  g[        U 5      [        U5      :H  $ NF)	__class__r   r*   others     r   __eq__ChangelogEntry.__eq__   s(    >>U__,DzT%[((r   )	r   r   r   r   r   r   r   r   r   NF)rJ   rK   rL   rM   r/   r   r   rN   r   r   r3   r:   r   r   r   r   r   r   __repr__r   r   rO   rP   r   r   r   r      s    
)$         % %       & &
 HO)r   r   c                        \ rS rSrS rS rSrg)EntrySorter   c                 l  ^ [        S U 5       5      nU V^s0 s H  mT[        U4S jU 5       5      _M     snU l        [        [        S U 5       5      [        R
                  " [        R                  5      SS9n[        [        U5      5       Vs0 s H  oTU   U_M
     snU l
        g s  snf s  snf )Nc              3   8   #    U  H  oR                   v   M     g 7frG   )r   .0entrys     r   	<genexpr>'EntrySorter.__init__.<locals>.<genexpr>   s     ;7%7   c              3   `   >#    U  H#  nUR                   T:X  d  M  UR                  v   M%     g 7frG   )r   r   )r   r   r   s     r   r   r      s*      7WE"]]g5 0%//Ws   ..c              3   8   #    U  H  oR                   v   M     g 7frG   )r:   r   s     r   r   r      s     B'}}'r   Tr\   reverse)setminpackage_urgenciessorted	functools
cmp_to_keyapt_pkgversion_compareranger;   version_keys)r*   entriespackagesr   versionsis      `  r   r/   EntrySorter.__init__   s    ;7;< $"
 $ S 7W 7 8 8#"
 #B'BC'2273J3JK"&( 6;3x=5IJ5Ia[!^5IJ"
 Ks    B,B1c                 |    U R                   UR                     UR                  U R                  UR                     4$ rG   )r   r   r   r:   r*   r   s     r   key_funcEntrySorter.key_func   s6    &&u}}5u}}!!%--02 	2r   )r   r   N)rJ   rK   rL   rM   r/   r   rO   rP   r   r   r   r      s    K2r   r   c                   h    \ rS rSrS rS rS rS r\S 5       r	\S 5       r
\S 5       rS	 rS
 rSrg)Changes   c                 <    / U l         / U l        SU l        SU l        g NTF)_entries_binnmusr   reversedr2   s    r   r/   Changes.__init__   s    r   c                   ^ Ub%  U R                   UR                   :w  a  [        S5      e[        5       mTR                  R	                  U R                  5        TR
                  R	                  U R
                  5        Ub^  TR                  R	                  U4S jUR                   5       5        TR
                  R	                  U4S jUR
                   5       5        STl        T$ )N'Can only add Changes to another Changesc              3   L   >#    U  H  nUTR                   ;  d  M  Uv   M     g 7frG   r   )r   eaddeds     r   r   "Changes.__add__.<locals>.<genexpr>   $      ">^%&enn%< #$!^   $	$c              3   L   >#    U  H  nUTR                   ;  d  M  Uv   M     g 7frG   r   )r   br   s     r   r   r     r   r   F)r   
ValueErrorr   r   extendr   r   )r*   r   r   s     @r   __add__Changes.__add__   s    5??!BFGG	dmm,dmm,NN!! ">U^^ "> >NN!! ">U^^ "> >r   c                 &  ^  Uc  T $ T R                   UR                   :w  a  [        S5      eT R                  R                  U 4S jUR                   5       5        T R                  R                  U 4S jUR                   5       5        ST l        T $ )Nr   c              3   L   >#    U  H  nUTR                   ;  d  M  Uv   M     g 7frG   r   )r   r   r*   s     r   r   #Changes.__iadd__.<locals>.<genexpr>  $      81 ! 6 Qr   c              3   L   >#    U  H  nUTR                   ;  d  M  Uv   M     g 7frG   r   )r   r   r*   s     r   r   r     r  r   F)r   r   r   r   r   r   r   s   ` r   __iadd__Changes.__iadd__  sy    =K>>U__,FGG 8 8 	8 8 8 	8r   c                 :   U R                   (       a  g U R                  R                  [        U R                  5      R                  U R
                  S9  U R                  R                  [        U R                  5      R                  U R
                  S9  SU l         g )Nr   T)r   r   sortr   r   r   r   r2   s    r   r  Changes.sort  sq    ;;{4==9BB#'== 	 	2{4==9BB#'== 	 	2r   c                 :    U R                  5         U R                  $ rG   )r  r   r2   s    r   r   Changes.entries      		}}r   c                 :    U R                  5         U R                  $ rG   )r  r   r2   s    r   binnmusChanges.binnmus   r
  r   c                 ~    U R                   (       a,  SR                  [        [        U R                   5      5      S-   $ g)Nrd   r    r6   )r   joinmaprm   r2   s    r   changesChanges.changes%  s+    <<;;s356==r   c                     SU l         UR                  (       a  U R                  R                  U5        g U R                  R                  U5        g r   )r   r   r   rZ   r   r   s     r   
save_entryChanges.save_entry+  s4    <<MM  'MM  'r   c                      SU l         SU l        g r   )r   r   r2   s    r   r   Changes.reverse2  s    r   )r   r   r   r   N)rJ   rK   rL   rM   r/   r   r  r  rN   r   r  r  r  r   rO   rP   r   r   r   r      s\    
      
(r   r   c                   ,    \ rS rSrS rS rS rS rSrg)NullFiltereri7  c                     g rG   rP   r2   s    r   r/   NullFilterer.__init__8      r   c                     g rG   rP   )r*   _pkg
_installeds      r   resetNullFilterer.reset;  r  r   c                     gr   rP   r*   _entrys     r   stopNullFilterer.stop>      r   c                     gr   rP   r#  s     r   filterNullFilterer.filterA  r'  r   rP   N)	rJ   rK   rL   rM   r/   r   r%  r)  rO   rP   r   r   r  r  7  s    r   r  c                       \ rS rSr\R
                  " S5      r\R
                  " S5      r\R
                  " S\R                  5      r	\R
                  " S5      r
SrSS jrS	 rS
 rSrg)ChangelogParseriE  zC^(?P<package>\S+) \((?P<version>.*)\) .*;.*urgency=(?P<urgency>\w+)zT(^\S+ \(?\d.*\)|Old Changelog:|Changes|ChangeLog begins|Mon|Tue|Wed|Thu|Fri|Sat|Sun)z(;;\s*)?Local\s+variables.*z^\s--\s.*<.*@.*>.*$zbinary-only=yesNc                     Xl         UR                  U l        UR                  U l        X@l        [        5       U l        U=(       d    UR                  =(       d
    [        5       U l
        SU l        X l        g)zTSee comment above Filterer class in apt_listchanges.py for
documentation of filtererFN)r   binary_binaryr3   r   r  r   _changesfiltererr  	_filterer_stoppedr   )r*   r   r   r1  rC   s        r   r/   ChangelogParser.__init__P  sR      ~~~~#	!GW%5%5G	r   c                    SnSnSnU R                   R                  U R                  U R                  5        UR	                  5        GH  nUR                  SS5      nUR                  S5      (       a  M.  Ub  UR                  S5      (       d  US:X  aj  U(       dP  U R                  R                  U5      (       a0  UR                  U5        U R                  U5      nSnU(       d    GOrM  UR                  U5        M  U(       d  U R                  R                  U5      OSnU(       az  SnUR                  S	5      nU R                  U5      (       d  Sn  GO[        XPR                  U R                   U R"                  XR                  S
5      U R$                  U;   5      nGM\  U R&                  R                  U5      (       aV  U(       d    OSnU R                  U5      (       d  Sn  Os[        XPR                  U R                   U R"                  SSS5      nGM  U R(                  R                  U5      (       a    O U(       d  GM  UR                  U5        GM     U R                  U5        U(       a  U R*                  $ S$ )z7Parse changelog or news from the given file descriptor.FNr`   ra   #r!   r    Tr:   r   r6   r   )r2  r   r   r  	readlinesrw   r<   _changelog_trailermatchr   _save_entryr   _changelog_headergroupr   r   r/  r   _binnmu_marker_changelog_header_ancient_changelog_header_emacsr0  )	r*   fdancientr   is_debian_changelogr-   go_onr9  r:   s	            r   parseChangelogParser.parse\  s   #T]]DOO<LLND;;w	2Ds## dooc&:&:ddl4#:#:#@#@#F#F%%d+ ,,U3E E  ! %%d+ % ..44T:*. *.'#kk)4G++E22 $*iit||Y!7++t35E
 3399$??."G++E22 $*4DLL+/<<UEKE 1177==U%%d+[ #b 	 3t}}==r   c                     U R                   (       a  gU R                  R                  U5      (       a  SU l         gU(       a;  U R                  R                  U5      (       d  U R                  R                  U5        g)NFT)r3  r2  r%  r)  r0  r  r   s     r   r:  ChangelogParser._save_entry  sY    == >>u%% DM..u55MM$$U+r   )r/  r0  r2  r  r   r   r3  r   NN)rJ   rK   rL   rM   recompiler;  r>  
IGNORECASEr?  r8  r=  r/   rD  r:  rO   rP   r   r   r,  r,  E  si    

NP "

	(!) !jj)G)+8$:;&N
:>xr   r,  c                   <    \ rS rSrS	S jrS r S
S jrS rS rSr	g)ChangelogsReaderi  Nc                     Xl         UR                  U l        UR                  U l        X l        UR                  S5      (       a  [        U5      U l        O[        U5      S-   U l        X0l	        X@l
        g )N/r   )r   r.  r/  r3   r   _rootdirr=   r;   
prefix_lenr2  _installed_package)r*   r   rootdirr1  rC   s        r   r/   ChangelogsReader.__init__  sY    ~~~~C  !'lDO!'lQ.DO!"+r   c                 ^    U(       d  g U H  nU R                  X25      nU(       d  M  Us  $    g rG   )_read_changelog)r*   	filenamesversion_filteringfilenamer   s        r   _find_firstChangelogsReader._find_first  s1    !H))(FFv " r   c                 `    U R                  X#5      nU R                  X5      nU(       a  XE-   $ U$ rG   )rZ  )r*   rW  binnmus_filenamesrX  r  r   s         r   read_changelogs ChangelogsReader.read_changelogs  s3    ""#4H""9@$+w 88r   c                    U R                  [        R                  R                  U R                  U5      5      u  p4U(       d  gX0R
                  S  n[        R                  " SU S35        U   [        U R                  X0R                  U(       a  U R                  OS S9R                  U5      sS S S 5        $ ! , (       d  f       g = f)NFzFound z in _read_changelogrC   )_open_changelog_fileosr   r  rP  rQ  r   debugr,  r   r2  rR  rD  )r*   fileglobrX  rY  r@  s        r   rV   ChangelogsReader._read_changelog  s    00GGLL13OO,-vhZ':;<"x$ 11*.0 16b		 RRs   .AB99
Cc                    [         R                   " U5      nU H  n [        R                  R                  U5      (       a#  [        R
                  " [        S5      U-  5        O@UR                  S5      (       a  U[        R                  " U5      4s  $ U[        US5      4s  $   g   g! [         a:  nUR                  [        R                  [        R                  4;  a  e  S nAM  S nAff = f)Nz(Ignoring `%s' (seems to be a directory!)z.gzrbrH  )globrc  r   isdirr   errorr   r=   gzipGzipFileri   IOErrorerrnoENOENTELOOP)r*   filename_globrW  rY  r   s        r   rb  %ChangelogsReader._open_changelog_file  s    IIm,	!H77==**LLDE !" &&u--#T]]8%<<<#T(D%999  "   775<<"== >s   A4B)B))
C-3/C((C-)r/  r2  rR  r   rP  r   rQ  rG   r   )
rJ   rK   rL   rM   r/   rZ  r^  rV  rb  rO   rP   r   r   rM  rM    s     
, +09:r   rM  c                 >    SS/nU Vs/ s H  o"U -  PM	     sn$ s  snf )Nzusr/share/doc/*/%s.gzzusr/share/doc/*/%srP   )rY  formatsrp   s      r   _changelog_variationsrv    s)    &#%G")*'QL'***s   c                       \ rS rSr\" S5      r\" S5      \" S5      -   rS rS r\r	\
S 5       rSS	 jr\S
 5       rSS jrS rSS jrS rS rS rSrg)r   i  zNEWS.Debianzchangelog.Debian	changelogc                 .   Xl         X l        [        5       nUR                  U R                   5        UR                  S   nUR
                  U l        UR                  U l        UR                  U l        UR                  U l	        UR                  U l        g )Nr   )r   r1  rR   r{   rU   r   r.  r:   r3   r@   r   r)   )r*   r   r1  parserpkgdatas        r   r/   Package.__init__  sm    	 tyy!..#oonn%44((	r   c                 P    SU R                   R                   SU R                   S3$ N<z object for >)r   rL   r   r2   s    r   r   Package.__str__  s&    4>>../|DII;aHHr   c                 2    [        SU R                  -   5      $ )Nzchangelog.Debian.)rv  r)   r2   s    r   binnmu_filenamesPackage.binnmu_filenames  s    $%8499%DEEr   Nc                 V   [         R                  " [        S5      SU R                  0-  5        / n/ n/ nUS;   a  U R                  nUS;   a  U R
                  nU R                  nXE-   U-   n[         R                  " SU 35        U R                  U5      n [        XU=(       d    U R                  US9n	U(       a  U	R                  U R                  S5      n
OSn
U(       a  U	R                  XVSS	9nOSn[        R                  " US
5        X4$ ! [        R                  " US
5        f = f)a  Extract changelog and binnmu entries, news or both from the package.

Unpacks changelog or news files from the binary package, and parses
them.
If filterer is specified, it overrides the one specified on object
creation.
Returns ChangelogParser object or None.
z#Extracting changes from %(debfile)sdebfilebothnewsr  
changelogsz
Examining ra  NTrX  r   )r   rd  r   r   news_filenameschangelog_filenamesr  _extract_contentsrM  r1  r^  shutilrmtree)r*   whichr1  rC   r  r  r  rW  tempdirreaderr  rx  s               r   extract_changesPackage.extract_changes  s1    	Q<=+, 	- $$!00N**"&":":#44"8;KK	z)-.((3	&%dX5N09;F --d.A.A4H""22'&* 3 ,	 !	 MM'1%   MM'1%s   AD D(c                 n   ^ U  V^s/ s H!  m[        U4S jU 5       5      (       d  M  TPM#     sn$ s  snf )Nc              3   R   >#    U  H  n[         R                   " TU5      v   M     g 7frG   )fnmatch)r   pro   s     r   r   +Package.fn_pattern_match.<locals>.<genexpr>6  s     ?hwq!,,hs   $')any)rW  patternsro   s     `r   fn_pattern_matchPackage.fn_pattern_match3  s8    $ A9a?h?? 9 A 	A As   22c                    [         R                  " [        S5      SU R                  0-  5        / n/ n/ nUS;   a  U R                  nUS;   a  U R
                  nU R                  nU R                  X4-   U-   5      nU R                  Xc5      nU R                  Xd5      nU R                  Xe5      n[        U SU=(       d    U R                  5      nU(       a  UR                  US5      nOSnU(       a  UR                  XE5      n	OSn	U(       a  UR                  (       a  UOSU	(       a%  U	R                  (       d  U	R                  (       a  U	4$ S4$ )zLike extract_changes but reads already installed changelog files
No version filtering because that requires the version number we're
parsing for to be different from the installed version number.z,Extracting installed changes for %(package)sr   r  r  rO  N)r   rd  r   r.  r  r  r   _extract_filenames_via_installedr  rM  r1  r^  r   r  )
r*   r  r1  
news_fileschangelog_filesbinnmu_filespackage_filesr  r  rx  s
             r   extract_changes_via_installed%Package.extract_changes_via_installed8  sE    	QEF-. 	/
$$,,J**"66O00L==(<79**=E
//O,,]I!$X-FG))*d;DD../I I4&""i&7&7 D 	D>BD 	Dr   c           
         SU R                    3n[        R                  " [        R                  R	                  U[        R                  R                  U5      5      5        [        [        R                  R	                  X5      S5       n SSSU R                    SU R                   3/n[        R                  " [        S5      S[        U5      0-  5        [        R                  " XC[        R                  S	S
S9   SSS5        U$ ! [        R                   aw  n[        R                   " [        S5      U R                   UR"                  (       a  UR"                  R%                  SS5      O
[        U5      S.-  5         SnASSS5        gSnAf[&         aJ  n[        R                   " [        S5      U R                   [        U5      S.-  5         SnASSS5        gSnAff = f! , (       d  f       U$ = f)zRun apt-get changelog and parse the downloaded changelog.
Retrieve changelog using the "apt-get changelog" command, and parse it.
znetwork/wbzapt-getz-qqrx  =z%Calling %(cmd)s to retrieve changelogcmdx   T)stdoutstderrtimeoutcheckz]Unable to retrieve changelog for package %(pkg)s; 'apt-get changelog' failed with: %(errmsg)sr`   ra   )pkgrh   Nz_Unable to retrieve changelog for package %(pkg)s; could not run 'apt-get changelog': %(errmsg)s)r.  rc  mkdirr   r  dirnameri   r:   r   rd  r   rm   ru   runPIPECalledProcessErrorrk  r  rw   rk   )r*   r  changelog_filechangelog_fdry   rq   s         r   extract_content_via_aptPackage.extract_content_via_apt\  s   
 $DKK=1
grww~'FGH"'',,w7>,$e["kk]!DLL>:<QFG#S\23 4%??CtE ?4 ! 00  F G"kk)) "$!1!1'9!E),R223 # ?>&   H I"kkSW=>? 1 ?>&' ?>4 sD   
G(A1DG%A%FG(G%8G G( G%%G((
G7c                 T   [         R                  " SS9n U R                  U5      nU(       aG  [        XU=(       d    U R                  US9R                  U/SSS9nU[        R                  " US5        $  [        R                  " US5        g! [        R                  " US5        f = f)zRun apt-get changelog and parse the downloaded changelog.
Retrieve changelog using the "apt-get changelog" command, and parse it.
Returns ChangelogParser object or None.
apt-listchangesprefixra  NTr  r   )tempfilemkdtempr  rM  r1  r^  r  r  )r*   r1  rC   r  r  rx  s         r   extract_changes_via_aptPackage.extract_changes_via_apt  s     ""*;<		&!99'BN,8#<t}}'))8'($$ *9 *H  !MM'1%  MM'1% MM'1%s   AB B'c           	         [         R                  " U R                  5      nSR                  U Vs/ s H  n[         R                  " SU-   5      PM     sn5      nSU SU S3n[        R
                  " USSSSS	9nUR                  [        R                  * :X  a  [        e[        S
 UR                  R                  5       R                  S5       5       5      $ s  snf )Nr!   ./dpkg-deb --fsys-tarfile z | tar tf - --wildcards  2>/dev/nullTr`   F)shellcapture_outputrb   r  c              3   *   #    U  H	  oS S v   M     g7f)r   NrP   )r   fns     r   r   -Package._extract_filenames.<locals>.<genexpr>  s     G%FrqrF%Fs   r    )shlexquoter   r  ru   r  
returncodesignalSIGINTKeyboardInterruptlistr  r   r$   )r*   r  qpathrp   qnamesextract_commandr   s          r   _extract_filenamesPackage._extract_filenames  s    DII&(C(Q5;;tax0(CD&ug .$$*8<9 	 4w
 .##GV]]%8%8%:%@%@%FGGG Ds   #Cc                 p   [         R                  " SSU R                   SU R                   34SSSS9nUR                  [
        R                  * :X  a  [        eUR                  R                  5       R                  S5       Vs/ s H  o3R                  5       S	S  PM     nnU R                  XA5      $ s  snf )
Ndpkgz-Lr#   Tr`   F)r  rb   r  r    r   )ru   r  r.  r)   r  r  r  r  r  r   r$   r  )r*   r  r   r  filess        r   r  (Package._extract_filenames_via_installed  s    Tdkk]!DII;78'@
 .##*0--*=*=*?*E*Ed*KL*KBAB*KL$$U55 Ms   B3c           	         [         R                  " SS9n[        R                  " U R                  5      n[        R                  " U5      nSR                  U Vs/ s H  n[        R                  " SU-   5      PM     sn5      nSU SU SU S3n[        R                  " U5      n[        R                  " U5      (       aE  [        R                  " U5      [        R                  :X  a  [        R                  " US5        [        eU$ s  snf )	Nr  r  r!   r  r  z | tar xf - --wildcards -C r  r   )r  r  r  r  r   r  rc  systemWIFSIGNALEDWTERMSIGr  r  r  r  r  )	r*   rW  r  r  qdirrp   r  r  statuss	            r   r  Package._extract_contents  s    ""*;<DII&{{7#)D)Q5;;tax0)DE&ug .''+fAfX\C 	 ?+>>&!!bkk&&9V]]&JMM'1%## Es   #Dr)   r.  r1  r   r3   r@   r:   rH  rG   )rJ   rK   rL   rM   rv  r  r  r/   r   r   rN   r  r  staticmethodr  r  r  r  r  r  r  rO   rP   r   r   r   r     s    *=9N01k*	+ )IHF F*!X A A"DH!F(H	6r   r   c                   4    \ rS rSrS rS r\rSS jrS rSr	g)	InstalledPackagei  c                     S U l         X l        UR                  U l        UR                  U l        UR
                  U l        UR                  U l        UR                  U l        g rG   )	r   r1  r   r.  r:   r3   r@   r   r)   )r*   r{  r1  s      r   r/   InstalledPackage.__init__  sJ    	 oonn%44((	r   c                 P    SU R                   R                   SU R                   S3$ r~  )r   rL   r.  r2   s    r   r   InstalledPackage.__str__  s&    4>>../|DKK=JJr   Nc                 $    U R                  X5      $ rG   )r  )r*   r  r1  rC   s       r   r   InstalledPackage.extract_changes  s    11%BBr   c                     [        5       erG   )NotImplementedError)r*   rW  s     r   r  "InstalledPackage._extract_contents  s    !##r   r  rH  )
rJ   rK   rL   rM   r/   r   r   r  r  rO   rP   r   r   r  r    s    )KHC$r   r  )ro  r  r   ri  rl  rc  rI  r  r  r  ru   r  r   apt_listchangesr   apt_listchanges.ALChacksr   r   r   rR   r   r   r   r  r,  rM  rv  r   r  rP   r   r   <module>r     s   4      	 	       " &*- -`%( %(PG) G)X2 2*C CL ^ ^B< <~+T Tn$w $r   