
    q&fF                         d dl Z d dlmZ d dlmZmZ ddlmZ ej                  Zd Z	d Z
 G d d	      Z G d
 dej                        Zy)    N)_)errorpycompat   )commonc              #      K   t        |       }|dk7  r(| d| | |dz   d f | j                  dd|      }|dk7  r(d| f yw)a  Yield tuples with path split at '/', starting with the full path.
    No leading, trailing or double '/', please.
    >>> for x in rpairs(b'foo/bar/baz'): print(x)
    ('foo/bar/baz', '')
    ('foo/bar', 'baz')
    ('foo', 'bar/baz')
    ('.', 'foo/bar/baz')
    Nr      /r      .)lenrfind)pathis     7/usr/lib/python3/dist-packages/hgext/convert/filemap.pyrpairsr      sZ      	D	A
r'2AhQUW%%JJtQ" r' *s
   8AAc                 2    | yt        j                  |       S )z}We use posixpath.normpath to support cross-platform path format.
    However, it doesn't handle None input. So we wrap it up.N)	posixpathnormpath)r   s    r   	normalizer   $   s     |d##    c                   6    e Zd ZdZd	dZd Zd Zd Zd Zd Z	y)

filemapperzMap and filter filenames when importing.
    A name can be mapped to itself, a new name, or None (omit from new
    repository).Nc                     || _         i | _        i | _        i | _        d | _        |r0| j                  |      rt        j                  t        d            y y )Ns   errors in filemap)	uiincludeexcluderenametargetprefixesparser   Abortr   )selfr   r   s      r   __init__zfilemapper.__init__1   sT    "zz$kk!$8"9::   r   c                     d} fd}t        j                  |d      j                         }|r|dk(  rAt        j                               }| || j                  d      z  }| j
                  |<   nA|dk(  rWt        j                               }| || j
                  d      z  }| || j                  d      z  }| j                  |<   n|dk(  rYt        j                               }t        j                               }| || j                  d      z  }| j                  |<   n|dk(  r,| j                  t        j                                     z  }nV j                  j                  t        d	      j                  j                  t        j                  |      fz         |d
z  }j                         }|r|S )Nr   c           	         | s?j                   j                  t        d      j                  j                  |fz         y| |v r@j                   j                  t        d      j                  j                  | |fz         y| j                  d      s| j                  d      sd| v rSj                   j                  t        d      j                  j                  |t        j                  |       fz         yy)Ns   %s:%d: path to %s is missing
r   s   %s:%d: %r already in %s list
r
   s   //s   %s:%d: superfluous / in %s %r
r   )	r   warnr   infilelineno
startswithendswithr   bytestr)namemappinglistnamelexr!   s      r   checkzfilemapper.parse.<locals>.check>   s    78zz3::x89 w78zz3::tX>? t$d(;u}89zz3::x9I9I$9OPQ r   s   !@#$%^&*()-=+[]{}|;:,./<>?)filepath	wordcharss   includes   excludes   renames   sources   %s:%d: unknown directive %r
r   )r   shlexer	get_tokenr   r   r   r   r   r   r%   r   r&   r'   r   r*   )	r!   r   errsr/   cmdr+   srcdestr.   s	   `       @r   r   zfilemapper.parse;   s   	* nn%B
 mmoj  1dDLL*==%)T"
" 1dDLL*==dDKK;;%)T"	!0 1c4<<<<#'C 	!

9S]]_#=>>67zz3::x/?/?/DEF 	--/C/ 0 r   c                 z    t        |      }t        |      D ]  \  }}	 ||   ||fc S  d|dfS # t        $ r Y "w xY w)Nr   )r   r   KeyError)r!   r+   r,   presufs        r   lookupzfilemapper.lookupq   sZ    t 	HCs|S#--	
 D#~  s   .	::c                 F   | j                   Lt               | _         | j                  j                         D ]   \  }}| j                   j	                  |       " | j                   rd| j                   v ryt        |      }t        |      D ]  \  }}|| j                   v s y y)zReturn true if the given target filename is covered as a destination
        of the filemap. This is useful for identifying what parts of the target
        repo belong to the source repo and what parts don't.r   TF)r   setr   itemsaddr   r   )r!   filenamebeforeafterr:   r;   s         r   istargetfilezfilemapper.istargetfilez   s     &"%%D!%!2!2!4 /##''./
 ""dd.A.A&AX&x( 	HC
 d)))	 r   c                    | j                   r | j                  || j                         d   }n|}| j                  r | j                  || j                        d   }nd}| j                   s|st        |      t        |      k  ry | j                  || j                        \  }}}|r)|dk(  r|S |r|j                  d      r||z   S |dz   |z   S |S |S )Nr   r   r   r
   )r   r<   r   r   r   r)   )r!   r+   incexcnewprer:   r;   s          r   __call__zfilemapper.__call__   s    <<++dDLL1!4CC<<++dDLL1!4CC#c(c#h*>;;tT[[9S~
