
Qc           @   s  d  Z  d d l Z d d l Z d d l Z d d l Z d d l m Z e j Z e j	 Z
 d Z e Z d Z d Z d Z e j e  Z e j e  Z d Z d	   Z d
   Z d   Z d e f d     YZ d e f d     YZ e d  Z d   Z d Z d   Z d   Z d   Z  d   Z! d   Z" d   Z# d   Z$ d d  Z% d   Z& d d  Z( d   Z) i  Z* d   Z+ d   Z, d    Z- e+ d!  d"    Z. e+ d#  d$    Z/ e+ d%  d&    Z0 e+ d'  d(    Z1 e+ d)  d*    Z2 e+ d+  d,    Z3 d d d-  Z4 d S(.   s	  Obsolete markers handling

An obsolete marker maps an old changeset to a list of new
changesets. If the list of new changesets is empty, the old changeset
is said to be "killed". Otherwise, the old changeset is being
"replaced" by the new changesets.

Obsolete markers can be used to record and distribute changeset graph
transformations performed by history rewriting operations, and help
building new tools to reconciliate conflicting rewriting actions. To
facilitate conflicts resolution, markers include various annotations
besides old and news changeset identifiers, such as creation date or
author name.

The old obsoleted changeset is called "precursor" and possible replacements are
called "successors".  Markers that used changeset X as a precursors are called
"successor markers of X" because they hold information about the successors of
X. Markers that use changeset Y as a successors are call "precursor markers of
Y" because they hold information about the precursors of Y.

Examples:

