
    q&fG3                         d dl Z d dlmZmZ d dlmZmZ ddlmZm	Z	m
Z
  G d d      Z G d d	ej                        Z G d
 dej                        Z G d d      Z G d d      Zy)    N)hexsha1nodeconstants)mdiffrevlog   )	basestore	constantsshallowutilc                   $    e Zd ZdZdZdZdZdZdZy)ChainIndiciesz>A static class for easy reference to the delta chain indicies.r   r            N)	__name__
__module____qualname____doc__NAMENODEBASENAMEBASENODEDATA     B/usr/lib/python3/dist-packages/hgext/remotefilelog/contentstore.pyr   r      s$    H DD H HDr   r   c                        e Zd Z fdZd Zej                  j                  d        Zd Z	ej                  j                  d        Z
d Zej                  j                  d        Zd Zd	 Zd
 ZddZ xZS )unioncontentstorec                     t        t        | 
  |i | || _        |j	                  d      | _        |j	                  dd      | _        y )N
writestoreallowincompleteF)superr   __init__storesgetr   r    selfargskwargs	__class__s      r   r"   zunioncontentstore.__init__%   sE    /@@ **\2
  &zz*;UCr   c                 d   | j                  ||      }|d   t        j                     t        j                  k7  rt        |t        |      f      |j                         t        j                     }|}|r;|j                         t        j                     }t        j                  ||g      }|r;|S )a  Fetches the full text revision contents of the given name+node pair.
        If the full text doesn't exist, throws a KeyError.

        Under the hood, this uses getdeltachain() across all the stores to build
        up a full chain to produce the full text.
        )getdeltachainr   r   r   nullidKeyErrorr   popr   r   patches)r&   namenodechainfulltexttextdeltas          r   r$   zunioncontentstore.get0   s     ""4.9]++,0A0H0HHD#d),-- 99;}112IIK 2 23E==w/D  r   c                     | j                   D ]  }	 |j                  ||      c S  t        |t        |      f      # t        $ r Y :w xY w)z;Return the single delta entry for the given name/node pair.)r#   getdeltar.   r   r&   r1   r2   stores       r   r8   zunioncontentstore.getdeltaH   sW     [[ 	E~~dD11	 c$i())     <	AAc                 `   | j                  ||      }|d   t        j                     t        j                  k7  rW|d   \  }}}}}	 | j                  ||      }|j                  |       |d   t        j                     t        j                  k7  rW|S # t        $ r | j                  s Y |S w xY w)a  Returns the deltachain for the given name/node pair.

        Returns an ordered list of:

          [(name, node, deltabasename, deltabasenode, deltacontent),...]

        where the chain is terminated by a full text entry with a nullid
        deltabasenode.
        r+   )_getpartialchainr   r   r   r-   extendr.   r    )r&   r1   r2   r3   xdeltabasenamedeltabasenode	morechains           r   r,   zunioncontentstore.getdeltachainS   s     %%dD1Bi../3D3K3KK49"I1Aq- 11-O	Y'	 Bi../3D3K3KK   ++s   #B B-,B-c                     | j                   D ]  }	 |j                  ||      c S  t        |t        |      f      # t        $ r Y :w xY w)z)Returns the metadata dict for given node.)r#   getmetar.   r   r9   s       r   rD   zunioncontentstore.getmetak   sW     [[ 	E}}T400	
 c$i())  r;   c                 ~    | j                   D cg c]  }|j                          }}t        j                  | S c c}w N)r#   
getmetricsr
   sumdicts)r&   smetricss      r   rG   zunioncontentstore.getmetricsu   s5    +/;;7a1<<>77##W-- 8s   :c                     | j                   D ]  }	 |j                  ||      c S  t        |t        |      f      # t        $ r Y :w xY w)zReturns a partial delta chain for the given name/node pair.

        A partial chain is a chain that may not be terminated in a full-text.
        )r#   r,   r.   r   r9   s       r   r=   z"unioncontentstore._getpartialchainy   sY     [[ 	E**466	 c$i())  r;   c                     t        d      Ns5   cannot add content only to remotefilelog contentstoreRuntimeErrorr&   r1   r2   datas       r   addzunioncontentstore.add       D
 	
