3
Zb                 @   s  d Z ddlm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 yeZW n ek
rt   eZY nX G dd deZG dd deZG d	d
 d
eZG dd dejZG dd deZejdddi ejZejdZejdZejdZejdZejdejZejdejZejdejZejdejZ ejdejZ!ejdZ"ejdZ#ejdZ$ejdejZ%ejdejZ&ejd Z'ejd!Z(ejd"ejZ)ejd#ejZ*ejd$ejZ+ejd%ejZ,ejd&ejZ-ejd'Z.G d(d) d)eZ/d*d+ Z0dS ),zAThis module implements facilities to deal with Debian changelogs.    )absolute_importN)debian_supportc               @   s$   e Zd ZdZdZdd Zdd ZdS )ChangelogParseErrorz0Indicates that the changelog could not be parsedTc             C   s
   || _ d S )N)_line)selfline r   2/usr/lib/python3/dist-packages/debian/changelog.py__init__2   s    zChangelogParseError.__init__c             C   s
   d| j  S )NzCould not parse changelog: )r   )r   r   r   r	   __str__5   s    zChangelogParseError.__str__N)__name__
__module____qualname____doc__is_user_errorr
   r   r   r   r   r	   r   .   s   r   c               @   s   e Zd ZdZdS )ChangelogCreateErrorz`Indicates that changelog could not be created, as all the information
    required was not givenN)r   r   r   r   r   r   r   r	   r   8   s   r   c               @   s$   e Zd ZdZdZdd Zdd ZdS )VersionErrorzBIndicates that the version does not conform to the required formatTc             C   s
   || _ d S )N)_version)r   versionr   r   r	   r
   A   s    zVersionError.__init__c             C   s
   d| j  S )NzCould not parse version: )r   )r   r   r   r	   r   D   s    zVersionError.__str__N)r   r   r   r   r   r
   r   r   r   r   r	   r   <   s   r   c               @   s   e Zd ZdZdS )Versionz)Represents a version of a Debian package.N)r   r   r   r   r   r   r   r	   r   I   s   r   c            
   @   s   e Zd ZdZdddZdd Zdd	 ZeeeZd
d Z	dd Z
dd Zdd Zdd Zedd Zedd Zdd ZejdkreZdd ZneZdd ZdS ) ChangeBlockz=Holds all the information about one block from the changelog.Nutf-8c             C   sh   d | _ | j| || _|| _|p"d| _|p,d| _|| _|| _|| _g | _	|	pNi | _
|
| _d| _d| _d S )Nunknown Fz  )_raw_version_set_versionpackagedistributionsurgencyurgency_comment_changesauthordate	_trailingother_pairs	_encoding_no_trailer_trailer_separator)r   r   r   r   r   r   changesr!   r"   r$   encodingr   r   r	   r
   P   s    



zChangeBlock.__init__c             C   s   |d k	rt || _d S )N)strr   )r   r   r   r   r	   r   b   s    zChangeBlock._set_versionc             C   s
   t | jS )N)r   r   )r   r   r   r	   _get_versionf   s    zChangeBlock._get_versionc             C   s\   i }xRt j D ]F\}}|d j |dd  j  }tj|}|d krLd| }|||< qW |S )Nr      zXS-%s)r$   itemsupperlowerxbcs_rematch)r   Z	norm_dictkeyvaluemr   r   r	   other_keys_normalisedk   s    
z!ChangeBlock.other_keys_normalisedc             C   s   | j S )N)r    )r   r   r   r	   r(   u   s    zChangeBlock.changesc             C   s   | j j| d S )N)r#   append)r   r   r   r   r	   add_trailing_linex   s    zChangeBlock.add_trailing_linec             C   s   | j d kr|g| _ nl| j }|j  d}x<tt|D ],}tj|| }|d kr4|j|| d}P q4W |j  |sz|j| || _ d S )NFT)r    reverserangelen	blankliner1   insertr6   )r   changer(   Zaddedir4   r   r   r	   
add_change{   s    


zChangeBlock.add_changec             C   sb   t jdj| j}g }xF|j|D ]8}|jd}x(tjd|D ]}|jt|jd q>W q"W |S )N r   z\d+)	sixujoinr    finditergrouprer6   int)r   Ztype_rer(   Zbugsr1   Zcloses_listr   r   r	   _get_bugs_closed_generic   s    
z$ChangeBlock._get_bugs_closed_genericc             C   s
   | j tS )N)rH   closes)r   r   r   r	   bugs_closed   s    zChangeBlock.bugs_closedc             C   s
   | j tS )N)rH   closeslp)r   r   r   r	   lp_bugs_closed   s    zChangeBlock.lp_bugs_closedc             C   s`  d}| j d krtd|| j d 7 }| jd kr6td|d| j d 7 }| jd krZtd|| jd 7 }| jd krztd	|d
