关联冲突块呈现方法和设备与流程

文档序号:20837506发布日期:2020-05-22 17:03阅读:183来源:国知局
关联冲突块呈现方法和设备与流程

本申请涉及软件开发技术领域,尤其涉及一种关联冲突块呈现方法和设备。



背景技术:

在软件开发过程中,不同的项目组在同一版本代码的基础上并行开发情况下,开发完成后,基于功能合并等原因,需要将各自开发的代码进行合并。但是,如果不同项目组在开发过程中对基础版本中相同代码实体进行了不同的变更,在合并时就会产生代码冲突。目前,很多用户采用semanticmerge工具进行冲突块的自动消解,然而,该工具并不能完全消解代码合并过程中产生的所有冲突,也就是说,代码冲突的彻底消解仍依赖人工参与,如何提高人工消解效率成为主要问题。

semanticmerge工具中对于不能自动消解的冲突块展示了冲突块内部洞察信息。比如:当前版本相对于基础版本的变更信息以及待合并版本相对于基础版本的变更信息等,用户在做消解时可以通过这些洞察信息直观地了解到当前冲突块包含的三个版本的代码片段之间的不同,然而,用户在做消解时,更多时候需要查看关联冲突块的代码片段,上述仅提供当前冲突块内部洞察信息的方法,不能满足用户快速定位关联冲突块的需求。



技术实现要素:

本申请提供一种关联冲突块呈现方法和设备,用以提升人工消解冲突块的效率。

第一方面,本申请提供一种关联冲突块呈现方法,包括:

获取第一冲突文件,所述第一冲突文件中包括多个代码块,每个代码块包括所述代码块当前版本的代码片段、所述代码块基础版本的代码片段和所述代码块待合并版本的代码片段;

接收用户界面触发的用于激活待处理代码块的第一指令,所述待处理代码块的类型为未消解冲突块或者单方变更块;

在所述用户界面呈现所述待处理代码块包含的代码片段以及所述待处理代码块的n个关联代码块的索引;

其中,每个关联代码块的类型为未消解冲突块、单方变更块和已消解冲突块中的一种,每个关联代码块与所述待处理代码块的关联关系为依赖关系、被依赖关系和相似关系中的一种,n大于等于1。

在一种可能的设计中,所述方法还包括:

接收所述用户界面触发的用于激活任一关联代码块的第二指令;

将所述用户界面呈现的所述待处理代码块包含的代码片段跳转为所述关联代码块包含的代码片段。

在一种可能的设计中,所述用户界面设有依赖组、被依赖组和相似组;

所述在所述用户界面呈现所述待处理代码块的n个关联代码块的索引,包括:

根据每个关联代码块与所述待处理代码块的关联关系,将每个关联代码块的索引呈现在所述依赖组、所述被依赖组或所述相似组中。

在一种可能的设计中,所述在所述用户界面呈现所述待处理代码块的n个关联代码块的索引之前,还包括:

从所述第一冲突文件中确定所述待处理代码块的至少一个关联代码块。

在一种可能的设计中,所述在所述用户界面呈现所述待处理代码块的n个关联代码块的索引之前,还包括:

获取第二冲突文件;

从所述第二冲突文件中确定与所述待处理代码块的至少一个关联代码块。

在一种可能的设计中,所述从所述第一冲突文件中确定所述待处理代码块的至少一个关联代码块,包括:

根据所述待处理代码块中的变量和/或函数在所述第一冲突文件的其他代码块中的利用情况,从所述第一冲突文件中确定与所述待处理代码块有依赖关系和被依赖关系的关联代码块;和/或

根据所述待处理代码块包含的代码片段各自对应的token串和抽象语法子树,从所述第一冲突文件中确定与所述待处理代码块有相似关系的关联代码块。

在一种可能的设计中,所述根据每个关联代码块与所述待处理代码块的关联关系,将每个关联代码块的索引呈现在所述依赖组、所述被依赖组或所述相似组中,包括:

将n个关联代码块中与待处理代码块有依赖关系的代码块呈现在依赖组中;

将n个关联代码块中与待处理代码块有被依赖关系的代码块呈现在被依赖组中;

将n个关联代码块中与待处理代码块有相似关系的代码块呈现在相似组中。

在一种可能的设计中,所述根据所述待处理代码块中的变量和/或函数在所述第一冲突文件的其他代码块中的利用情况,从所述第一冲突文件中确定与所述待处理代码块有依赖关系的关联代码块,包括:

若待处理代码块中定义的变量在第一冲突文件中的其他代码块中共m个代码块中使用,则确定该m个代码块均为与待处理代码块有依赖关系的关联代码块。

在一种可能的设计中,所述根据所述待处理代码块中的变量和/或函数在所述第一冲突文件的其他代码块中的利用情况,从所述第一冲突文件中确定与所述待处理代码块有被依赖关系的关联代码块,包括:

若待处理代码块中使用的变量在第一冲突文件中的其他代码块中共k个代码块中定义,则确定该k个代码块均为与待处理代码块有被依赖关系的关联代码块。

在一种可能的设计中,所述根据所述待处理代码块包含的代码片段各自对应的token串和抽象语法子树,从所述第一冲突文件中确定与所述待处理代码块有相似关系的关联代码块,包括:

针对第一冲突文件包含的多个代码块中的除待处理代码块的每个代码块,计算所述待处理代码块包含的三个版本的代码片段各自对应的token串和所述代码块包含的三个版本的代码片段各自对应的token串之间每个版本的代码片段的token相似度;