r   c                 T    |}| j                   D ]  }|s|j                  |      } |S rF   )r#   
getmissing)r&   keysmissingr:   s       r   rU   zunioncontentstore.getmissing   s4    [[ 	4E**73	4 r   c                 l    | j                   r| j                   j                  |||       y t        d      )Ns   no writable store configured)r   addremotefilelognoderO   rP   s       r   rY   z&unioncontentstore.addremotefilelognode   s+    ??OO00tTB>??r   c                 J    | j                   D ]  }|j                  ||        y rF   )r#   
markledger)r&   ledgeroptionsr:   s       r   r[   zunioncontentstore.markledger   s%    [[ 	.EVW-	.r   rF   )r   r   r   r"   r$   r   baseunionstore	retriabler8   r,   rD   rG   r=   rR   rU   rY   r[   __classcell__r)   s   @r   r   r   $   s    	D0 ''* (*0 ''* (*. ''* (*

@.r   r   c                   H     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
 xZS )	remotefilelogcontentstorec                 ^    t        t        | 
  |i | t        j                         | _        y rF   )r!   rc   r"   	threadinglocal_threaddatar%   s      r   r"   z"remotefilelogcontentstore.__init__   s'    '7HH$??,r   c                 J   | j                  ||      }t        j                  |      \  }}}||||z    }t        j                  |      }||   \  }	}
}}d }|rt	        |	      }| j                  |||       |t        j                  z  rd x}}t        j                  |||      }|S rF   )	_getdatar
   parsesizeflagsancestormapr   _updatemetacacher   REVIDX_EXTSTOREDcreaterevlogtext)r&   r1   r2   rQ   offsetsizeflagscontentrk   p1p2linknodecopyfromcopyrevrevisions                  r   r$   zremotefilelogcontentstore.get   s    }}T4()88>ev.!--d3%0%6"B("gGdD%0 6***!%%Gh//7Kr   c                 n    | j                  ||      }||t        j                  | j                  ||      fS rF   )r$   r   r-   rD   r&   r1   r2   rx   s       r   r8   z"remotefilelogcontentstore.getdelta   s;     88D$'$$LLt$	
 	
r   c                 R    | j                  ||      }||d t        j                  |fgS rF   r$   r   r-   rz   s       r   r,   z'remotefilelogcontentstore.getdeltachain   /    
 88D$'tT#4#;#;XFGGr   c                    | j                          || j                  j                  d   k7  r>| j                  ||      }t	        j
                  |      \  }}}| j                  |||       | j                  j                  d   S Nr   r   )_sanitizemetacacherg   	metacacheri   r
   rj   rl   )r&   r1   r2   rQ   ro   rp   rq   s          r   rD   z!remotefilelogcontentstore.getmeta   sw    !4##--a00==t,D"-"<"<T"BFD%!!$e4))!,,r   c                     t        d      rM   rN   rP   s       r   rR   zremotefilelogcontentstore.add   rS   r   c                 Z    t        | j                  dd       }|d| j                  _        y y )Nr   )NN)getattrrg   r   )r&   r   s     r   r   z,remotefilelogcontentstore._sanitizemetacache   s/    D,,k4@	)5D& r   c                     | j                          || j                  j                  d   k(  ry t        j                  |t        j
                  |i}||f| j                  _        y )Nr   )r   rg   r   r	   METAKEYFLAGMETAKEYSIZE)r&   r2   rp   rq   metas        r   rl   z*remotefilelogcontentstore._updatemetacache   sV    !4##--a00%%ui.C.CTJ&*D\"r   )r   r   r   r"   r$   r8   r,   rD   rR   r   rl   r`   ra   s   @r   rc   rc      s,    -,	
H-

6
2r   rc   c                   >    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d
d	Z
y)remotecontentstorec                      || _         || _        y rF   )_fileservice_shared)r&   uifileserviceshareds       r   r"   zremotecontentstore.__init__   s    'r   c                     | j                   j                  |t        |      fgdd       | j                  j	                  ||      S NT)force	fetchdata)r   prefetchr   r   r$   r&   r1   r2   s      r   r$   zremotecontentstore.get   sG    ""CItt 	# 	
 ||d++r   c                     | j                  ||      }||t        j                  | j                  j	                  ||      fS rF   )r$   r   r-   r   rD   rz   s       r   r8   zremotecontentstore.getdelta   s?    88D$'$$LL  t,	
 	
r   c                 R    | j                  ||      }||d t        j                  |fgS rF   r|   rz   s       r   r,   z remotecontentstore.getdeltachain   r}   r   c                     | j                   j                  |t        |      fgdd       | j                  j	                  ||      S r   )r   r   r   r   rD   r   s      r   rD   zremotecontentstore.getmeta  sG    ""CItt 	# 	
 ||##D$//r   c                     t        d      )Ns   cannot add to a remote storerN   rP   s       r   rR   zremotecontentstore.add	      :;;r   c                     |S rF   r   )r&   rV   s     r   rU   zremotecontentstore.getmissing  s    r   Nc                      y rF   r   )r&   r\   r]   s      r   r[   zremotecontentstore.markledger      r   rF   )r   r   r   r"   r$   r8   r,   rD   rR   rU   r[   r   r   r   r   r      s+    
