o
    µ+keÜC  ã                   @   s  d dl Z d dlZd dlZd dlZd dlZddlmZmZm	Z	m
Z
mZ ddlmZmZ ddlmZmZ dd„ Zej dd	g fd
dgfddgfddgfddgfddgfddgfg¡dd„ ƒZej ddg fdg fddgfddgfg¡dd„ ƒZej ddddg fdg fdddgfd d!d"gfd#d!d"gfd$d%d&gfd'd(d)gfg	¡d*d+„ ƒZej ddg fd,g fdd-d.gfd/d0gfg¡d1d2„ ƒZej dd3d4d5d6g d7¢fd8g d7¢fdg fd9g d:¢fd;ddgfd<d!d"gfd=dd%gfd>d!d"gfd?d%d&gfd@d(d)gfdAdBdCgfg¡dDdE„ ƒZej dd5dFdGd4d6g dH¢fd8g dH¢fdg fd9g d:¢fd;ddgfdId!d"gfdJd!d"gfdKd!d"gfd=g fdLdd%gfd>d!d"gfdMd%d&gfdNd%d&gfdOg dP¢fd@g dQ¢fdRd(d)gfdSdTdUgfdVdUgfdAdBgfdWdCgfg¡dXdY„ ƒZej ddZd[d\d]g fd^g fd_g d`¢fg¡dadb„ ƒZdcdd„ Zdedf„ Zdgdh„ Zej diedjƒ¡dkdl„ ƒZej diedmƒ¡dndo„ ƒZej dieedpdqƒƒ¡drds„ ƒZ ej dtg dfdugdfdvgg fg dw¢g dx¢fdygg fdzgg d{¢fd|gg d}¢fg d~¢dgfd€gg d¢fd‚gg dƒ¢fd„gdfd…gg fd†gdfg d‡¢ddgfdˆd‰gg dŠ¢fd‰dˆgg dŠ¢fg¡d‹dŒ„ ƒZ!ej dg g d fdugg d fdŽgg dfdd‘gg dfd’gd	gd fd’d“gd	gd fg d”¢d
gdfg¡d•d–„ ƒZ"d—d˜„ Z#ej d™dšgd›gg¡dœd„ ƒZ$ej dtg dfdugdfdŽgg fdžgg dŸ¢fd gg dŸ¢fd¡gg d¢¢fd£d‘gg d¤¢fdd‘gg d¤¢fd¥d¦gg d§¢fd¦d¥gg d¨¢fd©dªgg d§¢fg¡d«d¬„ ƒZ%ej d­de	fdve	fd®e	fd¯e	fd°e	fd±e	fd²e	fd³efdyefd´efdµefd¶efd…efd·efd¸efd¹e
fdºe
fd»e
fd¼e
fg¡d½d¾„ ƒZ&ej dig d¿¢¡dÀdÁ„ ƒZ'dÂdÃ„ Z(dS )Äé    Né   )ÚPathFullPatternÚPathPrefixPatternÚFnmatchPatternÚShellPatternÚRegexPattern)Úload_exclude_fileÚload_pattern_file)Úparse_patternÚPatternMatcherc                    sH   t dd„ | D ƒƒsJ dƒ‚‡ fdd„| D ƒ}||du r| n|ks"J ‚dS )z"Utility for testing patterns.
    c                 S   s   g | ]
}|t j |¡k‘qS © )ÚosÚpathÚnormpath©Ú.0Úfr   r   ú;usr/lib/python3.10/site-packages/borg/testsuite/patterns.pyÚ
<listcomp>   s    z"check_patterns.<locals>.<listcomp>z.Pattern matchers expect normalized input pathsc                    ó   g | ]	}ˆ   |¡r|‘qS r   ©Úmatchr   ©Úpatternr   r   r      ó    N)Úall)Úfilesr   ÚexpectedZmatchedr   r   r   Úcheck_patterns   s   r   zpattern, expectedú/ú/homeÚhomez/home///z/./homez
/home/userú	home/userz/home/user2ú
home/user2ú/home/user/.bashrcúhome/user/.bashrcc                 C   ó   g d¢}t |t| ƒ|ƒ d S )N)r!   r"   r#   r%   ©r   r   ©r   r   r   r   r   r   Útest_patterns_full   s   r)   Ú Úrelativezrelative/path/úrelative/pathc                 C   s   ddg}t |t| ƒ|ƒ d S )Nr,   zrelative/path2r'   r(   r   r   r   Útest_patterns_full_relative'   ó   r-   )r   N)z/./Nz/home/uúhome/user/.profilez/etcúetc/server/configúetc/server/hostsz///etc//////z/./home//..//home/user2úhome/user2/.profileú!home/user2/public_html/index.htmlz/srvúsrv/messagesú	srv/dmesgc                 C   r&   )N)	r0   r1   r!   r/   r%   r2   r3   r4   r5   ©r   r   r(   r   r   r   Útest_patterns_prefix4   s   r7   Úfooúrelative/path1úrelative/twoÚmoreúmore/relativec                 C   r&   )N)r9   r:   r<   r6   r(   r   r   r   Útest_patterns_prefix_relativeI   r.   r=   )z/*N)z/./*N)Ú*Nz*/*)
r0   r1   r/   r%   r2   r3   r4   r5   úhome/foo/.thumbnailsúhome/foo/bar/.thumbnailsz*///*z/home/*)r/   r%   r2   r3   r?   r@   z/home/user/*z/etc/*z
*/.pr????ez///etc//////*z/./home//..//home/user2/*z/srv*z/home/*/.thumbnailsr?   r@   c                 C   r&   )N)r0   r1   r!   r/   r%   r2   r3   r4   r5   r?   r@   )r   r   r(   r   r   r   Útest_patterns_fnmatchV   s   rA   )z**/*N)z/**/*N)r0   r1   r/   r%   r2   r3   r4   r5   úsrv2/blafaselr?   r@   z/etc/*/*z	/etc/**/*z/etc/**/*/*z**/.pr????ez/./home//..//home/user2/z/./home//..//home/user2/**/*z/srv*/)r4   r5   rB   )Úsrvr4   r5   Úsrv2rB   z/srv/*z/srv2/**rD   rB   z	/srv2/**/z/home/*/*/.thumbnailsc                 C   r&   )N)r0   r1   r!   r/   r%   r2   r3   rC   r4   r5   rD   rB   r?   r@   )r   r   r(   r   r   r   Útest_patterns_shelly   s   $rE   )r*   N)z.*N)z^/Nz^abc$z^[^/]z^(?!/srv|/foo|/opt))r    ú/home/user/.profiler$   ú/home/user2/.profileú"/home/user2/public_html/index.htmlú/home/foo/.thumbnailsú/home/foo/bar/.thumbnailsc                 C   s>   g d¢}t | ƒ}t|ƒ| ksJ ‚|j| ksJ ‚t|||ƒ d S )N)z	/srv/dataz/foo/barr    rF   r$   rG   rH   z/opt/log/messages.txtz/opt/log/dmesg.txtrI   rJ   )r   Ústrr   r   )r   r   r   Úobjr   r   r   Útest_patterns_regex¦   s
   rM   c                   C   s>   t dƒ d¡s	J ‚t dƒ tjj¡sJ ‚t dƒ d¡rJ ‚d S )Nz^/$r   z^\\$)r   r   r   r   Úsepr   r   r   r   Útest_regex_patternÁ   s   rO   c                   C   s
   t jdv S )N)Údarwin)ÚsysÚplatformr   r   r   r   Úuse_normalized_unicodeÈ   s   
