
    riqi                     <   d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
mZmZmZ ddlZ eej                  j!                  dd            Z ee      ej&                  vr"ej&                  j)                  d ee             edz  Z ee      ej&                  vr"ej&                  j)                  d ee             dd	lmZmZ d
edededededefdZd
ededefdZdeddfdZ G d d      Zej<                  dedeeddf   fd       Z G d d      Z y)u  
test_auto_merge_stash_isolation.py

task-2418: PreFlightCheck T1+T2 stash 격리 fix 회귀 테스트
작성자: 모리건 (dev3 팀 테스터)

테스트 항목:
단위 테스트 (8개) - TestPreFlightCheckStashIsolationUnit
  1. test_simulate_merge_passes_affected_files_to_stash
  2. test_simulate_merge_metadata_missing_dirty_returns_conflict
  3. test_simulate_merge_metadata_missing_clean_skips_stash
  4. test_get_task_affected_files_parses_modify_and_create_only
  5. test_stash_pop_with_retry_succeeds_after_one_failure
  6. test_stash_pop_with_retry_raises_after_three_failures
  7. test_find_stash_by_msg_searches_correct_ref_among_multiple_stashes
  8. test_run_groups_task_ids_per_project_path

통합 테스트 (4개) - TestPreFlightCheckStashIsolationIntegration
  9.  test_integration_stash_whitelist_includes_untracked
  10. test_integration_concurrent_stash_apply_correct_ref
  11. test_integration_apply_drop_removes_stash
  12. test_integration_apply_conflict_triggers_notify
    N)Path)	Generator)	MagicMockMockcallpatchWORKSPACE_ROOTz/home/jay/workspacescripts)PreFlightCheckPreFlightCheckErrorbasetask_idmodify_filescreate_filesforbidden_filesreturnc                    | dz  dz  }|j                  dd       || dz  }d| dddg}|r-|j                  d	       |D ]  }|j                  d
| d        |r-|j                  d       |D ]  }|j                  d
| d        |r-|j                  d       |D ]  }|j                  d
| d        |j                  dj                  |      d       |S )u<   task md 파일을 ## affected_files 섹션과 함께 생성.memorytasksTparentsexist_ok.md# 
z## affected_files
u   ### 수정
z- `z`
u   ### 신규
u   ### 변경 금지
 utf-8encoding)mkdirappend
write_textjoin)	r   r   r   r   r   	tasks_dirmd_pathlinesfs	            </home/jay/workspace/tests/test_auto_merge_stash_isolation.py_make_task_md_with_affectedr)   3   s    x')IOOD4O0WIS/)G'"t%:;E^$ 	'ALL3qc&	'^$ 	'ALL3qc&	'*+  	'ALL3qc&	' rwwu~8N    c                 z    | dz  dz  }|j                  dd       || dz  }|j                  d| dd	       |S )
u6   ## affected_files 섹션 없는 task md 파일 생성.r   r   Tr   r   r   u1   

작업 내용만 있고 affected_files 없음.
r   r   )r    r"   )r   r   r$   r%   s       r(   _make_task_md_no_affectedr,   K   sS    x')IOOD4O0WIS/)GG9$XYdklNr*   	repo_pathc                    | j                  dd       t        j                  ddgt        |       dd       t        j                  g dt        |       dd       t        j                  g dt        |       dd       | d	z  }|j	                  d
d       t        j                  g dt        |       dd       t        j                  g dt        |       dd       y)u,   임시 git repo 초기화 및 초기 커밋.Tr   gitinitFcwdcapture_outputcheck)r/   configz
user.emailztest@test.com)r/   r5   z	user.nameTest	README.mdzinit
r   r   )r/   add.)r/   commit-mr0   N)r    
subprocessrunstrr"   )r-   readmes     r(   _git_init_repor@   T   s    OOD4O0NNE6?ItSXYNNCYhltyzNN9s9~^bjop$F
h1NN&C	N4W\]NN2IW[chir*   c                   p    e Zd ZdZdefdZdefdZdefdZdefdZdefdZ	defdZ
defd	Zdefd
Zy)$TestPreFlightCheckStashIsolationUnitu%   단위 테스트 (mock 기반, 8개).tmp_pathc                    d}dg}dg}t        ||||g        t        |      }|j                  dt        |             t        t        |            }g fd}t	        d|      5  t	        j
                  |d	d
      5  |j                  |g |g       ddd       ddd       t              dk\  sJ d       d   }	d|	v sJ d       d|	v sJ d       d|	v sJ d       |	j                  d      }