,
H0<r   r   c                   ^    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d Zy)manifestrevlogstorec                     |j                   | _        |j                  | _        t	               | _        t        j                  | j                  d      | _        d| _        y )Ns   00changelog.iradixr   )	r:   _storesvfs_svfsdict_revlogsr   _cl_repackstartlinkrev)r&   repos     r   r"   zmanifestrevlogstore.__init__  s@    jjYY
==3CD#$ r   c                 B    | j                  |      j                  |      S rF   )_revlograwdatar   s      r   r$   zmanifestrevlogstore.get  s    ||D!))$//r   c                 z    | j                  ||      }||| j                  j                  | j                  ||      fS rF   )r$   r   r-   rD   rz   s       r   r8   zmanifestrevlogstore.getdelta  s4    88D$'txxT40HHHr   c                 ^    | j                  ||      }||d | j                  j                  |fgS rF   )r$   r   r-   rz   s       r   r,   z!manifestrevlogstore.getdeltachain"  s.    88D$'tT488??H=>>r   c                     | j                  |      }|j                  |      }t        j                  |j	                  |      t        j
                  |j                  |      iS rF   )r   revr	   r   rq   r   rawsize)r&   r1   r2   rlr   s        r   rD   zmanifestrevlogstore.getmeta&  sM    \\$ffTl!!288C=!!2::c?
 	
r   Nc                 X   |
t               }||v rg S | j                  |      }i }|h}|j                  |j                  |      gd      D ]  }|j	                  |      }|j                  |       |j                  |      \  }	}
|	| j                  j                  k7  r|	|vr|j                  |	       |
| j                  j                  k7  r|
|vr|j                  |
       | j                  j	                  |j                  |            }|	|
|df||j	                  |      <   |r |S  |S )NT)	inclusiver   )setr   	ancestorsr   r2   discardparentsr   r-   rR   linkrev)r&   r1   r2   knownr   r   rW   ancrevancnoders   rt   ru   s               r   getancestorsz manifestrevlogstore.getancestors.  s   =EE5=I\\$	&llBFF4L>TlB 	FggfoGOOG$ZZ(FBTXX__$5BTXX__$5Bxx}}RZZ%78H*,b(C)@Ibggfo&	 r   c                     | j                   }| j                  |      }|j                  |      }|j                  |j	                  |            }|d   |d   |j                  |      d fS r   )r   r   r   r   r   r2   )r&   r1   r2   clr   r   r   s          r   getnodeinfozmanifestrevlogstore.getnodeinfoG  s]    XX\\$**T"**RVVD\*
GAJ(8$??r   c                     t        d      )Ns   cannot add to a revlog storerN   )r&   r'   s     r   rR   zmanifestrevlogstore.addN  r   r   c                     | j                   j                  |      }|<d}|dk7  rd|z  }t        j                  | j                  |      }|| j                   |<   |S )N   00manifesttreer   s   meta/%s/00manifestr   )r   r$   r   r   )r&   r1   r   
revlognames       r   r   zmanifestrevlogstore._revlogQ  sX    ]]t$:*Js{2T9
tzz<B"$DMM$	r   c                     g }|D ]8  \  }}| j                  |      }||j                  vs&|j                  ||f       : |S rF   )r   nodemapappend)r&   rV   rW   r1   r2   mfrevlogs         r   rU   zmanifestrevlogstore.getmissing[  sM     	-JD$||D)H8+++d|,	-
 r   c                      || _         || _        y rF   )r   _repackendlinkrev)r&   startrevendrevs      r   setrepacklinkrevrangez)manifestrevlogstore.setrepacklinkrevranged  s    #+ !'r   c                 X   |r |j                  t        j                        ry d}t        j                  | j                  d      }| j
                  }| j                  }t        t        |      dz
  dd      D ]W  }|j                  |      }||k  r n?||kD  r!|j                  |      }	|j                  | ||	       |j                  | ||	       Y | j                  j                         D ]  \  }
}}|d d dk7  s|dd  d	k7  r|dt        d
        }t        j                  | j                  |d d       }t        t        |      dz
  dd      D ]W  }|j                  |      }||k  r ||kD  r!|j                  |      }	|j                  | ||	       |j                  | ||	       Y  y )Nr   r   r   r   r+      s   meta/s   .is   /00manifest)	indexfile)r$   r	   OPTION_PACKSONLYr   r   r   r   rangelenr   r2   markdataentrymarkhistoryentryr   data_entries)r&   r\   r]   treenamer   startlinkrev
endlinkrevr   r   r2   tpathrp   s                r   r[   zmanifestrevlogstore.markledgerh  s   w{{9#=#=>]]4::->?//++
R1b"- 	:CjjoG%#773<D  x6##D(D9	: "[[557 	>MAtTBQx8#tBCyE'9A^!4 45HtzzT#2Y?BSWq["b1 >**S/\)Z'wws|$$T8T:''h=>	>r   c                      y rF   r   )r&   r\   s     r   cleanupzmanifestrevlogstore.cleanup  r   r   rF   )r   r   r   r"   r$   r8   r,   rD   r   r   rR   r   rU   r   r[   r   r   r   r   r   r     sF    %0I?
2@<( >Dr   r   )re   mercurial.noder   r   	mercurialr   r    r   r	   r
   r   r^   r   rc   r   r   r   r   r   <module>r      sg      $w.	00 w.tE2	 3 3 E2P* *Zx xr   