
    +j&D                     2   d Z ddlZddlmc mZ ddlZddl	Z	ddl
Z
ddlZddlZddlZ e
j                  e      j!                         Zej$                  d   Zedz  dz  dz  dz  Zej*                  j-                  d ee            Zg ZdZeeuZeZerej:                  ZdZeeuZ e ZesB ejB                  d	efd
eef      d ejD                         v s ejF                  e      r ejH                  e      nd ejH                  e      dz  Z%dde%iz  Z&ejO                  e&       er ejB                  d	e fdeef      d ejD                         v s ejF                  e      r ejH                  e      nd ejH                  e       ejH                  e      dz  Z(dde(iz  Z)ejO                  e)        ejT                  ed      i z  Z+dde+iz  Z, e- ej\                  e,            dxZxZxZxZxZxZ Zej*                  j_                  e      Z0ej:                  jc                  e0       dZ2dZ3d Z4d Z5d Z6de7defdZ8de9de7fdZ:d ed!efd"Z; ejx                  d#$      d%        Z=d& Z>d' Z?d( Z@d) ZAd* ZBd+ ZCd, ZDd- ZEd. ZFd/ ZGd0 ZHd1 ZId2 ZJd3 ZKy)4u  
task-2729+22 회귀: file_touch_ratio_check CODE_ROOT recognition (Option A replacement)

회장 verbatim 13 시나리오 — 전부 isolated temp(pytest tmp_path) git repo 로 검증.
canonical 무손상. 직접 코딩/실 spawn/activation 없음.

★ RAW_KEY_DENYLIST_LITERAL_IN_TEST_HYGIENE (task-2729+21 #194 BLOCKER) 해소:
  raw-key denylist 를 **소스에 full 16-hex literal 로 박지 않는다**. 키는 런타임에
  조각(split fragment)으로 조립하며(어떤 줄에도 연속된 full key 부재), assert
  실패 메시지에도 재구성된 키를 출력하지 않는다(masked). → PR diff raw key literal 0.

검증 대상 결함:
- env root(PROJECT_PATH→WORKTREE_PATH→QC_EVIDENCE_ROOT) 미인식 → canonical diff
  기준 ratio 0.00 false-negative
- env root 가 repo 하위 디렉토리면 git diff(top-level 기준)와 report 파싱 mismatch
- HEAD~5 가 커밋<5/shallow 에서 subprocess crash
    N   teamsshared	verifiersfile_touch_ratio_check.pyftr_check_2729p22)is not)z%(py2)s is not %(py5)s_spec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16zassert %(py19)spy19))c119085addb0f8b7)c38fb9955616e24dzCOKACDIR_KEY_ANU =c                  .    t        d t        D              S )uO   raw-key denylist 를 런타임에 조각 결합으로 생성(로그 미출력).c              3   >   K   | ]  }d j                  |        yw) N)join).0partss     V/home/jay/workspace/tests/regression/test_file_touch_ratio_root_recognition_2729p22.py	<genexpr>z_denylist.<locals>.<genexpr>3   s     @E@s   )tuple_RAW_KEY_FRAGMENTS     r!   	_denylistr'   1   s    @-?@@@r&   c                 T    t        |       dk  ry| dd  d| dd  dt        |        dS )	uE   assert 메시지/로그용 마스킹 — full key 재구성 출력 0.   z***N   u   …z(len=))len)tokens    r!   _maskr/   6   s9    
5zQBQi[E"#J<uSZL::r&   c                 Z    t        j                  ddt        |       ddddddg	|dd      S )	Ngitz-Cz-czuser.name=tzuser.email=t@tzcommit.gpgsign=falseT)capture_outputtext)
subprocessrunstr)repoargss     r!   _gitr9   >   sE    >>4T-'7(	
 		
 	 	r&   filesmsgc                     |j                         D ]Z  \  }}t        j                  |       |z  }|j                  j	                  dd       |j                  |d       t        | d|       \ t        | ddd|       y )	NTparentsexist_okutf-8encodingaddcommit-qz-m)itemspathlibPathparentmkdir