针对第一冲突文件包含的多个代码块中的除待处理代码块的每个代码块,计算所述待处理代码块包含的三个版本的代码片段各自对应的抽象语法子树和所述代码块包含的三个版本的代码片段各自对应的抽象语法子树之间每个版本的代码片段的结构相似度;

根据所述待处理代码块包含的三个版本的代码片段和所述每个代码块包含的三个版本的代码片段之间每个版本的代码片段的token相似度和结构相似度,确定与所述待处理代码块有相似关系的关联代码块。

在一种可能的设计中,上述方法还包括:

针对第一冲突文件包含的每个代码块,存储该代码块中定义的变量和/或函数,以及使用的变量和/或函数;

判断待处理代码块中定义的变量是否在第一冲突文件中除待处理代码块的其他代码块中使用;以及判断待处理代码块中使用的变量是否在第一冲突文件中除待处理代码块的其他代码块中定义。

在一种可能的设计中,所述计算所述待处理代码块包含的三个版本的代码片段各自对应的抽象语法子树和所述代码块包含的三个版本的代码片段各自对应的抽象语法子树之间每个版本的代码片段的结构相似度,包括:

根据所述待处理代码块包含的三个版本的代码片段的行号范围,确定所述待处理代码块包含的三个版本的代码片段各自对应的抽象语法子树;

针对第一冲突文件包含的多个代码块中的除待处理代码块的每个代码块,根据所述代码块包含的三个版本的代码片段的行号范围,确定所述代码块包含的三个版本的代码片段各自对应的抽象语法子树;

根据所述待处理代码块的包含的三个版本的代码片段各自对应的抽象语法子树和每个代码块包含的三个版本的代码片段各自对应的抽象语法子树,确定所述待处理代码块包含的三个版本的代码片段和每个代码块包含的三个版本的代码片段之间每个版本的代码片段的结构相似度。

在一种可能的设计中,所述根据所述待处理代码块包含的三个版本的代码片段的行号范围,确定所述待处理代码块包含的三个版本的代码片段各自对应的抽象语法子树,包括:

针对所述待处理代码块包含的三个版本的代码片段中的第一版本的代码片段,解析所述第一版本的代码片段所在的代码文件,得到所述代码文件对应的抽象语法树;

搜索所述抽象语法树,将行号范围落在所述第一版本的代码片段对应的行号范围内的子树确定为所述第一版本的代码片段对应的抽象语法子树。

在一种可能的设计中,所述根据所述待处理代码块包含的三个版本的代码片段和所述每个代码块包含的三个版本的代码片段之间每个版本的代码片段的token相似度和结构相似度,确定与所述待处理代码块有相似关系的关联代码块,包括:

针对所述待处理代码块包含的三个版本的代码片段中第一版本的代码片段,以及所述每个代码块包含的三个版本的代码片段中第一版本的代码片段;

对所述待处理代码块的第一版本的代码片段和所述每个代码块的第一版本的代码片段之间的token相似度和结构相似度取加权平均,得到所述待处理代码块的第一版本的代码片段和所述每个代码块的第一版本的代码片段之间第一相似度值;

对所述待处理代码块包含的三个版本的代码片段和所述每个代码块包含的三个版本的代码片段之间的三个所述第一相似度值取加权平均,得到所述待处理代码块包含的三个版本的代码片段和所述每个代码块包含的三个版本的代码片段之间的第二相似度值;

将所述第二相似度值大于预设阈值的代码块确定为与所述待处理代码块有相似关系的关联代码块。

第二方面,本申请提供一种终端设备,包括:

获取模块,用于获取第一冲突文件,所述第一冲突文件中包括多个代码块,每个代码块包括所述代码块当前版本的代码片段、所述代码块基础版本的代码片段和所述代码块待合并版本的代码片段;

接收模块,用于接收用户界面触发的用于激活待处理代码块的第一指令,所述待处理代码块的类型为未消解冲突块或者单方变更块;

呈现模块,用于在所述用户界面呈现所述待处理代码块包含的代码片段以及所述待处理代码块的n个关联代码块的索引;

其中,每个关联代码块的类型为未消解冲突块、单方变更块和已消解冲突块中的一种,每个关联代码块与所述待处理代码块的关联关系为依赖关系、被依赖关系和相似关系中的一种,n大于等于1。

在一种可能的设计中,所述接收模块,还用于接收所述用户界面触发的用于激活任一关联代码块的第二指令;

所述呈现模块还用于,将所述用户界面呈现的所述待处理代码块包含的代码片段跳转为所述关联代码块包含的代码片段。

在一种可能的设计中,所述用户界面设有依赖组、被依赖组和相似组;所述呈现模块具体用于:

根据每个关联代码块与所述待处理代码块的关联关系,将每个关联代码块的索引呈现在所述依赖组、所述被依赖组或所述相似组中。

在一种可能的设计中,上述终端设备还包括:依赖关系分析模块和相似关系分析模块,所述依赖关系分析模块和所述相似关系分析模块用于从所述第一冲突文件中确定所述待处理代码块的至少一个关联代码块。

在一种可能的设计中,所述获取模块还用于:获取第二冲突文件;

所述依赖关系分析模块和所述相似关系分析模块还用于从所述第二冲突文件中确定与所述待处理代码块的至少一个关联代码块。

在一种可能的设计中,所述依赖关系分析模块和相似关系分析模块具体用于:

根据所述待处理代码块中的变量和/或函数在所述第一冲突文件的其他代码块中的利用情况,从所述第一冲突文件中确定与所述待处理代码块有依赖关系和被依赖关系的关联代码块;和/或