- When changeset A is replacement by a changeset A', one marker is stored:

    (A, (A'))

- When changesets A and B are folded into a new changeset C two markers are
  stored:

    (A, (C,)) and (B, (C,))

- When changeset A is simply "pruned" from the graph, a marker in create:

    (A, ())

- When changeset A is split into B and C, a single marker are used:

    (A, (C, C))

  We use a single marker to distinct the "split" case from the "divergence"
  case. If two independents operation rewrite the same changeset A in to A' and
  A'' when have an error case: divergent rewriting. We can detect it because
  two markers will be created independently:

  (A, (B,)) and (A, (C,))

Format
------

Markers are stored in an append-only file stored in
'.hg/store/obsstore'.

The file starts with a version header:

- 1 unsigned byte: version number, starting at zero.


The header is followed by the markers. Each marker is made of:

- 1 unsigned byte: number of new changesets "R", could be zero.

- 1 unsigned 32-bits integer: metadata size "M" in bytes.

- 1 byte: a bit field. It is reserved for flags used in obsolete
  markers common operations, to avoid repeated decoding of metadata
  entries.

- 20 bytes: obsoleted changeset identifier.

- N*20 bytes: new changesets identifiers.

- M bytes: metadata as a sequence of nul-terminated strings. Each
  string contains a key and a value, separated by a color ':', without
  additional encoding. Keys cannot contain ' ' or ':' and values
  cannot contain ' '.
iN(   t   _i   i    s   >BIB20st   20si   c         c   s`  d } t  d |  | | d ! d } | d 7} | t k rV t j t d  |   n  t |   } x | t | k r[|  | | t !} | t 7} t  t |  \ } } } } d }	 | r t | }
 |  | | |
 !} t  t	 | |  }	 | |
 7} n  |  | | | !} t |  | k r=t j t d  | t |  f   n  | | 7} | |	 | | f Vqe Wd S(   s(   Read and enumerate markers from raw datai    s   >Bi   s+   parsing obsolete marker: unknown version %rsI   parsing obsolete marker: metadata is too short, %d bytes expected, got %dN(    (
   t   _unpackt
   _fmversiont   utilt   AbortR    t   lent   _fmfsizet   _fmfixedt
   _fnodesizet   _fmnode(   t   datat   offt   diskversiont   lt   curt   nbsuct   mdsizet   flagst   pret   sucst   st   metadata(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   _readmarkers   s.    



c         C   s   x\ |  j    D]N \ } } d | k s1 d | k r@ t d   n  d | k r t d   q q Wd j g  t |   D] } d | |  | f ^ qr  S(   sm   Return encoded metadata string to string mapping.

    Assume no ':' in key and no ' ' in both key and value.t   :t    s*   ':' and ' ' are forbidden in metadata key's$   ':' are forbidden in metadata value's   %s:%s(   t	   iteritemst
   ValueErrort   joint   sorted(   t   metat   keyt   valuet   k(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt
   encodemeta   s    c         C   sL   i  } x? |  j  d  D]. } | r | j  d  \ } } | | | <q q W| S(   s8   Return string to string dictionary from encoded version.R   R   (   t   split(   R   t   dR   R   R    (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt
   decodemeta   s    t   markerc           B   s;   e  Z d  Z d   Z d   Z d   Z d   Z d   Z RS(   s   Wrap obsolete marker raw datac         C   s   | |  _  | |  _ d  |  _ d  S(   N(   t   _repot   _datat   Nonet   _decodedmeta(   t   selft   repoR   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   __init__   s    		c         C   s   |  j  d S(   s#   Precursor changeset node identifieri    (   R(   (   R+   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   precnode   s    c         C   s   |  j  d S(   s-   List of successor changesets node identifiersi   (   R(   (   R+   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt	   succnodes   s    c         C   s/   |  j  d k r( t |  j d  |  _  n  |  j  S(   s   Decoded metadata dictionaryi   N(   R*   R)   R%   R(   (   R+   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyR      s    c         C   s7   |  j    d j d  } t | d  t | d  f S(   s#   Creation date as (unixtime, offset)t   datet    i    i   (   R   R#   t   floatt   int(   R+   t   parts(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyR0      s    (   t   __name__t
   __module__t   __doc__R-   R.   R/   R   R0   (    (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyR&      s   				t   obsstorec           B   sV   e  Z d  Z d   Z d   Z d   Z d	 d d
 d  Z d   Z d   Z	 d   Z
 RS(   s   Store obsolete markers

    Markers can be accessed with two mappings:
    - precursors[x] -> set(markers on precursors edges of x)
    - successors[x] -> set(markers on successors edges of x)
    c         C   s\   i  |  _  g  |  _ i  |  _ i  |  _ | |  _ | j d  } | rX |  j t |   n  d  S(   NR8   (   t   cachest   _allt
   precursorst
   successorst   sopenert   tryreadt   _loadR   (   R+   R=   R   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyR-      s    					c         C   s   t  |  j  S(   N(   t   iterR:   (   R+   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   __iter__   s    c         C   s   t  |  j  S(   N(   t   boolR:   (   R+   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   __nonzero__   s    i    c         C   s   | d k r i  } n  d | k r8 d t j   | d <n  t |  d k rY t |   n  x/ | D]' } t |  d k r` t |   q` q` Wt |  t |  t |  t |  f } |  j	 | | g  d S(   s   obsolete: add a new obsolete marker

        * ensuring it is hashable
        * check mandatory metadata
        * encode metadata
        R0   s   %d %di   N(
   R)   R   t   makedateR   R   t   strt   tupleR3   R"   t   add(   R+   t   transactiont   prect   succst   flagR   t   succR&   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   create   s    	*c         C   s   t  s t j d   n  g  | D] } | |  j k r | ^ q } | r |  j d d  } z] | j d t  | j   } | j d |  x* t	 | | d k  D] } | j
 |  q WWd | j   X|  j |  |  j j   n  t |  S(   sp   Add new markers to the store

        Take care of filtering duplicate.
        Return the number of new marker.s,   obsolete feature is not enabled on this repoR8   t   abi    N(   t   _enabledR   R   R:   R=   t   seekt	   _SEEK_ENDt   tellRG   t   _encodemarkerst   writet   closeR?   R9   t   clearR   (   R+   RH   t   markerst   mt   newt   ft   offsett   bytes(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyRG     s    (c         C   s    t  |  } |  j | |  d  S(   N(   R   RG   (   R+   RH   R   RW   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   mergemarkers&  s    c         C   s   x} | D]u } |  j  j |  | d  \ } } |  j j | t    j |  x- | D]% } |  j j | t    j |  qS Wq Wt j |  j k r t	 j
 t d    n  d  S(   Ni   s;   bad obsolescence marker detected: invalid successors nullid(   R:   t   appendR<   t
   setdefaultt   setRG   R;   t   nodet   nullidR   R   R    (   R+   RW   t   markR   R   t   suc(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyR?   *  s    '(    N(   R5   R6   R7   R-   RA   RC   R)   RM   RG   R]   R?   (    (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyR8      s   					c         c   s7   | r t  d t  Vn  x |  D] } t |  Vq Wd  S(   Ns   >B(   t   _packR   t   _encodeonemarker(   RW   t	   addheaderR&   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyRS   5  s    c         C   sb   |  \ } } } } t  |  } t t | } | t  |  | | g } | j |  t | |  | S(   N(   R   R   R
   t   extendRe   (   R&   R   R   R   R   R   t   formatR   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyRf   >  s    i  c   
      C   s   |  j  s i  Si  } g  } t d } xl |  j  D]a } t |  } t |  | t k rq g  } d } | j |  n  | j |  | t |  7} q- WxV t t |   D]B \ } } d j t d t	  g |  }	 t
 j |	  | d | <q W| S(   s   List markers over pushkeyi   i    t    s   >Bs   dump%i(   R8   t   _maxpayloadRf   R   R^   t	   enumeratet   reversedR   Re   R   t   base85t	   b85encode(
   R,   t   keysR4   t
   currentlenR&   t   nextdatat   currentpartt   idxt   partR   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   listmarkersL  s"    	
c         C   s   | j  d  s- |  j j t d  |  d S| rQ |  j j t d  |  d St j |  } |  j   } zF |  j d  } z% |  j j	 | |  | j
   d SWd | j   XWd | j   Xd S(   s   Push markers over pushkeyt   dumps   unknown key: %ri    s   unexpected old values   pushkey: obsolete markersi   N(   t
   startswitht   uit   warnR    Rn   t	   b85decodet   lockRH   R8   R]   RU   t   release(   R,   R   t   oldRY   R   R|   t   tr(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt
   pushmarker`  s     
c      	   C   s   t  r |  j r d | j d  k r g  } |  j d  } xC t | d t D]/ } | | } | j | j d | d |   qL Wg  | D] } | s | ^ q r t d  } |  j j	 |  q n  d S(   sp   utility function to push bookmark to a remote

    Exist mostly to allow overridding for experimentation purposet   obsoletet
   namespacest   reverseRj   s&   failed to push some obsolete markers!
N(
   RO   R8   t   listkeysR   t   TrueR^   t   pushkeyR    Ry   Rz   (   R,   t   remotet   rsltst
   remotedataR   R   t   rt   msg(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   syncpushu  s    
#c         C   s   d } t r |  j j d  | j d  } d | k r |   } xR t | d t D]> } | j d  rS t j	 | |  } |  j
 j | |  qS qS W|  j   q n  | S(   sM  utility function to pull bookmark to a remote

    The `gettransaction` is function that return the pull transaction, creating
    one if necessary. We return the transaction to inform the calling code that
    a new transaction have been created (when applicable).

    Exists mostly to allow overridding for experimentation purposes!   fetching remote obsolete markers
R   t   dump0R   Rw   N(   R)   RO   Ry   t   debugR   R   R   Rx   Rn   R{   R8   R]   t   invalidatevolatilesets(   R,   R   t   gettransactionR   t	   remoteobsR   R   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   syncpull  s    	c         c   s&   x |  j  D] } t |  |  Vq
 Wd S(   s*   all obsolete markers known in a repositoryN(   R8   R&   (   R,   t
   markerdata(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt
   allmarkers  s    c         c   sA   x: |  j  j j j |  j   d  D] } t |  j  |  Vq" Wd S(   s6   obsolete marker marking this changeset as a successorsN(    (   R'   R8   R;   t   getRa   R&   (   t   ctxR   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   precursormarkers  s    (c         c   sA   x: |  j  j j j |  j   d  D] } t |  j  |  Vq" Wd S(   s.   obsolete marker making this changeset obsoleteN(    (   R'   R8   R<   R   Ra   R&   (   R   R   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   successormarkers  s    (c         c   s   t  |  } t  |  } x | r | j   } | Vxo |  j j | d  D]X } | d | @rb qH n  x; | d D]/ } | | k rm | j |  | j |  qm qm WqH Wq Wd S(   s   Yield node for every successor of <nodes>.

    Some successors may be unknown locally.

    This is a linear yield unsuited to detecting split changesets.i   i   N(    (   R`   t   popR<   R   RG   (   R8   t   nodest   ignoreflagst	   remainingt   seent   currentRc   Rd   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   allsuccessors  s    	c            s  |  j    }  t |  j d |   } |  j r |  j j   d } x t |  | k r t |  } t d   | D  } g  | D] } | j   r} | j   ^ q} } | j t	 |  j |     f d   | D } t |  j d |   } qB Wn  t d   | D  S(   sS  return all nodes in the "foreground" of other node

    The foreground of a revision is anything reachable using parent -> children
    or precursor -> sucessor relation. It is very similars to "descendant" but
    augmented with obsolescence information.

    Beware that possible obsolescence cycle may result if complexe situation.
    s   %ln::ic         s   s   |  ] } | j    Vq d  S(   N(   Ra   (   t   .0t   c(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pys	   <genexpr>  s    c         3   s!   |  ] } |   k r | Vq d  S(   N(    (   R   t   n(   t   nm(    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pys	   <genexpr>  s    c         s   s   |  ] } | j    Vq d  S(   N(   Ra   (   R   R   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pys	   <genexpr>  s    (
   t
   unfilteredR`   R8   t	   changelogt   nodemapR   t   mutableRa   t   updateR   (   R,   R   t
   foregroundt   plenRJ   R   R   t   known(    (   R   s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyR     s    		+c         C   s  |  j  j } | g } t |  } | d k r6 i  } n  xC| r{| d } | | k rk | j | j    q9 | | k r | |  k r | f g | | <qxg  | | <q9 xt | |  D]b } xX | d D]I } | | k r | | k r g  | | <q| j |  | j |  Pq q Wq Pq Wg  }	 x t | |  D] } g  g }
 x | d D]~ } g  } xi |
 D]a } xX | | D]L } t	 |  } x* | D]" } | | k r| j |  qqW| j |  qoWq^W| }
 qKW|	 j
 |
  q1Wg  } g  } t d   |	 D d d   d t } xR | D]J \ } } x; | D] } | j |  r)Pq)q)W| j |  | j |  qW| j   | | | <q9 W| | S(   s  Return all set of successors of initial nodes

    Successors set of changeset A are a group of revision that succeed A. It
    succeed A as a consistent whole, each revision being only partial
    replacement.  Successors set contains non-obsolete changeset only.

    In most cases a changeset A have zero (changeset pruned) or a single
    successors set that contains a single successor (changeset A replaced by
    A')

    When changeset is split, it results successors set containing more than
    a single element. Divergent rewriting will result in multiple successors
    sets.

    They are returned as a list of tuples containing all valid successors sets.

    Final successors unknown locally are considered plain prune (obsoleted
    without successors).

    The optional `cache` parameter is a dictionary that may contains
    precomputed successors sets. It is meant to reuse the computation of
    previous call to `successorssets` when multiple calls are made at the same
    time. The cache dictionary is updated in place. The caller is responsible
    for its live spawn. Code that makes multiple calls to `successorssets`
    *must* use this cache mechanism or suffer terrible performances.ii   c         s   s'   |  ] } | r t  |  | f Vq d  S(   N(   R`   (   R   R   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pys	   <genexpr>  s    R   c         S   s   t  |  d  S(   Ni   (   R   (   t   x(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   <lambda>  s    R   N(   R8   R<   R`   R)   t   removeR   R   R^   RG   t   listRh   R   t   issubsetR   (   R,   t   initialnodet   cachet   succmarkerst	   toproceedt
   stackedsetR   Rc   Rd   t	   succssetst   marksst   productresultt   prefixt   suffixt   newssRu   R   t   finalt	   candidatet
   setversiont   listversiont   seenset(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   successorssets  sd    			
!	

c         c   sD   |  j  j j } x. | D]& } | |  } | d k	 r | Vq q Wd S(   sg   yield revision numbers of known nodes passed in parameters

    Unknown revisions are silently ignored.N(   R   R   R   R)   (   R,   R   t   torevR   t   rev(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt
   _knownrevs  s
    c            s     f d   } | S(   sA   Decorator to register a function as computing the cache for a setc            s      t  k s t  |  t    <|  S(   N(   t
   cachefuncst   AssertionError(   t   func(   t   name(    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt	   decorator  s    
(    (   R   R   (    (   R   s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   cachefor  s    c         C   sV   |  j    }  |  j s d S| |  j j k rH t | |   |  j j | <n  |  j j | S(   sy   Return the set of revision that belong to the <name> set

    Such access may compute the set and cache it for future use(    (   R   R8   R9   R   (   R,   R   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   getrevs  s    	c         C   s&   d |  j  k r" |  j j j   n  d S(   s   Remove all obsolescence related cache from a repo

    This remove all cache in obsstore is the obsstore already exist on the
    repo.

    (We could be smarter here given the exact event that trigger the cache
    clearing)R8   N(   t
   _filecacheR8   R9   RV   (   R,   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   clearobscaches  s    	R   c         C   sv   t    } |  j j j } |  j j } xK |  j j D]= } | |  } | d k	 r1 | |  |  r1 | j	 |  q1 q1 W| S(   s   the set of obsolete revisionsN(
   R`   R   R   R   t   _phasecachet   phaseR8   R<   R)   RG   (   R,   t   obst   getrevt   getphaseRa   R   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   _computeobsoleteset  s    	t   unstablec            sH   t  |  d      s t   S|  j } t   f d   | j    D  S(   s7   the set of non obsolete revisions with obsolete parentsR   c         3   s!   |  ] } |   k r | Vq d  S(   N(    (   R   R   (   R   (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pys	   <genexpr>  s    (   R   R`   R   t   descendants(   R,   t   cl(    (   R   s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   _computeunstableset  s
    	t	   suspendedc            s>   |  j  j t |  d     t   f d   t |  d  D  S(   s9   the set of obsolete parents with non obsolete descendantsR   c         3   s!   |  ] } |   k r | Vq d  S(   N(    (   R   R   (   R   (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pys	   <genexpr>  s    R   (   R   t	   ancestorsR   R`   (   R,   (    (   R   s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   _computesuspendedset  s    t   extinctc         C   s   t  |  d  t  |  d  S(   s<   the set of obsolete parents without non obsolete descendantsR   R   (   R   (   R,   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   _computeextinctset  s    t   bumpedc            sh   |  j  j     f d   |  j d  D } t |  j | d t } d } t |  j | t |  |    S(   s3   the set of revs trying to obsolete public revisionsc         3   s   |  ] }   |  Vq d  S(   N(    (   R   R   (   t   tonode(    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pys	   <genexpr>  s    s   public()R   s   %ld - obsolete() - public()(   R   Ra   t   revsR   R8   t	   bumpedfixR`   R   (   R,   t   publicnodesR<   t   query(    (   R   s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   _computebumpedset  s    	t	   divergentc   
      C   s  t    } |  j } i  } x |  j  d  D] } | j j | j   d  } t  |  } x | r | j   d } | | k r t |  | |  n  g  | | D] } | r | ^ q }	 t |	  d k r | j | j	    Pn  | j
 | j j | d   qX Wq( W| S(   sM   the set of rev that compete to be the final successors of some revision.
    s   (not public()) - obsolete()i    i   (    (    (   R`   R8   R;   R   Ra   R   R   R   RG   R   R   (
   R,   R   R8   t   newermapR   Rc   t	   toprocessRI   R   t   newer(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   _computedivergentset  s     			#$c   	      C   s/  | d k r i  } n  d | k r8 d t j   | d <n  d | k rZ |  j j   | d <n  |  j d  } z x | D] \ } } | j   s t j d |   n  | j   } t	 d   | D  } | | k r t j d |   n  |  j
 j | | | | |  |  j j   qs W| j   Wd | j   Xd S(	   s  Add obsolete markers between changesets in a repo

    <relations> must be an iterable of (<old>, (<new>, ...)) tuple.
    `old` and `news` are changectx.

    Trying to obsolete a public changeset will raise an exception.

    Current user and date are used except if specified otherwise in the
    metadata attribute.

    This function operates within a transaction of its own, but does
    not take any lock on the repo.
    R0   s   %i %it   users   add-obsolescence-markers'   cannot obsolete immutable changeset: %sc         s   s   |  ] } | j    Vq d  S(   N(   Ra   (   R   R   (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pys	   <genexpr>,  s    s#   changeset %s cannot obsolete itselfN(   R)   R   RD   Ry   t   usernameRH   R   R   Ra   RF   R8   RM   t   filteredrevcacheRV   RU   R}   (	   R,   t	   relationsRK   R   R   RI   R   t   nprect   nsucs(    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   createmarkers  s(    		(5   R7   t   structR   Rn   Ra   t   i18nR    t   packRe   t   unpackR   RQ   t   FalseRO   R   R   R
   t   calcsizeR   R	   R   R   R"   R%   t   objectR&   R8   RS   Rf   Rk   Rv   R   R   R   R   R   R   R   R   R)   R   R   R   R   R   R   R   R   R   R   R   R   R   (    (    (    s6   /sys/lib/python2.7/site-packages/mercurial/obsolete.pyt   <module>T   sV   $		 	!			[														