rS   c                 C   s$   t | ƒt| ƒtd| › dƒt| ƒgS )Nú^z/foo$)r   r   r   r   r   r   r   r   Ú_make_test_patternsÌ   s
   ýrU   r   u   bÃ¡c                 C   s&   |   d¡sJ ‚|   d¡tƒ ksJ ‚d S ©Nu   bÃ¡/foou   baÌ/foo©r   rS   r   r   r   r   Útest_composed_unicode_patternÔ   ó   rX   u   baÌc                 C   s&   |   d¡tƒ ks
J ‚|   d¡sJ ‚d S rV   rW   r   r   r   r   Útest_decomposed_unicode_patternÚ   s   rZ   s   ba€Úlatin1c                 C   s&   |   d¡rJ ‚|   tddƒ¡sJ ‚d S )Nzba/foos   ba€/foor[   )r   rK   r   r   r   r   Útest_invalid_unicode_patternà   rY   r\   zlines, expectedz# Comment onlyr>   )z	# Commentz*/something00.txtz  *whitespace*  z #/ws*r*   z# EOF)ú	more/datar!   ú #/wsfoobarzre:.*zre:\s)údata/something00.txtr]   r!   z
re:(.)(\1))r]   r!   ú	start/whitespaceúwhitespace/end	)r*   r*   r*   z*# This is a test with mixed pattern styleszre:(?i)BAR|ME$r*   z*whitespace*zfm:*/something00*r]   z
  re:^\s  )r_   r]   r!   ra   z
  re:\s$  )r_   r]   r!   r^   r`   zpp:./zpp:/z	pp:aaabbb)zpp:/datazpp: #/z	pp:	startzpp:/whitespacez/nomatchz/more/*)r_   r!   r^   r`   ra   c                    ó|   g d¢‰ ‡ fdd„}|   d¡}| d¡}| d  |¡¡ W d   ƒ n1 s'w   Y  |t|ƒƒ|d u r7ˆ n|ks<J ‚d S )N)r_   r]   r!   r^   r`   ra   c                    s8   g }t t| ƒ|ƒ tdd‰ ˆ  |¡ ‡ fdd„ˆD ƒS )NT©Úfallbackc                    r   r   r   ©r   r   ©Zmatcherr   r   r     r   zEtest_exclude_patterns_from_file.<locals>.evaluate.<locals>.<listcomp>)r   Úopenr   Úadd_inclexcl)ÚfilenameÚpatterns©r   rf   r   Úevaluate  s
   