根据所述待处理代码块包含的代码片段各自对应的token串和抽象语法子树,从所述第一冲突文件中确定与所述待处理代码块有相似关系的关联代码块。

在一种可能的设计中,所述呈现模块具体用于:

将n个关联代码块中与待处理代码块有依赖关系的代码块呈现在依赖组中;

将n个关联代码块中与待处理代码块有被依赖关系的代码块呈现在被依赖组中;

将n个关联代码块中与待处理代码块有相似关系的代码块呈现在相似组中。

在一种可能的设计中,所述依赖关系分析模块具体用于:

若待处理代码块中定义的变量在第一冲突文件中的其他代码块中共m个代码块中使用,则确定该m个代码块均为与待处理代码块有依赖关系的关联代码块。

在一种可能的设计中,所述依赖关系分析模块具体用于:

若待处理代码块中使用的变量在第一冲突文件中的其他代码块中共k个代码块中定义,则确定该k个代码块均为与待处理代码块有被依赖关系的关联代码块。

在一种可能的设计中,所述相似关系分析模块具体用于:

针对第一冲突文件包含的多个代码块中的除待处理代码块的每个代码块,计算所述待处理代码块包含的三个版本的代码片段各自对应的token串和所述代码块包含的三个版本的代码片段各自对应的token串之间每个版本的代码片段的token相似度;

针对第一冲突文件包含的多个代码块中的除待处理代码块的每个代码块,计算所述待处理代码块包含的三个版本的代码片段各自对应的抽象语法子树和所述代码块包含的三个版本的代码片段各自对应的抽象语法子树之间每个版本的代码片段的结构相似度;

根据所述待处理代码块包含的三个版本的代码片段和所述每个代码块包含的三个版本的代码片段之间每个版本的代码片段的token相似度和结构相似度,确定与所述待处理代码块有相似关系的关联代码块。

在一种可能的设计中,所述依赖关系分析模块还用于:

针对第一冲突文件包含的每个代码块,存储该代码块中定义的变量和/或函数,以及使用的变量和/或函数;

判断待处理代码块中定义的变量是否在第一冲突文件中除待处理代码块的其他代码块中使用;以及判断待处理代码块中使用的变量是否在第一冲突文件中除待处理代码块的其他代码块中定义。

在一种可能的设计中,所述相似关系分析模块具体用于:

根据所述待处理代码块包含的三个版本的代码片段的行号范围,确定所述待处理代码块包含的三个版本的代码片段各自对应的抽象语法子树;

针对第一冲突文件包含的多个代码块中的除待处理代码块的每个代码块,根据所述代码块包含的三个版本的代码片段的行号范围,确定所述代码块包含的三个版本的代码片段各自对应的抽象语法子树;

根据所述待处理代码块的包含的三个版本的代码片段各自对应的抽象语法子树和每个代码块包含的三个版本的代码片段各自对应的抽象语法子树,确定所述待处理代码块包含的三个版本的代码片段和每个代码块包含的三个版本的代码片段之间每个版本的代码片段的结构相似度。

在一种可能的设计中,所述相似关系分析模块具体用于:

针对所述待处理代码块包含的三个版本的代码片段中的第一版本的代码片段,解析所述第一版本的代码片段所在的代码文件,得到所述代码文件对应的抽象语法树;

搜索所述抽象语法树,将行号范围落在所述第一版本的代码片段对应的行号范围内的子树确定为所述第一版本的代码片段对应的抽象语法子树。

在一种可能的设计中,所述相似关系分析模块具体用于:

针对所述待处理代码块包含的三个版本的代码片段中第一版本的代码片段,以及所述每个代码块包含的三个版本的代码片段中第一版本的代码片段;

对所述待处理代码块的第一版本的代码片段和所述每个代码块的第一版本的代码片段之间的token相似度和结构相似度取加权平均,得到所述待处理代码块的第一版本的代码片段和所述每个代码块的第一版本的代码片段之间第一相似度值;

对所述待处理代码块包含的三个版本的代码片段和所述每个代码块包含的三个版本的代码片段之间的三个所述第一相似度值取加权平均,得到所述待处理代码块包含的三个版本的代码片段和所述每个代码块包含的三个版本的代码片段之间的第二相似度值;

将所述第二相似度值大于预设阈值的代码块确定为与所述待处理代码块有相似关系的关联代码块。

第三方面,本申请提供一种终端设备,包括:存储器和处理器;

所述存储器用于存储程序指令,所述处理器用于调用所述存储器中的程序指令执行上述关联冲突块呈现方法。

第四方面,本申请提供一种可读存储介质,所述可读存储介质上存储有计算机程序;所述计算机程序在被执行时,实现上述关联冲突块呈现方法。

本申请提供的关联冲突块呈现方法和设备,通过依赖关系分析模块和相似关系分析模块获取当前冲突块的关联代码块列表,使得当前冲突块被激活后,终端设备可以将这些关联代码块的索引呈现在用户界面,用户需要查看某关联代码块包含的代码片段时,点击该关联代码块的索引,用户界面便可跳转到该关联代码块包含的代码片段,使得用户可以快速查找到当前冲突块中变量和/或函数的定义以及使用情况,另外还可参考与当前冲突块相似的并且已经消解的代码块的消解方案,极大提高了用户消解冲突块的效率。

附图说明

图1为本申请提供的系统框架图;

图2为本申请提供的终端设备的结构示意图;

图3为本申请提供的关联冲突块呈现方法的实施例的流程示意图;、

图4为本申请提供的用户界面示意图一;

图5为本申请提供的用户界面示意图二;

图6为本申请提供的用户界面示意图三;

图7为本申请提供的用户界面示意图四;

