
    )c                        d 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dlZ G d d      Z G d d      Zd	 Zd
 Z	 	 ddedededededefdZd ZdefdZd defdZdadaedk(  rdej8                  v r# ed       ej8                  j;                  d       dej8                  v rej8                  j;                  d       dZndZ eej8                        dk7  r ed        ej@                  d       yejB                  jE                         xr ejF                  jE                         Z" eej8                  d   e"de"e       yy)!aJ  
apt_changelog.py

Replacement for apt changelog, can be used both standalone and as a module.

In addition to apt changelog sources, it directly supports also Linux Mint
and Launchpad repositories and will try to retrieve a changelog for packages
from all other debian package sources as well. Most importantly, changelogs
for installed packages are retrieved locally to avoid unnecessary network
activity.

Unlike apt it does not support wildcards for the package name. You get to
check one specific changelog at a time only. I see no value in multi-lookups.

Copyright (c) 2018 gm10

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
    N)Cache)
DebPackagec                   H    e Zd Zdedededededededed	ed
edededefdZy)_Packagenamefullnamearchitectureversionsource_namesource_versionurifilenameorigin	componentdownloadableis_installeddependenciesc                     || _         || _        || _        || _        || _        || _        d | _        || _        || _        |	| _	        |
| _
        || _        || _        t               | _        || _        y N)r   r   r	   r
   r   r   source_version_rawr   r   r   r   r   r   listinstalled_filesr   )selfr   r   r	   r
   r   r   r   r   r   r   r   r   r   s                 :/usr/lib/python3/dist-packages/mintcommon/apt_changelog.py__init__z_Package.__init__5   sw     	 (&,"& "((#v(    N)__name__
__module____qualname__strboolr   r    r   r   r   r   4   sk    )3 ) )3 ) ))(+)14)?B)KN))$()7;)JN)r   r   c            	           e Zd Zd"defdZd Zd Zd Zd"dedefdZ	defd	Z
	 	 d#dedededefdZed$defd       Zd%defdZed        ZdefdZd&defdZd"dedefdZdefdZd&defdZdefdZd efd!Zy
)'_AptChangeloginteractivec                    || _         d| _        d| j                  z  | _        | j                  | _        d}|dz  | _        |dz  | _        |dz  | _        d | _        d | _        d | _	        t        j                          t        j                  j                  d      r%t        j                  j                  d      | _        nd | _        t        j                  j                  d      rIt        j                  j!                  d	      | _        t        j                  j%                  d      | _        nd
| _        | j                  sRt(        j*                  j-                  | j"                        r)t(        j*                  j/                  | j&                        s-t1        dt2        j4                         | j7                  d       y y )Ni@B g      ?zZTo retrieve the full changelog, %s MB have to be downloaded.
%s
Proceed with the download?)%.1fz8Otherwise we will try to retrieve just the last change.
)r'    )zan unknown amount ofr(   z Acquire::Changelogs::URI::OriginzDir::Cache::pkgcachez
Dir::CacheinvalidzAE: Invalid APT configuration found, try to run `apt update` firstfilec   )r%   MBmax_download_size_defaultmax_download_sizemax_download_size_msg_lcmax_download_size_msgmax_download_size_msg_unknown	apt_cacheapt_cache_date	candidateapt_pkginit_configconfigexistssubtreeapt_originsfind_dirapt_cache_path	find_filepkgcacheospathisdirisfileprintsysstderrclose)r   r%   max_download_size_msg_templates      r   r   z_AptChangelog.__init__J   s^   & ),tww&!%!?!?*& )G JI )I%%Ck%Q"-KNj-j*" 	>>  !CD&~~556XYD#D>>  !78").."9"9,"GD#NN445KLDM&DNNNd112t}}-UZZ!JJrN	 .r   c                     t         j                  j                  | j                        r)t         j                  j	                  | j                        S y r   )r@   rA   rC   r?   getmtimer   s    r   get_cache_datez_AptChangelog.get_cache_dates   s2    77>>$--(77##DMM22r   c                     | j                         }| j                  st               | _        || _        y || j                  k7  r#| j                  j	                  d        || _        y y r   )rL   r3   r   r4   open)r   
cache_dates     r   refresh_cachez_AptChangelog.refresh_cachex   sU    ((*
~~"WDN",D4...NN%",D /r   c                 8    | j                   rd | _         d | _        y r   )r5   r3   rK   s    r   
drop_cachez_AptChangelog.drop_cache   s    >>!DNr   pkg_nameno_localc           	      z   | j                          | j                  |      | _        | j                  j                  sd}n| j                  j                  dk(  rd}ni| j                  j                  j                  d      rd}nA| j                  r3| j                  j                  | j                  j                         v rd}nd}d}d }|s| j                  j                  rt        rt        d       | j                  | j                  j                  d	
      }| j                  j                  dk(  rF| j                  j                  dk(  r|j                  dd      }| j                  j                  dk(  rd }|r!t        j                   j#                  |      sd }|rd	}n|dk(  re| j%                  | j                  j'                  | j                  j                              }| j)                  |      }|s| j+                  d       n|dk(  rt        j                   j-                  | j                  j.                        \  }}| j1                  |      \  }}|s@d}|| j                  j                  | j                  j2                  dfz  }| j)                  |d      }|s|| j                  j                  | j                  j2                  dfz  }| j)                  |d      }|s| j+                  d       n|dk(  r| j                  j.                  j-                  d      d   j-                  dd      \  }	}
}}d|
d|d| j                  j                  }| j1                  |      \  }}|s)d|
d|d| j                  j                  d| j                  j2                  d	}| j)                  |d      }|s| j+                  d       n|dk(  rot        rt        d        t        j                   j-                  | j                  j.                        \  }}| j1                  |      \  }}|sj| j+                  d!       nX|dk(  rS| j4                  | j                  j6                  z   }t        j                   j#                  |      s| j+                  d"       d#}|r3|s0t        rt        d$|       	 t        j                   j9                  |      }|j;                         j=                  d%      r4t?        j@                  |d&      jC                         jE                  d'      }n|j;                         j=                  d(      r4tG        j@                  |d&      jC                         jE                  d'      }nV|j;                         d)k(  r8tA        |d&      jC                         jI                         jE                  d'      }ntK        d*      |S |dk(  rKt        r't        d+|jP                  | jR                  z  fz         jT                  }|jW                          |S |j=                  d,      rt        r't        d+|jP                  | jR                  z  fz         jT                  j-                  d-      d   j-                  d.      d/   j-                  d0      }|jW                          |D ]$  }|jY                         }|s|d1k(  rd#}||d0z   z  }& |S |j                  | j4                        }t        r+t        |rd2nd+|jP                  | jR                  z  fz         	 |st[        j\                  d34      }| j^                  rjP                  rd/}d5}|ja                  d67      D ]_  }|tc        |      z  }|je                  |       ||jP                  z  }tg        ||z        }t        d8d9|z  d:||z
  z  |d;z  d<z  d#d	=       a t        d>d:|d?z   z  z   d>d	=       nd	jh                  _5        d/}d}	 |jh                  jC                  d6      }|s[|tc        |      z  }|| jl                  kD  r>| jo                  | jp                        s!|jW                          |jW                          y#d	}|sn|je                  |       |jW                          |js                  d/       |j=                  d@      rn|r|}njt                  }tw        |      }| j                  |jx                        }|r*|j{                  |      }|j                  dA      rh|dBd  }natK        dC      |j=                  dD      rt?        j@                  jt                  d&      jC                         jE                  d'      }|j-                  dE      }|D ]C  }|j-                  d0      } dF| d/   v s| dd  D ]   }!|!j                  dG      r|dH|!dd  z  z  }  C E |stK        dI      t}        j@                  dJK      5 }"| j                  |"j                         D #cg c]  }#|#j                  dLv s|#jt                   c}#      }|r.|"j                  |      jC                         jE                         }ntK        dM      	 d d d        dOt               v r	 jW                          |S |S # tL        $ r'}tO        |       | j+                  d       Y d }~|S d }~ww xY wc c}#w # 1 sw Y   bxY w# tL        $ r&}tO        |       | j+                  dN       Y d }~d }~ww xY w# tL        $ r}tO        |       Y d }~|S d }~ww xY w)PNlocal_package	linuxmintzLP-PPA-zLP-PPAAPTunsupportedFzPackage is installed...T)localUbuntulinux-signedzlinux-imagezlinux-modules
