
    	^c2                         d dl Z d dlZd dlmZ d dlmZmZ d dlmZm	Z	m
Z
 ddlmZ d Zd Z G d	 d
ej                  ZdS )    N)_)errorutil)dateutilprocutil
stringutil   )commonc              #   f   K   	 	 t          j        |           }|sdS |V  # t          $ r Y dS w xY w)z,Yield the dictionary objects generated by p4TN)marshalloadEOFError)fds     2/usr/lib/python3/dist-packages/hgext/convert/p4.pyloaditerr      s\      	QA GGG		
    s   " " 
00c                 J    g d}|D ]\  }}|                      ||          } | S )aQ  Perforce escapes special characters @, #, *, or %
    with %40, %23, %2A, or %25 respectively

    >>> decodefilename(b'portable-net45%252Bnetcore45%252Bwp8%252BMonoAndroid')
    'portable-net45%2Bnetcore45%2Bwp8%2BMonoAndroid'
    >>> decodefilename(b'//Depot/Directory/%2525/%2523/%23%40.%2A')
    '//Depot/Directory/%25/%23/#@.*'
    ))s   %2A   *)s   %23   #)s   %40   @)s   %25   %)replace)filenamereplacementskvs       r   decodefilenamer   %   sD      L  * *1##Aq))O    c                   $    e Zd Zd fd	Zd Zd Zd Zej        d             Z	ej        d             Z
ej        d             Zej        d	             Zej        d
             Zej        d             Zd Zd Zd ZddZd Zd Zd Zd Z xZS )	p4_sourceNc                 r   ddl m} t          t          |                               ||||           d|v r9|                    d          s$t          j        t          d          |z            t          j	        dd	           i | _
        | j                            d
d|j                  | _        t          j        d          | _        t          j        d          | _        t          j        d          | _        |r4t)          |          dk    r#t+          j        t          d                    d S d S )Nr	   )convcmd)revs   /   //s%   %s does not look like a P4 repository   p4F)abort   converts   p4.encodingsE   ([a-z]+)?(text|binary|symlink|apple|resource|unicode|utf\d+)(\+\w+)?$sA   \$(Id|Header|Date|DateTime|Change|File|Revision|Author):[^$\n]*\$s   \$(Id|Header):[^$\n]*\$s8   p4 source does not support specifying multiple revisions) r"   superr    __init__
startswithr
   NoRepor   	checktoolrevmapuiconfigorig_encodingencodingrecompilere_typere_keywordsre_keywords_oldlenr   Abort)selfr0   repotypepathr#   r"   	__class__s         r   r+   zp4_source.__init__:   sN   i''Hd'FFF4<< 6 6<-:;;dB   	e,,,,(=
 
 z
 
 :
 
  "z*EFF 	CIIMM+*   	 	MMr   c                     || _         dS )a  Sets the parsed revmap dictionary.

        Revmap stores mappings from a source revision to a target revision.
        It is set in convertcmd.convert and provided by the user as a file
        on the commandline.

        Revisions in the map are considered beeing present in the
        repository and ignored during _parse(). This allows for incremental
        imports if a revmap is provided.
        N)r/   )r;   r/   s     r   	setrevmapzp4_source.setrevmap]   s     r   c                     dt          j        |          z  }t          j        |d          }i }t          |          D ]}|                    dd          }|rd||<    |S )zRead changes affecting the paths   p4 -G changes -s submitted %s   rbmode   changeNT)r   
shellquotepopenr   get)r;   r=   cmdstdout	p4changesr   cs          r   _parse_viewzp4_source._parse_viewj   sr    .1DT1J1JJ%000	&!! 	$ 	$Ai&&A $#	!r   c           	         i }i }i }i }i }i }g }	|                     t          d                     d|v rf|                    |                     |                     |                    d          r#|                    d          r|dd         di}
nddi}
ndt          j        |          z  }t          j	        t          j
        |d	
                    }i }
|D ]}|                    d          r||                                         \  }}|                    |                     |                     |                    d          r)|                    d          r|dd         }|dd         }|dd         }||                    d          dz   d         }||
|<   t          |                                t                    }t          |
                                t           d          }| j                            dd          }|                     t          d                     d}|D ]%}|r!t          |          t          |          k     r&| j        r,t          |          t          | j        d                   k    rY|| j        v r|}e|r|g}ng }|                     |          }|                     ||          }|j                            d          }t!          |          dk    r|d                             d          }nd}d|j        |fz  }|                     t7          j        |d          dz              g }i }g }d}d|z  |v rd|z  |v r|d|z           }d}|D ]j} |                                                    |                                           r/t=          |