write_textr9   )r7   r:   r;   relcontentps         r!   _commitrO   K   sp     WLL$	td3	Ww/T5#	
 	xtS)r&   	n_commitsfinal_filesc                    t        j                  |       } | j                  dd       t        | dd       t	        t        d|dz
              D ]!  }t        | d| dt        |      id	|        # |dk\  rt        | |xs d
did       | S )uS   n_commits 개 커밋을 가진 repo 생성. 마지막 커밋에 final_files 포함.Tr=   initrE   r      z_pad/z.txtzpad z_pad/last.txtxfinal)rG   rH   rJ   r9   rangemaxrO   r6   )r7   rP   rQ   is       r!   _build_reporZ   T   s    <<DJJtdJ+vt3q)a-() =qcA/4s<=A~k;os%;WEKr&   task_idprefixc                 .   t        j                  |       dz  dz  | dz  }|j                  j                  dd       ddg}|D ](  }|j	                  d|j                  d	       d	|        * |j                  d
j                  |      d
z   d       |S )u   canonical workspace 의 memory/reports/{task_id}.md 작성.

    각 파일을 ``- {prefix}/{rel}`` 목록 항목으로 기록.
    memoryreportsz.mdTr=   z# reportr   z- /
r@   rA   )rG   rH   rI   rJ   appendrstriprK   r   )	workspacer[   	rel_filesr\   rplinesrL   s          r!   _write_reportrh   `   s    
 
i	 8	+i	7WIS/	IBIIOOD4O0E 6r&--,-Qse456MM$))E"T)GM<Ir&   T)autousec              #   H   K   dD ]  }| j                  |d        d yw)uH   각 테스트 전 CODE_ROOT env 초기화 (호스트 env 누수 방지).)PROJECT_PATHWORKTREE_PATHQC_EVIDENCE_ROOTF)raisingN)delenv)monkeypatchvs     r!   
_clear_envrr   n   s.      C -1e,-	s    "c            	         t               } t        t        fD ]R  }|j                  d      }| D ]   }||v}|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      nddt        j                         v st	        j                  |      rt	        j                  |      nddz  }t	        j                  dt        |       d	|j                         d
z   d|iz  }t        t	        j                  |            d } t        |v}|st	        j
                  d|fdt        |f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      nddz  }t	        j                  d|j                         d
z   d|iz  }t        t	        j                  |            d }t         j"                  }d} |||      }| }	|	st	        j                  d|j                         dz   dt        j                         v st	        j                  t               rt	        j                  t               ndt	        j                  |      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }
t        t	        j                  |
            d x}x}x}}	U t%        t&        dd      }|j(                  dk(  r(|j*                  r| D ]  }|j*                  }||v}|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }t	        j                  dt        |             dz   d|iz  }t        t	        j                  |            d x}} d| d    dfd| D        }t-        |      }|st	        j                  d      dz   d t        j                         v st	        j                  t,              rt	        j                  t,              nd t	        j                  |      t	        j                  |      dz  }t        t	        j                  |            d x}}y )!Nr@   rA   not inz%(py0)s not in %(py2)stoksrcpy0r   u   raw key literal 노출: z @ 
>assert %(py4)spy4_KEY_ASSIGN_NEEDLEu   키 변수 노출 @ z,COKACDIR_KEY[A-Z_]*\s*=\s*['\"][0-9a-f]{12,}u   키 할당 literal @ zW
>assert not %(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.search
}(%(py4)s, %(py5)s)
}re)rz   r   r|   r   r   diffzorigin/main...HEADr   )z2%(py0)s not in %(py4)s
{%(py4)s = %(py2)s.stdout
}rz   r   r|   u   PR diff raw key 노출: 
>assert %(py6)spy6z	+ leaked z	 trailingc              3   &   K   | ]  }|v  
 y w)Nr%   )r   rw   planteds     r!   r"   z8test_01_no_raw_key_literal_in_pr_diff.<locals>.<genexpr>   s     .#sg~.s   u!   raw-key detector 무력화 회귀.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)r'   MOD_PATH	THIS_FILE	read_text
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgr/   nameAssertionError_format_explanationr}   r~   searchr9   	REPO_ROOT
returncodestdoutr   )denypathrx   rw   @py_assert1@py_format3@py_format5@py_assert3@py_assert6@py_assert8@py_format9r   @py_format7r   s                @r!   %test_01_no_raw_key_literal_in_pr_diffr   w   s   ;D9% /nngn. 	YCc>XXX3cXXXXXX3XXX3XXXXXXcXXXcXXXX%=eCj\TYYK#XXXXXXX	Y!,PPP!PPPPPP!PPP!PPPPPPPPPPPPP0DTYYK.PPPPPPP99 	/;	/9;S
 	/ 
 
 	/ 
 	/.."499+.	/ 	/(.	/ 	/..  	/ 	/%.Y  	/ 	/%.Y  	/ 	/%.Y <	/ 	/(.	/ 	/.. >A	/ 	/%.Y >A	/ 	/%.Y
 	/ 	/ 	/..	/ 	/ 	// 	6#78D! 	SC"kkR3k)RRR3kRRRRRR3RRR3RRRRRRdRRRdRRRkRRR-EeCj\+RRRRRRRR	S $q'),G..S3..S.SS0SSSSSSS3SSS3SSS.SSS.SSSSSSr&   c                    t        | dz  dddi      }t        |ddgt        |             |j                  dt        |             t        j                  dt        |            }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}x}}y )Nr7   r)   0teams/shared/verifiers/file_touch_ratio_check.pyprint('x')
task-xrk   statusPASS==z%(py1)s == %(py4)spy1r|   r   r   rZ   rh   r6   setenvftrverifyr   r   r   r   r   r   )	tmp_pathrp   r7   out@py_assert0r   @py_assert2r   r   s	            r!   &test_02_env_root_equals_repo_root_passr      s    61	;^LD $#U"VX[\`Xab~s4y1
**Xs4y
)Cx='F'=F"'''=F'''='''F'''C'''''''r&   c                 
   t        | dz  dddi      }t        j                  |      dz  dz  }|j                  } |       }|sddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }t        t        j                  |            d x}}t        |d
dgt        |             |j                  dt        |             t        j                  d
t        |            }|d   }d}||k(  }	|	st        j                   d|	fd||f      t        j                  |      t        j                  |      dz  }t        j"                  |      dz   d|iz  }
t        t        j                  |
            d x}x}	}d |d   D        }t%        |      }|st        j"                  |      dz   dt	        j
                         v st        j                  t$              rt        j                  t$              ndt        j                  |      t        j                  |      d	z  }t        t        j                  |            d x}}y )Nr7   r)   r   r   r   r   zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_dir
}()
}subdirr   r   rk   r   r   r   r   r   r   r   c              3   $   K   | ]  }d |v  
 ywzsource=PROJECT_PATHNr%   r   ds     r!   r"   zAtest_03_env_subdir_toplevel_normalization_pass.<locals>.<genexpr>        Ba$)B   detailsr   r   )rZ   rG   rH   is_dirr   r   r   r   r   r   r   rh   r6   r   r   r   r   r   r   )r   rp   r7   r   r   r   r   r   r   r   r   s              r!   .test_03_env_subdir_toplevel_normalization_passr      s   61	;^LD \\$')H4F===??66=?$#U"VX[\`Xab~s6{3
**Xs4y
)Cx='F'=F"'''=F'''='''F'''C'''''''B3y>BG3BBGBGGCGGGGGG3GGG3GGGBGGGBGGGGGGr&   c                    t        | dz  dddi      }t        | dz  dddi      }t        | dz  dddi      }t        |d	dgt        |             |j                  d
t        |             |j                  dt        |             |j                  dt        |             t        j                  d	t        |            }d |d   D        }t        |      }|st        j                  |      dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}|j                  d
       t        j                  d	t        |            }	d |	d   D        }t        |      }|st        j                  |	      dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}|j                  d       t        j                  d	t        |            }
d |
d   D        }t        |      }|st        j                  |
      dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nar)   za.txt1
bzb.txtczc.txtr   rk   rl   rm   c              3   $   K   | ]  }d |v  
 ywr   r%   r   s     r!   r"   z-test_04_env_priority_order.<locals>.<genexpr>   r   r   r   r   r   r   c              3   $   K   | ]  }d |v  
 ywzsource=WORKTREE_PATHNr%   r   s     r!   r"   z-test_04_env_priority_order.<locals>.<genexpr>   s     Dq%*Dr   c              3   $   K   | ]  }d |v  
 yw)zsource=QC_EVIDENCE_ROOTNr%   r   s     r!   r"   z-test_04_env_priority_order.<locals>.<genexpr>   s     G!(A-Gr   )rZ   rh   r6   r   r   r   r   r   r   r   r   r   r   r   r   ro   )r   rp   repo_arepo_brepo_cr   r   r   r   out2out3s              r!   test_04_env_priority_orderr      s@   CWe,<=FCWe,<=FCWe,<=F&(WIs6{; ~s6{3F4)3v;7
**Xs6{
+CB3y>BG3BBGBGGCGGGGGG3GGG3GGGBGGGBGGGGGG ~&::hF,DDDODJ3DDJDJJdJJJJJJ3JJJ3JJJDJJJDJJJJJJ '::hF,DGtIGM3GGMGMMMMMMMM3MMM3MMMGMMMGMMMMMMr&   c                    t        | dz  dddi      }t        |ddgt        |             | dz  }| dz  }|j                          |j	                  dt        |             |j	                  d	t        |             t
        j                  dt        |            }d
 |d   D        }t        |      }|st        j                  |      dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}|d   }	d}|	|v }
|
st        j                   d|
fd|	|f      t        j                  |	      t        j                  |      dz  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}	x}
}y )Nr7   r)   zf.txtr   r   nopeplainrk   rl   c              3   $   K   | ]  }d |v  
 yw)zsource=workspace_rootNr%   r   s     r!   r"   z>test_05_invalid_env_falls_back_to_workspace.<locals>.<genexpr>   s     D&!+Dr   r   r   r   r   r   r   WARNFAILinz%(py1)s in %(py4)sr   r   r   )rZ   rh   r6   rJ   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   rp   r7   bogusnongitr   r   r   r   r   r   r   s               r!   +test_05_invalid_env_falls_back_to_workspacer      sR   x&(!gu-=>D$7)SY7vEF
LLN~s5z2F4
**Xs4y
)CDS^DI3DDIDIIcIIIIII3III3IIIDIIIDIIIIIIx=949=44999=4999=9994999c9999999r&   c            	         t         j                  } d}dg} | ||      }g }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}x}x}}t         j                  d	dd
g      }dg}	||	k(  } | st        j                  d| fd||	f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }
t        j                  |      dz   d|
iz  }t        t        j                  |            d x} }	y )Nz- /a/b/c
| /x/y |
r`   r   )zg%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s._extract_reported_files
}(%(py4)s, %(py6)s)
} == %(py11)sr   )rz   r   r|   r   py8r   zassert %(py13)spy13z- /repo/keep.txt
z/repokeep.txtz%(py0)s == %(py3)sr   rz   py3
>assert %(py5)sr   )r   _extract_reported_filesr   r   r   r   r   r   r   r   r   )r   r   @py_assert5@py_assert7@py_assert10@py_assert9@py_format12@py_format14r   r   @py_format4@py_format6s               r!   #test_05b_root_base_edge_no_catchallr      s/   &&K'=KuK&'=uEKKEKKKKEKKKKKK3KKK3KKK&KKK'=KKKuKKKEKKKKKKKKKKK