图8为本申请提供的用户界面示意图五;

图9为本申请提供的用户界面示意图六;

图10为本申请提供的终端设备100的结构示意图;

图11为本申请提供的终端设备110的硬件结构示意图。

具体实施方式

为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请中的附图,对本申请中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

在本申请中,需要解释的是,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性。此外,“至少一个”是指一个或者多个,“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b的情况,其中a,b可以是单数或者复数。字符“以是一般表示前后关联对象是一种“或”的关系。“以下至少一项(个)”或其类似表达,是指的这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a,b,或c中的至少一项(个),可以表示:单独a,单独b,单独c,a和b的组合,a和c的组合,b和c的组合,或a、b以及c的组合,其中a,b,c可以是单个,也可以是多个。

以下,对本申请中的部分用语进行解释说明,以便于本领域技术人员理解。

1)三个版本的代码文件:包括当前版本的代码文件、基础版本的代码文件和待合并版本的代码文件,当前版本的代码文件中包含的代码和待合并版本的代码文件中包含的代码均为在基础版本的代码文件中包含的代码的基础上进一步开发得到的代码。

为方便描述,下文中将当前版本简称为“ours版本”,将基础版本简称为“base版本”,将待合并版本简称为“theirs版本”,可以理解的是,ours版本、base版本和theirs版本仅仅是为了描述清楚本申请的方案所使用的示意性的名称,本领域技术人员还可以使用其他的名称,使用其他名称来实施的本申请的步骤时得到的方案均在本申请保护范围内。

2)代码合并:基于功能合并等原因,需将ours版本的代码文件中包含的代码和theirs版本的代码文件中包含的代码进行合并。

3)代码冲突:针对base版本的代码文件中的相同代码实体,如果ours版本和theirs版本分别对其做了不同的变更,在代码合并时就会产生代码冲突。比如:ours版本和theirs版本对base版本中同一变量进行了不同的命名操作,在代码合并时就会产生关于这个变量的代码冲突。

4)单方变更:针对base版本的代码文件中的相同代码实体,ours版本和theirs版本中只有一个版本做了变更,这种情况下,在代码合并时可直接取做出变更的一方。

5)冲突文件:代码合并后生成的文件,冲突文件包括两部分:成功合并部分和若干个冲突部分,每个冲突部分可使用“<<<<<<<”“|||||||”“=======”“>>>>>>>”等标识符划分该冲突部分对应的不同版本的代码片段。比如:可将冲突文件中“<<<<<<<”和“|||||||”之间的代码片段作为冲突部分的ours版本的代码片段,将“|||||||”和“=======”之间的代码片段作为冲突部分的base版本的代码片段,将“=======”和“>>>>>>>”之间的代码片段作为冲突部分的theirs版本的代码片段。

可以理解的是:不同的合并工具生成的冲突文件中划分不同版本的代码片段所使用的标识符不同,上述标识符仅是一种示例,本申请不以此为限,下文以这种标识符为例介绍本申请的方案。

6)冲突块:代码合并时一处冲突对应一个冲突块,每个冲突块均包含ours版本的代码片段、base版本的代码片段和theirs版本的代码片段,下文会介绍从冲突文件解析冲突块的过程。

7)单方变更块:代码合并时一处单方变更对应一个单方变更块,每个单方变更块均包含ours版本的代码片段、base版本的代码片段和theirs版本的代码片段,下文会介绍从冲突文件提取单方变更块的过程。

现有技术中,在代码合并时,多采用语义合并semanticmerge工具自动消解冲突块,对于不能自动消解的冲突块会展示冲突块内部洞察信息,比如:ours版本相对于base版本的变更信息以及theirs版本相对于base版本的变更信息等,用户在做消解时可以通过这些洞察信息直观地了解到当前冲突块包含的三个版本的代码片段之间的不同。然而,用户在做消解时,常常需要在其他代码块查找当前冲突块中变量和/或函数的定义以及使用情况,或者参考与当前冲突块相似的并且已经消解的代码块的消解方案,上述仅提供当前冲突块内部洞察信息,不能满足用户快速定位关联冲突块的需求。

图1为本申请提供的系统框架图,如图1所示,本申请提供的系统包括:终端设备和服务器。图2为本申请提供的终端设备的结构示意图,如图2所示,终端设备包括:依赖关系分析模块和相似关系分析模块,依赖关系分析模块用于从冲突文件中确定与待处理代码块有依赖关系的关联代码块,以及与待处理代码块有被依赖关系的关联代码块。相似关系分析模块用于从冲突文件中确定与待处理代码块有相似关系的关联代码块。服务器用于存储上述依赖关系分析模块和相似关系分析模块从冲突文件中分析得到的关联代码块列表。

可选的,终端设备可以是台式电脑、手机,平板电脑,笔记本电脑,智能手表,电视机或者其他具有显示屏的电子设备;服务器可以是实体服务器或者云服务器等具有相应处理能力的设备。

由于现有技术仅提供当前冲突块内部洞察信息,导致用户做消解时无法快速定位到当前冲突块的关联冲突块,本申请以此为切入点,通过依赖关系分析模块和相似关系分析模块获取当前冲突块的关联代码块列表,使得当前冲突块被激活后,终端设备可以将这些关联代码块的索引呈现在用户界面,用户需要查看某关联代码块包含的代码片段时,点击该关联代码块的索引,用户界面便可跳转到该关联代码块包含的代码片段,使得用户可以快速查找到当前冲突块中变量和/或函数的定义以及使用情况,另外还可参考与当前冲突块相似的并且已经消解的代码块的消解方案,极大提高了用户消解冲突块的效率。

