
    q&f2                         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y)    N)_)errorutil)dateutilprocutil
stringutil   )commonc              #   f   K   	 	 t        j                  |       }|sy| # t        $ r Y yw xY ww)z,Yield the dictionary objects generated by p4N)marshalloadEOFError)fds     2/usr/lib/python3/dist-packages/hgext/convert/p4.pyloaditerr      s>     QAG	 
  s    1" 1" 	.1.1c                 F    g d}|D ]  \  }}| j                  ||      }  | 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   %   s5    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_sourcec                 :   ddl m} t        t        |   ||||       d|v r2|j                  d      s!t        j                  t        d      |z        t        j                  dd	       i | _
        | j                  j                  d
d|j                        | _        t        j                   d      | _        t        j                   d      | _        t        j                   d      | _        |r-t)        |      dkD  rt+        j,                  t        d            y y )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__:   s    i'Hd'F4< 6--:;dB  	e,(=(=
 zz
 ::
  "zz*EFCIM++*  "4r   c                     || _         y)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 ]  }|j	                  dd      }|s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   sd    .1D1DT1JJ%0	&! 	$Ai&A#	!	$ r   c           	      |	   i }i }i }i }i }i }g }	|j                  t        d             d|v rO|j                  | j                  |             |j	                  d      r|j                  d      r|dd di}
nddi}
ndt        j                  |      z  }t        j                  t        j                  |d	
            }i }
|D ]  }|j	                  d      s||   j                         \  }}|j                  | j                  |             |j                  d      r|j                  d      r
|dd }|dd }|dd }||j                  d      dz   d }||
|<    t        |j                         t              }t        |
j                         t         d      }| j"                  j%                  dd      }|j                  t        d             d}|D ]  }|rt        |      t        |      k  r| j&                  r%t        |      t        | j&                  d         kD  rO|| j(                  v r|}`|r|g}ng }| j+                  |      }| j-                  ||      }|j.                  j1                  d      }t!        |      dkD  r|d   j3                  d      }nd}d|j4                  |fz  }|j                  t7        j8                  |d      dz          g }i }g }d}d|z  |v rd|z  |v r|d|z     }d}|D ]N  } |j;                         j	                  | j;                               s1t=        |
|    |t!        |       d z         } n |rK|j?                  ||d|z     f       |||<   |jA                  d|z        dk(  r|j?                  |       |||<   |dz  }d|z  |v rd|z  |v r|D ]  }||   }dt        j                  |      z  }!t        j                  |!d	
      }"d}#tC        |"      D ]p  }d}$d}d |z  |v rU|d |z     |k(  r=|d|z     dk(  r2d}%d!||%fz  |v r'|d"||%fz     d#k(  r|d!||%fz     }$n|%dz  }%d!||%fz  |v r'|dz  }d |z  |v rU|$sf|$|v sk||$   }# n |#r|#||<   |jE                  t        d$      ||fz          |||<   |||<   |||<   |} |rt!        |      dkD  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   sd   			
		
		!)*+ 4<T--d34u%$--*@crC('(*=*=d*CCC hnnSu&EFJE$ 	)$$W-#-f#5#;#;#=LE5$$T%5%5e%<=~~f-%..2H %cr
 %cr
!!"IE!%**T"2Q"6"89E#(E%L	) 9>>+5	 5::<S$?	 77>>*n= 			!234 V	FCK#h-7yyS[3tyy|+<<$!($$V,A&&q'2Aff''-G7|a#AJ--g6	?	AEE9--AIIj))!R0589EFKA!A%!+A!0CNQ./" A}}11!'')<#1%(WSVX=N2N#O LL(AhlO!<=*1Ih'uu[1_-<#**84)1Ig&Q "A%!+A!0C  ( "#H-+h.A.A'.JJ#>>%e<!%!(+ A$(MA&?q0kAo.&8 !+/ 2k A !A#/1a&#8Q">#$[Aq6%9#:m#K45laV6K4LM$) !Q	 $01a&#8Q">
 Q '?q0 %))C)2=)A'* "'5F8$GGHI#V,-?"H !"If %If!'JvFmV	p c)nq(HE $!#
 	
r   c                 N    | j                  | j                  | j                        S N)r   r0   r=   r;   s    r   _parse_oncezp4_source._parse_once  s    {{477DII..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    zzr   c                 6   dt        j                  d| j                  |   |fz        z  }d }	 t        j                  |d      }d }g }d }t	        |      D ]  }	|	d   }
|	j                  d      }|
dk(  r|st        |	d   |      } n||
d	k(  r|	j                  d
      }|dv r y| j                  j                  |	d         }|rd}|j                  d      xs d|j                  d      xs dz   }d|v rd}|j                  d      dk(  rd}d|v r| j                  }n,d|v r(| j                  }n|
dk(  s|
dk(  r|j                  |       d } |sn&|ydj                  |      }|r|j                  d|      }|dk(  r|j                  d      r|d d }||fS )Ns   p4 -G print %ss   %s#%srB   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"  s   ("5"5t,c22#
 
 	^^Ce4FDHHf% $!zuuW~8# %$+AjM4$@	'W_UU9-F!FF)!\\//'
;F"!'a!7C"LLO2s!  5=#'D!<<?j8#'D E>'+';';H!U]'+'7'7HW_	(9OOD) 	I$!L ] ` <88H%||Hh7H4<H--e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  s:    ++a JKLLzz#C 0#%77r   c                    | j                  |j                  dd            }t        |d         df}|g }t        j                  | 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1CL!1%?G}};;s7|,!!$(ABIi.s9~N
 	
r   c                 d    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}  s-     &+%0||F##r   c                     || j                   v r| j                   |   S || j                  v r$| j                  |      }| j                  |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  sn    $.. >>#&&DKK$$S)A))!T)::kkBCcI
 	
r   c                     i S r    r   s    r   gettagszp4_source.gettags  s    	r   c                 ^    t        | j                  |   D cg c]  }|d   	 c}      S c c}w )Nr   )r_   r   )r;   rg   r   xs       r   getchangedfileszp4_source.getchangedfiles  s'    TZZ_5qt5665s   *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
d 
/ / 
+ + 
* * 
. . 
* * 
. .@D8

($
7r   r    )r   r4   mercurial.i18nr   	mercurialr   r   mercurial.utilsr   r   r   r)   r
   r   r   converter_sourcer    r   r   r   <module>r      sB     	   	(Y7'' Y7r   