
    q&f :                         d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	 d dl
mZ d dlmZ ddlmZmZ  G d	 d
      Z G d d      Zy)    N)bin)_)ancestorerrormdiffrevlog)storageutil)flagutil   )	constantsshallowutilc                       e Zd Zd Zd Zd Zy)remotefilelognodemapc                      || _         || _        y N)	_filename_store)selffilenamestores      C/usr/lib/python3/dist-packages/hgext/remotefilelog/remotefilelog.py__init__zremotefilelognodemap.__init__   s    !    c                 j    | j                   j                  | j                  |fg      }t        |       S r   )r   
getmissingr   bool)r   nodemissings      r   __contains__z!remotefilelognodemap.__contains__!   s/    ++((4>>4*@)AB=  r   c                 $    || vrt        |      |S r   )KeyErrorr   r   s     r   __get__zremotefilelognodemap.__get__%   s    t4. r   N)__name__
__module____qualname__r   r   r#    r   r   r   r      s    !r   r   c                   $   e Zd Zej                  Zd Zd Zd"dZd Z	dde
j                  dfdZ	 	 d"dZd Zd	 ZeZd
 Zd ZeZd Zd 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$dZ!d Z"d Z#d Z$d Z%d Z&d Z'd  Z(d! Z)y)%remotefilelogc                     || _         || _        || _        t        | j                  |j                        | _        d| _        t        t        j                        | _
        y )Nr   )openerr   repor   contentstorenodemapversiondictr
   flagprocessors_flagprocessors)r   r+   pathr,   s       r   r   zremotefilelog.__init__/   sI    	+DMM4;L;LM#H$;$;<r   c                 ~    | j                  |      }|j                  d      s|S |j                  dd      }||dz   d S )z&returns the file contents at this nodes   
   N)revision
startswithindex)r   r   tss       r   readzremotefilelog.read9   sA    MM$||G$HGGGQQzr   Nc                     t        j                  ||j                  d      |j                  d            }t        j                  |||      }| j                  ||||||      S )N   copy   copyrev)r   )r   createrevlogtextgetr	   hashrevisionsha1addrevision)	r   textmetatransactionlinknodep1p2hashtextr   s	            r   addzremotefilelog.addA   sf    //$((7#TXXj%9
 ++Hb"=k8R$   
 	
r   c                    t        j                  t        |      |      }d||fz  }	|}
d}|rd|v r|d   }t        |d         }
|	d||
|||fz  z  }	t	               }i }g }|
| j
                  j                  k7  rg| }|r!t        | j                  || j
                        }|j                  |j                  |
             |j                  |
       |j                  |
       || j
                  j                  k7  rB|j                  | j                  |             |j                  |       |j                  |       d}|r|j                  d      }||   \  }}}}|xs d}|d|||||fz  z  }|| j
                  j                  k7  r&||vr"|j                  |       |j                  |       || j
                  j                  k7  r&||vr"|j                  |       |j                  |       |r|	|z  }	|	S )Ns   %s %sr   r=   r>   s   %s%s%s%s%s r   )r   buildfileblobheaderlenr   setr,   nullidr)   r+   updateancestormapappendrJ   pop)r   rC   rD   flagsrG   rH   r   rF   headerdatarealp1copyfromvisited
pancestorsqueuep1flogancestortextcpa1pa2ancestorlinknode
pacopyfroms                         r   _createfileblobzremotefilelog._createfileblobK   s   00TEBFD>)GtOG}Hj)*F4Xx"HHH%
TYY%%%F&t{{HdiiHf0089LL KK!!!d..r23LLKKO 		!A5?]2C&
#*sJO /  L dii&&&3g+=S!C dii&&&3g+=S!C % ( 	r   c
                     |t        j                  |||      }t        j                  |      \  }
}t        j                  | ||      \  }}| j                  |||||||||
|f	      S )N)
_metatuple)r	   rA   	parsemetar
   processflagswriteaddrawrevision)r   rC   rE   rF   rG   rH   
cachedeltar   rT   sidedatarD   
metaoffsetrawtextvalidatehashs                 r   rB   zremotefilelog.addrevision   s     <//b"=D&006j ( : :!

 ""j) # 

 
	
