
    cZX                        d dl mZ d dlmZmZmZmZmZ d dlm	Z
mZ  ej        d          Z ej        d          Zej        Zeej        Znej        ZdZ G d d	          Z G d
 de          Ze G d de          ZdS dS )   )_)errorpathutilpolicytxnutilutil)docketv2parsersdirstateNic                   v    e Z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dZed             Zd Zd ZdS )_dirstatemapcommonz
    Methods that are identical for both implementations of the dirstatemap
    class, with and without Rust extensions enabled.
    Nc                     || _         || _        || _        || _        || _        d| _        d| _        d | _        d| _        d | _	        d | _
        d S )Ns   dirstate   F)_use_dirstate_v2_nodeconstants_ui_opener_root	_filename_nodelen_parents_dirtyparents_docket_pendingmode)selfuiopenerrootnodeconstantsuse_dirstate_v2s         7/usr/lib/python3/dist-packages/mercurial/dirstatemap.py__init__z_dirstatemapcommon.__init__.   s[     /+
$" !    c                     | j          dS )z5Loads the underlying data, if it's not already loadedN_mapr   s    r"   preloadz_dirstatemapcommon.preload=   s    				r$   c                 8    | j                             ||          S N)r'   get)r   keydefaults      r"   r,   z_dirstatemapcommon.getA   s    y}}S'***r$   c                 *    t          | j                  S r+   )lenr'   r(   s    r"   __len__z_dirstatemapcommon.__len__D   s    49~~r$   c                 *    t          | j                  S r+   iterr'   r(   s    r"   __iter__z_dirstatemapcommon.__iter__G   s    DIr$   c                     || j         v S r+   r&   )r   r-   s     r"   __contains__z_dirstatemapcommon.__contains__J   s    dir$   c                     | j         |         S r+   r&   )r   items     r"   __getitem__z_dirstatemapcommon.__getitem__M   s    yr$   c                     t          j        | j        | j        | j                  \  }}| j        @| j        |k    r5|                                 t          j        t          d                    || _        |S )Ns1   working directory state may be changed parallelly)
r   
trypendingr   r   r   r   closer   Abortr   )r   fpmodes      r"   _opendirstatefilez$_dirstatemapcommon._opendirstatefileR   sr    %dj$,OOD(T->$-F-FHHJJJ+FGG   !	r$   c                     	 |                                  5 }|                    |          cd d d            S # 1 swxY w Y   d S # t          $ r Y dS w xY w)Nr$   )rA   readFileNotFoundError)r   sizer?   s      r"   _readdirstatefilez$_dirstatemapcommon._readdirstatefile\   s    	'')) %Rwwt}}% % % % % % % % % % % % % % % % % %  	 	 	33	s-   A 8A <A < A 
AAc                     | j         sW| j        st          j        d          t          j                            |                                 | j                  | _         | j         S )Ns'   dirstate only has a docket in v2 format)	r   r   r   ProgrammingError	docketmodDirstateDocketparserG   r   r(   s    r"   r	   z_dirstatemapcommon.docketd   si    | 	( ,>   %399&&(($*= DL |r$   c                 `   	  j         }t          j                                                             t          |          |          }|j        |j        k    rt          j        d          |	                                	 j
                            	|           |                    |                                           |                                 |j        rH|	                                	d	 fd	}|r!d|j        z   }|                    ||           n
 |             | _        d S )Ns   dirstate docket name collisionc                 8    j                                       S r+   )r   unlink)_trdata_filenamer   s    r"   <lambda>z7_dirstatemapcommon.write_v2_no_append.<locals>.<lambda>   s    dl&9&9-&H&H r$   s   dirstate-v2-clean-r+   )r	   rJ   rK   with_new_uuidparentsr0   uuidr   rI   rQ   r   write	serializer=   addpostcloser   )
