
    q&fB                     ,   d dl Z d dlmZ d dlmZmZmZ d dlmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZ d dlmZmZ d dlmZ d dlmZmZ dd	lm Z  d
dl!m"Z"m#Z#  ej                         Z$e$jK                  ed      d        Z&e$jK                  e	d      d        Z'e$jK                  ed      d        Z(d Z)d Z*d Z+d8dZ,ddejZ                  fdZ.d Z/d Z0e$jK                  ed      d        Z1e$jK                  ejd                  d      d        Z3e$jK                  ejd                  d      d        Z4d Z5e$jK                  e
d       d!        Z6e$jK                  ed"      d#        Z7e$jK                  ejp                  d$      d%        Z9d& Z:d' Z;d( Z<d) Z=d* Z>e$jK                  ed+      d,        Z?e$jK                  ed-      d.        Z@d/ ZAd9d0ZBd9d1ZCd2 ZDe$jK                  ed3      d4        ZEe$jK                  ed5      e$jK                  ed6      d7               ZFy):    N)_)binhexshort)bundle2changegroupcmdutilcontexterrorexchange	exthelper	localreporevlogscmutilvfswireprotov1server)actionsengine)
repository)storageutil
stringutil   )lfutil   )	blobstorepointermakefilestoragec                 ^    d|v r|j                  t        j                          | d||d|S )N   lfs)requirementsfeatures )addr   REPO_FEATURE_LFS)origr    r!   kwargss       3/usr/lib/python3/dist-packages/hgext/lfs/wrapper.pylocalrepomakefilestorager(   3   s1    Z001G\HGGG    allsupportedversionsc                 8     | |      }|j                  d       |S )Ns   03)r#   )r%   uiversionss      r'   r*   r*   ;   s    BxHLLOr)   _capabilitiesc                      | ||      }t        |j                  d      r0d|j                  v r|j                  d       |j                  d       |S )z5Wrap server command to announce lfs server capabilitylfslocalblobstorer   s	   lfs-serve)hasattrsvfsr    append)r%   repoprotocapss       r'   r.   r.   B   sL     eDtyy-.
 T&&&KK%FKr)   c                      yNFr"   )selftexts     r'   bypasscheckhashr;   R   s    r)   c                    t        j                  |      }|j                         }| j                  j                  }|j                  |      s8| j                  |_        | j                  j                  j                  |g|       |j                  |d      }i }|j                         D ]*  }|j                  d      s|t        d      d }||   ||<   , |s|j                  d      rt        j                  ||      }|dfS )a%  Read filelog content from local blobstore transform for flagprocessor.

    Default tranform for flagprocessor, returning contents from blobstore.
    Returns a 2-typle (text, validatehash) where validatehash is True as the
    contents of the blobstore should be checked using checkhash.
    F)verifys   x-hg-Ns   
T)r   deserializeoidopenerr0   hasfilenamelfsremoteblobstore	readbatchreadkeys
startswithlenr   packmeta)r9   r:   pr?   storehgmetaknames           r'   readfromstorerO   V   s     	D!A
%%'CKK))E99S>]]
&&00!e< ::c%:(D FVVX  <<!S]_%DQ4F4L  )##FD1$<r)   c                    t        j                  |      \  }}|r
|dkD  r||d  }t        t        j                  |      j                               }| j                  j                  j                  ||       d|z  }t        j                  |dt        |      z        }t        j                  |      sd|d<   | |j                         D ]  \  }}||d|z  <    |j                         }	|	dfS )	Nr   s	   sha256:%ss   %d)r?   size   0   x-is-binarys   x-hg-%sF)r   	parsemetar   hashlibsha256digestr@   r0   writer   gitlfspointerrH   r   binaryitems	serialize)
r9   r:   rL   offsetr?   longoidmetadatarM   vrawtexts
             r'   writetostorerb   s   s     **40NFF&1*FG} gnnT"))+
