o
    HiH                     @   s@  d Z ddlZddlZddlmZ ddlmZ d'ddZdd Zd	d
 Zdd Z	d'ddZ
dd Zd'ddZdd Zd(ddZd)ddZd(ddZd'ddZedkrddlZeejd k reed! ed" ejd" Zed#kreejd$k red% ed! ed" ejd& Zejd  ZeeeZesed" dS dS dS dS )*u(   
删除指定 Target 的宏定义内容
    N)oc_yaml)oc_utilc                 C   s$   | st d dS tj}t||  dS )u6   
    初始化函数，接收目标 Target 名称
    u    错误: 未指定 Target 名称!N)printr   path_mix_projectprocess_target_macros)target_namepath r	   B/data/storage/obfuscation/tool/ObjectiveC/oc_custom/custom_file.pydelete_macro_content   s
   r   c                 C   s&   |  ddko|  ddko| tjvS )N
.xcodeprojFz
.framework)endswithr   list_folder_ignore_all)dr	   r	   r
   isTrue   s   &r   c                 C   sr  |dkr	d}d}n|dkrd}d}n	t d|  dS tj| ddD ]\}}}d	d
 |D |dd< dd
 |D |dd< |D ]v}tj||}zQt|ddd}	|	 }
W d   n1 s_w   Y  d| |
v srd| |
v rt|
||}||
krt|ddd}	|	| W d   n1 sw   Y  W q? t	y } zt d| d|  W Y d}~q?d}~ww q"dS )u-   
    处理项目中的 Target 宏定义
    XXGPlayKitOSXXGPLAYKITOS_TARGETXXGPLAYKITCN_TARGETXXGPlayKitCNu$   错误: 不支持的 Target 名称: NTtopdownc                 S      g | ]}t |r|qS r	   r   .0r   r	   r	   r
   
<listcomp>)       z)process_target_macros.<locals>.<listcomp>c                 S   .   g | ]}t j|d  tjv s|dkr|qS    contentsosr   splitextr   list_support_open_file_typer   fr	   r	   r
   r   *      . rutf-8encoding#ifdef w   处理文件     时出错: )
r   r"   walkr   joinopenreadprocess_file_contentwrite	Exception)r   r   
keep_macroremove_macrorootdirsfilesname	file_pathr&   file_contentmodified_contenter	   r	   r
   r      s<   
 r   c                 C   sZ   d| d}t j|d| t jd} dd }d| d}t j||| t jd} t dd| } | S )	ud   
    处理文件内容，删除不需要的宏定义块，保留需要的宏定义块的内容
    	#ifdef\s+	.*?#endif flagsc                 S   sN   |  d}|d}|dkrdS |d}|dkr|S ||d |  }|S )Nr   
rC   z#endifr   )groupfindrfindstrip)match
full_matchfirst_line_end
last_endifmiddle_contentr	   r	   r
   replace_keep_macroH   s   


z0process_file_content.<locals>.replace_keep_macro\n\s*\n\s*\n

resubDOTALL)contentr7   r8   remove_patternrQ   keep_patternr	   r	   r
   r4   ?   s   r4   c                 C   s>  t j}d}tj|ddD ]\}}}dd |D |dd< dd |D |dd< |D ]n}tj||}zIt|dd	d
}| }	W d   n1 sIw   Y  d| |	v rzt|	|}
|
|	krzt|dd	d
}|	|
 W d   n1 suw   Y  W q) t
y } ztd| d|  W Y d}~q)d}~ww qtd dS )ud   
    删除所有 #ifdef XXGPLAYKIT_DEBUG 和 #endif 之间的内容
    不管是哪个 Target
    XXGPLAYKIT_DEBUGTr   c                 S   r   r	   r   r   r	   r	   r
   r   m   r   z'delete_debug_macros.<locals>.<listcomp>Nc                 S   r   r   r!   r%   r	   r	   r
   r   n   r'   r(   r)   r*   r,   r-   r.   r/   u)   XXGPLAYKIT_DEBUG 宏定义块删除完成)r   r   r"   r0   r   r1   r2   r3   remove_debug_macro_contentr5   r6   r   )r   r   debug_macror9   r:   r;   r<   r=   r&   r>   r?   r@   r	   r	   r
   delete_debug_macrosa   s0   

 r^   c                 C   s2   d| d}t j|d| t jd} t dd| } | S )uI   
    删除 #ifdef XXGPLAYKIT_DEBUG 到 #endif 之间的所有内容
    rA   rB   rC   rD   rR   rS   rT   )rX   r]   debug_patternr	   r	   r
   r\      s   r\   c                 C   s   |st j}td|  d|  d}tj|ddD ]P\}}}|D ]H}|| krgtj||}tj||}	zt||	 td| d|	  d}t|| | W q t	yf }
 ztd|
  W Y d}
