ó
Ú0f^c           @   s;  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 Z d Z d Z	 d Z
 d Z e j d e j d ƒ e j d	 ƒ d
 Z d d „ Z d d „ Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d S(   s%   
Test framework for cvs-fast-export.
iÿÿÿÿNi   i   i   i   i    t   PATHs   ..s   Latin-1t    c         C   s  | r d | } n  t  j j t j d ƒ } t t k rX t j j d | |  | f ƒ n  y€ t	 j
 |  d t ƒ} | d k  rª t j j d | |  | f ƒ t j d ƒ n- | d k r× t j j d | |  | f ƒ t SWn: t t f k
 r} t j j d | |  | | f ƒ t SXt S(	   s4   Either execute a command or raise a fatal exception.t    i    s   %s: executing '%s'%s
t   shells$   %s: %s was terminated by signal %d.
i   s   %s: %s returned %d.
s!   %s: execution of %s%s failed: %s
(   t   ost   patht   basenamet   syst   argvt   verboset   DEBUG_COMMANDSt   stdoutt   writet
   subprocesst   callt   Truet   stderrt   exitt   Falset   OSErrort   IOError(   t   dcmdt   legendt   callert   retcodet   e(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt	   noisy_run   s"      c         C   s  | r d | } n  t  j j t j d ƒ } t t k rX t j j d | |  | f ƒ n  y3 t	 j
 |  d t d t	 j ƒj ƒ  d j t ƒ SWn‚ t	 j k
 r} | j d k  rÐ t j j d | | j f ƒ n/ | j d k rÿ t j j d | | j f ƒ n  t j d ƒ n Xd	 S(
   s7   Either execute a command and capture its output or die.R   i    s   %s: executing '%s'%s
R   R   s&   %s: child was terminated by signal %d.s   %s: child returned %d.i   N(   R   R   R   R   R   R	   R
   R   R   R   t   PopenR   t   PIPEt   communicatet   decodet   binary_encodingt   CalledProcessErrort
   returncodeR   R   (   R   R   R   R   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   capture_or_die'   s     3! t   directory_contextc           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C   s   | |  _  d  |  _ d  S(   N(   t   targett   Nonet   source(   t   selfR$   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   __init__8   s    	c         C   sm   t  t k r2 t j j d t j j |  j ƒ ƒ n  t j	 ƒ  |  _
 t j j |  j ƒ ri t j |  j ƒ n  d  S(   Ns   In %s: (   R	   R
   R   R   R   R   R   t   relpathR$   t   getcwdR&   t   isdirt   chdir(   R'   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt	   __enter__;   s
    &c         C   s   t  j |  j ƒ d  S(   N(   R   R,   R&   (   R'   t   extypet   value_unusedt   traceback_unused(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   __exit__A   s    (   t   __name__t
   __module__R(   R-   R1   (    (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR#   7   s   		t   RCSRepositoryc           B   s€   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 d „ Z d
 d „ Z d „  Z RS(   s   An RCS file collection.c         C   sC   | |  _  t |  _ t j j t j ƒ  |  j  d ƒ |  _ g  |  _ d  S(   Nt   module(	   t   nameR   t   retainR   R   t   joinR*   t	   directoryt   conversions(   R'   R6   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR(   F   s    		$c         C   s6   t  | ƒ s2 |  j s" |  j ƒ  n  t j d ƒ n  d  S(   Ni   (   R   R7   t   cleanupR   R   (   R'   t   cmd(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   run_with_cleanupL   s    	c         G   sl   t  t k  r d } n d } t d |  j | | d j | ƒ f ƒ rh |  j rh |  j ƒ  t j d ƒ n  d S(   s.   Execute a RCS command in context of this repo.s   -qR   s   cd %s && %s %s %sR   i   N(	   R	   t	   DEBUG_VCSR   R9   R8   R7   R;   R   R   (   R'   R<   t   argst   mute(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   doQ   s    	3
c         C   s   |  j  d j |  j ƒ ƒ d S(   s   Initialize the repository.s   rm -fr {0} && mkdir -p {0}N(   R=   t   formatR9   (   R'   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   initZ   s    c      
   C   sh   t  t k r) t j j d | | f ƒ n  t |  j ƒ * t | d ƒ  } | j | ƒ Wd QXWd QXd S(   s&   Create file content in the repository.s   %s <- %st   wN(   R	   R
   R   R   R   R#   R9   t   open(   R'   t   fnt   contentt   fp(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR   ]   s
    c         C   s   |  j  d d d | ƒ d S(   s)   Add a file to the version-controlled set.t   rcss   -t-s   -iN(   RA   (   R'   t   filename(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   addd   s    c         C   s   |  j  d d | d | ƒ d S(   s!   Create a tag on a specified file.RI   s   -nt   :N(   RA   (   R'   RJ   R6   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   tagg   s    c         C   s   |  j  d d | ƒ d S(   s1   Check out a writeable copy of the specified file.t   cos   -lN(   RA   (   R'   RJ   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   checkoutj   s    c         C   s   |  j  d d | | f ƒ d S(   s'   Check in changes to the specified file.t   cis	   -m'%s' %sN(   RA   (   R'   RJ   t   message(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   checkinm   s    R   c         C   s8   d t  t d } |  j d j |  j | | | ƒ ƒ d  S(   Ns   -v i   s6   find -L {0} -name "*,v" | cvs-fast-export {1} {2} >{3}(   R	   t   DEBUG_LIFTERR=   RB   R9   (   R'   t   _modulet   _gitdirt   outfilet	   more_optst   vopt(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   streamp   s    c         C   s‚   d | } |  j  | | | | ƒ |  j d j | ƒ ƒ |  j d j |  j | | ƒ ƒ |  j j | ƒ |  j s~ t j | ƒ n  d S(   s   Convert the repo.s	   %s.git.fis/   rm -fr {0} && mkdir {0} && git init --quiet {0}sM   cat {2} | (cd {1} >/dev/null; git fast-import --quiet --done && git checkout)N(	   RY   R=   RB   R9   R:   t   appendR7   R   t   remove(   R'   R5   t   gitdirRW   t
   streamfile(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   convertt   s    
	c         C   s9   |  j  s5 |  j r5 t j d d j |  j ƒ ƒ q5 n  d S(   s$   Clean up the repository conversions.s	   rm -fr %sR   N(   R7   R:   R   t   systemR8   (   R'   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR;   }   s    		(   R2   R3   t   __doc__R(   R=   RA   RC   R   RK   RM   RO   RR   RY   R^   R;   (    (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR4   D   s   											t   CVSRepositoryc           B   sD   e  Z e d  „ Z d „  Z d „  Z d „  Z d d „ Z d „  Z	 RS(   c         C   sP   t  j |  | ƒ | |  _ t j j t j ƒ  |  j ƒ |  _ g  |  _	 g  |  _
 d  S(   N(   R4   R(   t   readonlyR   R   R8   R*   R6   R9   t	   checkoutsR:   (   R'   R6   Rb   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR(   „   s
    	!	c         G   s`   t  t k  r d } n d } |  j r- d } n d } |  j d | | |  j d j | ƒ f ƒ d S(   s.   Execute a CVS command in context of this repo.s   -QR   s   CVSREADONLYFS=yes s   %scvs %s -d:local:%s %sR   N(   R	   R>   Rb   R=   R9   R8   (   R'   R<   R@   t   prefix(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyRA   Š   s    			c         C   s   t  j |  ƒ |  j d ƒ d  S(   NRC   (   R4   RC   RA   (   R'   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyRC   —   s    c         C   sL   t  j j |  j | ƒ } t t k r; t j j d | ƒ n  t  j	 | ƒ d S(   s-   Create an empty module with a specified name.s   Creating module %s
N(
   R   R   R8   R9   R	   R
   R   R   R   t   mkdir(   R'   t   mnameR5   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR5   š   s    c         C   s'   |  j  j t |  | | ƒ ƒ |  j  d S(   s   Create a checkout of this repo.iÿÿÿÿ(   Rc   RZ   t   CVSCheckout(   R'   R5   RO   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyRO       s    c         C   s;   |  j  s7 t j |  ƒ x |  j D] } | j ƒ  q  Wn  d S(   s-   Clean up the repository checkout directories.N(   R7   R4   R;   Rc   (   R'   RO   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR;   ¤   s    	N(
   R2   R3   R   R(   RA   RC   R5   R%   RO   R;   (    (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyRa   ƒ   s   			Rg   c           B   s’   e  Z d  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d d „ Z
 d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s   -proxyc         C   s‰  | |  _  | p d |  _ | p! | |  _ d  |  _ t j j |  j  j t j	 d ƒ s|  j  j
 t j |  _ y t j |  j ƒ Wn t k
 r n Xt j |  j ƒ t j |  j  j |  j t j	 |  j ƒ t j |  j t j	 d ƒ |  j  j
 t j 7_
 |  j  j t j 7_ n  |  j  j d |  j ƒ | rdt j j | ƒ rNt j | ƒ n  t j |  j | ƒ n  t j j t j ƒ  |  j ƒ |  _ d  S(   NR5   t   CVSROOTRN   (   t   repoR5   RO   R%   t   proxyR   R   t   existsR9   t   sepR6   Rg   t   PROXYSUFFIXt   shutilt   rmtreeR   Re   t   symlinkRA   t   renameR8   R*   (   R'   Ri   R5   RO   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR(   ­   s*    		#'c         G   s7   t  |  j ƒ " |  j j | g t | ƒ Œ  Wd QXd S(   s,   Execute a command in the checkout directory.N(   R#   R9   Ri   RA   t   list(   R'   R<   R?   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyRA   Ä   s    c         C   s*   t  |  j ƒ  |  j j | ƒ Wd QXd S(   s,   Execute a command in the checkout directory.N(   R#   R9   Ri   R=   (   R'   R<   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   outdoÈ   s    c         G   s   |  j  d g t | ƒ Œ  d S(   s)   Add a file to the version-controlled set.RK   N(   RA   Rr   (   R'   t	   filenames(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyRK   Ì   s    c         G   s!   |  j  d d g t | ƒ Œ  d S(   s.   Remove a file from the version-controlled set.R[   s   -fN(   RA   Rr   (   R'   t   files(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR[   Ï   s    c         C   sH   |  j  d | d ƒ |  j  d d | d d | ƒ |  j  d d | ƒ d S(   s   Create a new branch.RM   t   _roots   -rs   -bt   upN(   RA   (   R'   t
   branchname(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   branchÒ   s    t   HEADc         C   s>   |  j  d d ƒ | d k r: |  j  d d d | d ƒ n  d S(   s   Switch to an existing branch.Rw   s   -ARz   s   -rt   'N(   RA   (   R'   Ry   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   switch×   s    c         C   s   |  j  d | ƒ d S(   s   Create a tag.RM   N(   RA   (   R'   R6   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyRM   Ü   s    c         C   s;   |  j  d d | ƒ |  j  d d ƒ |  j  d d | ƒ d S(   s   Merge a branch to trunk.RM   t   merge_Rw   s   -As   -jN(   RA   (   R'   Rx   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   mergeß   s    c         C   s(   t  j d ƒ |  j d d | g Œ  d S(   s!   Commit changes to the repository.i   t   commits   -m '%s'N(   t   timet   sleepRA   (   R'   RQ   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR   å   s    c      
   C   sh   t  t k r) t j j d | | f ƒ n  t |  j ƒ * t | d ƒ  } | j | ƒ Wd QXWd QXd S(   s&   Create file content in the repository.s   %s <- %sRD   N(   R	   R
   R   R   R   R#   R9   RE   (   R'   RF   RG   RH   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR   ì   s
    c      
   C   sh   t  t k r) t j j d | | f ƒ n  t |  j ƒ * t | d ƒ  } | j | ƒ Wd QXWd QXd S(   s)   Append to file content in the repository.s	   %s <-| %st   aN(   R	   R
   R   R   R   R#   R9   RE   (   R'   RF   RG   RH   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyRZ   ó   s
    c         C   s:   | d k r d } n  |  j  d d d d d | d ƒ d S(	   s4   Update the content to the specified revision or tag.t   masterRz   Rw   s   -kbs   -As   -rR{   N(   RA   (   R'   t   rev(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   updateú   s    	c         C   s]   |  j  r1 t j j |  j  ƒ r1 t j |  j  ƒ n  t j j |  j ƒ rY t j |  j ƒ n  d S(   s    Clean up the checkout directory.N(   Rj   R   R   Rk   Rn   Ro   R9   (   R'   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR;   ÿ   s    N(   R2   R3   Rm   R%   R(   RA   Rs   RK   R[   Ry   R|   RM   R~   R   R   RZ   R…   R;   (    (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyRg   «   s   											c         C   s   t  j j |  ƒ s* t j j d |  ƒ d St  j j | ƒ sT t j j d | ƒ d St j |  | d t ƒs‰ t j j d |  | f ƒ n  d S(   s&   Complain if two files aren't identicals   %s does not exist in CVS.
Ns)   %s does not exist in the git conversion.
t   shallows   %s and %s are not the same.
(	   R   R   Rk   R   R   R   t   filecmpt   cmpR   (   R‚   t   b(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   expect_same  s    c         C   s   t  j j |  ƒ s* t j j d |  ƒ d St  j j | ƒ sT t j j d | ƒ d St j |  | d t ƒr‰ t j j d |  | f ƒ n  d S(   s/   Rejoice if two files are unexpectedly identicals   %s does not exist in CVS.
Ns)   %s does not exist in the git conversion.
R†   s%   %s and %s are unexpectedly the same.
(	   R   R   Rk   R   R   R   R‡   Rˆ   R   (   R‚   R‰   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   expect_different  s    c         C   s"   |  j  d ƒ p! |  j d ƒ d k S(   s8   Is this a synthetic branch generated by cvs-fast-export?s   import-t   UNNAMEDiÿÿÿÿ(   t
   startswitht   find(   R6   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt
   junkbranch  s    t   ConvertComparisonc           B   sS   e  Z d  Z d Z d d d d e d „ Z e d „ Z d „  Z	 d „  Z
 d „  Z RS(	   s9   Compare a CVS repository and its conversion for equality.s   -gitR   c         C   sQ  | |  _  t | r | n | d ƒ |  _ |  j j | | r@ | n | d ƒ |  _ | pY | |  _ | |  _ |  j j d | t j d | ƒt	 | t j ƒ n g  t
 d ƒ j ƒ  D]% } | d k r¯ t | ƒ r¯ | ^ q¯ |  _ g  t
 d ƒ j ƒ  D] } | ^ qð |  _ Wd  QX|  j j ƒ  d |  j k rM|  j j d ƒ d g |  j |  _ n  d  S(	   Ns	   .testrepos	   .checkoutR5   RW   s   git branch -lt   *s
   git tag -lRƒ   (   t   stemRa   Ri   RO   R5   t	   showdiffsR^   R   t   SUFFIXR#   R"   t   splitR   t   branchest   tagst   sortR[   (   R'   R’   Ri   RO   R5   t   optionsR“   R6   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR(   $  s    		 A.c      	   C   sä  d |  j  | | f } | |  j k rY | |  j k rY | rU t j j | d | ƒ n  t Sd „  } |  j j | ƒ t	 |  j  t
 j ƒ 2 t d | ƒ s¶ |  j j ƒ  t j d ƒ n  Wd QXt | |  j  d d d	 ƒƒ } g  | D]! } | t |  j  d ƒ d ^ qâ } t | |  j  t
 j d d
 ƒƒ }	 g  |	 D]$ } | t |  j  t
 j ƒ d ^ q2}
 | j ƒ  |
 j ƒ  t } | |
 k r‰| r€t j j | d ƒ |  j r€t j j | d t g  |
 D] } | | k r¾| ^ q¾ƒ ƒ t g  |
 D] } | | k rì| ^ qìƒ } | r.t j j | d | ƒ n  t g  | D] } | |
 k r8| ^ q8ƒ } | r}t j j | d | ƒ q}q€n  t } n  g  | D]D } | j d t
 j d ƒ |	 k r| | j d t
 j d ƒ f ^ q} x‡ | D] \ } } t j | | d t ƒsát } | r`t j j d |  j  | | | | f ƒ |  j r]t j d | | f ƒ q]q`qáqáW| r­| s‡t j j | d ƒ qàt t k ràt j j | d ƒ qàn3 | sà| ràt t k ràt j j | d ƒ qàn  | S(   sA   Test to see if a tag or branch checkout has the expected content.s
   %s %s %s: s   %s unexpectedly missing.
c         s   s   x† t  j |  ƒ D]u \ } } } xc | D][ } t  j j | | ƒ } | | j t  j ƒ k r& | j d ƒ r& | j d ƒ r& | Vq& q& Wq Wd  S(   Ns
   .cvsignores
   .gitignore(   R   t   walkR   R8   R•   Rl   t   endswith(   t   mydirt   ignoret   roott   _Ru   t   walkfileR   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   ftw:  s
    8s   git checkout --quiet %si   Ns	   .checkoutR   t   CVSs   .gits   file manifests don't match.
s   common: %d
s   gitspace only: %s
s   CVS only: %s
s
   .checkout/t   /R†   s#   %s %s %s: %s and %s are different.
s   diff -u %s %ss   trees unexpectedly match
s   trees matched as expected
s   trees diverged as expected
(   R’   R—   R–   R   R   R   R   RO   R…   R#   R   R”   R   Ri   R;   R   Rr   t   lenR˜   R   R“   t   sett   replaceR‡   Rˆ   R   R_   R	   t   DEBUG_STEPS(   R'   R   t   reft   success_expectedt   preambleR¡   t   cvspathsRF   t   cvsfilest   gitpathst   gitfilest   successt   ft   gitspace_onlyt   cvs_onlyR   t   commonR‚   R‰   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   compare_tree3  sf    	."1

	.++	N&	$c         C   sš   xo |  j  D]d } | j d ƒ r^ t d k rn t j j d t j j t j	 d ƒ | f ƒ qn q
 |  j
 d | ƒ q
 Wx! |  j D] } |  j
 d | ƒ q| Wd S(   sC   Check all named references - branches and tags - expecting matches.s   UNNAMED-BRANCHi    s   %s: skipping %s
Ry   RM   N(   R–   R›   R	   R   R   R   R   R   R   R   R´   R—   (   R'   Ry   RM   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   checkallq  s    3c         C   sE   t  | ƒ } | j ƒ  | j ƒ  k } | sA t j j | d ƒ n  d  S(   Ns    return was not as expected
(   R"   t   stripR   R   R   (   R'   R<   t   expectedt   seent	   succeeded(    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   command_returns{  s    c         C   s(   |  j  j ƒ  t j |  j t j ƒ d  S(   N(   RO   R;   Rn   Ro   R’   R   R”   (   R'   (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR;   €  s    N(   R2   R3   R`   R”   R%   R   R(   R   R´   Rµ   Rº   R;   (    (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyR      s   >	
	(   R`   R   R   Rn   R   R€   R‡   R§   R
   R>   RS   R	   t   putenvt   getenvt   pathsepR   R   R"   t   objectR#   R4   Ra   Rg   RŠ   R‹   R   R   (    (    (    s9   /home/esr/public_html/cvs-fast-export/tests/testlifter.pyt   <module>   s$   H$?([			