%
%&:S'N
KC,#3,###3,######3###3###,#########r&   c                    t        | dz  dddi      }t        | dz  dddi      }t        |ddgt        |             |j                  d	t        |             t        j                  dt        |            }|d
   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  |      dz   d|iz  }	t        t        j                  |	            d x}x}}d |d   D        }
t        |
      }|st        j                  |      dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      t        j                  |      dz  }t        t        j                  |            d x}
}y )Ncanonr)   r   r   wtr   zprint('y')
r   rl   r   r   r   r   r   r   r   c              3   $   K   | ]  }d |v  
 ywr   r%   r   s     r!   r"   z?test_06_canonical_report_selected_diff_combo.<locals>.<genexpr>   s     Cq%*Cr   r   r   r   r   )rZ   rh   r6   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rp   	canonicalworktreer   r   r   r   r   r   r   s              r!   ,test_06_canonical_report_selected_diff_combor      sA   Hw.J3FGI4	;^LH
 8	;<c(m H6
**Xs9~
.Cx='F'=F"'''=F'''='''F'''C'''''''CC	NCH3CCHCHHSHHHHHH3HHH3HHHCHHHCHHHHHHr&   c                    ddddd}t        | dz  d|      }t        |dt        |j                               t	        |             |j                  d	t	        |             t        j                  dt	        |            }|d
   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  |      dz   d|iz  }	t        t        j                  |	            d x}x}}d |d   D        }