|	|
dz   d }||z   D ]  }||v rJ | d        |	j                  d      }|	j                  d      }|	j                  d      }||cxk  r|k  sJ d        J d       y# 1 sw Y   xY w# 1 sw Y   xY w)uM   simulate_merge 호출 시 task affected_files만 stash push 인자에 전달.	task-1001scripts/foo.pytests/test_foo.pyr	   workspace_pathc                     t               }d|_        d|_        d|_        d| v rd| v rj	                  |        d|_        |S )Nr   r   stashpushstash_ref_capturedr   
returncodestdoutstderrr!   cmdkwargsresultstash_push_callss      r(   mock_subprocess_runztTestPreFlightCheckStashIsolationUnit.test_simulate_merge_passes_affected_files_to_stash.<locals>.mock_subprocess_run}   sG    VF !FFMFM#~&C- '', 4Mr*   subprocess.runside_effect_is_working_tree_dirtyTreturn_valuetask_idsN   u4   git stash push가 최소 1회 호출되어야 한다r   --include-untrackedu$   --include-untracked 플래그 필요r;   u   -m 메시지 플래그 필요--u   -- 구분자 필요u&   이 stash push 파일 목록에 없음u   플래그 순서가 잘못됨)	r)   r>   setenvr   r   objectsimulate_mergelenindex)selfrC   monkeypatchr   r   r   project_pathpfcrW   
stash_calldash_dash_idx	file_argsr'   idx_untrackedidx_midx_dash_dashrV   s                   @r(   2test_simulate_merge_passes_affected_files_to_stashzWTestPreFlightCheckStashIsolationUnit.test_simulate_merge_passes_affected_files_to_stashm   s   ()+,#Hg|\SUV 8}+S];CM:
	 #1DE 	Ic#;$O I""<wi"HI	I
 #$)a+aa)%a(
$
2Z4ZZ2z!B#BB!z!8#88! #((.}q012	, 	PA	>OaS(N#OO>	P #(()>?  &"((.u4}4U6UU4U6UU4+I I	I 	Is$   (E-E!E-!E*	&E--E6c                     d}t        ||       t        |      }|j                  dt        |             t        t        |            }g t	        j
                  |dd      5  t	        j
                  |dfd	      5  |j                  |g |g
      }ddd       ddd       d   du sJ d       t        |d         dk\  sJ d       |d   d   d   dk(  sJ d       t              dk(  sJ d       y# 1 sw Y   bxY w# 1 sw Y   fxY w)uW   affected_files 없는 task + dirty working tree → metadata_missing conflict + 알림.z	task-2000r	   rH   r[   Tr\   _notify_chairman_stash_failurec                  &    j                  |       S Nr!   akwnotify_callss     r(   <lambda>zrTestPreFlightCheckStashIsolationUnit.test_simulate_merge_metadata_missing_dirty_returns_conflict.<locals>.<lambda>   s    bnbubuvwbx r*   rY   r^   NpassedFu   passed=False이어야 한다	conflictsr`   u(   conflicts가 최소 1개이어야 한다r   branch__metadata_missing__u.   branch가 __metadata_missing__이어야 한다=   _notify_chairman_stash_failure가 1회 호출되어야 한다r,   r>   rc   r   r   rd   re   rf   )rh   rC   ri   r   rj   rk   rU   r{   s          @r(   ;test_simulate_merge_metadata_missing_dirty_returns_conflictz`TestPreFlightCheckStashIsolationUnit.test_simulate_merge_metadata_missing_dirty_returns_conflict   s'   !(G48}+S];CM:\\#7dK 	Rc#CQxy R++L"y+QR	R h5(H*HH(6+&'1,X.XX,k"1%h/3II{K{{I< A%f'ff%R R	R 	Rs$   %DC8D8D	=DDc                    d}t        ||       t        |      }|j                  dt        |             t        t        |            }g fd}t	        j
                  |dd      5  t	        d|	      5  |j                  |g |g
      }ddd       ddd       t              dk(  sJ d       d   g k(  sJ d       y# 1 sw Y   6xY w# 1 sw Y   :xY w)uK   affected_files 없는 task + clean working tree → stash push 호출 0건.z	task-3000r	   rH   c                 x    t               }d|_        d|_        d|_        d| v rd| v rj	                  |        |S )Nr   r   rK   rL   rN   rR   s      r(   rW   zxTestPreFlightCheckStashIsolationUnit.test_simulate_merge_metadata_missing_clean_skips_stash.<locals>.mock_subprocess_run   s@    VF !FFMFM#~&C- '',Mr*   r[   Fr\   rX   rY   r^   Nr   uK   clean working tree에서는 git stash push를 호출하지 않아야 한다r~   u$   conflicts가 비어 있어야 한다r   )	rh   rC   ri   r   rj   rk   rW   rU   rV   s	           @r(   6test_simulate_merge_metadata_missing_clean_skips_stashz[TestPreFlightCheckStashIsolationUnit.test_simulate_merge_metadata_missing_clean_skips_stash   s    !(G48}+S];CM:	 \\#7eL 	R'5HI R++L"y+QR	R #$)x+xx)k"b(P*PP(R R	R 	Rs$   *C8CCC	CCc                 <   d}dg}dg}ddg}t        |||||       |j                  dt        |             t        t        |            }|j	                  |g      }||v s
J | d       ||   }	d|	v sJ d	       d|	v sJ d
       d|	vsJ d       d|	vsJ d       y)uA   수정/신규 섹션만 파싱하고 변경 금지 섹션 제외.z	task-4000rF   rG   zscripts/bar.pyzdispatch.pyr	   rH   u   가 결과에 없음u'   수정 파일이 포함되어야 한다u'   신규 파일이 포함되어야 한다u.   변경 금지 파일이 제외되어야 한다N)r)   rc   r>   r   _get_task_affected_files)