linux-meta   z2http://packages.linuxmint.com/dev/%s_%s_%s.changesamd64i386   z://   /z!https://ppa.launchpadcontent.net/z)/ubuntu/pool/main/{self.source_prefix()}/zhttps://launchpad.net/~z/+archive/ubuntu/z/+files/_z_source.changes   zUnsupported Package      r(   zUsing local changelog:z.gzrutf-8z.xz	changelogzUnknown changelog formatzDownloading: %s (%.2f MB)z.changeszChanges:	Checksumsr   
.zUsing cached package:zapt-changelog-)prefix<   i @  )
chunk_sizez,[%(progress)s%(spacer)s] %(percentage).1f%%= d   )progressspacer
percentage)endflush
   z.debzAutomatically decompressed:   zMalformed Debian package.diff.gzz+++z/debian/changelog+z%s
zNo changelog in .diff.gzzr:xz)fileobjmode)   0   2zNo changelog in source packagei  tmpFile)CrP   parse_package_metadatar5   r   r   
startswithr;   r   r   _DEBUGrD   get_changelog_from_filelistr   r   replacer@   rA   rC   get_apt_changelog_uriget	check_urlexit_on_failsplitr   get_changelog_urir   r=   r   basenamelowerendswithgziprN   readdecodelzmaencode
ValueError	Exception_generic_exception_handlerlengthr-   textrG   striptempfileNamedTemporaryFiler%   iter_contentlenwriteintrawdecode_contentr/   user_confirmr2   seekr   r   filelistdata_contenttarfile
getmemberstypeextractfilevars)$r   rS   rT   r   has_local_changelogr   rh   base_urird   ppa_url	ppa_ownerppa_namerj   r   echangeschangesource_is_cacher   recv_lengthblocksdatarecv_pctrecv_blockssizesize_exceededbuffdebchangelog_file	additionsadditionlineslinetarss$                                       r   get_changelogz_AptChangelog.get_changelog   s(
   44X> ~~**$F^^""k1 F^^""--i8F$.."7"74;K;K;P;P;R"RF"F $DNN77u6722..d 3 <C ~~$$0>>--?++mODC>>--=C277>>#. "&u_,,  $$T^^%:%:;=Cs#A!!!${" ''--(:(:;KHa++H5FAs P$.."<"<NN117"< <NN3."dnn&@&@55v&? ?CsE2A))!, x""((/288a@ ,GY!nw  zB  DH  DR  DR  D^  D^  _H++H5FAsdmowy}  zH  zH  zT  zT  VZ  Vd  Vd  Vs  Vs  tNN3.%%a(}$u23''--(:(:;KHa++H5FAs!!!$ &%%(?(??C77>>#&!!!$ 	xu5c:%77++C0
 >>#,,U3 $		#c 2 7 7 9 @ @ II^^%..u5 $		#c 2 7 7 9 @ @ II^^%4 $S# 3 3 5 < < > E Eg NI$%?@@r g u_u8CDGGAS;TTUIGGI` ] \\*%u8CDGGAS;TTUffll:.q177DQGMMdSGGGI! /}!#$.I/T E "nnT-@-@AOu4+sAHHtww4F.GGIW'&&99AQRG''AHH&'!#$%NNeN$D 
7D'3t94K#MM$/'2QXX'=H*-fx.?*@K!"Q03k0A/2f{6J/K2:S.!"#"
 (*7
7 dSFRK%88d$O
 04, (-""#%%**W"5C#0 $C 0#'$*@*@#@+/+<+<T=_=_+`()	(//18<#& %#MM#. # GGILLO<<'&#LL %Q-C%)%E%Ecll%SN%$'$4$4^$D	$//0MN(1"#I()CDD\\*-  99W\\37<<>EEgND $

5 1I$- * (t 4.%(:(-ab	 *#'??3#7$-$qr(1B$BI$)	** %()CDD !gFC Os)-)I)I-0^^-=X<AWQVVX*Z)(+(G(L(L(N(U(U(WI",-M"NN &	O DF"2MMO
 yq  %*1-!!!$$l q%R YO O  '*1-!!#&&' ! 2.q11 	2s   8Dj% *Ek) 7D3k) +Ak) 9kk
+k
9Ak<k) l %	k.kkkk&"k) )	l2ll	l:$l55l:c                 d   d|v r|j                  dd      \  }}d}n d|v r|j                  dd      \  }}d}nd}d}|| j                  v r| j                  |   }n/t        d|z  t        j                         | j                  d       d}d}|s|rd}j                  D ]a  }|r#t        j                  |j                  |      r7d	}n4|j                  D ]%  }	t        j                  |	j                  |      s$d	}' |s_|} n |sy|r-t        d
|d|j                  dt        j                         n,t        d|d|j                  dt        j                         | j                  d       nj                  }t        |j                  |j                  j                  d|j                  |j                   |j"                  |j$                  t&        j(                  j+                  |j,                        |j                  d   j.                  |j                  d   j0                  |j2                  |j4                  |j6                        }|j4                  r|j8                  |_        |j"                  |_        d|j"                  v r$|j"                  j                  dd      d   |_        |S )z Creates the self.candidate object based on package name=version/release

        Wildcard matching is only used for version and release, and only the
        first match is processed.
        rq   rb   Nrc   zE: Unable to locate package %sr*      FTzE: Release "z" is unavailable for ""zE: Version "   r   )r
   r   r   r	   r   r   r   r   r   r   r   r   r   :)r   r3   rD   rE   rF   rG   versionsfnmatchr
   originsarchiver   r5   r   packager	   r   r   r   r@   rA   r   r   r   r   r   r   r   r   r   )
