
    Dc``O@                     B   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlmZ d dlmZ d Z G d d          Z G d d          Z G d	 d
          Z G d d          Z G d d          Z G d d          Z G d d          ZddgZdS )    N)_)reducec                 b    dddddd}|                     |                                 d          S )N            )critical	emergencyhighmediumlowc   )getlower)uurgency_maps     )/usr/share/apt-listchanges/DebianFiles.py_numeric_urgencyr   -   s;    "#"#"#"#"#	& &K ??17799b)))    c                   N    e Zd Z ej        d          Zg dZd Zd Zd Z	d Z
dS )ControlStanzaz^\S+ \((?P<version>.*)\).*)PackageSourceVersionArchitectureStatusc           	      8   d }|                     d          D ]}|s d S |d         dv r(|r%t          | |t          | |          dz   |z              9|                     dd          \  }}|| j        v r$t          | ||                                           d }d S )N
r   ) 	:r   )splitsetattrgetattrfields_to_readlstrip)selfsfieldlinevalues        r   __init__zControlStanza.__init__;   s    GGDMM 	! 	!D Aw+%% MD%u)=)=)Dt)KLLL#zz#q11uD///D%8888 EE	! 	!r   c                 `    t          | d| j                                      d          d         S )Nr   r    r   )r%   r   r#   r(   s    r   sourcezControlStanza.sourceL   s)    tXt|44::3??BBr   c                 j    t          | d          o#| j                            d          d         dk    S )Nr   r    r   	installed)hasattrr   r#   r/   s    r   r2   zControlStanza.installedO   s1    tX&&S4;+<+<S+A+A!+D+SSr   c                     | j         }t          | d          rM| j                            | j                  }|r,|                    d          }|                    |          s|S |S )a  
        This function returns the version of the package. One would like it to
        be the "binary" version, though we have the tough case of source
        package whose binary packages versioning scheme is different from the
        source one (see OOo, linux-source, ...).

        This code does the following, if the Source field is set with a
        specified version, then we use the binary version if and only if the
        source version is a prefix. We must do that because of binNMUs.
        r   version)r   r3   source_version_rematchr   group