~
qd}
~
ww qq|sutd	|  d
 dS dS )uw  
    修改工程中指定文件的名字
    
    参数:
        old_name (str): 要修改的文件名，例如 'XXGPlayKit.bundle'
        new_name (str): 新的文件名，例如 'ProjectName.bundle'
        project_path (str, optional): 项目路径，默认使用 oc_util.path_mix_project
    
    返回:
        bool: 操作成功返回 True，否则返回 False
    u    开始查找并重命名文件: z -> FTr   u   已重命名文件夹: u   重命名文件夹时出错: Nu   未找到名为 u    的文件或文件夹)
r   r   r   r"   r0   r   r1   renameupdate_file_referencesr6   )old_namenew_nameproject_pathfound_and_renamedr9   r:   r;   dir_nameold_pathnew_pathr@   r	   r	   r
   rename_specific_file   s0   ri   c                 C   s6  t j| ddD ]\}}}dd |D |dd< dd |D |dd< |D ]s}t j||}zNt|ddd	}| }	W d   n1 sDw   Y  ||	v rz|	||}
|
|	krzt|d
dd	}||
 W d   n1 snw   Y  td|  W q$ t	y } ztd| d|  W Y d}~q$d}~ww qdS )u   
    更新项目文件中对重命名文件的引用
    
    参数:
        project_path (str): 项目路径
        old_name (str): 旧文件名
        new_name (str): 新文件名
    Tr   c                 S   r   r	   r   r   r	   r	   r
   r      r   z*update_file_references.<locals>.<listcomp>Nc                 S   r   r   r!   r%   r	   r	   r
   r      r'   r(   r)   r*   r-   u   已更新文件中的引用: r.   r/   )
r"   r0   r   r1   r2   r3   replacer5   r   r6   )rd   rb   rc   r9   r:   r;   r<   r=   r&   r>   r?   r@   r	   r	   r
   ra      s.   

 ra   Tc              
   C   s
  ddl }zctj| std|   W dS tj| r*t|  td|   W d
S |r;||  td|   W d
S zt|  td|   W W d
S  t	yg } ztd|  d	 W Y d}~W dS d}~ww  t
y } ztd|  d|  W Y d}~dS d}~ww )u0  
    删除指定路径的文件或文件夹
    
    参数:
        path (str): 要删除的文件或文件夹的路径
        recursive (bool, optional): 如果是文件夹，是否递归删除其内容，默认为 True
    
    返回:
        bool: 操作成功返回 True，否则返回 False
    r   Nu   错误: 路径不存在: Fu   已删除文件: u   已递归删除文件夹: u   已删除空文件夹: u$   错误: 无法删除非空文件夹 u"   ，请使用 recursive=True 参数Tu   删除 r/   )shutilr"   r   existsr   isfileremovermtreermdirOSErrorr6   )r   	recursiverk   r@   r	   r	   r
   delete_file_or_folder   s6   



rs   Fc              
   C   s  t j| rt j| std|   dS |r|rtd dS |rGzt|}W n tjyF } ztd| d|  W Y d}~dS d}~ww d}t j| ddD ]f\}	}
}|s}|D ]#}d	}|rgt	|
|}n||v }|r|t j|	|}t|r||d
7 }qY|s|
 }|D ],}d	}|rt	|