t        |
      }|st        j                  |      dz   dt        j                          v st        j"                  t              rt        j                  t              ndt        j                  |
      t        j                  |      dz  }t        t        j                  |            d x}
}y )N	print(1)
z	print(2)
zr
zd
)r   ztests/regression/test_x.pyzmemory/reports/task-x.mdz!memory/plans/p0b-pickup/design.mdr7   r)   r   rk   r   r   r   r   r   r   r   c              3   $   K   | ]  }d |v  
 yw)zFile-Touch Ratio: 1.00Nr%   r   s     r!   r"   z1test_07_four_of_four_ratio_one.<locals>.<genexpr>   s     E'1,Er   r   r   r   r   )rZ   rh   listkeysr6   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   rp   r:   r7   r   r   r   r   r   r   r   s              r!   test_07_four_of_four_ratio_oner      s6   <H&2$)-2	E x&(!U3D$$uzz|"4c$i@~s4y1
**Xs4y
)Cx='F'=F"'''=F'''='''F'''C'''''''Ec)nEJ3EEJEJJsJJJJJJ3JJJ3JJJEJJJEJJJJJJr&   c                    t        | dz  dddi      }t        |ddgt        |             |j                  dt        |             t        j                  dt        |            }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}x}}t        | dz  dddi      }	t        |	ddgt        |	             |j                  dt        |	             t        j                  dt        |	            }
|
d   }d}||v }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  |
      dz   d|iz  }t        t        j                  |            d x}x}}y )Nr1rT   r   zprint('z')