r   trstmetapacked
old_docket
new_docketrO   categoryrQ   s
   `        @r"   write_v2_no_appendz%_dirstatemapcommon.write_v2_no_appendp   s#   [
-;;LLNNCKK
 

 ?jo--()JKKK"0022=&111 	%%''(((



 ? 	&4466MHHHHHHF 0:?B&1111!r$   c                    | j         s| j        r| j        j        | _         n| j        dz  }|                     |          }t          |          }||k    r,|d | j                 || j        d| j        z           f| _         nE|dk    r| j        j        | j        j        f| _         n!t          j
        t          d                    | j         S )N       s(   working directory state appears damaged!)r   r   r	   rT   r   rG   r0   r   nullidr   r>   r   )r   read_lenrZ   ls       r"   rT   z_dirstatemapcommon.parents   s    } 	$  $ 3=1,++H55GG==?T]?+4=1t}+<<=%DMM !VV+2+2%DMM
  +EFF   }r$   r+   )rB   )__name__
__module____qualname____doc__r'   copymapr#   r)   r,   r1   r5   r7   r:   rA   rG   propertyr	   r`   rT    r$   r"   r   r   #   s          DG! ! !  + + + +           
      	 	 X	" " "8    r$   r   c                   .   e Zd ZdZed             Zed             Zd Zd ZeZ	d Z
d Zdd	Zd
 Zd Zed             ZddZd dZed             Zed             Zd Zd Zed             Zed             Z	 	 	 	 	 d!dZd Zd Zd Zd Zd Zd ZdS )"dirstatemapa  Map encapsulating the dirstate's contents.

    The dirstate contains the following state:

    - `identity` is the identity of the dirstate file, which can be used to
      detect when changes have occurred to the dirstate file.

    - `parents` is a pair containing the parents of the working copy. The
      parents are updated by calling `setparents`.

    - the state map maps filenames to tuples of (state, mode, size, mtime),
      where state is a single character representing 'normal', 'added',
      'removed', or 'merged'. It is read by treating the dirstate as a
      dict.  File state is updated by calling various methods (see each
      documentation for details):

      - `reset_state`,
      - `set_tracked`
      - `set_untracked`
      - `set_clean`
      - `set_possibly_dirty`

    - `copymap` maps destination filenames to their source filename.

    The dirstate also provides the following views onto the state:

    - `filefoldmap` is a dict mapping normalized filenames to the denormalized
      form that they appear as in the dirstate.

    - `dirfoldmap` is a dict mapping normalized directory names to the
      denormalized form that they appear as in the dirstate.
    c                 F    i | _         |                                  | j         S r+   )r'   rD   r(   s    r"   r'   zdirstatemap._map   s    			yr$   c                 ,    i | _         | j         | j         S r+   )rk   r'   r(   s    r"   rk   zdirstatemap.copymap   s    		|r$   c                 f   | j                                          | j                                         |                     | j        j        | j        j                   t          j        | d           t          j        | d           t          j        | d           t          j        | d           d S )N   _dirs   _alldirss   filefoldmap
   dirfoldmap)r'   clearrk   