r   rS   pkg_versionpkg_releasepkg
_candidater5   match_found_pkg_origins
             r   r   z$_AptChangelog.parse_package_metadatan  sZ    (?&.nnS!&<#X{KH_&.nnS!&<#X{KKK t~~%..*C2X=CJJOJJrN 
	+K 
t||[A&*#'<< /"??7??KH*.K/ !%J
 {TWT\T\]"zz+ {TWT\T\]"zz+

2J ((%%**++$00'66..ww''
(;(;<''*11"**1-77%22%22%22
	 !!(+(;(;I%'0'?'?	$)***'0'?'?'E'Ec1'Ma'PI$r   Nurl
check_sizestreammsgc                    t         rt        d|       	 t        j                  ||d      }|r|j                  sd|_        |j
                  j                  d      }|rt        |      |_        nd|_        |rT|rR|j                  | j                  kD  r9| j                  |s| j                  n||j                  | j                  z  z        r|S dt               v rj                          y	# t        $ r}t        |       Y d}~6d}~ww xY w)
z: True if url can be downloaded and fits size requirements z	Checking:rf   )r   timeoutri   zContent-Lengthr   N_rF)r   rD   requestsr   encodingheadersr   r   r/   r   r0   r-   r   r   r   rG   )r   r   r   r   r   r   r   r   s           r   r   z_AptChangelog.check_url  s     5c*	c&!<B {{")BK(89 #FBI !BI"BII0F0F$F%%>A66sTWW,./ I46>HHJ)  	*&q))	*s   C+ +	D	4DD	errc                 .    t        j                  |        y)z Exit N)rE   exit)r   s    r   rG   z_AptChangelog.close  s     	r   c                     d| j                   j                  d| j                   j                  }t	        d|z  t
        j                         | j                  |       y# t        $ r d}Y =w xY w)z- Prints error message and calls self.close() zChangelog unavailable for rq   r(   z E: Failed to fetch changelog. %sr*   N)r5   r   r   AttributeErrorrD   rE   rF   rG   )r   r   detailss      r   r   z_AptChangelog.exit_on_fail  s_    	;?>>;U;UW[WeWeWxWxyG 	07:L