r   rk   r   r   r   r   r   r   r   r2r*   ztask-yr   r   r   r   )r   rp   repo1out1r   r   r   r   r   repo2r   s              r!   'test_08_head5_failsafe_low_commit_countr     sv   4	;^LE %$V#WY\]bYcd~s5z2::hE
+D>)V)>V#)))>V)))>)))V)))T))))))) 4	;^LE %$V#WY\]bYcd~s5z2::hE
+D>;5;>55;;;>5;;;>;;;5;;;t;;;;;;;r&   c                    t        | dz  dddi      }t        j                  |      dz  j                  dd       t        | d	z  dd
di      }t	        |dd
gt        |             |j                  dt        |             t        j                  dt        |            }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  |      dz   d|iz  }	t        t        j                  |	            d x}x}}d |d   D        }
t        |
      }|st        j                  |      dz   dt!        j"                         v st        j$                  t              rt        j                  t              ndt        j                  |
      t        j                  |      dz  }t        t        j                  |            d x}
}y )Nr   r)   zx.txtr   zdirty_uncommitted.txtzdirty
r@   rA   r   r   zprint('w')
r   rk   r   r   r   r   r   r   r   c              3   $   K   | ]  }d |v  
 ywr   r%   r   s     r!   r"   zGtest_09_canonical_dirty_does_not_block_selected_root.<locals>.<genexpr>&  r   r   r   r   r   r   )rZ   rG   rH   rK   rh   r6   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s              r!   4test_09_canonical_dirty_does_not_block_selected_rootr    sd   Hw.GU3CDI\\)66BB9W^B_4	;^LH 8	;<c(m ~s8}5