z1test_exclude_patterns_from_file.<locals>.evaluatezexclude.txtÚwtÚ
©Újoinrg   ÚwriterK   )ÚtmpdirÚlinesr   rl   ZexclfileÚfhr   rk   r   Útest_exclude_patterns_from_fileæ   s   '
ÿ$ru   z+lines, expected_roots, expected_numpatternsz- *é   z+fm:*/something00.txtz-/datazR /ú	# comment)rw   z- /datazR /homec           	      C   sx   dd„ }|   d¡}| d¡}| d  |¡¡ W d   ƒ n1 s!w   Y  |t|ƒƒ\}}||ks4J ‚||ks:J ‚d S )Nc                 S   s$   g }g }t t| ƒ||ƒ |t|ƒfS ©N)r	   rg   Úlen©ri   ÚrootsÚinclexclpatternsr   r   r   rl   2  s   z.test_load_patterns_from_file.<locals>.evaluateúpatterns.txtrm   rn   ro   )	rr   rs   Zexpected_rootsZexpected_numpatternsrl   Úpatternfilert   r{   Znumpatternsr   r   r   Útest_load_patterns_from_file#  s   
ÿr   c                  C   s°   d} t  | ¡}g g }} t||| ƒ t| ƒdksJ ‚t| d jtƒs$J ‚t| d jtƒs.J ‚t| d jtƒs8J ‚t| d jtƒsBJ ‚t| d jt	ƒsLJ ‚t| d jtƒsVJ ‚d S )	NzÊ        +0_initial_default_is_shell
        p fm
        +1_fnmatch
        P re
        +2_regex
        +3_more_regex
        P pp
        +4_pathprefix
        p fm
        p sh
        +5_shell
    é   r   rv   r   é   é   é   )
