
    (<i7"                     :   d Z ddlZddlZddlZddlZddlZdZdefdZde	e   fdZ
 e
       Zdededefd	Zd
ede	e   fdZdededz  fdZ	 ddede	e   dededz  deeeeedz  f   f   f
dZdededeeeeedz  f   f   ddfdZddZedk(  r e        yy)uJ  
sync_verifiers.py - 팀 간 verifier 파일 동기화 검사 스크립트

모든 팀(dev1, dev4, dev5, dev6, dev7)의 qc/verifiers/ 디렉토리에 있는
공유 verifier 파일을 비교하고, 차이가 있으면 보고합니다.
--fix 옵션으로 정본(canonical) 파일을 다른 팀에 자동 복사할 수 있습니다.
    Nzqc/verifiersreturnc                      t         j                  j                  t         j                  j                  t                    } t         j                  j                  |       S )uB   이 스크립트 기준으로 teams/ 디렉토리를 찾습니다.)ospathdirnameabspath__file__)
script_dirs    L/home/jay/workspace/.worktrees/task-2057-dev2/teams/shared/sync_verifiers.pyget_workspace_rootr      s4    !:;J77??:&&    c                     t               } t        j                  j                  |       }	 |t        j                  vr t        j                  j                  d|       ddlm}  |       }g }|D ]X  }t        j                  j                  | |t              }t        j                  j                  |      sH|j                  |       Z |S # t        $ r g d}Y pw xY w)uP   teams/ 하위에서 qc/verifiers 디렉토리가 존재하는 팀 자동 발견.r   )get_dev_short_ids)dev1dev2dev3dev4dev5dev6dev7dev8)r   r   r   r   sysinsertutils.org_loaderr   ImportErrorjoinVERIFIERS_SUBDIRisdirappend)	teams_dir_workspace_rootr   
candidatesfoundteamverifiers_paths          r   _discover_teamsr&      s    "$Iggooi0OV#((*HHOOA/6&(
 E i7GH77==(LL L  VU
Vs   ?C CCworkspace_rootr$   c                 L    t         j                  j                  | |t              S N)r   r   r   r   )r'   r$   s     r   get_verifiers_dirr*   2   s    77<<.>??r   verifiers_dirc                 B   g }t         j                  j                  |       s|S t        j                  |       D ]Z  }|j	                         s|j
                  j                  d      s0|j
                  dk7  s@|j                  |j
                         \ t        |      S )u   
    verifiers_dir에서 __init__.py를 제외하고
    tests/ 서브디렉토리를 제외한 .py 파일 목록을 반환합니다.
    z.pyz__init__.py)	r   r   r   scandiris_filenameendswithr   sorted)r+   filesentrys      r   collect_py_filesr4   6   sw    
 E77=='M* %==?uzz2259ejjM>YLL$% %=r   r   c                     	 t        | d      5 }|j                         cddd       S # 1 sw Y   yxY w# t        $ r Y yw xY w)uV   파일을 읽어 내용을 반환합니다. 읽기 실패 시 None을 반환합니다.zutf-8)encodingN)openreadOSError)r   fs     r   	read_filer;   D   sB    $) 	Q668	 	 	 s#   5 )	5 25 5 	A Acanonical_teamother_teamstarget_filec                    t        ||       }t        |      }|?||v r|g}n7t        d| d|  dt        j                         t        j
                  d       i }|D ]  }t        j                  j                  ||      }t        |      }	|	t        d| t        j                         Pi }
|D ]  }t        ||      }t        j                  j                  ||      }t        |      }|	d| |
|<   E|	|k(  rd|
|<   Pt        j                  |	j                  d	
      |j                  d	
      |  dt         d| | dt         d|       }dj                  |      |
|<    |
||<    |S )u   
    canonical_team의 파일과 other_teams의 파일을 비교합니다.

    Returns:
        {
            filename: {
                team: diff_text | None  # None이면 동일
            }
        }
    Nz	[ERROR] 'u   ' 파일이 u(    verifiers 디렉토리에 없습니다.file   u1   [WARN] 정본 파일을 읽을 수 없습니다: u   [파일 없음] T)keepends/)fromfiletofile )r*   r4   printr   stderrexitr   r   r   r;   difflibunified_diff