下面结合具体的实施例对本申请提供的关联冲突块呈现方法进行详细说明。

基于图1所示系统,图3为本申请提供的关联冲突块呈现方法的实施例的流程示意图,本实施例可由图1中终端设备来执行,如图3所示,本实施例提供的关联冲突块呈现方法,包括:

s301、接收用户界面触发的用于激活待处理代码块的第一指令。

s302、在所述用户界面呈现所述待处理代码块包含的代码片段以及所述待处理代码块的n个关联代码块的索引。

需要说明的是:上述待处理代码块的类型可以为未消解的冲突块,也可为单方变更块,也就是说,本申请的方法不仅可以呈现冲突块的关联代码块的索引,还可呈现单方变更块的关联代码块的索引。

需要说明的是:待处理代码块的n个关联代码块中每个关联代码块的类型为未消解冲突块、单方变更块和已消解冲突块中的一种,也就是说,本申请不仅呈现与待处理代码块有关联关系的未消解冲突块,还呈现了与待处理代码块有关联关系的已消解冲突块,可以使用户做冲突块消解时可以参考已消解的冲突块的消解方案,提升了用户消解冲突块的效率。另外,本申请还呈现与待处理代码块有关联关系的单方变更块,避免待处理代码块中的变量和/或函数在单方变更块中定义或使用时,用户无法定位该关联代码块的问题。

需要说明的是:待处理代码块的n个关联代码块中每个关联代码块与待处理代码块的关联关系为依赖关系、被依赖关系和相似关系中的一种,用户可以通过与待处理代码块有依赖关系的代码块查看待处理代码块中定义的变量和/或函数的使用情况,通过与待处理代码块有被依赖关系的代码块查看待处理代码块中使用的变量和/或函数的定义情况,通过与待处理代码块有相似关系的代码块查看已消解冲突块的消解方案,并对其他相似的未消解冲突块进行批量消解,从而提升用户消解冲突块的效率。

为了使用户界面呈现的n个关联代码块与待处理代码块的关系更加明了,可在用户界面设置依赖组、被依赖组合相似组。并根据每个关联代码块与待处理代码块的关联关系,将每个关联代码块的索引呈现在上述依赖组,或者被依赖组,或者相似组中。具体的,可将n个关联代码块中与待处理代码块有依赖关系的代码块呈现在依赖组中;将n个关联代码块中与待处理代码块有被依赖关系的代码块呈现在被依赖组中;将n个关联代码块中与待处理代码块有相似关系的代码块呈现在相似组中。

下面对第一指令的可实现方式进行说明:

一种可实现的方式中,用户可以通过点击图4所示用户界面上冲突块旁边的上下箭头来触发激活待处理代码块的第一指令,这种情况下,第一指令为该点击动作触发的指令。以待处理代码块为冲突文件2中未消解的第4个冲突块为例,用户点击图4所示用户界面上冲突块旁边的向下箭头后,用户界面跳转到图5,如图5所示,用户界面上呈现了第4个冲突块ours版本的代码片段、base版本的代码片段以及theirs版本的代码片段;同时还会呈现与第4个冲突块有依赖关系的代码块的索引,与第4代码块有被依赖关系的代码块的索引以及与第4个冲突块相似的代码块的索引。具体的,参见图5,与第4个冲突块有依赖关系的代码块为第313个冲突文件中的第10个冲突块(conflictblock10offile313),与第4个冲突块有被依赖关系的代码块为第2个冲突文件中的第13个单方变更块(single-sidechange13offile2),与第4个冲突块有相似关系的代码块为第313个冲突文件中的第20个冲突块(conflictblock20offile313)。

另一种可实现方式中,用户可以通过点击图4所示用户界面上冲突块旁边的上下箭头先触发显示待处理代码块的三个版本的代码片段,这时用户界面跳转到图6,然后通过点击图6所示用户界面左侧关联代码块的下拉按钮触发显示待处理代码块的关联代码块,比如点击被依赖组对应的下拉按钮触发显示与待处理代码块有被依赖关系的代码块的索引,这时用户界面跳转到图7,这种情况下,s301中的第一指令包括图4中用户点击冲突块旁边的上下箭头触发的指令,以及图6中用户点击被依赖组的下拉按钮触发的指令。

需要说明的是:上述第二种实现方式下第一指令具体包括几个指令取决于用于点击了几个组的下拉按钮,如果用户对依赖组、被依赖组和相似组的下拉按钮都点击了,那么第一指令就包括了图4中用户点击冲突块旁边的上下箭头触发的指令以及点击三个组的下拉按钮所触发的指令。

以上,介绍了在用户界面呈现待处理代码块的n个关联代码块的索引的过程,下面介绍如何从冲突文件中确定出该n个关联代码块,该过程可由图2中依赖关系分析模块和相似关系分析模块执行。

需要说明的是:由于本申请是要从冲突块和单方变更块中确定出n个关联代码块,因此,需要先从冲突文件中把冲突块解析出来,把单方变更块提取出来。下文先介绍冲突块解析过程以及单方变更块提取过程。

冲突块解析过程:

参见上文描述,冲突文件包括两部分:成功合并部分和若干个冲突部分,一个冲突部分对应一个冲突块,每个冲突部分使用“<<<<<<<”“|||||||”“=======”“>>>>>>>”等标识符划分该冲突部分对应的不同版本的代码片段。针对每个冲突部分,提取“<<<<<<<”和“|||||||”之间的代码片段作为对应冲突块的ours版本的代码片段,提取“|||||||”和“=======”之间的代码片段作为对应冲突块的base版本的代码片段,提取“=======”和“>>>>>>>”之间的代码片段作为对应冲突块的theirs版本的代码片段;然后,将ours版本的代码片段在ours版本的代码文件中做匹配,得到ours版本的代码片段在ours版本的代码文件中的行号范围,将base版本的代码片段在base版本的代码文件中做匹配,得到base版本的代码片段在base版本的代码文件中的行号范围,将theirs版本的代码片段在theirs版本的代码文件中做匹配,得到theirs版本的代码片段在theirs版本的代码文件中的行号范围,把每个版本代码文件中相应行号范围内的代码片段截取出来便构成了一个冲突块。

对所有的冲突文件做上面的相同的操作,便可得到所有冲突文件各自包含的冲突块。

单方变更块提取过程:

先从冲突文件中解析得到ours版本,base版本和theirs版本这个三个版本的代码文件,基于这三个版本的代码文件,一方面,获取ours版本基于base版本的第一变更列表,该第一变更列表记载有ours版本基于base版本的变更对象、变更动作、变更对象在ours版本的代码文件中的行号范围以及变更对象在base版本的代码文件中的行号范围;另一方面,获取theirs版本基于base版本的第二变更列表,该第二变更列表记载有theirs版本基于base版本的变更对象、变更动作、变更对象在theirs版本的代码文件中的行号范围以及变更对象在base版本的代码文件中的行号范围;然后以上述两个变更列表中base版本的行号为基准,若第一变更列表中base版本的某个行号不在第二变更列表中,则确定该行的变更为ours版本基于base版本的单方变更,若第二变更列表中base版本的某个行号不在第一变更列表中,则确定该行的变更为theirs版本基于base版本的单方变更,把每个版本代码文件中单方变更对应的行号范围内的代码片段截取出来便构成了一个单方变更块。

对所有的冲突文件做上面的相同的操作,便可得到所有冲突文件各自包含的单方变更块。

需要说明的是,本申请是要从获取到的所有冲突文件各自包含的冲突块和单方变更块中确定待处理代码块的n个关联冲突块,而所有冲突文件可被划分为两种:第一种为待处理代码块所在的冲突文件,第二种为不包含待处理代码块的冲突文件。为方便描述,下文中将第一种冲突文件称为第一冲突文件,将第二种冲突文件称为第二冲突文件。由于本申请从第一冲突文件中确定待处理代码块的关联代码块的方法和从第二冲突文件中确定待处理代码块的关联代码块的方法相同,因此,下文以第一冲突文件为例,对确定关联冲突块的过程进行说明。

下面介绍从第一冲突文件包含的冲突块和单方变更块中确定与待处理代码块有依赖关系和被的依赖关系的代码块:

对第一冲突文件进行上文的冲突块解析和单方变更提取后,可以得到第一冲突文件包含的多个冲突块和单方变更块,为方面描述,将冲突块和单方变更块统称为代码块,即第一冲突文件包含多个代码块,每个代码块包括该代码块ours版本的代码片段、该代码块base版本的代码片段和该代码块theirs版本的代码片段。

由于冲突块或者单方变更块正是因为对相同的变量和/或函数做了两方或一方变更引起的,因此,代码块的三个版本的代码片段涉及到的函数和/或函数是相同的,可针对每个代码块,存储该代码块中定义的变量和/或函数,以及使用的变量和/或函数,然后根据待处理代码块中的变量和/或函数在第一冲突文件中除待处理代码块的其他代码块中的利用情况,确实出与待处理代码块有依赖关系和被依赖关系的关联代码块。

一种可实现的方式中,可通过如下方式存储代码块中定义的变量以及使用的变量:在每个代码块定义变量声明map,变量使用map,变量依赖list和变量被依赖list。

上述变量声明map,变量使用map,变量依赖list和变量被依赖list的数据结构可以为:

每个变量var的数据结构可定义如下:

其中,integerstartline表示变量起始行,integerendline表示变量终止行,stringvarrawdata表示定义或使用该变量的原始代码,integerblockindex表示冲突块索引,stringfilename表示冲突文件名称。

一种可实现的方式中,可判断待处理代码块中定义的变量是否在第一冲突文件中除待处理代码块的其他代码块中使用,若判断结果为待处理代码块中定义的变量在m个代码块中使用,则确定该m个代码块均为与待处理代码块有依赖关系的关联代码块,可将该m个代码块的索引放入待处理代码块的变量依赖list。

另外,可判断待处理代码块中使用的变量是否在第一冲突文件中除待处理代码块的其他代码块中定义,若判断结果为待处理代码块中使用的变量在k个代码块中定义,则确定该k个代码块均为与待处理代码块有被依赖关系的关联代码块,可将该k个代码块的索引放入待处理代码块的变量被依赖list。

需要说明的是:上文基于变量确定与待处理代码块有依赖关系的关联代码块以及被依赖关系的关联代码块的方法适用于函数,本申请不再针对函数赘述。

下面介绍从第一冲突文件包含的冲突块和单方变更块中确定与待处理代码块有相似关系的代码块:

同依赖关系与被依赖关系,对第一冲突文件进行上文的冲突块解析和单方变更提取后,可以得到第一冲突文件包含的多个冲突块和单方变更块,为方面描述,将冲突块和单方变更块统称为代码块,即第一冲突文件包含多个代码块,每个代码块包括该代码块ours版本的代码片段、该代码块base版本的代码片段和该代码块theirs版本的代码片段。

一种可实现方式中,可根据待处理代码块包含的ours版本、base版本和theirs版本的代码片段各自对应的token串和抽象语法子树来确定与待处理代码块有相似关系的关联代码块。