setparentsr   rd   r   clearcachedpropertyr(   s    r"   rv   zdirstatemap.clear   s    	+2D4G4NOOO x000 {333 ~666 }55555r$   c                 4    | j                                         S r+   r'   itemsr(   s    r"   r{   zdirstatemap.items   s    y   r$   c              #   x   K   |                                  D ]"\  }}||j        |j        |j        |j        fV  #dS )z
        Return an iterator of (filename, state, mode, size, mtime) tuples

        `all` is unused when Rust is not enabled
        N)r{   stater@   rF   mtime)r   allfilenamer9   s       r"   
debug_iterzdirstatemap.debug_iter   sT       !%

 	K 	KXtTZDItzJJJJJ	K 	Kr$   c                 4    | j                                         S r+   )r'   keysr(   s    r"   r   zdirstatemap.keys   s    y~~r$   Fc                     ||f| _         d| _        i }|r\| j                                        D ]B\  }}|j        r6| j                            |d           }|r|||<   |                                 C|S NT)r   r   r'   r{   p2_infork   popdrop_merge_data)r   p1p2fold_p2copiesfssources           r"   rw   zdirstatemap.setparents   s    R! 	(	)) ( (19 (!\--a66F +$*q	%%'''r$   c                 v   t           j                            | j                            | j                            | _        | j        r@| j        j	        sd S | j        
                    | j                                                  }n|                                 }|sd S t          j        t          d          r/t                              t!          |          dz            | _        | j        rO| j        j        }| j        j        }t          j        t*          j                  } || j        | j        ||           n5t          j        t          j                  } || j        | j        |          }| j        s
 | j        |  | j        j        | _        | j        j        | _        | j        j        | _        d S )Ns   dict_new_presizedG   )r   filestatfrompathr   joinr   identityr   r	   rU   rD   rQ   rG   safehasattrr   dict_new_presizedr0   r'   rT   tree_metadatanogcr
   parse_dirstaterk   r   rw   r7   r:   r,   )r   rZ   pr[   r   s        r"   rD   zdirstatemap.read  s   ..Ldn--
 
   	*;# ""4;#<#<#>#>??BB''))B 	F G%9:: 	A  11#b''R-@@DI   	<#A;,D!Yr'899NN49dlB====!Yw'=>>Nty$,;;A! 	 DOQ !I2909=r$   c                 Z   | j         r;t          j        | j        | j                  \  }}|                     ||||           nat                              | j        | j        |                                           }|                    |           |	                                 d| _
        d S NF)r   r
   pack_dirstater'   rk   r`   r   rT   rV   r=   r   )r   rY   rZ   r\   r[   s        r"   rV   zdirstatemap.write9  s      	+DIt|DDLFD##BD&9999**	4< F HHVHHJJJ"r$   c                     | j          | j        S r+   r'   r   r(   s    r"   r   zdirstatemap.identityE  s    		}r$   Nc                     ||j         r#d| j        v r| j                            |           |%d| j        v r| j                            |           dS dS dS )z,increment the dirstate counter if applicableN_dirs_alldirs)removed__dict__r   addpathr   )r   r   	old_entrys      r"   
_dirs_incrzdirstatemap._dirs_incrM  sq     !2&&Jx(((t}!<!<M!!(+++++ !<!<r$   c                 h   |Pd| j         v r!|j        s| j                            |           d| j         v r|s| j                            |           n%|r#d| j         v r| j                            |           d| j         v r1t          j        |          }| j        	                    |d           dS dS )z,decrement the dirstate counter if applicableNr   r   filefoldmap)
r   r   r   delpathr   r   r   normcaser   r   )r   r   r   remove_variantnormeds        r"   
_dirs_decrzdirstatemap._dirs_decrV  s     $-''	0A'
""8,,,T]**>*%%h/// 	,
dm ; ;M!!(+++DM))]8,,F  ..... *)r$   c                    	 t           j        } || j        t          j        t          j                  S # t          $ r Y nw xY wi }t          j        }| j                                        D ]\  }}|j	        s|| ||          <   d|d<   |S )zeReturns a dictionary mapping normalized case paths to their
        non-normalized versions.
           .)
r   make_file_foldmapr'   r   normcasespecnormcasefallbackAttributeErrorr   r{   r   )r   makefilefoldmapr   r   namer   s         r"   r   zdirstatemap.filefoldmapc  s    
	%7O #?	4,d.C    	 	 	D	 =y(( 	) 	)GD!9 )$(((4..!$s   4 
A Ac                 R    i }t           j        }| j        D ]}|| ||          <   |S r+   )r   r   r   r   r   r   r   s       r"   
dirfoldmapzdirstatemap.dirfoldmapy  s9    =J 	% 	%D $Ahhtnnr$   c                     || j         v S )zo
        Returns True if the dirstate contains a tracked (not removed) file
        in this directory.
        )r   r   ds     r"   hastrackeddirzdirstatemap.hastrackeddir  s    
 DJr$   c                     || j         v S )zn
        Returns True if the dirstate contains a file (tracked or removed)
        in this directory.
        )r   r   s     r"   hasdirzdirstatemap.hasdir  s    
 DM!!r$   c                 8    t          j        | j        d          S )NT)only_trackedr   dirsr'   r(   s    r"   r   zdirstatemap._dirs  s    }TYT::::r$   c                 4    t          j        | j                  S r+   r   r(   s    r"   r   zdirstatemap._alldirs  s    }TY'''r$   Tc                 t   | j                             |d           |sL|sJ|sH| j                            |          }|                     |           |                     ||           dS | j                            |          }|                     ||           t          |||||          }|| j        |<   dS )ah  Set a entry to a given state, diregarding all previous state

        This is to be used by the part of the dirstate API dedicated to
        adjusting the dirstate after a update/merge.

        note: calling this might result to no entry existing at all if the
        dirstate map does not see any point at having one for this file
        anymore.
        N)r   )