|          |t!          |           d         z             } nk|r[|                    ||d|z           f           |||<   |                     d|z            dk    r|                    |           |||<   |dz  }d|z  |v rd|z  |v |D ]}||         }dt          j        |          z  }!t          j
        |!d	
          }"d}#tC          |"          D ]}d}$d}d |z  |v rb|d |z           |k    rG|d|z           dk    r8d}%d!||%fz  |v r-|d"||%fz           d#k    r|d!||%fz           }$n|%dz  }%d!||%fz  |v -|dz  }d |z  |v b|$r|$|v r
||$         }# n|#r|#||<   |"                    t          d$          ||fz             |||<   |||<   |||<   |}'|rt!          |          dk    r|g}	||||	|d%S )&z4Prepare list of P4 filenames and revisions to imports   reading p4 views
r$   r%   s   /...Nr   s   p4 -G client -o %srB   rC   s   Views   ...   r	   )keyT)rQ   reverser(   s   p4.startrevs   collecting p4 changelists
r   s   
s    **empty changelist description**s   %s %sP      
s   depotFile%ds   rev%ds   action%ds   move/adds   p4 -G filelog %ss   change%ds	   file%d,%ds   how%d,%ds
   moved froms*   cannot find source for copied file: %s@%s
)	   changeset   files   copies   heads	   depotname)#statusr   updaterM   r,   endswithr   rF   r   r   rG   splitfindsortedkeysintr9   r0   r1   r#   r/   _fetch_revision_construct_commitdesc
splitlinesrstriprevr   ellipsislowerr   appendrH   r   warn)&r;   r0   r=   rK   	changeset	files_map
copies_map	localname	depotnameheadsviewsrI   
clientspecclientsviewcview	vieworderstartrevlastidchangeparentsr   rL   descarr	shortdesctfilescopiescopiedfilesioldnamer   r   flcmdflstdoutcopiedfilenamecopiedoldnamejs&                                         r   _parsezp4_source._parseu   s   			
		
		!)**+++ 4<<T--d33444u%% %$--*@*@ %crcC('(*=d*C*CCC hnSu&E&E&EFFJE$ 	) 	)$$W-- )#-f#5#;#;#=#=LE5$$T%5%5e%<%<===~~f-- +%..2H2H + %crc
 %crc
!!""IE!%**T"2"2Q"6"8"89E#(E%L 9>>++555	 5::<<S$???	 7>>*n== 			!233444 V	 V	F CKK#h--77y S[[3ty|+<+<<<$$ !($$V,,A&&q'22Af''--G7||a#AJ--g66		?	AE9--AIIj)!R0058999EFKA!A%!++A!0C0CNQ./"  A}}11!''))<< #1%(WSVVXX=N2N#O#O  2LL(AhlO!<===*1Ih'uu[1_--<<#**8444)1Ig&Q "A%!++A!0C0C  ( " "#H-+h.A'.J.JJ#>%e<<<!%!(++  A$(MA&?q00kAo.&88 !+/ 2k A A !A#/1a&#8Q">">#$[Aq6%9#:m#K#K45laV6K4LM$) !Q	 $01a&#8Q">">
 Q '?q00 % ))C)C)2=)A! '5F8$$GGHII#V,-   
 !"If %If!'JvFF 	c)nnq((HE $!#
 
 	
r   c                 B    |                      | j        | j                  S N)r   r0   r=   r;   s    r   _parse_oncezp4_source._parse_once  s    {{47DI...r   c                     | j         d         S )NrW   r   r   s    r   r   zp4_source.copies  s    	**r   c                     | j         d         S )NrV   r   r   s    r   r   zp4_source.files      ))r   c                     | j         d         S )NrU   r   r   s    r   rl   zp4_source.changeset      --r   c                     | j         d         S )NrX   r   r   s    r   rq   zp4_source.heads  r   r   c                     | j         d         S )NrY   r   r   s    r   rp   zp4_source.depotname  r   r   c                     | j         S r   )rq   r   s    r   getheadszp4_source.getheads  s
    zr   c                    dt          j        d| j        |         |fz            z  }d }	 t          j        |d          }d }g }d }t	          |          D ]}	|	d         }