startswith)r(   vr7   svs       r   r5   zControlStanza.versionR   sl     L4"" 	*00==E [[++||B'' Ir   N)__name__
__module____qualname__recompiler6   r&   r-   r0   r2   r5    r   r   r   r   7   st        "
#@AAQQQN! ! !"C C CT T T    r   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )ControlParserc                 "    g | _         i | _        d S N)stanzasindexr/   s    r   r-   zControlParser.__init__h   s    


r   c                 j    i | j         |<   | j        D ] }|| j         |         t          ||          <   !d S rE   )rG   rF   r%   )r(   r*   stanzas      r   	makeindexzControlParser.makeindexl   sG    
5l 	? 	?F8>DJugfe4455	? 	?r   c                 `   	 t          |dd          5 }| xj        d |                                                    d          D             z  c_        d d d            d S # 1 swxY w Y   d S # t          $ r5}t          t          d          |t          |          dz            |d }~ww xY w)Nutf-8replace)encodingerrorsc                 0    g | ]}|t          |          S rA   )r   .0xs     r   
<listcomp>z*ControlParser.readfile.<locals>.<listcomp>t   s&     W W WaUV Wq!1!1 W W Wr   

'Error processing '%(what)s': %(errmsg)swhaterrmsg)openrF   readr#   	ExceptionRuntimeErrorr   str)r(   filefexs       r   readfilezControlParser.readfileq   s!   	KdWY??? X1 W W16688>>&;Q;Q W W WWX X X X X X X X X X X X X X X X X X 	K 	K 	Kq!JKK)-R A A B C CHJK	Ks;   A. A A!A. !A%%A. (A%)A. .
B-80B((B-c                 N   	 dd|gt           j        z   }t          j        |          }| j                            t          |                    dd                               d S # t          $ r5}t          t          d          |t          |          dz            |d }~ww xY w)Nzdpkg-debz-frL   rM   rV   rW   )r   r&   
subprocesscheck_outputrF   appenddecoder\   r]   r   r^   )r(   debcommandoutputra   s        r   readdebzControlParser.readdeby   s    	J!4-0LLG,W55FLfmmGY.O.O P PQQQQQ 	J 	J 	Jq!JKK),B @ @ A B BGIJ	Js   A!A% %
B$/0BB$c                     || j         v r$|| j         |         v r| j         |         |         S d S | j        D ]*}t          ||          rt          ||          |k    r|c S +d S rE   )rG   rF   r3   r%   )r(   r*   r,   rI   s       r   findzControlParser.find   s~    DJ
5)))z%(//t, " "65)) "gfe.D.D.M.M!MMMtr   N)r<   r=   r>   r-   rJ   rb   rk   rm   rA   r   r   rC   rC   g   se          ? ? ?
K K KJ J J
 
 
 
 
r   rC   c                       e Zd ZddZd Zd Zed             Zed             Zed             Z	ed             Z
ed	             Zed
             Zd ZeZdS )ChangelogEntryFc                     |                                 | _        || _        t          |          | _        d| _        d| _        || _        d S )N )strip_header_versionr   _trailer_content_binnmu)r(   headerr5   urgencybinnmus        r   r-   zChangelogEntry.__init__   sA    ||~~ 0 9 9r   c                 8    |                                 | _        d S rE   )rstripru   )r(   trailers     r   set_trailerzChangelogEntry.set_trailer   s    ((r   c                 r    | j         r| xj         |z  c_         d S |                                s	|| _         d S d S rE   )rv   isspace)r(   contents     r   add_contentzChangelogEntry.add_content   sG    = 	$MMW$MMMM"" 	$#DMMM	$ 	$r   c                     | j         S rE   )rt   r/   s    r   r5   zChangelogEntry.version   
    }r   c                     | j         S rE   r   r/   s    r   numeric_urgencyzChangelogEntry.numeric_urgency       $$r   c                     | j         S rE   )rw   r/   s    r   rz   zChangelogEntry.binnmu   
    |r   c                     | j         S rE   )rs   r/   s    r   rx   zChangelogEntry.header   r   r   c                     | j         S rE   )ru   r/   s    r   r}   zChangelogEntry.trailer   r   r   c                 4    | j                                         S rE   )rv   r|   r/   s    r   r   zChangelogEntry.content   s    }##%%%r   c                     | j         dz   | j        z   dz   | j        z   }| j         r	| j        r|S |                                S )NrU   )rx   r   r}   rr   )r(   results     r   __str__zChangelogEntry.__str__   sG    v%4v=L; 	4< 	M||~~r   N)F)r<   r=   r>   r-   r~   r   propertyr5   r   rz   rx   r}   r   r   __repr__rA   r   r   ro   ro      s           ) ) )$ $ $   X % % X%   X   X   X & & X&  
 HHHr   ro   c                       e Zd Zd Zed             Zed             Zed             Zed             Zed             Z	d Z
d Zd	S )
Changesc                 X    || _         g | _        g | _        t          d          | _        d S )Nr   )_package_entries_binnmusr   )r(   packages     r   r-   zChanges.__init__   s-     0 7 7r   c                     | j         S rE   )r   r/   s    r   r   zChanges.package   r   r   c                     | j         S rE   r   r/   s    r   r   zChanges.numeric_urgency   r   r   c                     | j         S rE   )r   r/   s    r   entrieszChanges.entries   r   r   c                     | j         S rE   )r   r/   s    r   binnmuszChanges.binnmus   r   r   c                 t    | j         r0d                    t          t          | j                             dz   S dS )NrU   rq   )r   joinmapr^   r/   s    r   changeszChanges.changes   s5    = 	A;;s36677&@@rr   c                     |j         r| j                            |           d S | j                            |           t	          | j        |j                  | _        d S rE   )rz   r   rf   r   minr   r   r(   entrys     r   
save_entryzChanges.save_entry   s]    < 	VM  '''''M  '''$'(=u?T$U$UD!!!r   c                 j    | j                                          | j                                         d S rE   )r   reverser   r/   s    r   r   zChanges.reverse   s0    r   N)r<   r=   r>   r-   r   r   r   r   r   r   r   r   rA   r   r   r   r      s        8 8 8   X % % X%   X   X   X
V V V         r   r   c                       e Zd Z ej        d          Z ej        d          Z ej        dej                  Z ej        d          Z	dZ
d Zd Zd Zd	S )
ChangelogParserz8^\S+ \((?P<version>.*)\) .*;.*urgency=(?P<urgency>\w+).*zV^(\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=yesc                     || _         d S rE   )_changes)r(   r   s     r   r-   zChangelogParser.__init__   s    r   c                 $   d}d}d}|rt          |          nd}|                                D ]}|                    dd          }|                    d          r/|c|                    d          s|dk    rH|s0| j                            |          r|                    |           ~|                    |           |s| j                            |          nd}|rd}|	                    d	          }	|rt          j        |	|          d
k    r n|                     |           |!|t          | j        j                  k    rd} nt!          ||	|	                    d          | j        |v           }N| j                            |          r/|s nad}|                     |           t!          |ddd          }| j                            |          r n||                    |            |                     |           |S )zParse changelog or news from the given file descriptor.
        If since_version is specified, only save entries later
        than the specified version.
        If latest is specified, only the latest N versions.FNrL   rM   #r    r   Tr5   r   ry   rq   r   )int	readlinesrg   r9   _changelog_trailerr7   r~   r   _changelog_headerr8   apt_pkgversion_compare_save_entrylenr   r   ro   _binnmu_marker_changelog_header_ancient_changelog_header_emacs)
r(   fdsince_versionlatestancientr   is_debian_changelogr+   r7   r5   s
             r   parsezChangelogParser.parse   sf   
 # &0VDLLNN )	 )	D;;w	22Ds##  dooc&:&: ddll ,4#:#@#@#F#F ,%%d++++%%d++++ CJS.44T:::t *.'#kk)44G$ )@AN*P *PST*U *U$$U+++)fDM<Q8R8R.R.R $*4%++i:P:P+/+>$+FH HEE 399$?? . "G$$U+++*4UEBBEE177== E&%%d++++ ""r   c                 B    || j                             |           d S d S rE   )r   r   r   s     r   r   zChangelogParser._save_entry*  s,    M$$U+++++ r   N)r<   r=   r>   r?   r@   r   r   
IGNORECASEr   r   r   r-   r   r   rA   r   r   r   r      s        "
#^__ *
  ,E  !F  !F(bj)GWW#$:;;&N     7# 7# 7#r, , , , ,r   r   c                   &    e Zd Zd Zd Zd Zd ZdS )ChangelogsReaderc                 L    || _         || _        || _        || _        || _        d S rE   )_source_pkg_name_rootdir_since_version_latest_reverse)r(   source_pkg_namerootdirr   r   r   s         r   r-   zChangelogsReader.__init__/  s+     /+r   c                      t           j                   fd}t          ||d          }|rt          ||d          p|}|sd S  j        r                                 S )Nc                 z    | p8                     t          j                            j        |                    S rE   )_read_changelogospathr   r   )accfnamer   r(   s     r   <lambda>z2ChangelogsReader.read_changelogs.<locals>.<lambda>9  s8     )Et/C/CT]E::G0E 0E r   F)r   r   r   r   r   )r(   	filenamesbinnmus_filenames
find_firstr   r   s   `    @r   read_changelogsz ChangelogsReader.read_changelogs6  s    $/00E E E E E
 
Iu55 	LJ(95AAKVF 	4= 	OOr   c                     |                      |          }|sdS |5  t          |                              || j        | j                  cd d d            S # 1 swxY w Y   d S )NF)_open_changelog_filer   r   r   r   )r(   filenamer   r   s       r   r   z ChangelogsReader._read_changelogH  s    &&x00 	5 	Y 	Y"7++11"d6I4<XX	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Ys   .AAAc                    t          j         |          }|D ]}	 t          j                            |          r%t	          j        t          d          |z             n=|                    d          rt          j	        |          c S t          |d          c S  nB# t          $ r5}|j        t          j        k    r|j        t          j        k    r Y d }~d }~ww xY wd S )Nz(Ignoring `%s' (seems to be a directory!)z.gzrb)globr   r   isdirALCLogerrorr   endswithgzipGzipFilerZ   IOErrorerrnoENOENTELOOP)r(   r   r   es       r   r   z%ChangelogsReader._open_changelog_fileP  s    Ih''	! 	 	H
7==** 0L#M!N!NQY!YZZZZ&&u-- 0=22222$/////   7el**qw%+/E/E ts   A,B	B
C'+CCN)r<   r=   r>   r-   r   r   r   rA   r   r   r   r   .  sS               $Y Y Y    r   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )r   c                    || _         t                      }|                    | j                    |j        d         }|j        | _        |                                | _        |                                | _        |j	        | _
        d S )Nr   )r   rC   rk   rF   r   binaryr0   r5   r   r   arch)r(   r   parserpkgdatas       r   r-   zPackage.__init__b  sk    	ty!!!.#~~''(((			r   c                    |                      d          }|                      d          }|                      d| j        z             }|                      d          }g }	|dk    s|dk    r|	                    |           |dk    s|dk    r?|	                    |           |	                    |           |	                    |           |                     |	          }
	 t	          | j        |
|||          }|                    |d          }|                    ||z   |          }t          j        |
d	           n# t          j        |
d	           w xY w||fS )
ai  Extract changelog and binnmu entries, news or both from the package.

        Unpacks changelog or news files from the binary package, and parses them.
        If since_version is specified, only return entries later than the specified version.
        If latest is specified, only the latest N versions.
        Returns a tuple of sequences of Changes objects.zNEWS.Debianzchangelog.Debianzchangelog.Debian.	changelogbothnews