??4(!C<'}s**Mr   c                 d    t        | j                  xs | j                  xs | j                        S N)boolr   r   r   r!   s    r   activezfilemapper.active   s#    DLL?DLL?DKK@@r   rK   )
__name__
__module____qualname____doc__r"   r   r<   rD   rI   rN    r   r   r   r   ,   s'    ;4l0,Ar   r   c                        e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )filemap_sourcec                 $   t         t        |   ||j                         || _        t        ||      | _        i | _        i | _        i | _        d | _	        d| _
        i | _        i | _        i | _        | j                  j                  dd      | _        y )NFs   converts   ignoreancestorcheck)superrU   r"   repotypebaser   commits	parentmapwantedancestorsconvertedorder_rebuiltorigparentschildrenseenchildrenr   
configboolignoreancestorcheck)r!   r   baseconverterfilemap	__class__s       r   r"   zfilemap_source.__init__   s    nd,R1G1GH!	$R1   ""#'77#5#5.$
 r   c                 8    | j                   j                          y rK   )rY   rB   rM   s    r   rB   zfilemap_source.before   s    		r   c                 8    | j                   j                          y rK   )rY   rC   rM   s    r   rC   zfilemap_source.after   s    		r   c                 r   | | _         t        t        i}t               }g }|j                  D ]g  }||   }||v}|r|||<   || j                  |<   n||   | j                  |<   || j
                  |<   ||   }|t        k(  rd }|j                  |||f       i || _        | j                  j                  |      S rK   )
r^   SKIPREVr>   orderr[   r\   appendr]   rY   	setrevmap)	r!   revmapseendummyset	convertedrevmappedwantedargs	            r   rm   zfilemap_source.setrevmap   s     #
!5	<< 	1CC[F4'F"V&)s#&*6ls#(0D  %v,Cg~c63/0	1 (yy""6**r   c                 
   | j                   ryd| _         | j                  j                          | j                  j                          | j                  j                          | j
                  D ]l  \  }}}|| j                  vr)	 | j                  |      j                  | j                  |<   |A| j                  j                  |d      dz   | j                  |<   n | j
                  D ]P  \  }}}	 | j                  |   }|r| j!                  ||       n| j#                  ||        | j$                  |g|  R y# t        j                  $ r" | j                  j                  d|z         Y w xY w# t        $ r Y w xY w)NTs   unknown revmap source: %s