ÚioÚStringIOr	   ry   Ú
isinstanceÚvalr   r   r   r   )rj   Zpattern_filer{   r   r   r   Útest_switch_patterns_styleA  s   

rˆ   rs   zX /dataz/datac                 C   s–   |   d¡}| d¡}| d  |¡¡ W d   ƒ n1 sw   Y  t|ƒ}t tj¡ g }g }tt|ƒ||ƒ W d   ƒ d S 1 sDw   Y  d S )Nr}   rm   rn   )	rp   rg   rq   rK   ÚpytestÚraisesÚargparseZArgumentTypeErrorr	   )rr   rs   r~   rt   ri   r{   r|   r   r   r   Ú$test_load_invalid_patterns_from_file[  s   
ÿ"ýrŒ   z-*/something0?.txt)Údataúdata/subdir/something01.txtr!   úhome/leoú
home/leo/tú
home/otherz-fm:*/something00.txtz-fm:*/something0?.txt)r   r!   r   r   r‘   z+/*/something0?.txt)r_   r!   r   r   r‘   z
+/home/leoz-/home/*)r   r_   rŽ   r!   r   r   )r   r_   rŽ   r!   z+fm:/home/leoz-/home/c                    rb   )N)r   r_   rŽ   r!   r   r   r‘   c                    s>   t dd‰ g }g }tt| ƒ||ƒ ˆ  |¡ ‡ fdd„ˆD ƒS )NTrc   c                    r   r   r   re   rf   r   r   r   •  r   zFtest_inclexcl_patterns_from_file.<locals>.evaluate.<locals>.<listcomp>)r   r	   rg   rh   rz   rk   rf   r   rl     s   

z2test_inclexcl_patterns_from_file.<locals>.evaluater}   rm   rn   ro   )rr   rs   r   rl   r~   rt   r   rk   r   Ú test_inclexcl_patterns_from_filej  s    
ÿ$r’   zpattern, clsz/data/*zfm:zfm:*z
fm:/data/*zfm:fm:/data/*zre:zre:^/something/zre:re:^/something/zpp:z	pp:/data/zpp:pp:/data/zsh:zsh:*z
sh:/data/*zsh:sh:/data/*c                 C   s   t t| ƒ|ƒs	J ‚d S rx   )r†   r
   )r   Úclsr   r   r   Útest_parse_patternŸ  s    r”   )zaa:zfo:*z00:zx1:abcc                 C   s8   t  t¡ t| ƒ W d   ƒ d S 1 sw   Y  d S rx   )r‰   rŠ   Ú
ValueErrorr
   r   r   r   r   Útest_parse_pattern_errorÂ  s   
"ÿr–   c                  C   s
  t ƒ } | jd u s
J ‚dD ]}|  |¡d u sJ ‚qdD ]}|| j|< q|  tdƒgd¡ |  tdƒtdƒgd¡ |  tdƒgd	¡ d
| _|  d¡d	ksLJ ‚|  d¡dksUJ ‚|  d¡dks^J ‚|  d¡d
ksgJ ‚|  d¡d
kspJ ‚|  d¡dksyJ ‚t ddjdksƒJ ‚d S )N)r*   r8   Zbar)ÚAÚBÚEmptyÚFileNotFoundz^ar—   z^bz^zr˜   z^$r™   rš   r*   ZaaaÚbbbÚcccZxyzÚzzhey!rc   )r   rd   r   Zis_include_cmdÚaddr   )ZpmÚiÚtargetr   r   r   Útest_pattern_matcherÈ  s"   r¡   ))r‹   r„   Úos.pathr   rQ   r‰   rj   r   r   r   r   r   r   r	   r
   r   r   ZmarkZparametrizer)   r-   r7   r=   rA   rE   rM   rO   rS   rU   rX   rZ   rK   r\   ru   r   rˆ   rŒ   r’   r”   r–   r¡   r   r   r   r   Ú<module>   sÞ   
ø

û





ö
	
û
ÿÿÿ






é

ÿÿÿ











ß
#
ÿù



ø	ùÿÿÝ
&

ÿÿÿÿþö
þ
ÿÿÿÿþÿþÿþÿþÿþå
ã