| j | j 7 }x&| jj D ]\}}|d||f 7 }qW |d7 }| j d krtdx| j D ]}||d 7 }qW | j	s>| j
d krtd| jd kr td|d| j
 | j | j d 7 }x| jD ]}||d 7 }qFW |S )Nr   zPackage not specifiedr@   zVersion not specified(z) zDistribution not specifiedz; zUrgency not specifiedzurgency=z, %s=%s
zChanges not specifiedzAuthor not specifiedzDate not specifiedz -- )r   r   r   r   r   r   r$   r-   r(   r&   r!   r"   r'   r#   )r   blockr2   r3   r=   r   r   r   r	   _format   s<    



zChangeBlock._format3c             C   s   t | j| jS )N)r*   encoder%   )r   r   r   r	   	__bytes__   s    zChangeBlock.__bytes__c             C   s   t | j| jS )N)unicoderR   r%   )r   r   r   r	   r      s    zChangeBlock.__str__)
NNNNNNNNNr   )r   r   r   r   r
   r   r+   propertyr   r5   r(   r7   r?   rH   rJ   rL   rP   sysr   rS   __unicode__r   r   r   r	   r   M   s(     


	!

r   z?^(\w%(name_chars)s*) \(([^\(\) \t]+)\)((\s+%(name_chars)s+)+)\;Z
name_charsz[-+0-9a-z.]z^\s*$z	^\s\s+.*$z[^ -- (.*) <(.*)>(  ?)((\w+\,\s*)?\d{1,2}\s+\w+\s+\d{4}\s+\d{1,2}:\d\d:\d\d\s+[-+]\d{4}\s*)$z`^ --(?: (.*) <(.*)>(  ?)((\w+\,\s*)?\d{1,2}\s+\w+\s+\d{4}\s+\d{1,2}:\d\d:\d\d\s+[-+]\d{4}))?\s*$z^([-0-9a-z]+)=\s*(.*\S)$z^([-0-9a-z]+)((\s+.*)?)$z	^X[BCS]+-z^(;;\s*)?Local variables:z^vim:z^\$\w+:.*\$z^\# z	^/\*.*\*/z5closes:\s*(?:bug)?\#?\s?\d+(?:,\s*(?:bug)?\#?\s?\d+)*zlp:\s+\#\d+(?:,\s*\#\d+)*zW^(\w+\s+\w+\s+\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}\s+[\w\s]*\d{4})\s+(.*)\s+(<|\()(.*)(\)|>)z:^(\w+\s+\w+\s+\d{1,2},?\s*\d{4})\s+(.*)\s+(<|\()(.*)(\)|>)z&^(\w[-+0-9a-z.]*) \(([^\(\) \t]+)\)\;?z"^([\w.+-]+)(-| )(\S+) Debian (\S+)z#^Changes from version (.*) to (.*):z$^Changes for [\w.+-]+-[\w.+-]+:?\s*$z^Old Changelog:\s*$z^(?:\d+:)?\w[\w.+~-]*:?\s*$c               @   st  e Zd ZdZdAddZdd ZdBd
dZdd Zdd Ze	eeddZ
e	dd Ze	dd Ze	dd Ze	dd Ze	dd Zdd Zdd Ze	eeddZdd Ze	eddZd d! Zd"d# Zej
d$kreZd%d& ZneZd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Ze	d1d eZd2d3 Z e	d4d e Z!d5d6 Z"d7d8 Z#e	d9d e#Z$d:d; Z%e	d<d e%Z&d=d> Z'd?d@ Z(dS )C	Changelogz#Represents a debian/changelog file.NFutf-8c             C   s0   || _ g | _g | _|dk	r,| j||||d dS )a  Initializer.

        Args:
          file: The contents of the changelog, either as a str, unicode object,
              or an iterator of lines (each of which is either a str or unicode)
          max_blocks: The maximum number of blocks to parse from the input.
              (Default: no limit)
          allow_empty_author: Whether to allow an empty author in the trailer
              line of a change block.  (Default: False)
          strict: Whether to raise an exception if there are errors.  (Default:
              use a warning)
          encoding: If the input is a str or iterator of str, the encoding to
              use when interpreting the input.
        N)
max_blocksallow_empty_authorstrict)r%   _blocksinitial_blank_linesparse_changelog)r   filerZ   r[   r\   r)   r   r   r	   r
      s    zChangelog.__init__c             C   s   |rt |n
tj| d S )N)r   warningswarn)r   messager\   r   r   r	   _parse_error  s    
zChangelog._parse_errorTc       #      C   sZ  d}d}d}d}	d}
|p| j }|d kr6| jd| d S g | _g | _t|d}g }|}d }t|trl|j|}t|tj	rt
|j dkr| jd| d S |j }xb|D ]X}t|tjs|j|}|jd	}||ks||kr tj|}tj|}|d k	rV|d k	rt
| j|krd S |jd
|_|jd|_|jdj |_|jdd
d
 }i }i }x|jdD ]}|j }tj|}|d kr| jd| | qh|jd
}|jd}|j |kr| jd|j  | |||j < |j dkr:tj|}|d kr| jd| | n&|jd
|_|jd}|d k	rB||_n|||< qhW ||_|}q|d k	r||krx| jj| n| jd j| qt j|}t!j|}t"j|}t#j|}t$j|}|d k	s|d k	r||kr| jd j| |}|
}q|d k	s|d k	s|d k	r>||kr,| jj| q| jd j| qt%j|d k	st&j|d k	st'j|d k	st(j|d k	st)j|d k	st*j|d k	st+j|d k	st,j|d k	r||kr| jd j| |}|
}q| jd||f | ||kr| jj| n| jd  j| q||ks4||	krt-j|} t.j|}!t/j|}"tj|}| d k	rx|j| |	}q|!d k	r|!jddkr| jd| | |!jd|_0d|!jd
|!jdf |_1|!jd|_2||_3| jj| g }t|d}|}n|"d k	rB|s| jd| | q||_3| jj| g }t|d}|}n||d k	rX|j| nft"j|}t#j|}t$j|}|d k	s|d k	s|d k	r|j| q| jd||f | |j| q||
kr||kr| jd! j| n
|j| qdst4d| qW ||kr||
ks.||
krV||krV| jd| | ||_3d|_5| jj| d S )"Nzfirst headingznext heading of EOFzstart of change datazmore change data or trailerzslurp to endzEmpty changelog file.)r)   r   rN   r,         ;,z$Invalid key-value pair after ';': %szRepeated key-value: %sr   z!Badly formatted urgency value: %sz(Unexpected line while looking for %s: %sz  z Badly formatted trailer line: %sz%s <%s>   FzUnknown state: %szFound eof where expected %sTrj   rj   rj   rj   rj   )6r%   rd   r]   r^   r   
isinstancebytesdecoderA   Zstring_typesr:   strip
splitlines	text_typerstriptopliner1   r;   rE   r   r   lstripr   splitkeyvaluer/   value_rer   r   r$   r6   r7   emacs_variablesvim_variablescvs_keywordcommentsmore_commentsold_format_re1old_format_re2old_format_re3old_format_re4old_format_re5old_format_re6old_format_re7old_format_re8r=   endlineendline_nodetailsr'   r!   r"   r    AssertionErrorr&   )#r   r`   rZ   r[   r\   r)   Zfirst_headingZnext_heading_or_eofZstart_of_change_dataZmore_changes_or_trailerZslurp_to_endZcurrent_blockr(   stateZ	old_stater   Z	top_matchZblank_matchZpairsZall_keysr$   ZpairZkv_matchr2   r3   Z	val_matchZcommentZemacs_matchZ	vim_matchZ	cvs_matchZcomments_matchZmore_comments_matchZchange_matchZ	end_matchZend_no_details_matchr   r   r	   r_     s>   





















































zChangelog.parse_changelogc             C   s   | j d jS )z,Return a Version object for the last versionr   )r]   r   )r   r   r   r	   get_version  s    zChangelog.get_versionc             C   s   t || jd _dS )zwSet the version of the last changelog block

        version can be a full version string, or a Version object
        r   N)r   r]   r   )r   r   r   r   r	   set_version  s    zChangelog.set_versionz'Version object for last changelog block)docc             C   s   | j jS )N)r   full_version)r   r   r   r	   <lambda>  s    zChangelog.<lambda>c             C   s   | j jS )N)r   epoch)r   r   r   r	   r     s    c             C   s   | j jS )N)r   debian_revision)r   r   r   r	   r     s    c             C   s   | j jS )N)r   r   )r   r   r   r	   r     s    c             C   s   | j jS )N)r   upstream_version)r   r   r   r	   r     s    c             C   s   | j d jS )z4Returns the name of the package in the last version.r   )r]   r   )r   r   r   r	   get_package  s    zChangelog.get_packagec             C   s   || j d _d S )Nr   )r]   r   )r   r   r   r   r	   set_package  s    zChangelog.set_packagez'Name of the package in the last versionc             C   s   dd | j D S )z@Returns a list of version objects that the package went through.c             S   s   g | ]
}|j qS r   )r   ).0rO   r   r   r	   
<listcomp>  s    z*Changelog.get_versions.<locals>.<listcomp>)r]   )r   r   r   r	   get_versions  s    zChangelog.get_versionsz0List of version objects the package went throughc             C   s   dd | j D S )Nc             S   s   g | ]
}|j qS r   )r   )r   rO   r   r   r	   r     s    z+Changelog._raw_versions.<locals>.<listcomp>)r]   )r   r   r   r	   _raw_versions  s    zChangelog._raw_versionsc             C   sL   g }|j tjdj| j x| jD ]}|j tj| q$W tjdj|S )NrN   r   )r6   rA   rB   rC   r^   r]   rp   )r   piecesrO   r   r   r	   rP     s
    zChangelog._formatrQ   c             C   s   t | j| jS )N)r*   rR   r%   )r   r   r   r	   rS     s    zChangelog.__bytes__c             C   s   t | j| jS )N)rT   rR   r%   )r   r   r   r	   r     s    zChangelog.__str__c             C   s
   t | jS )N)iterr]   )r   r   r   r	   __iter__  s    zChangelog.__iter__c             C   s@   t |tkr| j| S t |tkr.| t| S | j| jj| S )z select a changelog entry by number, version string, or Version

        :param n: integer or str representing a version or Version object
        )typerG   r]   r*   r   versionsindex)r   nr   r   r	   __getitem__
  s
    