3  	G	s   0A! !A/.A/c                 R    | j                         } | dv ry| dv ryt        d| z        )N)yyesT)nnoFzInvalid response value %s)r   r   )vals    r   	strtoboolz_AptChangelog.strtobool  s4    iik,K83>??r   qc                     | j                   st        rt        d       yt        d|z  d       	 	 | j                  t	                     }t        d       |S # t
        $ r t        dd       Y nt        $ r Y nw xY wN)z5 returns bool (always False in non-interactive mode) z7Maximum size exceeded, skipping in non-interactive modeFz	%s [y/n] r(   )rw   z#Invalid response. Try again [y/n]: )r%   r   rD   r   inputr   KeyboardInterrupt)r   r   responses      r   r   z_AptChangelog.user_confirm  sv    uVWkAo2&>>%'2b	 E;D$  s   %A A:/A:9A:uri_tarc                    d}| j                  | j                  j                  d      }|r|rd|j                  |kD  rU| j                  |d      }|r,|j                  |j                  k  r|}|j	                          n|}|r|j	                          n|}|j                  | j
                  kD  r5| j                  | j                  |j                  | j                  z  z        r||j                  fS y)z Returns request and URI of the preferred source

        The choice is made based on availability and size. If .deb is smaller
        than comparison_trigger_size, or if check_tar is False, then .deb is
        always selected.
        iP  F)Fr(   )