r   c
           	          |	r|	\  }
}nt        j                  |      \  }
}|dk7  rd}|r||d  }n|}| j                  ||
|||||      }| j                  j                  j                  | j                  ||       |S )Nr   )r	   rf   rc   r,   r-   addremotefilelognoder   )r   rl   rE   rF   rG   rH   r   rT   ri   re   rD   rk   blobtextrV   s                 r   rh   zremotefilelog.addrawrevision   s       *D*  +44W=D*A: J z{+HH##dE2r4
 			33DMM4Nr   c                     | j                   j                  j                  | j                  |      }||   \  }}}}|r||fS yNFr,   metadatastoregetancestorsr   )r   r   	ancestorsrG   rH   rF   rX   s          r   renamedzremotefilelog.renamed   sD    II++88M	%.t_"B(b>!r   c                 6    t        | j                  |            S )z#return the size of a given revision)rM   r;   r"   s     r   sizezremotefilelog.size   s    499T?##r   c                 b    || j                   j                  k(  ry| j                  |      }||k7  S )zpcompare text with a given file revision

        returns True if text is different than what is stored.
        T)r,   rO   r;   )r   r   rC   nodetexts       r   cmpzremotefilelog.cmp   s1     499###99T?4r   c                      y)NTr'   r   s    r   __nonzero__zremotefilelog.__nonzero__       r   c                 6    | j                   dv ryt        d      )N)s   .hgtagss   .hgsubs   .hgsubstater   s   len not supported)r   RuntimeErrorr~   s    r   __len__zremotefilelog.__len__   s     ==CC
 /00r   c                     g S r   r'   r~   s    r   headszremotefilelog.heads   s    	r   c                      yrr   r'   r~   s    r   emptyzremotefilelog.empty   s    r   c                     t        |t              rt        j                  d      | j                  j
                  }|j                  | j                  |      j                  t        j                  d      S )Ns3   remotefilelog does not accept integer rev for flagsr   )
isinstanceintr   ProgrammingErrorr,   r-   getmetar   r@   r   METAKEYFLAG)r   r   r   s      r   rT   zremotefilelog.flags  s[    dC ((F  		&&}}T]]D155i6K6KQOOr   c                 8   || j                   j                  k(  r,| j                   j                  | j                   j                  fS | j                   j                  j                  | j                  |      }||   \  }}}}|r| j                   j                  }||fS r   )r,   rO   rt   ru   r   r   r   rQ   rG   rH   rF   rX   s          r   parentszremotefilelog.parents
  s    499###99##TYY%5%555ii--::4==$O%0%6"B(!!B2vr   c                 $    | j                  |      S r   )r   r   revs     r   
parentrevszremotefilelog.parentrevs  s     ||C  r   c                 z    | j                   j                  j                  | j                  |      }||   \  }}}}|S r   rs   r   s          r   rF   zremotefilelog.linknode  s:    ii--::4==$O%0%6"B(r   c                     | j                   j                         j                  j                  | j	                  |            S r   )r,   
unfiltered	changelogr   rF   r"   s     r   linkrevzremotefilelog.linkrev  s/    yy##%//33DMM$4GHHr   c	              #     K   ~~~~~d }	|D ]  }
| j                  |
      \  }}|	|x}}	|
k(  r| j                  j                  }|| j                  j                  k7  rd }| j                  ||
      }n| j	                  |
      }d }t        j                  |
||| j                  |
      || j                  |
      d ||d d        y w)Nr   )r   p1nodep2noderF   basenoderT   baserevisionsizer6   deltarj   protocol_flags)	r   r,   rO   revdiffrawdatar   revlogrevisiondeltarF   rT   )r   nodes
nodesorderrevisiondataassumehaveparentrevisionsdeltaprevious	deltamodesidedata_helpers
debug_infoprevnoder   rG   rH   r   r6   r   s                   r   emitrevisionszremotefilelog.emitrevisions"  s      &? 	D\\$'FB&((8499++499+++Xt4<<-,,t,!jj&!%!  	s   CCc                 j    t        j                  | j                  |      | j                  |            S r   )r   textdiffr   )r   node1node2s      r   r   zremotefilelog.revdiffM  s%    ~~dll514<<3FGGr   c                     t        |      dk(  rt        |      }t        |      dk7  r*t        j                  || j                  t        d            |S )N(      s   invalid lookup input)rM   r   r   LookupErrorr   r   r"   s     r   lookupzremotefilelog.lookupP  sL    t9?t9Dt9?##dmmQ'>%?  r   c                     |S r   r'   r"   s     r   r   zremotefilelog.revZ  s    r   c                 P    t        |t              rt        j                  d      |S )Ns2   remotefilelog does not convert integer rev to node)r   r   r   r   r   s     r   r   zremotefilelog.node^  s)    c3((E  
r   c                 r   || j                   j                  k(  ryt        |      dk7  r*t        j                  || j
                  t        d            || j                   j                  j                  k(  s"|| j                   j                  j                  v rt        j                  | j                   j                  }|j                  | j
                  |      }|r|S |j                  | j
                  |      j                  t        j                  d      }|dk(  r|S t!        j"                  | ||      d   S )zreturns the revlog contents at this node.
        this includes the meta data traditionally included in file revlogs.
        this is generally only used for bundling and communicating with vanilla
        hg clients.
        r   r   s   invalid revision inputr   )r,   rO   rM   r   r   r   r   nodeconstantswdiridwdirfilenodeidsWdirUnsupportedr-   r@   r   r   r   r
   processflagsread)r   r   rawr   rl   rT   s         r   r6   zremotefilelog.revisionf  s     499###t9?##dmmQ'@%A  DII++222tyy..>>>'''		&&))DMM40NdmmT266y7L7LaPA:N((w>qAAr   c                 (    | j                  |d      S )NF)r   )r6   r"   s     r   r   zremotefilelog.rawdata  s    }}Tu}--r   c                 b    | j                   j                  j                  | j                  |      S r   rs   r"   s     r   rQ   zremotefilelog.ancestormap  s#    yy&&33DMM4HHr   c                    || j                   j                  k(  s|| j                   j                  k(  r| j                   j                  S | j                  ||      \  }}|j                         D ci c]  \  }}||
 }}}t	        j
                  |||   ||         }|rt        t        |j                  |            S | j                   j                  S c c}}w r   )	r,   rO   _buildrevgraphitemsr   rv   minmap__getitem__	r   abrevmap
