
    j.                        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mZ ddlZ ee      j                         j                   d   Zedz  dz  dz  Zedz  dz  Zedz  d	z  Zd
 Z ej,                  d      defd       Z ej,                  d      defd       Z ej,                  d      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)u  
test_scope_guard_lock_sha_2569.py
MT-T3: AD-1~3 검증 (lock_sha..HEAD scope guard)
  - pre-push hook lock_sha 추출 + _DIFF_BASE 분기 + worktree 감지 로직
  - pre_push_guard.py _resolve_diff_base() 정의 + lock_sha 키 사용
  - task_scope.py base_sha auto 분기 + _resolve_diff_base 호출
  - _resolve_diff_base() 동작 검증 (lock_sha fallback vs origin/main fallback)
    N)Path   scriptsz	git-hookszpre-pushzpre_push_guard.pyztask_scope.pyc                     t        t        dz        } t        t              }| |fD ]5  }|t        j                  vst        j                  j	                  d|       7 t
        j                  j                  dt              }||j                  yt
        j                  j                  |      }	 |j                  j                  |       |S # t        $ r Y yw xY w)u(   task_scope.py를 importlib으로 로드.r   r   task_scope_modN)str	WORKSPACEsyspathinsert	importlibutilspec_from_file_locationTASK_SCOPE_PYloadermodule_from_specexec_module	Exception)scripts_dirworkspace_rootpspecmods        F/home/jay/workspace/tests/regression/test_scope_guard_lock_sha_2569.py_load_task_scoper      s    i)+,K^N>* "CHHHHOOAq!" >>112BMRD|t{{*
..
)
)$
/C$ J  s   1C 	CCmodule)scopereturnc                     t         j                  }  |        }|st        j                  dt                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} }t         j                  d      S )Nu   pre-push hook 없음: C
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}PRE_PUSH_HOOKpy0py2py4utf-8encoding)r!   exists
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation	read_text@py_assert1@py_assert3@py_format5s      r   pre_push_contentr7   *       K!K!KK%;M?#KKKKKKK=KKK=KKKKKK!KKKKKK""G"44    c                     t         j                  }  |        }|st        j                  dt                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} }t         j                  d      S )Nu   pre_push_guard.py 없음: r    PRE_PUSH_GUARD_PYr"   r&   r'   )r;   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   s      r   guard_py_contentr<   0   s    ##W#%W%WW)CDUCV'WWWWWWWWWWWWW#WWW%WWWWWW&&&88r9   c                     t         j                  }  |        }|st        j                  dt                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} }t         j                  d      S )Nu   task_scope.py 없음: r    r   r"   r&   r'   )r   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   s      r   task_scope_contentr>   6   r8   r9   r7   c                 f   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}}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}}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	)um   pre-push hook에 lock_sha 추출, _DIFF_BASE 분기, worktree 컨텍스트 감지 로직이 있어야 한다.lock_shainz%(py1)s in %(py3)sr7   py1py3uY   pre-push hook에 'lock_sha' 키 참조가 없습니다. AD-1~3 구현을 확인하세요.
>assert %(py5)spy5N
_DIFF_BASEuW   pre-push hook에 '_DIFF_BASE' 변수가 없습니다. AD-1~3 구현을 확인하세요.
.worktreesut   pre-push hook에 worktree 컨텍스트 감지 로직이 없습니다. '.worktrees' 경로 패턴이 필요합니다.	r*   _call_reprcomparer/   r,   r-   r.   r+   r0   r1   )r7   @py_assert0@py_assert2@py_format4@py_format6s        r    test_pre_push_hook_uses_lock_sharQ   >   s    :))  :)          *    *    	d      <++  <+          ,    ,    	b      <++  <+          ,    ,   	9    r9   r<   c                    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}}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	)uc   pre_push_guard.py에 _resolve_diff_base() 함수 정의와 lock_sha 키 사용이 있어야 한다._resolve_diff_baserA   rC   r<   rD   uc   pre_push_guard.py에 '_resolve_diff_base' 함수가 없습니다. AD-1~3 구현을 확인하세요.rG   rH   Nr@   u[   pre_push_guard.py에 'lock_sha' 키 사용이 없습니다. AD-2 구현을 확인하세요.rK   )r<   rM   rN   rO   rP   s        r   )test_pre_push_guard_has_resolve_diff_baserT   O   s<    #33  #3           $4    $4    	n      :))  :)          *    *    	f    r9   r>   c                    d| v xs
 d| v xs d| v }|s{t        j                  d      dz   ddt        j                         v st        j                  |      rt        j
                  |      ndiz  }t        t        j                  |            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)u\   task_scope.py에 base_sha auto/AUTO 분기와 _resolve_diff_base 호출이 있어야 한다.zbase_sha in ("auto", "AUTO")zbase_sha == "auto"zbase_sha == 'auto'ub   task_scope.py에 base_sha auto/AUTO 분기 로직이 없습니다. AD-3 구현을 확인하세요.z