wc_tracked
p1_trackedr   has_meaningful_mtimeparentfiledata)rk   r   r'   r,   _drop_entryr   r   DirstateItem)	r   r   r   r   r   r   r   r   entrys	            r"   reset_statezdirstatemap.reset_state  s    ( 	4((( 	g 	 		h//IX&&&OOH	O:::FIMM(++	),,,!!!5)
 
 
 $	(r$   c                    d}|                      |          }|2|                     |           t          d          }|| j        |<   d}nt|j        sC|                     ||           |                                 |                     ||           d}n*|                                 |                     ||           |S )NFT)r   )r,   r   r   r'   trackedset_tracked_refresh_entryset_possibly_dirty)r   r   newr   s       r"   r   zdirstatemap.set_tracked  s    ""=OOH%%%   E #(DIhCC 
	1OOHe,,,%000CC
 $$&&&%000
r$   c                    |                      |          }|dS |                     |||j                    |j        s| j                            |d           |                                 |                     ||           dS )z4Mark a file as no longer tracked in the dirstate mapNF)r   r   T)r,   r   addedr   rk   r   set_untrackedr   r   r   r   s      r"   r   zdirstatemap.set_untracked  s    =5OOA5;OOOO= *  D)))!!!5)))4r$   c                     | |         }|t           z  }|                    |||           |                     ||           | j                            |d           dS )z$mark a file as back to a clean stateN)	rangemask	set_cleanr   rk   r   )r   r   r@   rF   r~   r   s         r"   r   zdirstatemap.set_clean  s_    XidE***He,,,4(((((r$   c                 j    | |         }|                                  |                     ||           dS )z<record that the current state of the file on disk is unknownN)r   r   )r   r   r   s      r"   r   zdirstatemap.set_possibly_dirty  s9    X  """He,,,,,r$   c                 N    |j         s| j                            |d           dS dS )z record updated state of an entryN)any_trackedr'   r   r   s      r"   r   zdirstatemap._refresh_entry  s3      	#IMM!T"""""	# 	#r$   c                 r    | j                             |d           | j                            |d           dS )zremove any entry for file f

        This should also drop associated copy information

        The fact we actually need to drop it is the responsability of the callerN)r'   r   rk   r   r   s     r"   r   zdirstatemap._drop_entry  s8     		aD!!!!!r$   Fr+   r   FFFTN)rg   rh   ri   rj   propertycacher'   rk   rv   r{   	iteritemsr   r   rw   rD   rV   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rm   r$   r"   ro   ro      s        F   ]
   ]
6 6 6! ! ! IK K K     
    4! 4! 4!l
# 
# 
#   ], , , ,/ / / /   ]*   ]  " " " ; ; ]; ( ( ]( !%$ %$ %$ %$N  0  ) ) )- - -# # #
" " " " "r$   ro   c                       e Zd Zed             Zed             Zd Zd Zd Z	e	Z
d ZddZed	             Zd
 Zed             Zd Zd Zed             Zd Zd Zd Zd Z	 	 	 	 	 ddZdS )ro   c                    t           j                            | j                            | j                            | _        | j        r| j        j	        r2| j        
                    | j                                                  }nd}t          j                            || j        j        | j        j                  | _        | j        j        }n9t          j                            |                                           \  | _        }|r| j        s
 | j        |  | j        j        | _        | j        j        | _        | j        j        | _        | j        S )z<
            Fills the Dirstatemap when called.
            r$   )r   r   r   r   r   r   r   r   r	   rU   rD   rQ   rustmodDirstateMapnew_v2	data_sizer   r'   rT   new_v1rG   r   rw   r7   r:   r,   )r   datarT   s      r"   r'   zdirstatemap._map  s-    !M22!!$.11 DM $ ;# <,,T[-F-F-H-HIIDDD#/66$+/1J 	 +-%,%8%?%?**,,& &"	7  *t1 *)) $	 6D#y4Dy}DH9r$   c                 4    | j                                         S r+   )r'   rk   r(   s    r"   rk   zdirstatemap.copymap)  s    9$$&&&r$   c                 6    | j                             |          S )z
            Return an iterator of (filename, state, mode, size, mtime) tuples

            `all`: also include with `state == b' '` dirstate tree nodes that
            don't have an associated `DirstateItem`.

            )r'   r   )r   r   s     r"   r   zdirstatemap.debug_iter-  s     9'',,,r$   c                 
   | j                                          |                     | j        j        | j        j                   t          j        | d           t          j        | d           t          j        | d           d S )Nrs   rt   ru   )r'   rv   rw   r   rd   r   rx   r(   s    r"   rv   zdirstatemap.clear7  s|    IOOOO#*D,?,F   $T8444$T;777$T=99999r$   c                 4    | j                                         S r+   rz   r(   s    r"   r{   zdirstatemap.items@  s    9??$$$r$   c                 *    t          | j                  S r+   r3   r(   s    r"   r   zdirstatemap.keysF  s    	??"r$   Fc                 `    ||f| _         d| _        i }|r| j                                        }|S r   )r   r   r'   setparents_fixup)r   r   r   r   r   s        r"   rw   zdirstatemap.setparentsK  s:    HDM!%DF 63355Mr$   c                     | j          | j        S r+   r   r(   s    r"   r   zdirstatemap.identityU  s    II= r$   c                    | j         sd|                                 \  }}| j                            ||          }|                    |           |                                 d| _        d S | j        j        d u}| j        	                    |          \  }}}|r>| j        }	|	
                                }