在上述可实现方式中,确定相似关系的关联代码块的过程可分为以下几步:

第一步、针对第一冲突文件包含的多个代码块中的除待处理代码块的每个代码块,计算待处理代码块的ours版本的代码片段和该代码块的ours版本的代码片段之间token相似度(记为“ours版本token相似度”),计算待处理代码块的base版本的代码片段和该代码块的base版本的代码片段之间token相似度(记为“base版本token相似度”),计算待处理代码块的theirs版本的代码片段和该代码块的theirs版本的代码片段之间token相似度(记为“theirs版本token相似度”)。

要计算两个代码块之间各个版本的代码片段的token相似度,需先提取两个代码块的各个版本的代码片段对应的token串,比如:要计算待处理代码块的ours版本的代码片段和某代码块的ours版本的代码片段之间token相似度,需先提取待处理代码块的ours版本的代码片段对应的token串以及该代码块的ours版本的代码片段对应的token串,然后采用余弦夹角的相似度计算方法确定两者的token相似度。

下面以待处理代码块的ours版本的代码片段为例,对提取token串的过程进行说明:使用转换工具,比如googlejavaformat,将ours版本的代码片段按行进行token转换,并去除括号、分号、逗号、冒号、算术运算符、逻辑运算符以及位运算符等对代码内容影响较小的token,从而得到ours版本的代码片段对应的token串。

第二步、针对第一冲突文件包含的多个代码块中的除待处理代码块的每个代码块,计算待处理代码块的ours版本的代码片段和该代码块的ours版本的代码片段之间结构相似度(记为“ours版本结构相似度”),计算待处理代码块的base版本的代码片段和该代码块的base版本的代码片段之间结构相似度(记为“base版本结构相似度”),计算待处理代码块的theirs版本的代码片段和该代码块的theirs版本的代码片段之间结构相似度(记为“theirs版本结构相似度”)。

要计算两个代码块之间各个版本的代码片段的结构相似度,需先确定两个代码块的各个版本的代码片段对应的抽象语法子树,比如:要计算待处理代码块的ours版本的代码片段和某代码块的ours版本的代码片段之间结构相似度,需先确定待处理代码块的ours版本的代码片段对应的抽象语法子树以及该代码块的ours版本的代码片段对应的抽象语法子树,然后根据这两个抽象语法子树,确定两者的结构相似度。

下面以待处理代码块的ours版本的代码片段为例,对确定抽象语法子树的过程进行说明:解析待处理代码块的ours版本的代码片段所在的ours版本代码文件,得到ours版本代码文件对应的抽象语法树,搜索该抽象语法树,将该抽象语法树上行号范围落在ours版本的代码片段对应的行号范围内的子树确定为ours版本的代码片段对应的抽象语法子树。

需要说明的是:得到两个抽象语法子树后,分别遍历两个子树,并计算对应节点的相似度,将相似度值大于预设阈值的两个节点匹配成一对,然后采用杰卡德相似系数计算两个子树匹配对应的节点数量和两个子树节点总数量的比值,用其作为两个子树的结构相似度。

第三步、根据第一步和第二步得到的待处理代码块的ours版本的代码片段和各代码块ours版本的代码片段之间的token相似度和结构相似度,待处理代码块的base版本的代码片段和各代码块base版本的代码片段之间的token相似度和结构相似度,待处理代码块的theirs版本的代码片段和各代码块theirs版本的代码片段之间的token相似度和结构相似度,确定与待处理代码与相似关系的关联代码块。

一种可实现方式中,本步骤又可包括如下几个步骤:

步骤a、可先对待处理代码块的ours版本的代码片段和每个代码块ours版本的代码片段之间的token相似度和结构相似度取加权平均,得到待处理代码块的ours版本的代码片段和每个代码块ours版本的代码片段之间第一相似度值;对待处理代码块的base版本的代码片段和每个代码块base版本的代码片段之间的token相似度和结构相似度取加权平均,得到待处理代码块的base版本的代码片段和每个代码块base版本的代码片段之间第一相似度值;对待处理代码块的theirs版本的代码片段和每个代码块theirs版本的代码片段之间的token相似度和结构相似度取加权平均,得到待处理代码块的theirs版本的代码片段和每个代码块theirs版本的代码片段之间第一相似度值。

步骤b、对待处理代码块和每个代码块之间上述三个第一相似度值取加权平均,得到待处理代码块和每个代码块之间第二相似度值;

步骤c、将第一冲突文件中除待处理代码的其他代码块中第二相似度值大于预设阈值的代码块确定为与待处理代码有相似关系的关联代码块。

需要说明的是:用于做上述关联分析的第一冲突文件中的代码块是通过上文描述的冲突块解析过程和单方变更提取过程得到的,这些代码块中有些可能已经被用户消解,有些可能未消解,无论代码块处于那种状态,均属于上述关联分析的范围。

s304、接收所述用户界面触发的用于激活任一关联代码块的第二指令。

s305、将所述用户界面呈现的所述待处理代码块包含的代码片段跳转为所述关联代码块包含的代码片段。

参见图8所示,用户可以通过点击任一关联代码块的索引来触发激活该关联代码块的第二指令,比如用户可以点击依赖组中第313个冲突文件中第10个冲突块(conflictblock10offile313),便可触发激活该冲突块的第二指令。终端设备接收到该第二指令后,可将用户界面跳转到该关联代码块的包含的代码片段,比如:用户点击依赖组中第313个冲突文件中第10个冲突块(conflictblock10offile313),用户界面跳转到图9,用户可以在图9中查看第2个冲突文件中第4个冲突块(待处理代码块)定义的变量和/或函数在第313个冲突文件中第10个冲突块中的使用情况,加快了用户理解分析冲突块的速度,提升了消解效率。