>assert %(py0)sr#   has_auto_branchrS   rA   rC   r>   rD   u_   task_scope.py에 '_resolve_diff_base' 호출이 없습니다. AD-1~3 구현을 확인하세요.rG   rH   N)	r*   r+   r,   r-   r.   r/   r0   r1   rL   )r>   rV   @py_format1rM   rN   rO   rP   s          r   %test_task_scope_accepts_auto_base_sharX   [   s2    	'*<< 	6!%77	6#55 
    	m                 #55  #5           $6    $6    	j    r9   tmp_pathc                    d}d}| dz  dz  }|j                  d       || dz  }|j                  t        j                  ||d             t	               }|t        j                  d
       |j                  dd       |j                  |        |j                  ||       }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z  |dz   z  dz  }|j                  dt'        |             |j                  ||       }||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	)u   _resolve_diff_base() 동작 검증.

    시나리오 A: 일반 컨텍스트(worktree 아님) + lock_sha 있어도 → origin/main 반환.
    시나리오 B: worktree 컨텍스트(GIT_DIR에 .worktrees 포함) + lock_sha → lock_sha 반환.
    z	task-9999(abcdef1234567890abcdef1234567890abcdef12z.taskslocksT)parentsz.lock)task_idr@   NuP   task_scope.py 로드 실패 — 의존성 누락 (정적 검증으로 대체됨)GIT_DIR zorigin/main)==)z%(py0)s == %(py3)sresult_a)r#   rF   u=   일반 컨텍스트에서 origin/main 반환 기대, 실제: rG   rH   rJ   z-dev1z.git)z%(py0)s == %(py2)sresult_bfake_sha)r#   r$   uG   worktree 컨텍스트 + lock_sha에서 lock_sha 반환 기대, 실제: z
>assert %(py4)sr%   )mkdir
write_textjsondumpsr   pytestskipsetenvchdirrS   r*   rL   r,   r-   r.   r/   r+   r0   r1   r   )rY   monkeypatchr^   rd   lock_dir	lock_filets_modrb   rN   r4   rO   rP   worktree_git_dirrc   @py_format3r6   s                   r   (test_resolve_diff_base_lock_sha_fallbackrs   m   sF    G9H("W,HNN4N gYe,,IX$NOP F~fg y"%h(((;H$ 8}$  8}              %    HzR    
  ,.'G2CDvMy#&6"78(((;Hx  8x                          RRZQ[\    r9   )__doc__builtinsr,   _pytest.assertion.rewrite	assertionrewriter*   importlib.utilr   rg   r
   pathlibr   ri   __file__resolver]   r	   r!   r;   r   r   fixturer   r7   r<   r>   rQ   rT   rX   rs    r9   r   <module>r      s       
  N""$,,Q/	I%3j@	),?? I%7( h5# 5  5
 h9# 9  9
 h5C 5  5s " c $#t #r9   