changelogsNr   )	_changelog_variationsr   extend_extract_contentsr   r0   r   shutilrmtree)r(   whichr   r   r   news_filenameschangelog_filenameschangelog_filenames_binnmuchangelog_filenames_nativer   tempdirreaderr   r   s                 r   extract_changeszPackage.extract_changesn  s|    33MBB"889KLL%)%?%?@SVZV_@_%`%`"%)%?%?%L%L"	F??evoo^,,,F??e|33011178887888((33		&%dk7M6SZ[[F)).$??D../BE_/_-GI II M'1%%%%FM'1%%%%i  s   !AD> >Ec           	      Z   t          j        d          }t          j                            || j        dz             }t          |d          }	 ddd| j        d| j        g}t          j	        t          d	          d
t          |          iz             t          j        ||t          j        dd           t          | j        d|||                              |gd          	 |                                 t'          j        |d           S # t          j        $ re}t          j        t          d          | j        |j        r|j                            dd          nt          |          dz             Y d}~nSd}~wt2          $ rC}t          j        t          d          | j        t          |          dz             Y d}~nd}~ww xY w|                                 t'          j        |d           n.# |                                 t'          j        |d           w xY wdS )a  Run apt-get changelog and parse the downloaded changelog.

        Retrieve changelog using the "apt-get changelog" command, and parse it.
        If since_version is specified, only return entries later than the specified version.
        If latest is specified, only the latest N versions.
        Returns a single sequence of Changes objects or None on downloading or parsing failure.apt-listchangesprefixz