rh   rC   ri   r   r   r   r   rk   rU   filess
             r(   :test_get_task_affected_files_parses_modify_and_create_onlyz_TestPreFlightCheckStashIsolationUnit.test_get_task_affected_files_parses_modify_and_create_only   s    ()+,+];#Hg|\Sbc+S];CM:--wi8& BWI-A"BB w5(S*SS("e+V-VV+u,^.^^,E)[+[[)r*   c           	         t        |      }|j                  dt        |             t        t        |            }dgfd}t        j                  |dd      5  t        d|	      5  t        d
      5  |j                  |dddg       ddd       ddd       ddd       d   dk(  sJ d       y# 1 sw Y   )xY w# 1 sw Y   -xY w# 1 sw Y   1xY w)uK   stash apply 첫 번째 실패 → 두 번째 시도 성공 → drop 성공.r	   rH   r   c                     t               }d|_        d|_        d|_        d| v r2d| v r.dxx   dz  cc<   d   dk(  rd|_        d|_        |S d|_        |S d| v rd| v rd|_        |S )Nr   r   rK   applyr`   zapply faileddropr   rO   rP   rQ   )rS   rT   rU   
call_counts      r(   rW   zvTestPreFlightCheckStashIsolationUnit.test_stash_pop_with_retry_succeeds_after_one_failure.<locals>.mock_subprocess_run  s    VF !FFMFM#~'S.1"a=A%()F%$2FM M	 )*F% M CFcM$%!Mr*   _find_stash_by_msg	stash@{0}r\   rX   rY   
time.sleeppreflight-task-1001-123rE   N   uF   stash apply가 2회 호출되어야 한다 (1회 실패 + 1회 성공))r>   rc   r   r   rd   _stash_pop_with_retry)rh   rC   ri   rj   rk   rW   r   s         @r(   4test_stash_pop_with_retry_succeeds_after_one_failurezYTestPreFlightCheckStashIsolationUnit.test_stash_pop_with_retry_succeeds_after_one_failure   s    8}+S];CM:S
	$ \\#3+N 	s'5HI s<( s--lKIbepdqrss	s !}!k#kk!	s ss s	s 	ss<   C+C7B5CC5B>:CC
	CCc                    t        |      }|j                  dt        |             t        t        |            }dgfd}g t        j                  |dd      5  t        d|	      5  t        d
      5  t        j                  |dfd	      5  t        j                  t              5  |j                  |dddg       ddd       ddd       ddd       ddd       ddd       d   dk(  sJ d       t              dk(  sJ d       y# 1 sw Y   NxY w# 1 sw Y   RxY w# 1 sw Y   VxY w# 1 sw Y   ZxY w# 1 sw Y   ^xY w)uc   stash apply 3회 모두 실패 → _notify_chairman_stash_failure 1회 + PreFlightCheckError raise.r	   rH   r   c                 p    t               }d|_        d|_        d|_        d| v rd| v rdxx   dz  cc<   |S )Nr`   r   zapply conflictrK   r   r   r   )rS   rT   rU   apply_counts      r(   rW   zwTestPreFlightCheckStashIsolationUnit.test_stash_pop_with_retry_raises_after_three_failures.<locals>.mock_subprocess_run)  s@    VF !FFM,FM#~'S.A!#Mr*   r   r   r\   rX   rY   r   rt   c                  &    j                  |       S rv   rw   rx   s     r(   r|   zlTestPreFlightCheckStashIsolationUnit.test_stash_pop_with_retry_raises_after_three_failures.<locals>.<lambda>9  s    jvj}j}~  kA r*   r   rE   N   u*   stash apply가 3회 시도되어야 한다r`   r   )
r>   rc   r   r   rd   pytestraisesr   r   rf   )rh   rC   ri   rj   rk   rW   r   r{   s         @@r(   5test_stash_pop_with_retry_raises_after_three_failureszZTestPreFlightCheckStashIsolationUnit.test_stash_pop_with_retry_raises_after_three_failures   sE   8}+S];CM:c		 \\#3+N 	'5HI <( c+K  ZA  B #]]+>? 55 ,k;TWbVc	 1~"P$PP"< A%f'ff%    	 	sl    E.D7:D+D	0DD	D+D7EDD	D($D++D40D77E 	<EEc                    t        |      }|j                  dt        |             t        t        |            }dfd}t        d|      5  |j	                  |d      }ddd       d	k(  s
J d
|        y# 1 sw Y   xY w)u-   stash list에서 msg로 정확한 ref 반환.r	   rH   zzstash@{0} On main: other-bot-stash
stash@{1} On main: preflight-task-1001-1234567890
stash@{2} On main: yet-another-stash
c                 F    t               }d|_        |_        d|_        |S )Nr   r   r   )rS   rT   rU   stash_list_outputs      r(   rW   zTestPreFlightCheckStashIsolationUnit.test_find_stash_by_msg_searches_correct_ref_among_multiple_stashes.<locals>.mock_subprocess_runS  s%    VF !F-FMFMMr*   rX   rY   zpreflight-task-1001-1234567890Nz	stash@{1}u   예상 ref=stash@{1}, 실제=)r>   rc   r   r   r   )rh   rC   ri   rj   rk   rW   refr   s          @r(   Btest_find_stash_by_msg_searches_correct_ref_among_multiple_stasheszgTestPreFlightCheckStashIsolationUnit.test_find_stash_by_msg_searches_correct_ref_among_multiple_stashesF  s    8}+S];CM:5 		 #1DE 	Y((7WXC	Y k!J%DSE#JJ!	Y 	Ys   A<<Bc                   
 |j                  dt        |             t        t        |            }ddddddddd	d
