
    	^cB                        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	 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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()                    ed          d             Z*e()                    ed          d             Z+e()                    ed          d             Z,d Z-d Z.d Z/d:dZ0ddej1        fdZ2d Z3d Z4e()                    ed          d             Z5e()                    ej6        d          d             Z7e()                    ej6        d          d             Z8d  Z9e()                    ed!          d"             Z:e()                    ed#          d$             Z;e()                    ej<        d%          d&             Z=d' Z>d( Z?d) Z@d* ZAd+ ZBe()                    ed,          d-             ZCe()                    ed.          d/             ZDd0 ZEd;d2ZFd;d3ZGd4 ZHe()                    ed5          d6             ZIe()                    ed7          e()                    ed8          d9                         ZJdS )<    N)_)binhexshort)getattrsetattr)bundle2changegroupcmdutilcontexterrorexchange	exthelper	localreporevlogscmutilutilvfswireprotov1server)actionsengine)
repository)storageutil
stringutil   )lfutil   )	blobstorepointers   makefilestoragec                 ^    d|v r|                     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*   8   s?    Z01114G\HGGGGG    s   allsupportedversionsc                 F     | |          }|                     d           |S )Ns   03)r%   )r'   uiversionss      r)   allsupportedversionsr/   @   s&    tBxxHLLOr+   s   _capabilitiesc                      | ||          }t          j        |j        d          r3d|j        v r|                    d           |                    d           |S )z5Wrap server command to announce lfs server capability   lfslocalblobstorer!   s	   lfs-serve)r   safehasattrsvfsr"   append)r'   repoprotocapss       r)   _capabilitiesr8   G   sf     4eD	#788 
 T&&&KK%%%FKr+   c                     dS NFr$   )selftexts     r)   bypasscheckhashr=   W   s    5r+   c                    t          j        |          }|                                }| j        j        }|                    |          s-| j        |_        | j        j                            |g|           |	                    |d          }i }|
                                D ]9}|                    d          r"|t          d          d         }||         ||<   :|s|                    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openerlfslocalblobstorehasfilenamelfsremoteblobstore	readbatchreadkeys
startswithlenr   packmeta)r;   r<   prA   storehgmetaknames           r)   readfromstorerR   [   s    	D!!A
%%''CK)E99S>> =]
&00!e<<< ::c%:((D FVVXX    <<!! 	 S]]__%DQ4F4L 2)) 2#FD11$<r+   c                    t          j        |          \  }}|r|dk    r
||d          }t          t          j        |                                                    }| j        j                            ||           d|z  }t          j
        |dt          |          z            }t          j        |          sd|d<   |"|                                D ]\  }}||d|z  <   |                                }	|	dfS )	Nr   s	   sha256:%ss   %d)rA   size   0   x-is-binarys   x-hg-%sF)r   	parsemetar   hashlibsha256digestrB   rC   writer   gitlfspointerrK   r   binaryitems	serialize)
r;   r<   rO   offsetrA   longoidmetadatarP   vrawtexts
             r)   writetostorere   x   s    *400NFF &1**FGG} gnT""))++
,
,CK!''T222 S G$us4yy7HIIIH
 T"" (#'  LLNN 	) 	)DAq'(HZ!^$$  ""GUr+   c                     ||dS |                      |          }n|                     |          }|| j        k    rdS |                     |          }t	          |t
          j        z            S r:   )revnodenullidflagsboolr   REVIDX_EXTSTORED)rlogrh   rg   rj   s       r)   _islfsrn      sh    
{<5hhtnnyy~~t{uJJsOOE//000r+   c
                    |j         j        j                            d          }|rRt	          |          }t          j        |          \  }}|r||z  } ||j         j        |          r|	t          j	        z  }	 | ||||||f|||	d|
S )Ns   lfstrack)
cachedeltarh   rj   )
_revlogrB   optionsgetrK   r   rW   rE   r   rl   )r'   r;   r<   transactionlinkp1p2rp   rh   rj   kwdslfstracktextlenmetar`   s                  r)   filelogaddrevisionr|      s     |"*..{;;H -d))",T22f 	vG8DL)733 	-V,,E4

     r+   c                     t          |j        |          rY|j                            |          }|sdS t          j        |          }d|v r!d|v r|d         t          |d                   fS dS  | ||          S )NFs	   x-hg-copys   x-hg-copyrev)rn   rq   rawdatar   r@   r   )r'   r;   rh   rd   rb   s        r)   filelogrenamedr      s    dlD!! ,&&t,, 	5&w//8##8(C(CL)3x/H+I+III54dr+   c                     t          |j        |          rC|j                            |          }t          j        |          }t          |d                   S  | ||          S )N)rg   s   size)rn   rq   r~   r   r@   int)r'   r;   rg   rd   rb   s        r)   filelogsizer      sa    dl$$$ &,&&s++&w//8G$%%%4c??r+   s   _verify_revisionc                 n   t          ||          r|                    |          }t          j        |          }|j        j                            |                                          r|t          j	         z  }n*|t          j	        z  r|d         
                    |            | ||||           d S )N)rh   s   safe_renamed)rn   r~   r   r@   rB   rC   rD   rA   r   rl   r%   )r'   rl	skipflagsstaterh   rd   rb   s          r)   _verify_revisionr      s    bt -**T""&w//
 9&**8<<>>:: 	-&111II00 	- /"&&t,,,DYt$$$$$r+   s   cmpc                 b   |                                 r t          |dd                       rvt          j        |                                          }t          j        |                                          }|                                |                                k    S  | ||          S )z+returns True if text is different than fctxislfsc                      dS r:   r$   r$   r+   r)   <lambda>zfilectxcmp.<locals>.<lambda>   s    u r+   )r   r   r   r@   r~   rA   )r'   r;   fctxrv   rw   s        r)   
