ó
3>ANc           @   s  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 d „  Z d e f d „  ƒ  YZ d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ e d k rŒe	 j ƒ  e ƒ  Z x% e D] Z e j d e j ƒ  ƒ qWe d d ƒ Z e j d e ƒ e j e d d ƒ ƒ e j e d d ƒ ƒ n  d S(   iÿÿÿÿN(   t   DistInfo(   t   function_deprecated_byc         C   sž   | j  d ƒ } |  j  d ƒ }  | |  k r. t Sy* | j d ƒ d } |  j d ƒ d } Wn t k
 rl t SXd | k rš | | j d ƒ d | k rš t St S(   sµ    check if the given add_url is idential or a mirror of orig_uri
        e.g. master_uri = archive.ubuntu.com
            compare_uri = de.archive.ubuntu.com
            -> True
    s   / s   //i   t   .(   t   rstript   Truet   splitt
   IndexErrort   Falset   index(   t
   master_urit   compare_urit   compare_srvt
   master_srv(    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt	   is_mirror+   s    c         C   s   t  t |  ƒ ƒ S(   s.    simple and efficient way to return uniq list (   t   listt   set(   t   s(    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   uniqI   s    t   SourceEntryc           B   sP   e  Z d  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 RS(	   s    single sources.list entry c         C   s®   t  |  _ t  |  _ d |  _ g  |  _ d |  _ d |  _ g  |  _ d |  _ | |  _	 | d  k r‚ t j j d ƒ t j j d ƒ } n  | |  _ |  j | ƒ d  |  _ g  |  _ d  S(   Nt    s   Dir::Etcs   Dir::Etc::sourcelist(   R   t   invalidt   disabledt   typet   architecturest   urit   distt   compst   commentt   linet   Nonet   apt_pkgt   configt   find_dirt   findt   filet   parset   templatet   children(   t   selfR   R"   (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   __init__Q   s     												c         C   sX   |  j  | j  k oW |  j | j k oW |  j | j k oW |  j | j k oW |  j | j k S(   s-    equal operator for two sources.list entries (   R   R   R   R   R   (   R&   t   other(    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   __eq__d   s
    c         C   s!  | j  ƒ  } g  } d } t } t } xÔ t t | ƒ ƒ D]À } | | d k rk | rk t } | | | 7} q7 | | d k r’ t } | | | 7} q7 | rÉ | | j ƒ  rÉ t } | j | ƒ | | } q7 | | j ƒ  ré | ré t } q7 | | | 7} q7 Wt | ƒ d k r| j | ƒ n  | S(   s‚    a split() implementation that understands the sources.list
            format better and takes [] into account (for e.g. cdroms) R   t   [t   ]i    (   t   stripR   t   ranget   lenR   t   isspacet   append(   R&   R   t   piecest   tmpt   p_foundt   space_foundt   i(    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   mysplitl   s,    	c         C   sK  |  j  j ƒ  } | d k s' | d k r4 t |  _ d S| d d k r t |  _ | d j ƒ  j ƒ  } | d d k r€ t |  _ d S| d } n  | j d ƒ } | d k rÆ | | d |  _ | |  } n  |  j | ƒ } t	 | ƒ d
 k  rô t |  _ d S| d j ƒ  |  _
 |  j
 d k r#t |  _ d S| d j ƒ  d d k rÕ| j d ƒ j d ƒ j d ƒ } xt | D]i } y | j d d ƒ \ } } Wn t k
 r£t |  _ qeX| d k rÅ| j d ƒ |  _ qet |  _ qeWn  | d j ƒ  |  _ t	 |  j ƒ d k  r	t |  _ n  | d j ƒ  |  _ t	 | ƒ d
 k r>| d
 |  _ n	 g  |  _ d S(   s^    parse a given sources.list (textual) line and break it up
            into the field we have R   t   #Ni    i   t   rpms   rpm-srct   debs   deb-srci   R*   s   []t   ;t   =t   archt   ,i   (   R8   s   rpm-srcR9   s   deb-src(   R9   s   deb-srcR8   s   rpm-src(   R   R,   R   R   R   R   R!   R   R6   R.   R   t   popt	   ExceptionR   R   R   R   (   R&   R   R1   R5   t   optionst   optiont   keyt   value(    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyR#   ‹   sP    					!c         C   s^   | |  _  | r. |  j j ƒ  j d ƒ |  _ n, |  j j ƒ  d d k rZ d |  j |  _ n  d S(   s#    set a line to enabled or disabled R7   i    N(   R   R   t   lstripR,   (   R&   t	   new_value(    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   set_enabledÉ   s
    
c         C   s   |  j  ƒ  j ƒ  S(   s    debug helper (   t   strR,   (   R&   (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   __str__Ô   s    c         C   sØ   |  j  r |  j Sd } |  j r( d } n  | |  j 7} |  j r[ | d d j |  j ƒ 7} n  | d |  j |  j f 7} t |  j	 ƒ d k r§ | d d j |  j	 ƒ 7} n  |  j
 d k rÊ | d |  j
 7} n  | d	 7} | S(
   s#    return the current line as string R   s   # s
    [arch=%s]R=   s    %s %si    t    s    #s   
(   R   R   R   R   R   t   joinR   R   R.   R   R   (   R&   R   (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyRG   Ø   s    				
N(   t   __name__t
   __module__t   __doc__R   R'   R)   R6   R#   RF   RH   RG   (    (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyR   N   s   			>		t   NullMatcherc           B   s   e  Z d  Z d „  Z RS(   s    a Matcher that does nothing c         C   s   t  S(   N(   R   (   R&   R   (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   matchð   s    (   RK   RL   RM   RO   (    (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyRN   í   s   t   SourcesListc           B   sž   e  Z d  Z e d d „ Z d „  Z d „  Z d „  Z d d d g  d „ Z	 d	 „  Z
 d
 „  Z e j ru e e ƒ Z n  d d „ Z d „  Z d „  Z d „  Z RS(   s8    represents the full sources.list + sources.list.d file s    /usr/share/python-apt/templates/c         C   s;   g  |  _  | r! t | ƒ |  _ n t ƒ  |  _ |  j ƒ  d  S(   N(   R   t   SourceEntryMatchert   matcherRN   t   refresh(   R&   t   withMatchert   matcherPath(    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyR'   ÷   s
    	c         C   s™   g  |  _  t j j d ƒ } |  j | ƒ t j j d ƒ } x( t j d | ƒ D] } |  j | ƒ qN Wx- |  j  D]" } | j so |  j j	 | ƒ qo qo Wd S(   s"    update the list of known entries s   Dir::Etc::sourcelists   Dir::Etc::sourcepartss	   %s/*.listN(
   R   R   R   t	   find_filet   loadR    t   globR   RR   RO   (   R&   R"   t   partsdirt   source(    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyRS     s    		c         c   s#   x |  j  D] } | Vq
 Wt ‚ d S(   sM    simple iterator to go over self.list, returns SourceEntry
            types N(   R   t   StopIteration(   R&   t   entry(    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   __iter__  s    	c         /   s[   xT |  j  D]I ‰  t ‡  ‡ f d †  ˆ Dƒ ƒ r
 t ‡  f d †  | Dƒ ƒ r
 ˆ  Vq
 q
 Wd  S(   Nc         3   s(   |  ] } t  ˆ  | ƒ ˆ | k Vq d  S(   N(   t   getattr(   t   .0RB   (   RZ   t   attrs(    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pys	   <genexpr>  s    c         3   s   |  ] } | ˆ  ƒ Vq d  S(   N(    (   R_   t	   predicate(   RZ   (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pys	   <genexpr>  s    (   R   t   all(   R&   t
   predicatesR`   (    (   RZ   R`   s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   __find  s    R   iÿÿÿÿc	            sÿ  t  ˆ  ƒ ‰  | }	 |  j ‡  f d †  d t d t d | d | d | ƒ}
 xW |
 D]O } xF |	 D]> } | | j k r] |	 |	 j | ƒ =t |	 ƒ d k r› | Sq] q] WqP W|  j ‡  f d †  d t d | d | d | ƒ}
 x\ |
 D]T } | j rt  | j ƒ |	 k rt | _ | S| j sÚ t | j |	 ƒ | _ | SqÚ W| } ˆ  rX| d	 d
 j ˆ  ƒ 7} n  | d | | f 7} x |	 D] } | d | } qsW| d k rªd | | f } n  | d } t	 | ƒ } | d k	 rØ| | _ n  |  j j | ƒ |  j j | | ƒ | S(   s¨   
        Add a new source to the sources.list.
        The method will search for existing matching repos and will try to
        reuse them as far as possible
        c            s   t  |  j ƒ ˆ  k S(   N(   R   R   (   R   (   R   (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   <lambda>(  s    R   R   R   R   R   i    c            s   t  |  j ƒ ˆ  k S(   N(   R   R   (   R   (   R   (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyRe   5  s    s
    [arch=%s]R=   s    %s %sRI   R   s   %s #%s
s   
N(   R   t   _SourcesList__findR   R   R   R.   R   R   RJ   R   R   R"   RR   RO   R   t   insert(   R&   R   R   R   t
   orig_compsR   t   posR"   R   R   t   sourcesRZ   t   new_compR   t   ct	   new_entry(    (   R   s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   add  sF    			
c         C   s   |  j  j | ƒ d S(   s2    remove the specified entry from the sources.list N(   R   t   remove(   R&   t   source_entry(    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyRo   R  s    c         C   s²   t  j j d ƒ } t j j | | ƒ rQ t j j | ƒ rQ t j | | | ƒ n  t  j j d ƒ } xH t	 j	 d | ƒ D]3 } t j j | | ƒ rw t j | | | ƒ qw qw Wd S(   s:    restore sources.list files based on the backup extension s   Dir::Etc::sourcelists   Dir::Etc::sourcepartss	   %s/*.listN(
   R   R   RV   t   ost   patht   existst   shutilt   copyR    RX   (   R&   t
   backup_extR"   RY   (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   restore_backupV  s    c         C   s†   t  ƒ  } | d k r' t j d ƒ } n  xX |  j D]M } | j | k r1 t j j | j ƒ r1 t	 j
 | j d | j | f ƒ q1 q1 W| S(   s†    make a backup of the current source files, if no backup extension
            is given, the current date/time is used (and returned) s   %y%m%d.%H%Ms   %s%sN(   R   R   t   timet   strftimeR   R"   Rq   Rr   Rs   Rt   Ru   (   R&   Rv   t   already_backupedRZ   (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   backupe  s    	'c         C   sn   yL t  | d ƒ 7 } x- | D]% } t | | ƒ } |  j j | ƒ q WWd QXWn t j j d | ƒ n Xd S(   s    (re)load the current sources t   rNs   could not open file '%s'
(   t   openR   R   R0   t   syst   stderrt   write(   R&   R"   t   fR   RZ   (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyRW   q  s    c         C   sà   i  } t  |  j ƒ d k r\ t j j d ƒ } d } t | d ƒ  } | j | ƒ Wd QXd Sz] xV |  j D]K } | j | k rš t | j d ƒ | | j <n  | | j j | j ƒ  ƒ qi WWd x | D] } | | j	 ƒ  qÃ WXd S(   s    save the current sources i    s   Dir::Etc::sourcelists    ## See sources.list(5) for more information, especialy
# Remember that you can only use http, ftp or file URIs
# CDROMs are managed through the apt-cdrom tool.
t   wN(
   R.   R   R   R   RV   R}   R€   R"   RG   t   close(   R&   t   filesRr   t   headerR   RZ   (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   save{  s    "c         C   s¬   g  } i  } x“ | D]‹ } | j  d k r. q n  | j  j rv | j  } | | k r\ g  | | <n  | | } | j | ƒ q t | j  j ƒ d k r | j | ƒ q q W| | f S(   s5   get all parent and child channels in the sources listi    N(   R$   R   t   childR0   R.   R%   (   R&   t   sources_listt   parentst   used_child_templatesRZ   RB   t   temp(    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   check_for_relations“  s    	
N(   RK   RL   RM   R   R'   RS   R]   Rf   R   Rn   Ro   Rw   R   t   _COMPAT_0_7R   t   restoreBackupR{   RW   R†   RŒ   (    (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyRP   ô   s   			5				
	RQ   c           B   s    e  Z d  Z d „  Z d „  Z RS(   s}    matcher class to make a source entry look nice
        lots of predefined matchers to make it i18n/gettext friendly
        c         C   s§   g  |  _  t j d | ƒ } x„ | D]| } t j j | ƒ } | j d ƒ } | d | !} t | d | ƒ} x3 | j  D]( } | j d  k	 rs |  j  j	 | ƒ qs qs Wq# Wd  S(   Ns	   %s/*.infos   .infoi    t   base_dir(
   t	   templatesRX   Rq   Rr   t   basenameR!   R    t	   match_uriR   R0   (   R&   RU   t
   spec_filesR   R5   R   R$   (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyR'   ±  s    	c         C   sÈ   t  j  } t } x² |  j D]§ } t j | j | j ƒ rƒ t j | j | j	 ƒ rƒ | j
 | j
 k sp | j
 d k rƒ t } | | _ Pq | j | j ƒ r t j | j | j	 ƒ r t } | | _ Pq q W| S(   s%   Add a matching template to the sourceR9   (   t   gettextR   R   t   ret   searchR’   R   RO   t
   match_nameR   R   R   R$   R   (   R&   RZ   t   _t   foundR$   (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyRO   ¿  s    	!		(   RK   RL   RM   R'   RO   (    (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyRQ   ¬  s   	t   __main__s   entry %ss!   http://archive.ubuntu.com/ubuntu/s$   http://de.archive.ubuntu.com/ubuntu/s   is_mirror(): %ss    http://archive.ubuntu.com/ubuntus#   http://de.archive.ubuntu.com/ubuntu(   R”   RX   t   loggingt   os.pathRq   R•   Rt   R~   Rx   R   t   aptsources.distinfoR    t   apt.deprecationR   R   R   t   objectR   RN   RP   RQ   RK   t   init_configRj   R\   t   infoRG   t   mirror(    (    (    s;   /usr/lib/python2.7/dist-packages/DistUpgrade/sourceslist.pyt   <module>   s8   		Ÿ¸)
		