r   r   )r^   r[   clearr\   ra   r]   r_   	getcommitparentsr   RepoLookupErrorr   debugr`   getr9   mark_wantedmark_not_wanted_discard)r!   rr   rt   ru   ry   s        r   rebuildzfilemap_source.rebuild   su   ==""$! $ 3 3 	CC$***,0NN3,?,G,GD$$S) %)]]%6%6sA%>%Bc"	C !% 3 3 		)C**3/   g.$$S#.DMM#((		) # ,, GGMM"@3"FG  s$   (D>2E6>1E32E36	FFc                 6    | j                   j                         S rK   )rY   getheadsrM   s    r   r   zfilemap_source.getheads  s    yy!!##r   c                     | j                   j                  |      x}| j                  |<   |j                  D ].  }| j                  j                  |d      dz   | j                  |<   0 |S Nr   r   )rY   rx   rZ   ry   r`   r|   )r!   rr   cps       r   rx   zfilemap_source.getcommit  sb     !%		 3 3C 88DLL 	;A#}}00A6:DMM!	;r   c                 6    | j                   j                         S rK   )rY   
numcommitsrM   s    r   r   zfilemap_source.numcommits  s    yy##%%r   c                 r    || j                   v r| j                   |   S | j                  j                  |      S rK   )rZ   rY   rx   r!   rr   s     r   _cachedcommitzfilemap_source._cachedcommit"  s2    $,,<<$$yy""3''r   c                 n   |D ]  }|| j                   j                  |d      dz   | j                   |<   | j                   |   | j                  |   k(  sR| j                  j	                  |d        | j
                  j	                  |d        | j                   |= | j                  s| j                  |=  y r   )ra   r|   r`   r\   popr[   r^   )r!   revsrs      r   r   zfilemap_source._discard'  s     		)Ay#'#4#4#8#8A#>#BDa   #t}}Q'77$$((D1""1d+%%a(==a(		)r   c                 4   	 | j                   j                  ||      }|D ]  }| j                  |      s y | j                  j                  ry| xr d| j                  |   j                  vS # t        $ r t        j                  t        d            w xY w)Ns+   source repository doesn't support --filemapTF   close)
rY   getchangedfilesNotImplementedErrorr   r    r   r   r   rZ   extra)r!   rr   r   filesfs        r   rt   zfilemap_source.wanted3  s    	QII--c15E  	Aq!	 ??"" yDXT\\#->-D-DDD! # 	Q++a NOPP	Qs   A/ /(Bc                     |(t         | j                  |<   t         h| j                  |<   y | j                  |   | j                  |<   | j                  |   | j                  |<   y rK   )rj   r[   r\   )r!   rr   r   s      r   r~   zfilemap_source.mark_not_wantedO  sb     9 #*DNN3)0	D  % #nnQ/s$($8$8$;S!r   c                 0   || j                   |<   t               }|D ]X  }|| j                  v r|j                  | j                  |          0| j                  j                  t        d      ||fz         Z |j                  |       || j                  |<   y )Ns!   warning: %s parent %s is missing
)r[   r>   r\   updater   r%   r   r@   )r!   rr   ry   wrevr   s        r   r}   zfilemap_source.mark_wanted^  s     "s u 	AD(((D0034;<QxG		 	$(S!r   c                      j                   |   j                  }t        |      dkD  r j                  s j	                          g }t               } j                   |   j                  }d}t        |      D ]  \  } j                     t        k(  s|v r# j                   xr t         fd|D              }	|	s0|s.t        |      dkD  r  j                        j                  |k(  rd}|j                  ||	f       |j                          |r|D 
cg c]
  }
|
d   r	|
 }}
d }|r%t        d |D              }|D 
cg c]  }
|
d   	 }}
n|rd}| j                  |<   d}d j                   |   j                   v r.|D 
cg c]  }
 j                  |
      j                   }}
||v rd}t        |      d	k  rk|si j#                  ||      sWd }
|r||   }
 j%                  ||
        j&                  j                  |d|
f         j(                  |   j                  |   S | j                   |   _         j+                  ||        j&                  j                  |dd f         j(                  |   j,                  j/                  ||      \  }}}i }t        |      }|D ]A  \  }} j1                  |      }|s||k7  s||vs$||f||<   ||k7  s1|j3                  |       C t5        |j7                               }i }|D ]2  } j1                  |      }|s j1                  ||         }|s.|||<   4 |||fS c c}
w c c}
w c c}
w )
Nr   Fc              3   r   K   | ].  }|k7  r'j                   |   k7  rj                  |   v r| 0 y wrK   )r[   r\   ).0p2mp1p1r!   s     r   	<genexpr>z,filemap_source.getchanges.<locals>.<genexpr>  sD      >84>>"--4//33	 >s   47T   c              3   &   K   | ]	  }|d      yw)   NrS   )r   r   s     r   r   z,filemap_source.getchanges.<locals>.<genexpr>  s     ,aQqT,s   r   r   r   )rZ   ry   r   rc   r   r>   branch	enumerater[   rj   anyr   rl   r@   maxr_   r   rt   r~   r]   r   r}   rY   
getchangesr   discardsortedr?   )r!   rr   fullry   mparentsknownparentsr   hasbranchparentr   
isancestorr   wpclosed	pbrancheschangescopiescleanp2r   ncleanp2r   r   newfncopiesr   newc	newsourcer   r   s   `                         @@r   r   zfilemap_source.getchangess  sx   ,,s#++w<!D$<$<LLN" uc"))w' 	"EAr..$Cg~!4!555 # >!> ;J o#g,:J%%b)00F:&*OOORa45S!#	"( #+8a1Q48H8,8,,B&./!/H/B 't||C(... @HH!++A.55HIH"x=1VDKKR4H ABK  a(&&UA7DMM7#>>#&& %-S!g&""Ct#45w
 $(99#7#7T#B w< 	(DAq??1%Dd%&7 !fd19$$Q'	( u{{}% 	.A??1%D OOF1I6	$-GDM	. gx''w 9 0 Is   !
M,MM"Mc                 8    | j                   j                  |      S rK   )r   rD   )r!   targetfilenames     r   targetfilebelongstosourcez(filemap_source.targetfilebelongstosource  s    ++N;;r   c                 D    |\  }}| j                   j                  ||      S rK   )rY   getfile)r!   r+   rr   realnamerealrevs        r   r   zfilemap_source.getfile  s#    'yy  733r   c                 6    | j                   j                         S rK   )rY   gettagsrM   s    r   r   zfilemap_source.gettags  s    yy  ""r   c                 6    | j                   j                         S rK   )rY   hasnativeorderrM   s    r   r   zfilemap_source.hasnativeorder  s    yy''))r   c                 8    | j                   j                  |      S rK   )rY   	lookuprevr   s     r   r   zfilemap_source.lookuprev  s    yy""3''r   c                 6    | j                   j                         S rK   )rY   getbookmarksrM   s    r   r   zfilemap_source.getbookmarks  s    yy%%''r   c                 <    | j                   j                  ||       y rK   )rY   rq   )r!   rr   sinkrevs      r   rq   zfilemap_source.converted  s    		C)r   )rO   rP   rQ   r"   rB   rC   rm   r   r   rx   r   r   r   rt   r~   r}   r   r   r   r   r   r   r   rq   __classcell__)rf   s   @r   rU   rU      so    
*+><$&(

)E8<)*h(T<4#*((*r   rU   )r   mercurial.i18nr   	mercurialr   r    r   rj   r   r   r   converter_sourcerU   rS   r   r   <module>r      sM      
.. $}A }A^v*V,, v*r   