**Xs9~
.Cx='F'=F"'''=F'''='''F'''C'''''''B3y>BG3BBGBGGCGGGGGG3GGG3GGGBGGGBGGGGGGr&   c                     t         dz  } t        | dz  dz  dz  j                               }d}d}d}t        | j	                               D ]  }|j
                  dk(  r|dz  dz  }|j                         s-t        |dz  j                               }t        j                  |      }t        j                  j                  |      r|dz  }|j                  }	 |	|      }
|
st        j                  |j
                  |f      d	z   d
t        j                         v st        j                   |      rt        j"                  |      nd
t        j"                  |	      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |
      dz  }t%        t        j&                  |            d x}	}
|dz  }||k(  }	|	st        j(                  d|	fd||f      d
t        j                         v st        j                   |      rt        j"                  |      nd
dt        j                         v st        j                   |      rt        j"                  |      nddz  }t        j                  |j
                  |f      dz   d|iz  }t%        t        j&                  |            d }	 d}||k\  }	|	st        j(                  d|	fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      dz  }t        j                  d|       dz   d|iz  }t%        t        j&                  |            d x}	}d}||k(  }	|	st        j(                  d|	fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      dz  }t        j                  d|       dz   d|iz  }t%        t        j&                  |            d x}	}y )Nr   r   r   r   z1/teams/shared/verifiers/file_touch_ratio_check.pyr   qcrT   zL
>assert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.endswith
}(%(py3)s)
}resolvedsuffix)rz   r   r   r   r   z%(py0)s == %(py2)sworktree_sharedry   r{   r|      )>=)z%(py0)s >= %(py3)s	convergedr   u   상대 symlink 수렴 부족: r   r   r   caveatu*   dev8 absolute double-hop caveat 예상 1: )r   r6   resolvesortediterdirr   
is_symlinkosreadlinkr   isabsendswithr   r   r   r   r   r   r   r   r   )	teams_dirr  r  r  r  teamlinkr
  
target_strr   @py_assert4r   r   r   r   r   s                   r!   test_10_per_team_symlink_parityr  *  s   G#I	X		+.I	IRRTO AFIFy((*+ F99 d{[( ::CCEF[[&
77==$ aKF$$C$V,C,CCtyy(.CCCCCCC8CCC8CCC$CCCCCCVCCCVCCC,CCCCCC NI.EEE8EEEEEE8EEE8EEEEEEEEEEEEEH0EEEEEEE!F" G9>GGG9GGGGGG9GGG9GGGGGG;I;GGGGGGGM6Q;MMM6QMMMMMM6MMM6MMMQMMMDVHMMMMMMMr&   c                     t         j                  d      } dD ]  }|| v}|st        j                  d|fd|| f      dt	        j
                         v st        j                  |      rt        j                  |      nddt	        j
                         v st        j                  |       rt        j                  |       nddz  }t        j                  |      d	z   d
|iz  }t        t        j                  |            d } dD ]  }|| v}|st        j                  d|fd|| f      dt	        j
                         v st        j                  |      rt        j                  |      nddt	        j
                         v st        j                  |       rt        j                  |       nddz  }t        j                  |      d	z   d