|}n||v }|rt j|	|}t|r|d
7 }||
v r|
| q|s nqPtd| d|rdn|rdnd  |S )ul  
    搜索并删除匹配指定模式的文件或文件夹
    
    参数:
        base_path (str): 搜索的基础路径
        pattern (str): 要匹配的模式，可以是文件名、扩展名或正则表达式
        file_only (bool, optional): 是否只删除文件，默认为 False
        folder_only (bool, optional): 是否只删除文件夹，默认为 False
        recursive (bool, optional): 是否递归搜索子文件夹，默认为 True
        use_regex (bool, optional): 是否使用正则表达式匹配，默认为 False
    
    返回:
        int: 成功删除的文件或文件夹数量
    1   错误: 基础路径不存在或不是文件夹: r   u6   错误: file_only 和 folder_only 不能同时为 Trueu"   错误: 无效的正则表达式 'z': NTr   Fr      共删除了 u    个u   文件u	   文件夹u   文件或文件夹)r"   r   rl   isdirr   rU   compileerrorr0   boolsearchr1   rs   copyrn   )	base_pathpattern	file_onlyfolder_onlyrr   	use_regexpattern_regexr@   deleted_countr9   r:   r;   filerL   r=   	dirs_copyrf   dir_pathr	   r	   r
   search_and_delete  s\   
$r   c                 C   s   t j| rt j| std|   dS dd |D }d}t j| ddD ]+\}}}|D ]}t j|d  }	|	|v rKt j||}
t	|
rK|d7 }q,|sP nq%td| d	 |S )
uh  
    删除指定目录下具有特定扩展名的所有文件
    
    参数:
        base_path (str): 搜索的基础路径
        extensions (list): 要删除的文件扩展名列表，例如 ['.txt', '.log']
        recursive (bool, optional): 是否递归搜索子文件夹，默认为 True
    
    返回:
        int: 成功删除的文件数量
    rt   r   c                 S   s$   g | ]}| d r|nd | qS ).)
startswith)r   extr	   r	   r
   r   n  s   $ z-delete_files_by_extension.<locals>.<listcomp>Tr   r   ru   u
    个文件)
r"   r   rl   rv   r   r0   r#   lowerr1   rs   )r|   
extensionsrr   normalized_extensionsr   r9   _r;   r   file_extr=   r	   r	   r
   delete_files_by_extension]  s$   r   c              
   C   s  ddl m  m} ddl}|stj}|ds| d}|j| r(|j	| s1t
d|   dS |j| d}|j|sGt
d|  dS zg||}| }|d}d}	t|D ];}
|
d	}|r||v rd}| D ]}t|D ]
}||
kr|} nqu|r nqo|dur||
 d
}	t
d|  q\|	st
d|  W dS |j|dd
d W d
S  ty } zt
d|  W Y d}~dS d}~ww )u  
    从 xcworkspace 中移除指定名字的工程
    
    参数:
        workspace_path (str): xcworkspace 文件的路径，例如 '/path/to/MyProject.xcworkspace'
        project_name (str): 要移除的工程名称，例如 'MyProject' 或 'MyProject.xcodeproj'
        project_path (str, optional): 项目路径，默认使用 oc_util.path_mix_project
    
    返回:
        bool: 操作成功返回 True，否则返回 False
    r   Nr   u5   错误: workspace 路径不存在或不是文件夹: Fzcontents.xcworkspacedatau)   错误: workspace 内容文件不存在: z
.//FileReflocationTu"   已从 workspace 中移除工程: u"   未在 workspace 中找到工程: r)   )r+   xml_declarationu(   从 workspace 中移除工程时出错: )xml.etree.ElementTreeetreeElementTreer"   r   r   r   r   rl   rv   r   r1   parsegetrootfindalllistgetiterrn   r5   r6   )workspace_pathproject_namerd   ETr"   contents_pathtreer9   	file_refsremovedfile_refr   parentelemchildr@   r	   r	   r
   remove_project_from_workspace  s\   





r   __main__   uk   用法: python -m ObjectiveC.oc_custom.custom_file remove_workspace_project <workspace_path> <project_name>r   remove_workspace_project   u   错误: 缺少参数!   )N)T)FFTF)__doc__r"   rU   
ObjectiveCr   r   r   r   r   r4   r^   r\   ri   ra   rs   r   r   r   __name__syslenargvr   exitcommandr   r   successr	   r	   r	   r
   <module>   sF    
)
"$
,
"
)
K
&K





	
