
    (<i                         d Z ddlZddlZddlZdededefdZdee   dedej                  fd	Z	dedefd
Z
ddededefdZy)uP  
git_evidence.py - git 커밋 증거 검증 verifier
task-2031: 코드 커밋 없이 .done 생성 방지

3가지 검증:
1. COMMIT_EXISTS: task ID가 포함된 커밋 최소 1건
2. NO_UNCOMMITTED: uncommitted 변경 없음
3. NON_EMPTY_COMMIT: 마지막 커밋이 빈 커밋이 아님

non-code task (문서만/리서치만) → SKIP
    Ntask_idworkspace_rootreturnc                    t         j                  j                  |dd|  d      }t         j                  j                  |      sy	 t	        |dd      5 }|j                         }ddd       t        j                  d	t        j                        }|sy|j                  d
      }t        t        j                  d|            S # 1 sw Y   axY w# t        $ r Y yw xY w)u@   task 파일의 ## 레벨 섹션에서 non-code 키워드 판별.memorytasksz.mdFrzutf-8)encodingNu   ## 레벨\s*\n(.*?)(?=\n## |\Z)   uB   코드 수정 없음|문서 업데이트만|문서만|리서치만)ospathjoinisfileopenreadresearchDOTALLgroupboolOSError)r   r   	task_pathfcontentmsections          T/home/jay/workspace/.worktrees/task-2057-dev2/teams/shared/verifiers/git_evidence.py_is_non_code_taskr      s    ^Xw7)3PI77>>)$
)S73 	qffhG	 II8'299M''!*BIIcelmnn	 	  s0   C C&/C /C CC 	CCargscwdc                 >    t        j                  dg| z   |ddd      S )u   git 명령 실행 헬퍼.gitT   )r    capture_outputtexttimeout)
subprocessrun)r   r    s     r   _run_gitr)   $   s(    >>	$     c                     	 t        ddg|       }|j                  dk(  r|j                  j                         S 	 | S # t        j
                  t        f$ r Y | S w xY w)u,   git rev-parse로 프로젝트 루트 탐지.z	rev-parsez--show-toplevelr   )r)   
returncodestdoutstripr'   TimeoutExpiredr   )r   results     r   _find_project_rootr1   /   sl    ;(9:NK!==&&(( "  %%w/ s   6< AAc                 2   t        | |      rddgdS t        |      }g }g }	 t        dddd|  g|      }|j                  j	                         j                         D cg c]  }|j	                         s| }}t        |      }|dk(  r'|j                  d	|  d
       |j                  d       n|j                  d|  d| d       	 t        ddg|      }
t        g d|      }|
j                  dk7  s|j                  dk7  r#|j                  d       |j                  d       n|j                  d       	 t        ddd|  ddg|      }|j                  j	                         }|rt        dd| d| g|      }|j                  j	                         j                         D cg c]  }|j	                         s| }}t        |      }|dk(  r#|j                  d       |j                  d       n'|j                  d| d       n|j                  d       |rd!||d"S d#|dS c c}w # t        j                  t        f$ r0}	|j                  d|	        |j                  d       Y d}	~	d}	~	ww xY w# t        j                  t        f$ r0}	|j                  d|	        |j                  d       Y d}	~	d}	~	ww xY wc c}w # t        j                  t        f$ r/}	|j                  d |	        |j                  d       Y d}	~	d}	~	ww xY w)$ul   
    git 커밋 증거 검증.

    Returns:
        {"status": "PASS"|"FAIL"|"SKIP", "details": [...]}
    SKIPu4   non-code task (문서/리서치) — git 검증 SKIP)statusdetailslogz	--onelinez--allz--grep=r   zFAIL COMMIT_EXISTS: u    커밋 0건COMMIT_EXISTSzPASS COMMIT_EXISTS: u    커밋 u   건u*   FAIL COMMIT_EXISTS: git 명령 실패 — Ndiff--quiet)r8   z--cachedr9   u.   FAIL NO_UNCOMMITTED: uncommitted 변경 존재NO_UNCOMMITTEDu.   PASS NO_UNCOMMITTED: uncommitted 변경 없음u+   FAIL NO_UNCOMMITTED: git 명령 실패 — z--format=%Hz-1z--name-onlyz^..u5   FAIL NON_EMPTY_COMMIT: 빈 커밋(변경 파일 0건)NON_EMPTY_COMMITu%   PASS NON_EMPTY_COMMIT: 변경 파일 uI   SKIP NON_EMPTY_COMMIT: task ID 커밋 없음 (COMMIT_EXISTS에서 처리)u-   FAIL NON_EMPTY_COMMIT: git 명령 실패 — FAIL)r4   r5   failed_checksPASS)r   r1   r)   r-   r.   
splitlineslenappendr'   r/   r   r,   )r   r   proj_dirr5   failedr0   llinescommit_countediff_resultcached_resulthash_result	last_hashdiff_files_result
file_linesdiff_file_counts                    r   verifyrO   :   s    .1NO
 	

 ".1HGF'5+w''8KLhW"MM//1<<>Lq!'')LL5z1NN1',GHMM/*NN1'(<.PSTU
(	2H= !@(K!!Q&-*B*Ba*GNNKLMM*+NNKL*Gwwi0-F
  &&,,.	 (9+S(DEx! &7%=%=%C%C%E%P%P%R`VWV]V]V_!`J`!*oO!#VW01!FFWWZ[\NNfg
  WvNN11e M %%w/ 'CA3GHo&&' %%w/ (DQCHI&''( a %%w/ *FqcJK())*s{   =H1  H,6H,:AH1 A.I= ;A.K )K	?K	AK ,H1 1I:
%I55I:=K%KK	K L'%LL)z/home/jay/workspace)__doc__r   r   r'   strr   r   listCompletedProcessr)   r1   dictrO    r*   r   <module>rV      s   
 
 	 s C D $49 3 :+F+F s s G2C G2 G2 G2r*   