ddg}g 
d
fd	}t        j                  |d|      5  t        j                  |d|      5  |j                  d       ddd       ddd       t        
      dk(  sJ dt        
       d       
D ci c]  }|d   |
 }}|j                  d      }|J d       t        |d         ddhk(  sJ d       t        |d         ddhk(  sJ d       |j                  d      }	|	J d       |	d   d
gk(  sJ d       |	d   d	gk(  sJ d       y# 1 sw Y   xY w# 1 sw Y   xY wc c}w ) ud   같은 project_path 두 task → simulate_merge 1회 (task_ids 2개), 다른 path → 별도 호출.r	   rH   ztask-Azbranch-Az/proj/alpha)r   r   rj   ztask-Bzbranch-Bztask-Czbranch-Cz
/proj/betaNc                 8    j                  | ||d       dg dS )N)rj   branchesr_   T)r}   r~   rw   )rj   r   r_   simulate_callss      r(   mock_simulate_mergezkTestPreFlightCheckStashIsolationUnit.test_run_groups_task_ids_per_project_path.<locals>.mock_simulate_mergeq  s,    !! ,$$# 
 #44r*   find_merge_branchesr\   re   rY   zbatch-test-001r   u1   simulate_merge가 2회 호출되어야 하는데    회rj   u5   /proj/alpha에 대한 simulate_merge 호출이 없음r   u   alpha branches가 맞지 않음r_   u   alpha task_ids가 맞지 않음u4   /proj/beta에 대한 simulate_merge 호출이 없음u   beta branches가 맞지 않음u   beta task_ids가 맞지 않음rv   )	rc   r>   r   r   rd   r=   rf   getset)rh   rC   ri   rk   branch_infosr   ccalls_by_path
alpha_call	beta_callr   s             @r(   )test_run_groups_task_ids_per_project_pathzNTestPreFlightCheckStashIsolationUnit.test_run_groups_task_ids_per_project_pathc  s   +S];CM: !JV JV JU
 	5 \\#4<P 	*c#3ATU *()*	*
 >"a'u+\]`ao]p\qqt)uu' 8FF!>*A-FF"&&}5
