
    yf!                        S SK r S SKr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
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  SSKJr  SSKJr  SSKJrJr  S r\" / SQ5      rSS jrS r\ R@                  \S.S jr!S r" " S S5      r#S r$S r%SS jr& " S S\RN                  5      r(SS jr)S r*g)     N)dequeOrderedDict)datetimetimezone	timedelta)islice)
attrgetter   )create_logger   )to_localtime)msgpack)__version__)chunker)
CH_BUZHASHCH_FIXEDc                     [         R                  " [        R                  5      [	        US-  S9-
  nSn/ nU  H;  nUR
                  U:  d  M  US-  nSU4X&R                  '   UR                  U5        M=     U$ )Ni  )secondsr   r   within)r   nowr   utcr   tsidappend)archiveshourskept_becausetargetkept_counterresultas          3/usr/lib/python3/dist-packages/borg/helpers/misc.pyprune_withinr#      so    \\(,,')EDL*IIFLF44&=AL"*L!9LMM!	 
 M    ))secondlyz%Y-%m-%d %H:%M:%S)minutelyz%Y-%m-%d %H:%M)hourlyz%Y-%m-%d %H)dailyz%Y-%m-%d)weeklyz%G-%V)monthlyz%Y-%m)yearlyz%Yc                    S n/ n[         U   nUc  0 nUS:X  a  U$ S n[        U [        S5      SS9 H}  n[        UR                  5      R                  U5      nX:w  d  M.  UnUR                  U;  d  MB  UR                  U5        U[        U5      4X7R                  '   [        U5      U:X  d  M}    O   UbL  [        U5      U:  a=  UR                  U;  a-  UR                  U5        US-   [        U5      4X7R                  '   U$ )Nr   r   T)keyreversez[oldest])	PRUNING_PATTERNSsortedr	   r   r   strftimer   r   len)	r   rulenr   lastkeeppatternr!   periods	            r"   prune_splitr9   -   s    DDt$GAvAH*T"2DAadd#,,W5>Dtt<'A&*CI%6TT"t9> B 	}TQ144|+CA":os4y9TTKr$   c            	         [         R                  R                  SS5      R                  5       n U S:X  a  g[        R
                  " 5       n[        R                  " 5       n [         R                  " 5       n[        R                  R                  S5      (       a  SnOS n SR                  S [        R                   5       5      nS
SKJnJn  U(       a  UR"                  OSnU(       a  SUR$                  -  OSn	U U	 SU S3n
/ nUb/  UR'                  SR)                  SR                  U5      5      5        Ub  UR'                  SU-  5        UR'                  SR)                  [*        XXZ5      5        UR'                  S[         R,                  " 5       [         R.                  " 5       4-  5        UR'                  S[        R0                  -  5        UR'                  S[         R                  R                  S5      -  5        UR'                  S5        SR                  U5      $ ! [         a    S n GNf = f!   S	n GN{= f)NBORG_SHOW_SYSINFOyesno linux)zUnknown Linuxr>   r>   .c              3   8   #    U  H  n[        U5      v   M     g 7fN)str).0vs     r"   	<genexpr>sysinfo.<locals>.<genexpr>Y   s     "C?a3q66?s   unknownr
   )llfuseBORG_FUSE_IMPLNonez %sz []zPlatform: {} zLinux: %s %s %sz,Borg: {}  Python: {} {} msgpack: {} fuse: {}zPID: %d  CWD: %szsys.argv: %rzSSH_ORIGINAL_COMMAND: %rSSH_ORIGINAL_COMMAND
)osenvirongetlowerplatformpython_implementationpython_versionunameAttributeErrorsys
startswithjoinr   version	fuse_implrI   rJ   __name__r   r   formatborg_versiongetpidgetcwdargv)show_sysinforU   rV   rW   linux_distributionmsgpack_versionrI   rJ   llfuse_namellfuse_versionllfuse_infoinfos               r"   sysinfork   G   s   ::>>"5u=CCELt$::<,,.N
 ||w''6!$(("C7??"CC 3%+&//K5;ef000N M.!1N3C1EKDN))#((5/:;%%(::;KK>EE3_c dKK"biik299;%??@KK)*KK*RZZ^^<R-SSTKKO99T?3  $#s   !H'  &H: 'H76H7:I)levelloggerc                     / nU H"  nUR                  UR                  5       5        M$     U H  nUR                  X5        M     g)z
log multiple lines of text, each line by a separate logging call for cosmetic reasons

each positional argument may be a single or multiple lines (separated by newlines) of text.
N)extend
splitlineslog)rl   rm   msgslinesmsglines         r"   	log_multirv   n   s<     ES^^%& 

5 r$   c                    [        U [        [        45      (       d   e[        U [        5      (       a  [        U 5      n [        U 5      S:X  a"  [        U S   [        5      (       a
  [
        4U -   n U S   [
        [        4;   d   eU $ )N   r   )
isinstancelisttupler2   intr   r   )cps    r"   normalize_chunker_paramsr~   {   sr    b4-(((("d2Y
2w!|
2a5#..^b a5Z****Ir$   c                   4    \ rS rSrSrS	S jrS rS rS rSr	g)
ChunkIteratorFileWrapper   z%File-like wrapper for chunk iteratorsNc                 F    Xl         SU l        SU l        SU l        X l        g)aD  
*chunk_iterator* should be an iterator yielding bytes. These will be buffered
internally as necessary to satisfy .read() calls.

*read_callback* will be called with one argument, some byte string that has
just been read and will be subsequently returned to a caller of .read().
It can be used to update a progress display.
r   r$   FN)chunk_iteratorchunk_offsetchunk	exhaustedread_callback)selfr   r   s      r"   __init__!ChunkIteratorFileWrapper.__init__   s&     -
*r$   c                 
   [        U R                  5      U R                  -
  nU(       dB   [        U R                  5      n[        U5      U l        SU l        [        U R                  5      nU$ ! [         a
    SU l         gf = f)NTr   )r2   r   r   nextr   
memoryviewStopIterationr   )r   	remainingr   s      r"   _refill ChunkIteratorFileWrapper._refill   sv    

Od&7&77	T001'.
 !"DDJJI ! !%s   %A. .BBc                     U(       d  gU R                  5       n[        X!5      nU =R                  U-  sl        U R                  U R                  U-
  U R                   $ Nr$   )r   minr   r   )r   nbytesr   	will_reads       r"   _readChunkIteratorFileWrapper._read   sP    LLN		*	Y&zz$++i78I8IJJr$   c                 0   / nU(       a}  U R                   (       dl  U R                  U5      nU[        U5      -  nUR                  U5        U R                  (       a  U R	                  U5        U(       a  U R                   (       d  Ml  SR                  U5      $ r   )r   r   r2   r   r   r[   )r   r   parts	read_datas       r"   readChunkIteratorFileWrapper.read   sl    T^^

6*Ic)n$FLL#!!""9- T^^^ xxr$   )r   r   r   r   r   rB   )
r^   
__module____qualname____firstlineno____doc__r   r   r   r   __static_attributes__ r$   r"   r   r      s    /+Kr$   r   c                     U R                   R                  UR                   Vs/ s H  o"R                  PM     sn5      n[	        U5      $ s  snf )z8Return file-like object for archived item (with chunks).)pipeline
fetch_manychunksr   r   )archiveitemcr   s       r"   	open_itemr      s>    %%001L1$$1LMN#N33 2Ms   Ac                 >   ^^ [        U 5      m[        UU4S j/ 5      $ )zz
Chunk an iterator <it> into pieces of <size>.

>>> list(chunker('ABCDEFG', 3))
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G']]
c                  .   > [        [        T T5      5      $ rB   )rz   r   )iterablesizes   r"   <lambda>chunkit.<locals>.<lambda>   s    VHd34r$   )iter)itr   r   s    `@r"   chunkitr      s     BxH4b99r$   c                 L    Uc  [        U SS9  g[        [        XU5      S5        g)zCAdvance the iterator n-steps ahead. If n is none, consume entirely.Nr   )maxlen)r   r   r   )iteratorr4   s     r"   consumer      s&     	yhq! 	VH#T*r$   c                   4   ^  \ rS rSrU 4S jrU 4S jrSrU =r$ )ErrorIgnoringTextIOWrapper   c                    > U R                   (       d   [        TU ]	  U5      $ g! [         a#     [        TU ]  5          g! [
         a      gf = ff = f)Nr>   )closedsuperr   BrokenPipeErrorcloseOSError)r   r4   	__class__s     r"   r   ErrorIgnoringTextIOWrapper.read   s]    {{w|A&  # GMO   s$   $ 
A?
A	AAAc                    > U R                   (       d   [        TU ]	  U5      $ [        U5      $ ! [         a#     [        TU ]  5          N&! [
         a      N3f = ff = frB   )r   r   writer   r   r   r2   )r   sr   s     r"   r    ErrorIgnoringTextIOWrapper.write   sZ    {{w}Q'' 1v # GMO s&   . 
AA		
AAAAr   )r^   r   r   r   r   r   r   __classcell__)r   s   @r"   r   r      s    		 	r$   r   c              #   f  #    U R                  U5      n[        U[        5      nU(       a  SOSnU=(       d    U(       a  SOSn[        U5      S:  aH  UR	                  U5      tpgXV-   /UQ7Gt pU Sh  vN   U R                  U5      n[        U5      S:  a  MH  [        U5      S:  a  Uv   gg N;7f)zHIter over chunks of open file ``fd`` delimited by ``sep``. Doesn't trim.r>   r$   rO      
r   N)r   ry   rC   r2   split)	fdsep	read_sizebufis_strpartpart2itemsfulls	            r"   iter_separatedr      s     
'')
CS!F2SD