parentfunckvr.   ancss	            r   r   zremotefilelog.ancestor  s    		   A)9)9$999###!00A6
&,lln5FQ1a455!!*fQiCs7..566yy 6s   1Cc                 t   || j                   j                  k(  s|| j                   j                  k(  r| j                   j                  S | j                  ||      \  }}|j                         D ci c]  \  }}||
 }}}t	        j
                  |||   ||         }t        |j                  |      S c c}}w )z@calculate all the heads of the common ancestors of nodes a and b)r,   rO   r   r   r   commonancestorsheadsr   r   r   s	            r   r   z"remotefilelog.commonancestorsheads  s     		   A)9)9$999###!00A6
&,lln5FQ1a455,,ZF1IN7&&-- 6s   1B4c                    | j                  |      }| j                  |      }t        j                  t              }t	               ||fD ]  }|j                         D ]  \  }}||   }	|\  }
}}}|
| j                  j                  k7  r$|s"|	j                  |
       j                  |
       || j                  j                  k7  si|	j                  |       j                  |         t        j                  t              }i }t        j                  fd|D              }|r|j                         \  }}||v r|r||   j                  ||          3t        |      t        |      z
  dz
  }|||<   |r||   j                  |       |j                  |      D ]  }|j                  ||f        |r||j                  fS )zBuilds a numeric revision graph for the given two nodes.
        Returns a node->rev map and a rev->[revs] parent function.
        c              3   0   K   | ]  }|vsd |f  y wr   r'   ).0n
allparentss     r   	<genexpr>z/remotefilelog._buildrevgraph.<locals>.<genexpr>  s     B1az.AdAYBs   		r   )rQ   collectionsdefaultdictlistrN   r   r,   rO   rR   rJ   dequerS   rM   r@   
appendleftr   )r   r   r   amapbmap
parentsmapmappingr   pdatar   rG   rH   rF   rX   r   r   r[   prevrevcurrent
currentrevparentr   s                        @r   r   zremotefilelog._buildrevgraph  s    "" !,,T2
U
d| 	'G&}} 
'e$T*-2*B( )))(NN2&NN2&)))NN2&NN2&
'	' !,,T2
!!B
B
 $yy{GW& w'..vg? Z3v;6:J(F7O7#**:6$..1 7  *f!567 $ z----r   c                      y r   r'   )r   minlinkrE   s      r   stripzremotefilelog.strip  s    r   c                     g S r   r'   r~   s    r   fileszremotefilelog.files  s    	r   c                      y)N)r   r   r'   r~   s    r   	checksizezremotefilelog.checksize  r   r   )NN)NFFFNNN)F)*r$   r%   r&   r   RevlogError_flagserrorclassr   r;   rJ   rc   r   REVIDX_DEFAULT_FLAGSrB   rh   rw   ry   rawsizer|   r   __bool__r   r   r   rT   r   r   rF   r   r   r   r   r   r   r6   r   rQ   r   r   r   r   r   r   r'   r   r   r)   r)   +   s    ((=
7@ )) 
V *X$ G
  H1P	!

I "')VHB6.I 
./.br   r)   )r   mercurial.noder   mercurial.i18nr   	mercurialr   r   r   r   mercurial.utilsr	   mercurial.revlogutilsr
    r   r   r   r)   r'   r   r   <module>r      s=        ( * n nr   