|iz  }t        t        j                  |            d } t        j                  d|       }t        |      }d}||k(  }	|	st        j                  d|	fd||f      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
t        j                  dt        |             dz   d|
iz  }t        t        j                  |            d x}x}	}d}|| v }|st        j                  d|fd|| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d x}}y )Nr@   rA   )zACTIVE=truezACTIVE = trueactivation_epochzsystemctl enablezsystemctl startrt   rv   rw   rx   ry   r{   r|   )z	os.systemzsubprocess.PopenzPopen(z.spawnz	dispatch(zspawn(callzsubprocess\.run\(rT   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr-   runs)rz   r   r   r   u0   subprocess.run 호출 수 예상 1(git 헬퍼): z
>assert %(py8)sr   z["git", "-C", cwd]r   )z%(py1)s in %(py3)sr   r   u'   subprocess.run 이 git 전용이 아님r   r   )r   r   r   r   r   r   r   r   r   r   r   r~   findallr-   )rx   rw   r   r   r   r"  r#  r   r   r  r   r   r   r   r   s                  r!   test_11_no_activation_no_spawnr&  H  s<   


g

.C # #~"""s#""""""s"""s""""""#"""#""""s""""""	# ] %3$$$t3$$$$$$t$$$t$$$$$$3$$$3$$$$$$$$$$% ::*C0Dt9YY9>YYY9YYYYYY3YYY3YYYYYYtYYYtYYY9YYYYYYMcRVi[YYYYYYYYQ3&QQQ3QQQQQQQQQ3QQQ3QQQQ(QQQQQQQr&   c                     t         j                  d      } dD ]  }|| v}|st        j                  d|fd|| f      dt	        j
                         v st        j                  |      rt        j                  |      nddt	        j
                         v st        j                  |       rt        j                  |       nddz  }t        j                  |      d	z   d
|iz  }t        t        j                  |            d } dD ]S  }d| }|| v}|st        j                  d|fd|| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }dd|iz  }	t        t        j                  |	            d x}}d| }|| v}|st        j                  d|fd|| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }dd|iz  }	t        t        j                  |	            d x}}V y )Nr@   rA   )z"w"z'w'z"a"z'a'z"w+"z'w+'rt   rv   wrx   ry   r{   r|   )git_evidencedispatchcallbackzimport )z%(py1)s not in %(py3)sr$  zassert %(py5)sr   zfrom )r   r   r   r   r   r   r   r   r   r   r   )
rx   r(  r   r   r   modr   r   r   r   s
             r!   test_12_no_foreign_module_touchr-  Y  se   


g

.C9 |qqqQ 8 ()c))))c)))))))))c)))c)))))))se}'}C''''}C'''}''''''C'''C'''''''(r&   c                    t        | dz  dddi      }t        |ddgt        |             |j                  dt        |             t	        j
                  |      j                  d      D ci c].  }|j                         s||j                         j                  0 }}t        j                  dt        |             t	        j
                  |      j                  d      D ci c].  }|j                         s||j                         j                  0 }}||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j                   |      rt        j"                  |      nd
dt        j                         v st        j                   |      rt        j"                  |      nddz  }t        j$                  d      dz   d|iz  }t'        t        j(                  |            d }y c c}w c c}w )Nr7   r)   r   r   r   rk   *r   r  beforeafterry   u4   verify 가 파일을 변경함 (부수효과 발생)r{   r|   )rZ   rh   r6   r   rG   rH   rglobis_filestatst_mtime_nsr   r   r   r   r   r   r   r   r   r   r   )	r   rp   r7   rN   r0  r1  r   r   r   s	            r!   test_13_verify_writes_nothingr6  e  s_   61	;\JD $#U"VX[\`Xab~s4y1/6||D/A/G/G/L\!PQPYPYP[a%%%\F\JJxT#.5ll4.@.F.Fs.K[qyy{Q$$$[E[U?RRR6URRRRRR6RRR6RRRRRRURRRURRRRRRRRRRR ][s   ,HH&H<H)L__doc__builtinsr   _pytest.assertion.rewrite	assertionrewriter   importlib.util	importlibr  rG   r~   r4   pytestrH   __file__r  r   r>   r   r   utilspec_from_file_locationr6   r
   r   r  r   r   loaderr   @py_assert13@py_assert12r   r   r   r   r   @py_format8rb   @py_format15@py_format17_format_boolop@py_format18@py_format20r   r   module_from_specr   exec_moduler$   r}   r'   r/   r9   dictrO   intrZ   rh   fixturerr   r   r   r   r   r   r   r   r   r  r  r  r&  r-  r6  r%   r&   r!   <module>rP     s:  $    	  	   GLL"**,	a 	w)K7:UU../BCMR 5D 5uD 5U\\ 5 5\5 5 5 5uD 5 5 5 5 5u 5 5 5u 5 5 5D 5 5 5 5 5 5 5\ 5 5 5 5 5U 5 5 5U 5 5 5\ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5nn%%e,     
 / A
;
* *C *	 	4 	c c  
 
T.(H"N4:$I$K <.H(N<R"(Sr&   