
    yfa,                        S SK r S SKrS SKrS SKrS SKJrJr  S SKJrJr  S SK	J
r
  SSKJr  SSKJr  \" 5       rSS	KJr  SS
KJrJrJr  SSKJrJr  SSKJr  SSK7   " S S\5      r " S S\5      r\" SS5      rSS/\" \R>                  5      -   r \ RC                  S5         " S S\RD                  5      r# " S S5      r$g)    N)abc
namedtuple)datetime	timedelta)
attrgetter   )Error   )create_logger)
StableDict)
bin_to_hexsafe_encodesafe_decode)parse_timestamputcnow)shellpattern)*c                       \ rS rSrSrSrSrg)MandatoryFeatureUnsupported   zdUnsupported repository feature(s) {}. A newer version of borg is required to access this repository.    N__name__
__module____qualname____firstlineno____doc__
exit_mcode__static_attributes__r       7/usr/lib/python3/dist-packages/borg/helpers/manifest.pyr   r      s
    nJr!   r   c                       \ rS rSrSrSrSrg)NoManifestError   zRepository has no manifest.r   Nr   r   r!   r"   r$   r$      s
    %Jr!   r$   ArchiveInfoz
name id ts	timestamparchivetsc                   h    \ rS rSrSrS rS rS rS rS r	S r
S	S
SSS	S	SS.S jrS rS rS rSrg	)Archives&   z
Nice wrapper around the archives dict, making sure only valid types/values get in
and we can deal with str keys (and it internally encodes to byte keys) and either
str timestamps or datetime timestamps.
c                     0 U l         g N	_archivesselfs    r"   __init__Archives.__init__,   s	    r!   c                 ,    [        U R                  5      $ r.   )lenr0   r1   s    r"   __len__Archives.__len__0   s    4>>""r!   c                 :    [        S U R                   5       5      $ )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr.   )r   .0names     r"   	<genexpr>$Archives.__iter__.<locals>.<genexpr>4   s     A.$K%%.s   )iterr0   r1   s    r"   __iter__Archives.__iter__3   s    A$..AAAr!   c                     [        U[        5      (       d   e[        U5      nU R                  R	                  U5      nUc  [
        e[        US   R                  5       5      n[        XS   US9$ )N   time   id)r=   idr)   )	
isinstancestrr   r0   getKeyErrorr   decoder&   )r2   r=   _namevaluesr)   s        r"   __getitem__Archives.__getitem__6   se    $$$$$D!##E*>NVG_33562>>r!   c                    [        U[        5      (       d   e[        U5      n[        U[        5      (       d   eUu  p4[        U[        5      (       d   e[        U[
        5      (       a"  UR                  S S9R                  [        5      n[        U[        5      (       d   eUR                  5       nX4S.U R                  U'   g )Ntzinfo)rE   rD   )rG   rH   r   tuplebytesr   replacestrftime
ISO_FORMATencoder0   )r2   r=   inforF   r)   s        r"   __setitem__Archives.__setitem__?   s    $$$$$4 $&&&&"e$$$$b(##4(11*=B"c""""YY[')7tr!   c                 b    [        U[        5      (       d   e[        U5      nU R                  U	 g r.   )rG   rH   r   r0   )r2   r=   s     r"   __delitem__Archives.__delitem__K   s+    $$$$$4 NN4 r!   Nz\Zr   TF)glob	match_endsort_byconsider_checkpointsfirstlastreversec                z   [        U[        [        45      (       a  [        S5      e[        R
                  " [        R                  " U=(       d    SUS95      nU R                  5        V	s/ s H"  oR                  U	R                  5      c  M   U	PM$     n
n	U(       d$  U
 V	s/ s H  n	SU	R                  ;  d  M  U	PM     n
n	[        U5       H  nU
R                  [        U5      S9  M     U(       a  U
SU n
O"U(       a  U
[        [        U
5      U-
  S5      S n
U(       a  U
R!                  5         U
$ s  sn	f s  sn	f )a  
Return list of ArchiveInfo instances according to the parameters.

First match *glob* (considering *match_end*), then *sort_by*.
Apply *first* and *last* filters, and then possibly *reverse* the list.

*sort_by* is a list of sort keys applied in reverse order.

Note: for better robustness, all filtering / limiting parameters must default to
      "not limit / not filter", so a FULL archive list is produced by a simple .list().
      some callers EXPECT to iterate over all archives in a repo for correct operation.
z!sort_by must be a sequence of strr   )r`   Nz.checkpoint)keyr   )rG   rH   rT   	TypeErrorrecompiler   	translaterM   matchr=   reversedsortr   maxr6   re   )r2   r_   r`   ra   rb   rc   rd   re   regexxarchivessortkeys               r"   listArchives.listP   s     gU|,,?@@

<11$+#ST#{{}P}!AFF0CA}P##+K8a}AFF/J8HK(GMMj1M2 )'HCMD$8! < =>H QKs   +D3D3!D89D8c                 8   UR                   R                  (       a  [        S5      eUR                  b  UR                  S-   Ul        U R                  UR                  R                  S5      UR                  UR                  UR                  UR                  S9$ )zn
get a list of archives, considering --first/last/prefix/glob-archives/sort/consider-checkpoints cmdline args
z~The options --first, --last, --prefix, and --glob-archives, and --consider-checkpoints can only be used on repository targets.r   ,)ra   rb   r_   rc   rd   )locationr(   r	   prefixglob_archivesrt   ra   splitrb   rc   rd   )r2   argss     r"   list_consideringArchives.list_consideringm   s     ==    Y  Z  Z;;"!%s!2Dyy!3!3C!8tOhOhos  pB  pB  JN  JT  JT  [_  [d  [dy  e  	er!   c                     UR                  5        HM  u  p#[        U[        5      (       d   e[        U[        5      (       a  SU;   a  SU;   d   eX0R                  U'   MO     g)z-set the dict we get from the msgpack unpackerrE   rD   N)itemsrG   rT   dictr0   )r2   dkvs       r"   set_raw_dictArchives.set_raw_dictw   sR    GGIDAa''''a&&5A:'Q,FF !NN1 r!   c                     U R                   $ )z.get the dict we can give to the msgpack packerr/   r1   s    r"   get_raw_dictArchives.get_raw_dict~   s    ~~r!   r/   )r   r   r   r   r   r3   r7   rA   rN   rZ   r]   rt   r}   r   r   r    r   r!   r"   r+   r+   &   sP    
#B?
8!
  5"SW_cjnx} :e"r!   r+   c                       \ rS rSr\R
                   " S S\R                  5      5       r\" 5       r	\
" / 5      rSrSS jr\S 5       r\S 5       r\SS	 j5       rS
 rS rS rSrg)Manifest   c                   $    \ rS rSrSrSrSrSrSrg)Manifest.Operation   readcheckwritedeleter   N)	r   r   r   r   READCHECKWRITEDELETEr    r   r!   r"   	Operationr      s     
   r!   r   s                                    Nc                     [        5       U l        0 U l        Xl        X l        Ub  [        U5      O[        U l        SU l        S U l	        g NF)
r+   rr   configrg   
repository	frozenset	ITEM_KEYS	item_keystam_verifiedr'   )r2   rg   r   r   s       r"   r3   Manifest.__init__   s>     
$1:1F9-I!r!   c                 ,    [        U R                  5      $ r.   )r   rF   r1   s    r"   id_strManifest.id_str   s    $''""r!   c                 *    [        U R                  S S9$ )NrQ   )r   r'   r1   s    r"   last_timestampManifest.last_timestamp   s    t~~d;;r!   c                    SSK Jn  SSKJnJnJn  SSKJn	   UR                  U R                  5      n
U(       d  U" X5      nU " X15      nUR                  S U
5      nUR                  XS9u  ol        U" US9nUR                  U5      Ul        UR                  S5      S;  a  [#        S	5      eUR$                  R'                  UR$                  5        UR                  S
5      Ul        UR*                  Ul        [,        [/        S UR                  S/ 5       5       5      -  Ul        UR                  (       a  UR*                  R                  SS5      nU" U5      nU(       a>  U(       d7  [2        R5                  S5        U" U5      n[7        US5      R9                  5         U(       d8  U(       a1  [2        R5                  S5        [:        R<                  " U" U5      5        UR?                  U5        X4$ ! U	R                   a    [        ef = f)Nr
   ManifestItem)key_factorytam_required_filetam_required)
Repository)force_tam_not_required)internal_dictversion)r   r
   zInvalid manifest versionr'   c              3   @   #    U  H  oR                  5       v   M     g 7fr.   )rK   )r<   rg   s     r"   r>    Manifest.load.<locals>.<genexpr>   s     2bKaC::<<Kas   r      tam_requiredFzPManifest is TAM verified and says TAM is required, updating security database...wzVManifest is TAM verified and says TAM is *not* required, updating security database...) itemr   
crypto.keyr   r   r   r   r   rI   MANIFEST_IDObjectNotFoundr$   decryptunpack_and_verify_manifestr   id_hashrF   
ValueErrorrr   r   r'   r   r   r   r   loggerdebugopencloseosunlinkcheck_repository_compatibility)clsr   
operationsrg   r   r   r   r   r   r   cdatamanifestdatamanifest_dictmmanifest_requiredsecurity_requiredfiles                     r"   loadManifest.load   s   'MM+	"NN3??3E j0Cs'{{4'/2/M/Md/M  0C,,}5kk$'556)788&&qzz2UU;/((&2b155Q\^`Ka2b)bb   ( 3 3OU K ,Z 8 ):op(4T3%%'$):uv		+J78//
;}9 (( 	"!!	"s   G5 5Hc                    U H  n[        X R                  5      (       d   eU R                  R                  SS 5      nUc    g UR                  R                  5       U;  a  M`  X2R                  R                  5          nSU;   d  M  [        US   5      U R                  -
  nU(       d  M  [        U Vs/ s H  ofR                  5       PM     sn5      e   g s  snf Ns   feature_flagss	   mandatory)
rG   r   r   rI   valuerX   setSUPPORTED_REPO_FEATURESr   rK   )r2   r   	operationfeature_flagsrequirementsunsupportedfs          r"   r   'Manifest.check_repository_compatibility   s    #Ii8888 KKOO,<dCM$%%'}<()?)?)ABL|+!,|"<=@\@\\;5;6W;axxz;6WXX $ 7Xs   4C
c                     0 nU R                   R                  SS 5      nUc  U$ UR                  5        H@  u  p4SU;   d  M  US    Vs1 s H  oUR                  5       iM     snXR                  5       '   MB     U$ s  snf r   )r   rI   r   rK   )r2   resultr   r   r   features         r"   get_all_mandatory_features#Manifest.get_all_mandatory_features   s    (8$? M'4':':'<#I|+NZ[gNh-iNh7nn.>Nh-i'')* (=  .js   A:c                    SSK Jn  U R                  R                  (       a  SU R                  S'   U R
                  c#  [        5       R                  [        5      U l        OWU R                  nU[        SS9-   R                  [        5      n[        U[        5       R                  [        5      5      U l        [        U R                  5      [        ::  d   e[        S U R                   5       5      (       d   e[        U R                   5      S::  d   eU" S[#        U R                  R%                  5       5      U R
                  [#        U R                  5      ['        [)        U R                   5      5      S	9nSU l        U R                  R-                  UR/                  5       5      nU R                  R1                  U5      U l        U R4                  R7                  U R8                  U R                  R;                  U5      5        g )
Nr
   r   Tr   r   )microsecondsc              3   >   #    U  H  n[        U5      S :*  v   M     g7f)   N)r6   r;   s     r"   r>   !Manifest.write.<locals>.<genexpr>   s     >3t9#s   d   )r   rr   r'   r   r   )r   r   rg   r   r   r'   r   rV   rW   r   r   ro   r6   rr   MAX_ARCHIVESallr   r   r   rS   sortedr   pack_and_authenticate_metadataas_dictr   rF   r   putr   encrypt)r2   r   prev_tsincrementedr   r   s         r"   r   Manifest.write   ss   '88  +/DKK(>>!#X..z:DN))G"YA%>>HHTK fh.?.?
.KLDN4==!\111>>>>>>4>>"c))) : : <=nndkk*F4>>23
 !xx66x7G7G7IJ((""4(D,,dhh.>.>t.DEr!   )rr   r   rF   r   rg   r   r   r'   r.   r   )r   r   r   r   enumuniqueEnumr   rS   NO_OPERATION_CHECKr   r   r   r3   propertyr   r   classmethodr   r   r   r   r    r   r!   r"   r   r      s    	[[DII  . 'mK # # < < " "HY	Fr!   r   )%r   r   os.pathri   collectionsr   r   r   r   operatorr   errorsr	   r   r   
datastructr   parseformatr   r   r   timer   r    r   	constantsr   r$   r&   rt   _fieldsAI_HUMAN_SORT_KEYSremoveMutableMappingr+   r   r   r!   r"   <module>r     s     	  	 ' (   "	 " = = )  % 
e 
 5 "9-[5H5H0II    $ Zs!! ZzHF HFr!   