|	                    d          }|
dk    r|st          |	d	         |          } n||
d
k    r|	                    d          }|dv r dS | j                            |	d                   }|rid}|	                    d          pd|	                    d          pdz   }d|v rd}|	                    d          dk    rd}d|v r| j
        }n-d|v r| j        }n!|
dk    s|
dk    r|                    |           d }|snE|dS d                    |          }|r|                    d|          }|dk    r|                    d          r
|d d         }||fS )Ns   p4 -G print %ss   %s#%sTrB   rC   s   codes   datas   errors   generics   stats   action)s   purges   deletes   move/delete)NNs   typer   r	         xrP   s   symlink   ls   ko   ks   texts   binarys   $\1$rT   )r   rF   rp   rG   r   rH   IOErrorr6   matchgroupr8   r7   rj   joinsubr\   )r;   namerg   rI   	lasterrorrJ   rD   contentskeywordsr   codedataactionp4typeflagss                  r   getfilezp4_source.getfile"  s4   ("5t,c22#
 #
 
 	.	^Ce444FDHHf%% $! $!zuuW~~8## % ($+AjM4$@$@	'W__UU9--F!FFF)zz!\//'
;;F 8"!'a!7C"LLOO2s!  5==#'D!<<??j88#'D E>>'+';HH!U]]'+'7HW__	(9(9OOD))) 		 ].	` <:88H%% 	8||Hh77H4<<H--e44<}H~r   c                     |r!t          j        t          d                    | j        |         | j        |         t                      fS )Ns'   convert from p4 does not support --full)r   r:   r   r   r   set)r;   rg   fulls      r   
getchangeszp4_source.getchangesd  sB     	M+a JKKLLLz#C 0#%%77r   c                 B   |                      |                    dd                    }t          |d                   df}|g }t          j        |                      |d                   t          j        |d          ||d|d         |d         |d         d	
          S )ze
        Constructs a common.commit object from an unmarshalled
        `p4 describe` output
        s   descr   s   timer   Ns   users   %Y-%m-%d %H:%M:%S %1%2rE   )r&   s   convert_revision)authordater{   rd   branchrg   extra)recoderH   ra   r
   commitr   datestr)r;   objr{   rd   r   s        r   rc   zp4_source._construct_commiti  s    
 {{3777C0011CL!!1%?G};;s7|,,!$(ABBIi.s9~NN
 
 
 	
r   c                 `    d|z  }t          j        |d          }t          j        |          S )zXReturn an output of `p4 describe` including author, commit date as
        a dictionary.s   p4 -G describe -s %srB   rC   )r   rG   r   r   )r;   rg   rI   rJ   s       r   rb   zp4_source._fetch_revision}  s2     &+%000|F###r   c                     || j         v r| j         |         S || j        v r,|                     |          }|                     |d           S t	          j        t          d          |z            )N)r{   s1   cannot find %s in the revmap or parsed changesets)rl   r/   rb   rc   r   r:   r   )r;   rg   r   s      r   	getcommitzp4_source.getcommit  sz    $.  >#&&DK$$S))A))!T):::kBCCcI
 
 	
r   c                     i S r    r   s    r   gettagszp4_source.gettags  s    	r   c                 J    t          d | j        |         D                       S )Nc                     g | ]
}|d          S )r   r   ).0xs     r   
<listcomp>z-p4_source.getchangedfiles.<locals>.<listcomp>  s    555qt555r   )r_   r   )r;   rg   r   s      r   getchangedfileszp4_source.getchangedfiles  s%    55TZ_555666r   r   )__name__
__module____qualname__r+   r@   rM   r   r   propertycacher   r   r   rl   rq   rp   r   r   r   rc   rb   r   r   r   __classcell__)r>   s   @r   r    r    9   s       ! ! ! ! ! !F  	 	 	P
 P
 P
d 
/ / / 
+ + + 
* * * 
. . . 
* * * 
. . .  @ @ @D8 8 8

 
 
 
($ $ $
 
 
  7 7 7 7 7 7 7r   r    )r   r4   mercurial.i18nr   	mercurialr   r   mercurial.utilsr   r   r   r)   r
   r   r   converter_sourcer    r   r   r   <module>r      s     				                            	 	 	  (Y7 Y7 Y7 Y7 Y7' Y7 Y7 Y7 Y7 Y7r   