,&$eC
c(Q,		#|,e,ggi 	 c(Q, 4y1}
 	 	s   A1B13B/4$B1B1c                    U R                  S5      (       a  U(       a  SOSnOU R                  S5      (       a  U(       a  SOSnOhU R                  S5      (       a  U(       a  SOS	nOFU R                  S
5      (       a  U(       a  SOSnO$U R                  S5      (       a  U(       a  SOSnOS n[        R                  SU5        U$ )N)z.tar.gzz.tgzzgzip -dgzip)z.tar.bz2z.tbzzbzip2 -dbzip2)z.tar.xzz.txzzxz -dxz)z.tar.lz4zlz4 -dlz4)z	.tar.zstdz.tar.zstzzstd -dzstdz'Automatically determined tar filter: %s)endswithrm   debug)fname
decompressfilters      r"   get_tar_filterr      s    ~~)**(f	,	-	-)w	+	,	,&D		'	''U	1	2	2(f
LL:FCMr$   rB   )Ni   )+loggingiorP   os.pathrT   rY   collectionsr   r   r   r   r   	itertoolsr   operatorr	   rm   r   timer   r>   r   r   r`   r   	constantsr   r   r#   r/   r9   rk   INFOrv   r~   r   r   r   r   TextIOWrapperr   r   r   r   r$   r"   <module>r      s     	 	   
 * 2 2   "	   *  ,	     4$N #<< 
 / /d4:+!1!1 0"r$   