一种可实现的方式中,用户可以点击图9中返回按钮返回待处理代码块(第2个冲突文件中第4个冲突块)包含的代码片段,该按钮可以使用户在待处理代码块和关联代码块之间来回切换,提高了用户体验。

本实施例提供的关联冲突块呈现方法,通过依赖关系分析模块和相似关系分析模块获取当前冲突块的关联代码块列表,使得当前冲突块被激活后,终端设备可以将这些关联代码块的索引呈现在用户界面,用户需要查看某关联代码块包含的代码片段时,点击该关联代码块的索引,用户界面便可跳转到该关联代码块包含的代码片段,使得用户可以快速查找到当前冲突块中变量和/或函数的定义以及使用情况,另外还可参考与当前冲突块相似的并且已经消解的代码块的消解方案,极大提高了用户消解冲突块的效率。

图10为本申请提供的终端设备100的结构示意图。如图10所示,本实施例提供的终端设备100,包括:

获取模块1001,用于获取第一冲突文件,所述第一冲突文件中包括多个代码块,每个代码块包括所述代码块当前版本的代码片段、所述代码块基础版本的代码片段和所述代码块待合并版本的代码片段;

接收模块1002,用于接收用户界面触发的用于激活待处理代码块的第一指令,所述待处理代码块的类型为未消解冲突块或者单方变更块;

呈现模块1003,用于在所述用户界面呈现所述待处理代码块包含的代码片段以及所述待处理代码块的n个关联代码块的索引;

其中,每个关联代码块的类型为未消解冲突块、单方变更块和已消解冲突块中的一种,每个关联代码块与所述待处理代码块的关联关系为依赖关系、被依赖关系和相似关系中的一种,n大于等于1。

可选的,所述接收模块1002,还用于接收所述用户界面触发的用于激活任一关联代码块的第二指令;

所述呈现模块1003还用于,将所述用户界面呈现的所述待处理代码块包含的代码片段跳转为所述关联代码块包含的代码片段。

可选的,所述用户界面设有依赖组、被依赖组和相似组;所述呈现模块1003具体用于:

根据每个关联代码块与所述待处理代码块的关联关系,将每个关联代码块的索引呈现在所述依赖组、所述被依赖组或所述相似组中。

可选的,本实施例的终端设备还包括:图2所示,依赖关系分析模块1004和相似关系分析模块1005,所述依赖关系分析模块1004和所述相似关系分析模块1005用于从所述第一冲突文件中确定所述待处理代码块的至少一个关联代码块。

可选的,所述获取模块1001还用于:获取第二冲突文件;

所述依赖关系分析模块1004和所述相似关系分析模块1005还用于从所述第二冲突文件中确定与所述待处理代码块的至少一个关联代码块。

可选的,所述依赖关系分析模块1004和相似关系分析模块1005具体用于:

根据所述待处理代码块中的变量和/或函数在所述第一冲突文件的其他代码块中的利用情况,从所述第一冲突文件中确定与所述待处理代码块有依赖关系和被依赖关系的关联代码块;和/或

根据所述待处理代码块包含的代码片段各自对应的token串和抽象语法子树,从所述第一冲突文件中确定与所述待处理代码块有相似关系的关联代码块。

本申请提供的上述终端设备,可以执行上述方法实施例中的步骤,其实现原理以及有益效果类似,此处不再进行赘述。

图11为本申请提供的终端设备110的硬件结构示意图。如图11所示,该终端设备110包括:存储器1101和至少一个处理器1102,存储器1101用于存储程序指令,至少一个处理器1102用于调用存储器1101中的程序指令执行上述方法实施例中的步骤,其实现原理以及有益效果类似,此处不再进行赘述。

本申请还提供一种可读存储介质,可读存储介质中存储有执行指令,终端设备110的至少一个处理器1102执行该执行指令时实现上述方法实施例中的步骤,其实现原理以及有益效果类似,此处不再进行赘述。

本申请还提供一种程序产品,该程序产品包括计算机程序(即执行指令),该计算机程序存储在可读存储介质中。终端设备110的至少一个处理器1102可以从可读存储介质读取该计算机程序,至少一个处理器1102执行该计算机程序使得终端设备110实施前述各种实施方式提供的关联冲突块呈现方法。

在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。例如,以上所描述的设备实施例仅仅是示意性的,例如,模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。

作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请实施例方案的目的。

另外,在本申请各个实施例中的各功能模块可以集成在一个处理单元中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个单元中。上述模块成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

上述以软件功能模块的形式实现的集成的模块,可以存储在一个计算机可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(英文:processor)执行本申请各个实施例方法的部分步骤。

应理解,上述处理器可以是中央处理单元(centralprocessingunit,cpu),还可以是其他通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合发明所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。

存储器可能包含高速ram存储器,也可能还包括非易失性存储nvm,例如至少一个磁盘存储器,还可以为u盘、移动硬盘、只读存储器、磁盘或光盘等。

总线可以是工业标准体系结构(industrystandardarchitecture,isa)总线、外部设备互连(peripheralcomponent,pci)总线或扩展工业标准体系结构(extendedindustrystandardarchitecture,eisa)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,本申请附图中的总线并不限定仅有一根总线或一种类型的总线。

在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行计算机程序指令时,全部或部分地产生按照本申请实施例的流程或功能。计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如固态硬盘solidstatedisk,ssd)等。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1