splitlinesr   )r<   r=   r'   r>   canonical_dircanonical_filesresultsfilenamecanonical_pathcanonical_content
file_diffsr$   team_dir	team_pathteam_contentdiffs                   r   compare_filesrY   M   s     &nnEM&}5O/)*mOK=^4DDlmZZ HHQK02G#  'mX>%n5$CNCSTZZ ,.
 	1D(>HXx8I$Y/L#%5i[#A
4  L0#'
4 ++%00$0? ++T+: ./q1A0B!H:N"V1%5$6azB	 $&774=
4 %	1( 'A 'D Nr   diffsc                 2   t        ||       }d}|j                         D ]  \  }}t        j                  j	                  ||      }|j                         D ]d  \  }}	|		t        ||      }
t        j                  j	                  |
|      }	 t        j                  ||       t        d|  d| d|        |dz  }f  |dk(  rt        d
       yt        d| d       y# t        $ r.}t        d| d| d| t        j                  	       Y d}~d}~ww xY w)u8   차이가 있는 파일을 정본으로 덮어씁니다.r   Nz  [FIX] z -> z : rB   u     [ERROR] 복사 실패 z: r@   u#     수정할 파일이 없습니다.u   
  총 u!   개 파일을 수정했습니다.)r*   itemsr   r   r   shutilcopy2rH   r9   r   rI   )r<   r'   rZ   rN   fixed_countrQ   
team_diffsrR   r$   	diff_textrU   rV   es                r   	fix_filesrc      s*    &nnEMK % h*mX>)//1 
	hOD) (>HXx8Ih^Y7 0TF#hZHIq 
	hh a34%FGH  h00@YKrRSQTU\_\f\fgghs   /C	D($DDc            
         t        j                  dt         j                  d      } | j                  ddt        dddj                  t               d	
       | j                  dd dd       | j                  ddd       | j                         }t               }|j                  }t        D cg c]
  }||k7  s	| }}t        d|        t        ddj                  |              t        d|        |j                  rt        d|j                          t                t        ||||j                        }d}|j                         D ]  \  }}	|	j                         D 
ci c]  \  }
}|	|
| }}
}|	j                         D 
cg c]
  \  }
}|	|
 }}
}|rd}t        d|        |rt        ddj                  |              |j                         D ]X  \  }
}t        d|
        |r5|j                  d      s$|j                         D ]  }t        d|         Kt        d|        Z t                t        d| d        
 t                |rQt        d!       |j                  rt        d"       t!        |||       nt        d#       t#        j$                  d$       y t        d%       t#        j$                  d&       y c c}w c c}}
w c c}}
w )'Nu:   팀 간 verifier 파일 동기화 검사 및 수정 도구u  
예시:
  python3 sync_verifiers.py                        # dev1 기준으로 전체 비교
  python3 sync_verifiers.py --canonical dev5       # dev5 기준으로 전체 비교
  python3 sync_verifiers.py --file pyright_check.py  # 특정 파일만 비교
  python3 sync_verifiers.py --fix                  # 차이 파일을 정본으로 덮어쓰기
  python3 sync_verifiers.py --canonical dev5 --fix # dev5 기준으로 수정
)descriptionformatter_classepilogz--canonicalr   TEAMu2   정본으로 사용할 팀 (기본: dev1, 선택: z, ))defaultchoicesmetavarhelpz--fileFILENAMEu6   비교할 특정 파일 이름 (예: pyright_check.py))rj   rl   rm   z--fix
store_trueu4   차이가 있는 파일을 정본으로 덮어쓰기)actionrm   u   정본 팀: u   비교 팀: u   작업 공간: u   비교 대상 파일: )r>   FTz[DIFF] u
     동일: u
     차이: u   [파일 없음]z    z[OK]   u     (모든 팀 동일)u3   결과: 차이가 있는 파일이 존재합니다.u.   
--fix 모드: 정본으로 덮어씁니다...uI     --fix 옵션을 사용하면 자동으로 정본으로 덮어씁니다.rB   uC   결과: 모든 팀의 verifier 파일이 정본과 동일합니다.r   )argparseArgumentParserRawDescriptionHelpFormatteradd_argumentTEAMSr   
parse_argsr   	canonicalrH   rA   rY   r\   
startswithrM   fixrc   r   rJ   )parserargsr'   r<   tr=   rZ   has_diffrQ   r`   r$   d
diff_teams
same_teamsra   lines                   r   mainr      s   $$P <<F A$))EBRASSTU   E	   C  
 D')N..N#;qN':1;K;	L(
)*	L;/0
12	ON+
,-yy&tyyk23	G.+~SWS\S\]EH % =*-7-=-=-?Q'$1=dAgQ
Q*4*:*:*<JwtQ	dJ
JHGH:&'
499Z#8"9:;#-#3#3#5 .i
4&)*Y%9%9:K%L ) 4 4 6 -TFm,- D,-. GGH:%:;<%=( 
GCD88CDnne<]^STW < RJs$   /
K:K,
K 7K 
K&K&__main__r)   )r   N)__doc__rq   rK   r   r]   r   r   strr   listr&   ru   r*   r4   r;   dictrY   rc   r   __name__ r   r   <module>r      sQ     	  
! 'C 'c * 	@c @ @ @C DI C C$J  #	AAcA A t	A
 
#tCtO$
$%AHIII T#sTz/**+I 
	I6Nb zF r   