%^'^^%:j)*z:.FFiHiiF:j)*x.BBeDeeB!%%l3	$\&\\$$4V6VV4$
2T4TT2#* *	* 	* Gs*   #E(<EE(E4E%	!E((E1N)__name__
__module____qualname____doc__r   rr   r   r   r   r   r   r   r    r*   r(   rB   rB   f   s|    /2V4 2VpgTX g2Qt QB\SW \4!lT !lN gd  gLK[_ K:(U$ (Ur*   rB   rC   c              #   4   K   | dz  }t        |       | yw)u4   실 임시 git repo 픽스처: init + 초기 커밋.repoN)r@   )rC   r   s     r(   git_repor     s      fD4
Js   c                   P    e Zd ZdZdedefdZdedefdZdedefdZdedefdZy)	+TestPreFlightCheckStashIsolationIntegrationu-   통합 테스트 (실 임시 git repo, 4개).r   rC   c                    |j                  dt        |             |dz  }|j                  dd       |dz  }|j                  dd       t        t        |            }d	}|j	                  t        |      |ddg      }t        j                  g d
t        |      ddd      }	|	j                  j                         dk(  sJ d|	j                          t        j                  g dt        |      ddd      }
||
j                  v sJ d| d|
j                          |
j                  j                  d      dk\  sJ d       |J d       y)u@   tracked 수정 + untracked 추가 파일 모두 stash에 포함.r	   r7   zmodified content
r   r   znew_untracked.pyzprint('hello')
rH   zpreflight-task-1001-test)r/   statusz--porcelainTFr2   r3   textr4   r   u+   stash 후 working tree가 clean해야 함: r/   rK   listu   stash list에 u   가 없음: r   r`   u&   stash ref가 최소 1개 있어야 함Nu0   _stash_whitelist가 None을 반환하면 안 됨)
rc   r>   r"   r   _stash_whitelistr<   r=   rP   stripcount)rh   r   rC   ri   tracked_fileuntracked_filerk   	stash_msg	stash_refstatus_resultstash_list_results              r(   3test_integration_stash_whitelist_includes_untrackedz_TestPreFlightCheckStashIsolationIntegration.test_integration_stash_whitelist_includes_untracked  sr   +S];  +- 4wG "$66!!"4w!GCM:.	((M,-
	 #,H
 ##))+r1w5`anauau`v3ww1 'NN$H
 -444xykQ]^o^v^v]w6xx4 ''--d3q8b:bb8$X&XX$r*   c           
      F   |j                  dt        |             t        t        |            }|dz  }|j                  dd       t	        j
                  g dt        |      dd	
       d}t	        j
                  ddddd|ddgt        |      dd	
       |dz  }|j                  dd       d}t	        j
                  ddddd|ddgt        |      dd	
       |j                  t        |      |      }	|	J d| d       |	dk7  s
J d|	        t        j                  |d      5  |j                  t        |      |	|dg       ddd       t	        j
                  g dt        |      ddd	      j                  }
||
vsJ d       ||
v sJ d       y# 1 sw Y   OxY w) ug   다그다 stash 후 다른 봇 stash → _find_stash_by_msg가 다그다 stash의 정확한 ref 반환.r	   rH   dagda.pyzdagda = True
r   r   )r/   r8   r   TFr1   zpreflight-task-1001-dagdar/   rK   rL   ra   r;   rb   zother_bot.pyzother = True
zpreflight-task-2002-otherNu*   다그다 stash ref를 찾지 못함 (msg=)r   uM   다른 봇이 stash@{0}이므로 다그다는 stash@{0}이 아니어야 함: rt   rE   r   r   u%   다그다 stash가 drop 되어야 함u$   다른 봇 stash는 잔존해야 함)rc   r>   r   r"   r<   r=   r   r   rd   r   rP   )rh   r   rC   ri   rk   
dagda_filedagda_stash_msg
other_fileother_stash_msg	found_ref
stash_lists              r(   3test_integration_concurrent_stash_apply_correct_refz_TestPreFlightCheckStashIsolationIntegration.test_integration_concurrent_stash_apply_correct_ref  s   +S];CM: 
*
.A1s8}UYafg5GV%:D/SWYcdH		
 .
.A5GV%:D/SWYghH		
 **3x=/J	$e(RSbRccd&ee$K'  	I+|  ~G  }H  *I  	I' \\#?@ 	`%%c(mYR]Q^_	`  ^^$H
 & 	 j0Y2YY0 *,T.TT,	` 	`s   *FF c                    |j                  dt        |             t        t        |            }|dz  }|j                  dd       d}|j	                  t        |      |dg      }|J d	       |j                         r|j                         dk7  sJ d
       t        j                  |d      5  |j                  t        |      ||dg       ddd       t        j                  g dt        |      ddd      j                  }|j                         dk(  s
J d|        |j                         sJ d       |j                         dk(  sJ d|j                                 y# 1 sw Y   xY w)uB   stash → apply + drop → stash list 비어 있고 변경 복원.r	   rH   z	target.pyzx = 42
r   r   zpreflight-task-5000-apply-dropN   stash_ref가 None이면 안 됨u;   stash 후 target.py가 이전 상태이거나 없어야 함rt   z	task-5000r   TFr   r   u9   stash apply+drop 후 stash list가 비어 있어야 함: u    target.py가 복원되어야 함u)   target.py 내용이 복원되어야 함: )rc   r>   r   r"   r   exists	read_textr   rd   r   r<   r=   rP   r   )	rh   r   rC   ri   rk   	test_filer   r   r   s	            r(   )test_integration_apply_drop_removes_stashzUTestPreFlightCheckStashIsolationIntegration.test_integration_apply_drop_removes_stash  s   +S];CM: {*	Z':4	 ((X	K=Q	$G&GG$ ##%)<)<)>*)L 	JI	JL \\#?@ 	Z%%c(mY	K=Y	Z  ^^$H
 & 	 !R'q+deodp)qq' !E#EE!""$
2w6_`i`s`s`u_v4ww2	Z 	Zs   1E''E0c           	        	 |j                  dt        |             t        t        |            }|dz  }|j                  dd       d}|j	                  t        |      |dg      }|J d	       |j                  d
d       g 	t        j                  |d	fd      5  t        d      5  t        j                  t              5  |j                  t        |      ||dg       ddd       ddd       ddd       t        	      dk(  sJ dt        	       d       t        j                  g dt        |      ddd      j                  }||v s
J d|        y# 1 sw Y   yxY w# 1 sw Y   }xY w# 1 sw Y   xY w)uf   stash 후 같은 파일 변경 → apply 시 conflict → 알림 + PreFlightCheckError + stash 잔존.r	   rH   zconflict.pyzversion = 1
r   r   zpreflight-task-6000-conflictNr   zversion = 999
rt   c                  &    j                  |       S rv   rw   rx   s     r(   r|   zmTestPreFlightCheckStashIsolationIntegration.test_integration_apply_conflict_triggers_notify.<locals>.<lambda>I  s    ^j^q^qrs^t r*   rY   r   z	task-6000r`   uA   _notify_chairman_stash_failure가 1회 호출되어야 하는데 r   r   TFr   u*   실패 시 stash ref가 잔존해야 함: )rc   r>   r   r"   r   r   rd   r   r   r   r   rf   r<   r=   rP   )
rh   r   rC   ri   rk   conflict_filer   r   r   r{   s
            @r(   /test_integration_apply_conflict_triggers_notifyz[TestPreFlightCheckStashIsolationIntegration.test_integration_apply_conflict_triggers_notify5  s   +S];CM: !=0  7 C2	((X	M?S	$G&GG$ 	  !2W E \\#?Mtu 	b|$ b]]#67 b--c(mY	T_S`abb	b < A%  	B)jkno{k|j}  ~A  (B  	B%  ^^$H
 & 	 J&a*TU_T`(aa&b bb b	b 	bs<   "E7.E+E'E+/E7E($E++E4	0E77F N)	r   r   r   r   r   r   r   r   r   r   r*   r(   r   r     sd    7*YD *Y\` *Y`3UD 3U\` 3Ur$x$ $xRV $xT$b $bX\ $br*   r   )!r   osr<   systimepathlibr   typingr   unittest.mockr   r   r   r   r   environr   	WORKSPACEr>   pathinsertSCRIPTS
auto_merger   r   r   r)   r,   r@   rB   fixturer   r   r   r*   r(   <module>r      sR  0 
  
    6 6   02GHI	y>!HHOOAs9~&
i
w<sxxHHOOAs7|$ :d S  \` sw   }A 0D 3 4 
jd 
jt 
j$eU eUZ	 t 	$d*: ;  ~b ~br*   