filectxcmpr      s     zz|| $=g}}==?? $ 00 00vvxx26688##4dr+   s   isbinaryc                     |                                 rVt          j        |                                          }t	          t          |                    dd                              S  | |          S )NrV   r   )r   r   r@   r~   rk   r   rs   )r'   r;   rb   s      r)   filectxisbinaryr     s\    zz|| :&t||~~66C^Q77889994::r+   c                 t    t          |                                 j        |                                           S N)rn   filelogrq   filenode)r;   s    r)   filectxislfsr     s%    $,,..($--//:::r+   s   _updatecatformatterc                      | |||||           |                     ||                                                    d S )N)r~   )datar~   )r'   fmctxmatcherpathdecodes         r)   _updatecatformatterr     sD    DS'4(((GGCI%%''G(((((r+   s   wrapconvertsinkc                 l     | |          }|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	           
      4   t          |           j        }	 |	||||||||          }
d| j        j        vr`| j        |
         t	          fd|D                       r8| j        j                            d           t          j        | j                   |
S )Nr!   c              3   Z   K   | ]%\  }}|v o|                                          V  &d S r   )r   ).0fnr   s      r)   	<genexpr>z9convertsink.<locals>.lfssink.putcommit.<locals>.<genexpr>;  s<      II41a186AIIIIIIr+   )super	putcommitr5   r"   anyr%   r   writereporequirements)r;   filescopiesparentscommitsourcerevmapfullcleanp2pcrh   r   	__class__lfssinks              @r)   r   z&convertsink.<locals>.lfssink.putcommit  s     7D))3r	 	 !777)D/C IIII5IIIII A	.226:::5di@@@r+   )__name__
__module____qualname__r   __classcell__)r   r   s   @r)   r   r     s>                           r+   r   )repotyper   )r'   sinkr   s     @r)   convertsinkr     sb    4::D}!	 !	 !	 !	 !	 !	 !	dn !	 !	 !	F !Kr+   s   __init__c           	          | ||           |j                                         D ]$\  }}|                    d          r
||j         |<   %dD ]6}t          j        ||          rt          ||t          ||                     7d S )Nr!   )r1      lfsremoteblobstore)rr   r^   rJ   r   r2   r   r   )r'   r;   othervfsrP   rc   rQ   s         r)   vfsinitr   H  s    Dx &&((    1<< 	 DLO > 9 9Hd++ 	9D$$ 7 78889 9r+   c                 B   t          j        | j        d          sdS g }t                      }| j        j        }|D ]\  }}| |         }|                    |          D ]}t          ||          }	|	r|	                                |vrj|                    |	                                          sC||	_	        |
                    |	           |                    |	                                           |r*t          j        |                               ||           dS dS )zSEnsure that required LFS blobs are present, fetching them as a group if
    needed.r1   N)r   r2   r3   setrC   walkpointerfromctxrA   rD   rE   r4   r%   r   remoterG   )
r5   
revmatchespointersoids
localstorerg   matchr   r   rM   s
             r)   _prefetchfilesr   V  s&    DI';<< H55D,J  " "
U3i% 	" 	"AsA&&A "QUUWWD((1H1H(
"""!!!	"  ? 	((:>>>>>? ?r+   c                     t          j        | j        d          sdS t          | j        j        t
          j                  S )Nr   Tr   r2   r3   
isinstancerF   r   _nullremoter5   s    r)   _canskipuploadr   o  s9    DI'<== t di2I4IJJJr+   c                     t          j        | j        d          sdS t          | j        j        t
          j                   S )Nr   Fr   r   s    r)   candownloadr   x  s<    DI'<== u $)6	8MNNNNr+   c                 h    t          |           rdS t          | |          }t          | |           dS )zuupload lfs blobs introduced by revs

    Note: also used by other extensions e. g. infinitepush. avoid renaming.
    N)r   extractpointersuploadblobs)r5   revsr   s      r)   uploadblobsfromrevsr     s>    
 d tT**Hhr+   c                 @    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   r5   outgoingmissing)pushops    r)   prepushr     s     v{FO,CDDDr+   s   pushc                    d|j         v r|                                sJ|                    d          s5t          d          }t	          j        |dz  t          d                    |j        j        }	 t          j	        ||
                                          |j        _         | ||g|R i |||j        _        S # ||j        _        w xY w | ||g|R i |S )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   Abortr3   rF   r   r   url)r'   r5   r   argsr(   mremotestores          r)   pushr     s    """ ||~~ 	fnnV&<&< 	 OPPA+F
#L!M!M    i2	7+4+;D&**,,+O+ODI(4f6t666v66+6DI((;DI(6666tD&242226222s   5=B? ?Cs   writenewbundlec                 N    t          ||j                    | ||||||g|R i |S )z;upload LFS blobs added by outgoing revisions on 'hg bundle')r   r   )	r'   r-   r5   r   rE   
bundletyper   r   r(   s	            r)   writenewbundler     sR    
 h.///4
D&(J;?  CI  r+   c                    | j                             d           i }| j         j        } |t          d          t          d          t	          |                    5 }|D ]Y}| |         }t          |                                          D ]}|||                                <   |                                 Zt          |                                d           cddd           S # 1 swxY w Y   dS )z1return a list of lfs pointers added by given revss&   lfs: computing set of blobs to upload
s
   lfs searchs
   changesetsc                 *    |                                  S r   )rA   )rM   s    r)   r   z!extractpointers.<locals>.<lambda>  s    quuww r+   )keyN)
r-   debugmakeprogressr   rK   pointersfromctxvaluesrA   	incrementsorted)r5   r   r   r   progressrr   rM   s           r)   r   r     sM   GMM<===H7'L		-!M**CII
 
 @	 	! 	!Aq'C$S))0022 & &$%!!    hoo''->->???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @s   B C**C.1C.Fc           	      h   | }|| vr\|sdS ||                                  v r|                                  }n-||                                 v r|                                 }ndS ||         }t          |                                j        |                                          sdS 	 t          j        |                                          }| |k    r|S i S # t          j	        $ rK}t          j        t          d          |t          |                                          |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
)rv   rw   rn   r   rq   r   r   r@   r~   InvalidPointerr   r   r   r   rh   )r   r   removed_ctxr   rM   exs          r)   r   r     s(    D|| 	4==6688DD#&&((]]6688DD47D$,,..($--//:: t	
//$;;H	! 
 
 
k566%		$$b)*
 
 	

s   '-C C D1&AD,,D1c                     i }|                                                                  }|                                 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   )r5   narrowmatchr   r   )r   r   resultr   r   rM   s         r)   r   r     sv     F

  A YY[[  qtt 	37333=F1IMr+   c                 f    |sdS | j         j        }|                    || j         j                   dS )z*upload given pointers from local blobstoreN)r3   rF   
writebatchrC   )r5   r   
remoteblobs      r)   r   r     s:     -J(DI$?@@@@@r+   s   finishdatamigrationc                     | ||||           t          j        |j        d          rt          j        |j        d          r|j        j        j        }|j        j        j        }|                                D ]o\  }}}	|	D ]b}
|                    t          d          |
z             t          j	        |
                    |
          |
                    |
                     cld S d S d S )Nr1   s   copying lfs blob %s
)r   r2   r3   rC   r   r   r[   r   r   ru   join)r'   r-   srcrepodstrepor"   	srclfsvfs	dstlfsvfsdirpathdirsr   rA   s              r)   upgradefinishdatamigrationr    s   DWg|,,, *  	F

7<)=
>
>	F L26	L26	$-NN$4$4 	F 	F GT5 F F344s:;;;INN3//1D1DEEEEF	F 	F 	F 	F	F 	Fr+   s   preservedrequirementss   supporteddestrequirementsc                 X     | |          }d|j         v r|                    d           |S )Nr!   )r"   r%   )r'   r5   reqss      r)   upgraderequirementsr    s6     4::D"""Kr+   )NN)F)KrX   mercurial.i18nr   mercurial.noder   r   r   mercurial.pycompatr   r   	mercurialr	   r
   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/   r8   r=   rR   re   rn   REVIDX_DEFAULT_FLAGSr|   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     sC          * * * * * * * * * *       
                                     
 , + + + + +       
              
 Y .//H H 0/H 566  76 "$455  65    :  >1 1 1 1. 	

%% % % %R
 
 
   ,--% % .-%$ $f--  .- $k22  32; ; ; 011) ) 21)
 ,--) ) .-)\ #[11
9 
9 21
9? ? ?2K K KO O O     E E E 7##3 3 $#3: +,,  -,@ @ @"
 
 
 
B   &A A A !788F F 98F  ":;;">??  @? <;  r+   