,CKK!!''T2 S G$$us4y7HIH
 T"#'  LLN 	)DAq'(HZ!^$	)   "GUr)   c                     ||y| j                  |      }n| j                  |      }|| j                  k(  ry| j                  |      }t	        |t
        j                  z        S r8   )revnodenullidflagsboolr   REVIDX_EXTSTORED)rlogre   rd   rg   s       r'   _islfsrk      s[    
{<hhtnyy~t{{JJsOE///00r)   c
                 <   |j                   j                  j                  j                  d      }|rZt	        |      }t        j                  |      \  }}|r||z  } ||j                   j                  |      r|	t        j                  z  }	 | ||||||f|||	d|
S )Ns   lfstrack)
cachedeltare   rg   )
_revlogr@   optionsgetrH   r   rT   rB   r   ri   )r%   r9   r:   transactionlinkp1p2rm   re   rg   kwdslfstracktextlenmetar]   s                  r'   filelogaddrevisionry      s     ||""**..{;Hd)",,T2fvGDLL))73V,,,E

   r)   c                     t        |j                  |      rO|j                  j                  |      }|syt        j                  |      }d|v rd|v r|d   t        |d         fS y | ||      S )NFs	   x-hg-copys   x-hg-copyrev)rk   rn   rawdatar   r>   r   )r%   r9   re   ra   r_   s        r'   filelogrenamedr|      ss    dllD!,,&&t,&&w/8#8(CL)3x/H+IIIdr)   c                     t        |j                  |      r>|j                  j                  |      }t        j                  |      }t        |d         S  | ||      S )N)rd   s   size)rk   rn   r{   r   r>   int)r%   r9   rd   ra   r_   s        r'   filelogsizer      sP    dll$,,&&s+&&w/8G$%%c?r)   _verify_revisionc                 ^   t        ||      r|j                  |      }t        j                  |      }|j                  j
                  j                  |j                               r|t        j                   z  }n'|t        j                  z  r|d   j                  |        | ||||       y )N)re   s   safe_renamed)rk   r{   r   r>   r@   r0   rA   r?   r   ri   r#   )r%   rl	skipflagsstatere   ra   r_   s          r'   r   r      s    bt**T"&&w/
 99&&**8<<>:&1111I000 /"&&t,Yt$r)   cmpc                 (   |j                         rz t        |dd              rgt        j                  |j	                               }t        j                  |j	                               }|j                         |j                         k7  S  | ||      S )z+returns True if text is different than fctxislfsc                       yr8   r"   r"   r)   r'   <lambda>zfilectxcmp.<locals>.<lambda>   s    r)   )r   getattrr   r>   r{   r?   )r%   r9   fctxrs   rt   s        r'   
filectxcmpr      sn     zz|=g}=?  0  0vvx2668##dr)   isbinaryc                     |j                         rGt        j                  |j                               }t	        t        |j                  dd                  S  | |      S )NrS   r   )r   r   r>   r{   rh   r~   rp   )r%   r9   r_   s      r'   filectxisbinaryr      sF    zz|&&t||~6C^Q7899:r)   c                 f    t        | j                         j                  | j                               S N)rk   filelogrn   filenode)r9   s    r'   filectxislfsr   
  s!    $,,.(($--/::r)   _updatecatformatterc                 b     | |||||       |j                  ||   j                                y )N)r{   )datar{   )r%   fmctxmatcherpathdecodes         r'   r   r     s-    S'4(GGCI%%'G(r)   wrapconvertsinkc                 r     | |      }|j                   dk(  r G fdd|j                        |_        |S )Ns   hgc                   "     e Zd Z fdZ xZS )convertsink.<locals>.lfssinkc	           
      :   t         |   }	 |	||||||||      }
d| j                  j                  vrg| j                  |
   t	        fd|D              rD| j                  j                  j                  d       t        j                  | j                         |