r   r5   r   r   rG   r/   r   r0   r-   r   )r   r   comparison_trigger_sizer_debr_tarr   s         r   get_deb_or_tarz_AptChangelog.get_deb_or_tar  s     #(t~~11595<<*AAw6U\\ELL8BKKMBII 6 66!!$"?"?TWW$#& ' BFF|#r   r   rZ   c                    |D cg c]  }d|j                         v s| }}|rDd| j                  j                  z  }|D ]%  }|j                         j                  |      s#|c S  yd}||v r|S d}||v r|S d| j                  j                  z  }|D ]%  }|j                         j                  |      s#|c S  |D ]B  }t        j
                  j                  |      j                         j                  d      s@|c S  yc c}w )ab   Returns hopefully the correct "changelog" or an empty string.

        We should not need to be searching because the debian policy says it
        must be at debian/changelog for source packages but not all seem to
        adhere to the policy:
        https://www.debian.org/doc/debian-policy/ch-source.html#debian-changelog-debian-changelog

        rj   z/usr/share/doc/%s/changelogzdebian/changelogzrecipe/debian/changelogzusr/share/doc/%s/changelogN)r   r5   r   r   r@   rA   r   )r   r   rZ   r   filestestpathitems          r   r   z)_AptChangelog.get_changelog_from_filelist  s    %Aqqwwy(@AA4t~~7J7JJH  ::<**84K &  *H5 0H5 3dnn6I6IIH  ::<**84K 
   77##D)//1<<[IK  - Bs
   DDuri_templatec           	           j                   j                  } fd j                   j                  dk(  rL j                   j                  j	                  d      r'  j                         }|r|}d j                   _         j                   j                  dk(  r* j                   j                  dk(  rd j                   _        d|v r|j                  dd      d   }|j                  dd	 j                   j                  r2 j                   j                  d
k7  r j                   j                  dz   nd
 j                          j                   j                  |dz        S )ag   Returns URI based on provided apt changelog URI template.

        Emulates apt's std::string pkgAcqChangelog::URI
        The template must contain the @CHANGEPATH@ variable, which will
        be expanded to
            COMPONENT/SRC/SRCNAME/SRCNAME_SRCVER
        Component is omitted for releases without one (= flat-style
        repositories).
        c                 Z   | j                   D ]  }|j                  r|j                  dk(  st        rt	        d|        y |j                  d   }|j
                  dv r|j                  c S |j
                  j                  d      syj                  t        |            } |      c S  y )NDependszW: Kernel dependency not found:r   )linuxr\   r]   )
r   target_versionsrawtyper   rD   r   r   r   r   r    )r   
dependencydeppkgr   $get_kernel_version_from_meta_packager   s       r   r  zQ_AptChangelog.get_apt_changelog_uri.<locals>.get_kernel_version_from_meta_packageG  s    !.. 	F
!119K9Ky9Xu%F
S#33A6%%)BB!000%%00>66s6{CD?EE	F r   r[   r]   r  r\   r   rb   z@CHANGEPATH@zQ%(component)s%(source_prefix)s/%(source_name)s/%(source_name)s_%(source_version)sr(   rc   )r   source_prefixr   r   )	r5   r   r   r   r   r   r   r   r	  )r   r   r   _source_versionr  s   `   @r   r   z#_AptChangelog.get_apt_changelog_uri;  s2    66	 >>  H,>>%%00>B4>>RO!0-4* >>  H,>>%%7)0DNN& . +11#q9!<N ##N_ NN,,NN,,2 "^^55;8:!%!3!3!5#~~99"0	 		r   r   c                 h    |s| j                   j                  }|j                  d      s|d   S |dd S )z- Return prefix used for build repository URL libr   Nre   )r5   r   r   )r   r   s     r   r	  z_AptChangelog.source_prefixx  s;    ..44K%0%;%;E%B{1~ 	O	r   c                    | j                  |dd      }|red}|j                  j                  dd      d   j                  dd      d   j                  dd      d   j                  d      }|D cg c]@  }|j                         j	                         j                  d	      s1|j                         B }}|sK|D cg c]@  }|j                         j	                         j                  d
      s1|j                         B }}|sK|D cg c]@  }|j                         j	                         j                  d      s1|j                         B }}|r|d   j                         d   S t        rt        d|       yc c}w c c}w c c}w )z Returns filename or None Fr(   zFiles:rb   r   r   z
-----BEGINrl   .debian.tar.xzr|   z.tar.xzz.dsc parse error forN)r   r   r   r   r   r   r   rD   )r   r   r   targetr   r   s         r   	parse_dscz_AptChangelog.parse_dsc  s@   ^^C.FGGMM(A.q177Q?BHHWXYZ[\bbcghE)._A!'')//2C2L2LM]2^aggi_F_-2]aggioo6G6P6PQ[6\!'')]]-2\aggioo6G6P6PQZ6[!'')\\ ay(,,5s; `]\s$   12E=$E=>2F1F2F>Fr   c                 0   d}| j                  |d| j                  j                  d| j                  j                  d      }|rg|re|j	                         j                  d      s|j	                         j                  d      r'|d|}d}| j                  || j                        }nd}|sb| j                  | j                  j                  z   }t        j                  j                  |      s |r|d|}nd}| j                  |      \  }}||fS )z Tries to find a changelog in files listed in .dsc, locally cached
        packages as well as the remote .deb file

        Returns r and uri
        Nrc   rd   z.dscr  r|   )r   )r  r5   r   r   r   r   r   r1   r=   r   r@   rA   rC   r   )r   r   r   target_filenamerh   r   s         r   r   z_AptChangelog.get_changelog_uri  s      ..8T^^E_E_aeaoaoa~a~)  A%%'001AB%%'00<%7C"Os$*D*DEAA%%(?(??C77>>#& #)1?CG"G,,W533xr   F)TTN)r   )i  r   )r   r   r   r!   r   rL   rP   rR   r    r   r   r   staticmethodr   rG   r   r   r   r   r   r   r   r	  r  r   r"   r   r   r$   r$   H   s
   '4 'R