|                     |
d          5 }|                    |	j                   |                                |	j        k    sJ |                    |          }|,|t          |          k    sJ |t          |          f            d d d            n# 1 swxY w Y   |	xj        t          |          z  c_        |                                 |	_        ||	_        |                    |	                                           |                                 n|                     ||||           t'          j        | d           d| _        d S )NFs   r+bs   _map)r   rT   r'   write_v1rV   r=   r   r	   rU   write_v2rQ   r   seekr   tellr0   r   rW   r`   r   rx   )r   rY   rZ   r   r   r\   
can_appendr[   appendr	   rQ   r?   writtens                r"   rV   zdirstatemap.writeZ  s1   ( B++B33   


%*" )5J#'9#5#5j#A#A FD& > & 4 4 6 6\\-88 NBGGF,---7799(88888 hhv..G*&#f++555V7M555N N N N N N N N N N N N N N N   CKK/  !%'+$))++,,,



''Bf===$T7333!&Ds   A=EEEc                 4    | j                                         S )zmReturns a dictionary mapping normalized case paths to their
            non-normalized versions.
            )r'   filefoldmapasdictr(   s    r"   r   zdirstatemap.filefoldmap}  s    
 9..000r$   c                 6    | j                             |          S r+   )r'   r   r   s     r"   r   zdirstatemap.hastrackeddir      9**1---r$   c                 6    | j                             |          S r+   )r'   r   r   s     r"   r   zdirstatemap.hasdir  s    9##A&&&r$   c                 v    i }t           j        }| j                                        D ]}|| ||          <   |S r+   )r   r   r'   tracked_dirsr   s       r"   r   zdirstatemap.dirfoldmap  sE    A}H	..00 ) )$(((4..!!Hr$   c                 6    | j                             |          S r+   )r'   r   r   s     r"   r   zdirstatemap.set_tracked  s    9((+++r$   c                 6    | j                             |          S r+   )r'   r   r   s     r"   r   zdirstatemap.set_untracked  r   r$   c                 @    | j                             ||||           d S r+   )r'   r   )r   r   r@   rF   r~   s        r"   r   zdirstatemap.set_clean  s$    I$e<<<<<r$   c                 :    | j                             |           d S r+   )r'   r   r   s     r"   r   zdirstatemap.set_possibly_dirty  s    I((+++++r$   TNc                 @    | j                             ||||||          S r+   )r'   r   )r   r   r   r   r   r   r   s          r"   r   zdirstatemap.reset_state  s0     9(($  r$   r   r   )rg   rh   ri   r   r'   rl   rk   r   rv   r{   r   r   rw   r   rV   r   r   r   r   r   r   r   r   r   rm   r$   r"   ro   ro     s        
	 	 
	@ 
	' 	' 
	'	- 	- 	-	: 	: 	:	% 	% 	% 		# 	# 	#
	 	 	 	 
	! 	! 
	!	' 	' 	'F 
	1 	1 
	1	. 	. 	.	' 	' 	' 
	 	 
		, 	, 	,	. 	. 	.	= 	= 	=	, 	, 	, !%	 	 	 	 	 	r$   )i18nr    r   r   r   r   r   dirstateutilsr	   rJ   r
   	importmodr   
importrustr   r   r   r   r   ro   rm   r$   r"   <module>r     s                            
 &
9
%
%
&
J
'
'"
?'LL'L	@ @ @ @ @ @ @ @FY" Y" Y" Y" Y"$ Y" Y" Y"x
 l l l l l( l l l l l r$   