phabrocator使用过程中发现了是哪个问题
1,修改内容有中文时会导致文档差异内容乱码。2,代码路径中有中文时会提示提交失败。3,大工程提交评审过程相当缓慢。
查看文档上关于中文字符和代码提交路径的相关介绍。文档介绍对于提交文件中包含中文的处理方法,需要在提交的时候加上—coding GBK,具体为提交时使用命令arc diff–encoding GBK。而代码提交路径中有中文则没有相关介绍,应该是设计的时候就没有做相关处理。关于提交大工程太慢的问题则是Phabricator只能在当前文件目录中有仓库配置文件的情况下才能提交,而我们使用的SVN版本在1.7之后只有在工程根目录下才有配置文件(.svn文件),所以导致使用svn的情况下只有在根目录才能提交评审,从而导致Phabricator会扫描全部工程文件,致使文件量过多时过慢。
根据以上的分析,问题1已经通过官方文档解决,但是问题2和问题3属于设计缺陷,解决办法是修改源码。我们首先解决问题2,通过Phabricator的相关文档我们知道,Phabricator属于CS结构,其主要的评审流程如下:
根据问题2的错误提示
提示内容表示svn的节点错误,找不到文件。可以合理猜测Phabricator在生成文件差异的过程中将差异内容文本格式识别错误,之后在检查的过程中提示此错误。
有了以上的猜测,我们可以查看代码中的获取文件差异的代码部分,将文本格式转化为Phabricator能识别的格式即可。
分析Phabricator的调用方式:
继续分析generateChanges()方法,找到了一下语句
分析为对不同代码管理工具做了不同处理,如果是SVN工具下,则使用上述对于方法处理。针对本问题2的路径问题,需要分析generateAffectedPaths()方法,然后发现调用了$paths = $repository_api->getSVNStatus($externals = true);方法来获取路径,具体的调用方式如下
剩下的处理就简单了,需要在获取xml格式文本后件将文本转化为GBK格式,但是这样还不够,因为Phabricator的服务器并不难识别GBK格式,需要在发送数据前将数据从GBK转化为UTF-8,具体修改如下:
1,ArcnistSubversionApi.php. getSVNStatus ()方法修改
2,ArcdiffWorkflow.php.run()方法修改
新增了格式转换方法
作出以上修改后,果然路径中有中文也不会出现问题。
同理对于问题3,我们希望的情况是在非根目录下也能提交,同时只提交当前目录,有了上述铺垫,我们可以直接在工程非根目录下运行svn–xml status,发现也能输出对于当前目录的文件差异,以这一点为基础,只需要解除Phabricator对svn下非根目录不能提交的限制即可。具体做法如下:
1,在ArcanistWorkingCopyIdentity.php的newFromPathWithConfig方法里修改判断当前目录,改为判断当前目录以及父目录
通用需要新增判断方法
有了以上修改后,就可以在非svn根目录也能提交,提高了评审速度。