-
eS e4 eNHc HT DHC D d 8 #  s  @ @S  S <4 t B; ;z C &   r   r$   c                     t         rHdd l}t        | j                  j                  d|j                         dt        j                         y y )Nr   z: rl   r*   )r   	tracebackrD   	__class__r   
format_excrE   rF   )r   r  s     r   r   r     s6    AKK00)2F2F2HIPSPZPZ[ r   c                  :    t         rt         j                          yy)z' Drop the apt cache to free up memory. N)apt_changelogrR   r"   r   r   rR   rR     s       " r   FrS   r%   outputpaged_outputrT   r/   c                    d}	 t         st        |       t        |      dkD  rt        |      t         _        nt         j                  t         _        t         j                  | |      }|r5|st         j                  d       |r	 ddlm}  ||       |S t        |       |S # t        $ r}t        |       d}Y d}~|S d}~ww xY w# t        $ r |r Y |S t        $ r t        j                  d       Y |S w xY w)z_ Returns changelog for given package name, if any, and if within
        size-restrictions
    Nr      )pagerF   )r  r   r   r/   r.   r   r   pydocr   r   r   rD   
SystemExitr   rE   r   )	rS   r%   r  r  rT   r/   rj   r   r   s	            r   r   r     s    
 I![! !A%.12C.DM+.;.U.UM+!//(C	 **1-)+)$  i  ! ).q1#(L )   $ !   !s0   A#C B   	C)B<<CC4C43C4c                  <    	 t        j                  | i |S #  Y y xY wr   )__builtins__rD   )argskwargss     r   rD   rD     s'    !!42622s    valuec                     t        |       ay r   )r!   r   )r(  s    r   	set_debugr*    s    %[Fr   c                     t        |       ay)z3 Instantiate _AptChangelog to global apt_changelog N)r$   r  )r%   s    r   r   r     s     "+.Mr   __main__z--debugTz
--no-localr^   a  Usage:  apt changelog [options] <package>

Tries to retrieve the changelog of a package and display it through a pager.
By default it displays the changelog for the version that is installed.
However, you can specify the same options as for the install command.

Options:
        --no-local
            Always retrieve changelogs remotely, where possible. This can be
            useful when the locally installed changelog has been truncated.

Changelog lookup may fail for some packages if source repositories
are not enabledrb   )r%   r  r  rT   )FFFFr   r  )$__doc__r   r   r   r@   rE   r   r   r   	apt.cacher   apt.debfiler   r6   r   r$   r   rR   r    r!   r   r   rD   r*  r   r   r  r   argvremove	_no_localr   r   stdinisattystdoutr"   r   r   <module>r6     sw  !F    	 
     " ) )(j	 j	X\

# EJHI!3 !D !t !!&*!DG!FD / /
 
zCHH$	"sxx%		
388}  	 	!!#;

(9(9(;chhqkvd)	57 r   