S )Nr   c              3   V   K   | ]   \  }}|v xr |   j                          " y wr   )r   ).0fnr   s      r'   	<genexpr>z9convertsink.<locals>.lfssink.putcommit.<locals>.<genexpr>6  s+     I41a186A6Is   &))super	putcommitr4   r    anyr#   r   writereporequirements)r9   filescopiesparentscommitsourcerevmapfullcleanp2pcre   r   	__class__lfssinks              @r'   r   z&convertsink.<locals>.lfssink.putcommit  s     7D3	 !7!77))D/C I5II		..226:55dii@r)   )__name__
__module____qualname__r   __classcell__)r   r   s   @r'   r   r     s       r)   r   )repotyper   )r%   sinkr   s     @r'   convertsinkr     s7    :D}}!	dnn !	F !Kr)   __init__c           	           | ||       |j                   j                         D ]&  \  }}|j                  d      s||j                   |<   ( dD ]&  }t        ||      st	        ||t        ||             ( y )Nr   )r0   rC   )ro   r[   rG   r1   setattrr   )r%   r9   othervfsrM   r`   rN   s         r'   vfsinitr   C  su    x  &&(  1<<DLLO 
 < 98T"D$$ 789r)   c                    t        | j                  d      syg }t               }| j                  j                  }|D ]  \  }}| |   }|j	                  |      D ]{  }t        ||      }	|	s|	j                         |vs%|j                  |	j                               rE||	_        |j                  |	       |j                  |	j                                }  |r&t        j                  |       j                  ||       yy)zSEnsure that required LFS blobs are present, fetching them as a group if
    needed.r0   N)r1   r2   setr0   walkpointerfromctxr?   rA   rB   r3   r#   r   remoterD   )
r4   
revmatchespointersoids
localstorerd   matchr   r   rJ   s
             r'   _prefetchfilesr   Q  s     49912H5D,,J  "
U3i% 	"AsA&AQUUWD(1H
"!	""  	((:> r)   c                     t        | j                  d      syt        | j                  j                  t        j
                        S )NrC   Tr1   r2   
isinstancerC   r   _nullremoter4   s    r'   _canskipuploadr   j  s3    49923 dii22I4I4IJJr)   c                     t        | j                  d      syt        | j                  j                  t        j
                         S )NrC   Fr   r   s    r'   candownloadr   s  s6    49923 $))66	8M8MNNNr)   c                 L    t        |       ryt        | |      }t        | |       y)z#upload lfs blobs introduced by revsN)r   extractpointersuploadblobs)r4   revsr   s      r'   uploadblobsfromrevsr   |  s#    dtT*Hhr)   c                 V    t        | j                  | j                  j                        S )zPrepush hook.

    Read through the revisions to push, looking for filelog entries that can be
    deserialized into metadata so that we can block the push on their upload to
    the remote blobstore.
    )r   r4   outgoingmissing)pushops    r'   prepushr     s     v{{FOO,C,CDDr)   pushc                    d|j                   v r|j                         s?|j                  d      s.t        d      }t	        j
                  |dz  t        d            |j                  j                  }	 t        j                  ||j                               |j                  _         | ||g|i |||j                  _        S  | ||g|i |S # ||j                  _        w xY w)zbail on push if the extension isn't enabled on remote when needed, and
    update the remote store based on the destination path.r   s:   required features are not supported in the destination: %ss&   enable the lfs extension on the server)hint)r    localcapabler   r   Abortr2   rC   r   r   url)r%   r4   r   argsr&   mremotestores          r'   r   r     s     """ ||~fnnV&< OPA++F
#L!M  ii22	7+4+;+;D&**,+ODII(f6t6v6+6DII(D&242622 ,7DII(s   5?C C&writenewbundlec                 P    t        ||j                          | ||||||g|i |S )z;upload LFS blobs added by outgoing revisions on 'hg bundle')r   r   )	r%   r,   r4   r   rB   
bundletyper   r   r&   s	            r'   r   r     s>    
 h../
D&(J;?CI r)   c                    | j                   j                  d       i }| j                   j                  } |t        d      t        d      t	        |            5 }|D ]H  }| |   }t        |      j                         D ]  }|||j                         <    |j                          J t        |j                         d       cddd       S # 1 sw Y   yxY w)z1return a list of lfs pointers added by given revss&   lfs: computing set of blobs to upload
s
   lfs searchs
   changesetsc                 "    | j                         S r   )r?   )rJ   s    r'   r   z!extractpointers.<locals>.<lambda>  s    quuw r)   )keyN)
r,   debugmakeprogressr   rH   pointersfromctxvaluesr?   	incrementsorted)r4   r   r   r   progressrr   rJ   s           r'   r   r     s    GGMM<=H77''L		-!M*CI
 @	 	!Aq'C$S)002 &$%!& 		!
 hoo'->?@ @ @s   A)CCc           	         | }|| vrJ|sy|| j                         v r| j                         }n$|| j                         v r| j                         }ny||   }t        |j                         j                  |j                               sy	 t        j                  |j                               }| |k(  r|S i S # t        j                  $ r@}t        j                  t        d      |t        |j                               |fz        d}~ww xY w)a?  return a pointer for the named file from the given changectx, or None if
    the file isn't LFS.

    Optionally, the pointer for a file deleted from the context can be returned.
    Since no such pointer is actually stored, and to distinguish from a non LFS
    file, this pointer is represented by an empty dict.
    Ns#   lfs: corrupted pointer (%s@%s): %s
)rs   rt   rk   r   rn   r   r   r>   r{   InvalidPointerr   r   r   r   re   )r   r   removed_ctxr   rJ   exs          r'   r   r     s     D|=668D#&&(]668D7D$,,.(($--/:	
/$;H	!! 
kk56%		$b)*
 	

s   
)B6 4B6 6D		;DD	c                     i }| j                         j                         }| j                         D ]!  } ||      st        | ||      }||||<   # |S )zreturn a dict {path: pointer} for given single changectx.

    If ``removed`` == True and the LFS file was removed from ``ctx``, the value
    stored for the path is an empty dict.
    )r   )r4   narrowmatchr   r   )r   r   resultr   r   rJ   s         r'   r   r     sa     F
 A YY[ t373=F1I Mr)   c                     |sy| j                   j                  }|j                  || j                   j                         y)z*upload given pointers from local blobstoreN)r2   rC   
writebatchr0   )r4   r   
remoteblobs      r'   r   r     s1    --J(DII$?$?@r)   finishdatamigrationc                     | ||||       t        |j                  d      rt        |j                  d      r|j                  j                  j                  }|j                  j                  j                  }|j	                         D ]^  \  }}}	|	D ]S  }
|j                  t        d      |
z         t        j                  |j                  |
      |j                  |
             U ` y y y )Nr0   s   copying lfs blob %s
)
r1   r2   r0   r   r   rX   r   r   rr   join)r%   r,   srcrepodstrepor    	srclfsvfs	dstlfsvfsdirpathdirsr   r?   s              r'   upgradefinishdatamigrationr    s    Wg|, w||01g)7 LL2266	LL2266	$-NN$4 	F GT5 F34s:;INN3/1DEF	F71r)   preservedrequirementssupporteddestrequirementsc                 T     | |      }d|j                   v r|j                  d       |S )Nr   )r    r#   )r%   r4   reqss      r'   upgraderequirementsr    s,     :D"""Kr)   )NN)F)GrU   mercurial.i18nr   mercurial.noder   r   r   	mercurialr   r   r	   r
   r   r   r   r   r   r   r   vfsmodr   mercurial.upgrade_utilsr   upgrade_actionsr   upgrade_enginemercurial.interfacesr   mercurial.utilsr   r   
largefilesr    r   r   ehwrapfunctionr(   r*   r.   r;   rO   rb   rk   REVIDX_DEFAULT_FLAGSry   r|   r   r   basefilectxr   r   r   r   r   readonlyvfsr   r   r   r   r   r   r   r   r   r   r   r   r  r  r"   r)   r'   <module>r!     s     * *   
 ,
  
 Y -.H /H 45 6 "O4 5:>1. 	

%
%%R
 +,% -%$ $$e, - $$j1 2; /0) 1)
 +,) -)\ ##Z0
9 1
9?2KO E 6"3 #3: *+ ,@"
B&A !67F 8F  "9:"=> ? ;r)   