.changelogwzapt-getz-qqr   =z%Calling %(cmd)s to retrieve changelogcmdx   T)stdoutstderrtimeoutcheckrq   Nr   z]Unable to retrieve changelog for package %(pkg)s; 'apt-get changelog' failed with: %(errmsg)srL   rM   )pkgrY   z_Unable to retrieve changelog for package %(pkg)s; could not run 'apt-get changelog': %(errmsg)s)tempfilemkdtempr   r   r   r   rZ   r   r   debugr   r^   rd   runPIPEr   r0   r   closer   r   CalledProcessErrorr   r  rg   r\   )	r(   r   r   r   r   changelog_filechangelog_fdri   ra   s	            r   extract_changes_via_aptzPackage.extract_changes_via_apt  s    "*;<<<gt{\/IJJNC00	& %dll6[\GLBCCucRYllF[[\\\N7<
Y\dhiiii $DK]F$+- --<_n=Mt-T-TU    M'1%%%%% , 	i 	i 	iL K L L%)[PRPY(f	(8(8)(L(L(L_bce_f_fh hh i i i i i i i i
  	2 	2 	2L L M M%)[(+B1 11 2 2 2 2 2 2 2 2	2    M'1%%%%    M'1%%%%tsD   A+D :,G= G AF ;G=  G9GG= GG= =+H(c           	         t          j        d          }dt          j        | j                  dt          j        |          dd                    d |D                       d}t          j        |          }t          j        |          r>t          j	        |          t          j        k    rt          j        |d           t          |S )	Nr  r  zdpkg-deb --fsys-tarfile z | tar xf - --wildcards -C r    c                 6    g | ]}t          j        |          S rA   )shlexquoterQ   s     r   rT   z-Package._extract_contents.<locals>.<listcomp>  s     888ek!nn888r   z 2>/dev/nullr   )r  r  r  r  r   r   r   systemWIFSIGNALEDWTERMSIGsignalSIGINTr   r   KeyboardInterrupt)r(   r   r   extract_commandstatuss        r   r   zPackage._extract_contents  s    "*;<<< K	""""EK$8$8$8$8HH88i8889999
 ?++>&!! 	$bk&&9&9V]&J&JM'1%%%##r   c                 (    ddg}fd|D             S )Nz./usr/share/doc/*/%s.gzz./usr/share/doc/*/%sc                     g | ]}|z  S rA   rA   )rR   rS   r   s     r   rT   z1Package._changelog_variations.<locals>.<listcomp>  s    ...H...r   rA   )r(   r   formatss    ` r   r   zPackage._changelog_variations  s*    ,)+....g....r   N)r<   r=   r>   r-   r  r  r   r   rA   r   r   r   r   a  sa        
) 
) 
)!! !! !!F' ' 'T  &/ / / / /r   r   )r?   r   r  r   r   r   r   r  r!  rd   r   r   ALChacksr   	functoolsr   r   r   rC   ro   r   r   r   r   __all__rA   r   r   <module>r,     s  4 
			 				                         
* * *- - - - - - - -`% % % % % % % %N/ / / / / / / /b&  &  &  &  &  &  &  & PE, E, E, E, E, E, E, E,N1 1 1 1 1 1 1 1fp/ p/ p/ p/ p/ p/ p/ p/f Y
(r   