zChangelog.__getitem__c             C   s
   t | jS )N)r:   r]   )r   r   r   r	   __len__  s    zChangelog.__len__c             C   s   || j d _d S )Nr   )r]   r   )r   r   r   r   r	   set_distributions  s    zChangelog.set_distributionsc             C   s   | j d jS )Nr   )r]   r   )r   r   r   r	   r     s    c             C   s   || j d _d S )Nr   )r]   r   )r   r   r   r   r	   set_urgency  s    zChangelog.set_urgencyc             C   s   | j d jS )Nr   )r]   r   )r   r   r   r	   r     s    c             C   s   | j d j| d S )Nr   )r]   r?   )r   r=   r   r   r	   r?   !  s    zChangelog.add_changec             C   s   || j d _d S )Nr   )r]   r!   )r   r!   r   r   r	   
set_author$  s    zChangelog.set_authorc             C   s   | j d jS )Nr   )r]   r!   )r   r   r   r	   r   &  s    c             C   s   || j d _d S )Nr   )r]   r"   )r   r"   r   r   r	   set_date(  s    zChangelog.set_datec             C   s   | j d jS )Nr   )r]   r"   )r   r   r   r	   r   *  s    c             K   s4   |j d| j tf |}|jd | jjd| d S )Nr)   r   r   )
setdefaultr%   r   r7   r]   r<   )r   kwargsrO   r   r   r	   	new_block,  s    

zChangelog.new_blockc             C   s   |j | j  d S )N)writer   )r   r`   r   r   r	   write_to_open_file2  s    zChangelog.write_to_open_file)NNFFrY   )NFTN))r   r   r   r   r
   rd   r_   r   r   rU   r   r   r   Zdebian_versionr   r   r   r   r   r   r   r   rP   rV   r   rS   rW   r   r   r   r   r   r   r   r?   r   r!   r   r"   r   r   r   r   r   r	   rX      sZ    
 
 7

rX   c              C   s  t j} tjd}d| krN|j| d }|rNd| kr@|jd| d< |jd| d< d| ks^d| krd| kr|j| d }|rd| kr|jd| d< |jd| d< d| kr| d }nNd| kr| d }n<ytjdd	tjt j	 j
}W n ttfk
r   d
}Y nX d| kr| d }nd| kr$| d }nd
}t jjdrZtd}z|j j }W d
|j  X |shtj }|rtjt j	 j}|sd
}nd||f }|r|}nd
}||fS )a  Get the maintainer information in the same manner as dch.

    This function gets the information about the current user for
    the maintainer field using environment variables of gecos
    informations as approriate.

    It uses the same methods as dch to get the information, namely
    DEBEMAIL, DEBFULLNAME, EMAIL, NAME, /etc/mailname and gecos.

    :returns: a tuple of the full name, email pair as strings.
        Either of the pair may be None if that value couldn't
        be determined.
    z^(.*)\s+<(.*)>$ZDEBEMAILZDEBFULLNAMEr,   re   ZEMAILNAMEz,.*r   Nz/etc/mailnamez%s@%s)osenvironrF   compiler1   rE   subpwdgetpwuidgetuidZpw_gecosKeyErrorAttributeErrorpathexistsopenreadlinern   closesocketZgetfqdnZpw_name)envZregexZ	match_objZ
maintainerZemailZaddrfuserr   r   r	   get_maintainer6  sX    








r   )1r   Z
__future__r   r   r   rF   r   ra   rV   rA   Zdebianr   ZStandardErrorZ_base_exception_class	NameError	Exceptionr   r   r   r   objectr   r   
IGNORECASErr   r;   r=   r   r   ru   rv   r0   rw   rx   ry   rz   r{   rI   rK   r|   r}   r~   r   r   r   r   r   rX   r   r   r   r   r	   <module>   sh   











  E