一种代码处理方法、装置、设备及介质

文档序号:26584769发布日期:2021-09-10 18:46阅读:41来源:国知局
一种代码处理方法、装置、设备及介质

1.本技术涉及计算机技术领域,尤其涉及一种代码处理方法、装置、设备以及计算机可读存储介质。


背景技术:

2.在进行软件开发时,开发者经常面临多个任务的开发。例如,开发者在开发新特性时,还可以检查已有代码的代码缺陷(bug),并修复该代码缺陷。在完成多个任务之后,开发者常常倾向于通过一次代码提交操作提交所有变更代码,如此产生了复合提交(composite commits)。
3.复合提交的提交消息包含了代码变更的多个任务,其他用户很难理解代码变更意图,这给代码开发阶段的代码审查以及代码维护阶段的代码恢复(revert)、择优挑选(cherry pick)回归测试(regression testing)等带来了不便,极大地影响了软件开发效率。基于此,业界亟需提供一种代码处理方法,以解决代码复合提交影响后续的代码审查、回归测试,进而影响软件开发效率的问题。


技术实现要素:

4.本技术提供了一种代码处理方法,其以代码变更块为粒度进行分析,获得代码变更块之间的关联关系,基于该关联关系实现智能代码分组,从而解决代码复合提交影响后续的代码审查、回归测试,进而影响软件开发效率的问题。
5.第一方面,本技术提供了一种代码处理方法。该方法可以由代码处理装置执行,代码处理装置可以部署于计算机中。计算机具体可以是台式机、笔记本电脑、平板电脑等终端设备,在有些情况下,计算机也可以包括服务器。
6.具体地,代码处理装置可以获取当前版本(current version)的代码文件相对于基础版本(base version)的代码文件的代码变更文件。其中,基础版本具体是指持续开发过程中再次开发之前的版本,当前版本具体是指持续开发过程中再次开发之后的版本。考虑到一次开发过程中可以包括多种代码变更操作,所述代码变更文件可以包括多个代码变更块。
7.代码处理装置可以从至少一个维度对所述多个代码变更块进行分析,从而获得所述多个代码变更块之间的至少一种关联关系,然后利用所述至少一种关联关系对所述多个代码变更块进行分组得到n(n为正整数)个代码变更组,以便根据所述n个代码变更组分别执行代码提交操作。
8.上述方法利用代码变更块之间的关联关系实现对代码变更块智能化以及自动化分组,避免了人工分组时的漏报或误报发生,提高了分组准确度。根据上述分组结果分别执行代码提交操作,每个代码变更组对应的提交消息包含的代码变更的任务大幅减少,如此,降低了其他用户理解代码变更意图的难度,有利于代码开发阶段的代码审查以及代码维护阶段的代码恢复、择优挑选、回归测试,提高了软件开发效率。
9.在一些可能的实现方式中,考虑到代码提交之前往往还需要进行编译,代码处理装置还可以通过对分组所得的代码变更组进行编译,以检验分组准确性,并在分组不准确时基于编译提示信息对分组结果进行调整,优化分组结果,进一步提高分组准确度。
10.具体实现时,针对n个代码变更组中的任意一个代码变更组(本技术称之为第一代码变更组),代码处理装置可以根据该第一代码变更组的代码变更块包括的当前版本的代码片段进行代码编译,得到编译提示信息,然后根据所述编译提示信息调整所述第一代码变更组。
11.当然,代码处理装置也可以对多个代码变更组,例如n个代码变更组中的每一个代码变更组,分别进行代码编译,得到各代码变更组对应的编译提示信息,并基于该提示信息调整上述代码变更组。例如,某一代码变更组的编译提示信息提示该代码变更组缺少某一函数定义时,另一代码变更组的编译提示信息提示该代码变更组定义了上述函数但并未使用函数,则代码处理装置可以从上述另一代码变更组中将包括上述函数定义的代码变更块移动至上述代码变更组。
12.针对调整后的代码变更组,代码处理装置还可以重新执行根据代码变更组的代码变更组包括的代码变更块包括的当前版本的代码片段进行代码编译的步骤。若编译提示信息提示编译通过或者编译成功,则可以结束根据编译提示信息调整分组结果的流程,若编译提示信息提示编译不通过,即存在编译告警或编译错误,则可以根据告警类型(如缺少括弧、static修饰的xxx函数没有被使用到)或错误类型(未定义函数或未定义变量)调整代码变更组。
13.也即代码处理装置可以循环执行“根据第一代码变更组的代码变更块包括的当前版本的代码片段进行代码编译,获得编译提示信息”以及“根据编译提示信息调整第一代码变更组”的步骤,直至第一代码变更组的代码变更块包括的当前版本的代码片段编译通过。
14.在一些可能的实现方式中,代码处理装置还可以提供分组界面,以便基于该分组界面人工调整分组结果,进一步提高分组准确度,以及提高兼容性。
15.具体地,分组界面可以展示代码处理装置对代码变更块的分组结果。该分组结果可以是代码处理装置基于代码变更块之间的关联关系分组所得分组结果,也可以是结合编译提示信息对上述分组结果进行调整所得的分组结果。当用户认为分组结果不准确时,可以通过分组界面对分组结果进行调整。代码处理装置可以接收用户通过分组界面对第二代码变更组的调整设置。其中,第二代码变更组可以是n个代码变更组中的任意一个。该第二代码变更组与第一代码变更组可以是同一代码变更组,也可以是不同的代码变更组。代码处理装置可以根据所述调整设置调整所述第二代码变更组的代码变更块。
16.在一些可能的实现方式中,代码处理装置可以基于用户对第二代码变更组中某一代码变更块或某些代码变更块的调整设置,通过自学习的方式自适应调整其他代码变更块,如此可以提高调整效率,以及提高用户操作便利性。
17.具体地,用户通过分组界面对第二代码变更组的调整设置可以是对第二代码变更组中目标代码变更块的调整设置,该目标代码变更块可以是第二代码变更组中的任意一个或多个代码变更块。代码处理装置可以根据上述调整设置先调整目标代码变更块,然后从第二代码变更组中确定目标代码变更块的关联代码变更块,根据上述调整设置调整所述关联代码变更块。
18.在一些可能的实现方式中,代码处理装置可以获取至少一个代码变更组对应的提交模板,然后根据所述至少一个代码变更组及其对应的提交模版生成提交消息,以便根据所述提交消息执行所述代码提交操作。基于此,一方面可以避免一个提交消息混杂多个变更任务,导致的变更意图难以理解,影响软件开发的后续流程,进而影响软件开发效率的问题。另一方面,可以改善使用长短期记忆网络(long short-term memory,lstm)生成提交消息导致的准确度不高、泛化能力不强的问题。
19.在一些可能的实现方式中,代码变更块之间的至少一种关联关系具体可以包括元素定义与使用关系、元素间接使用关系或者相似变更关系中的任意一种或多种。其中,代码变更块包括代码片段,而代码片段包括携带元素的语句。所谓元素即是代码片段中语句的组成部分,具体可以包括变量和/或函数等等。因此,元素定义与使用关系具体可以包括变量定义与使用关系和/或函数定义与使用关系。元素间接使用关系具体可以包括使用相同元素的代码变更块之间的关系。相似变更关系则是指具有相似变更行为的代码变更块之间的关系。
20.针对元素定义与使用关系、元素间接使用关系,代码处理装置可以通过如下方式获得。具体地,代码处理装置可以获取多个代码变更块中各代码变更块的代码变更动作集合,然后解析所述代码变更动作集合,获得所述各代码变更块对应的所述当前版本和所述基础版本的元素定义集和元素使用集,接着代码处理装置根据所述各代码变更块对应的所述当前版本和所述基础版本的元素定义集和元素使用集,获取所述多个代码变更块之间的元素定义与使用关系和元素间接使用关系中的至少一种。
21.需要说明的是,代码处理装置可以从多个维度对代码变更块进行分析,获得代码变更块之间的多种关联关系,例如元素定义与使用关系、间接使用关系和相似使用关系等等。如此可以为代码分组提供更为丰富且全面的信息,从而提高分组的准确度。
22.第二方面,本技术提供了一种代码处理装置。该装置具体包括:通信模块、分析模块和分组模块。其中,通信模块用于获取当前版本的代码文件相对于基础版本的代码文件的代码变更文件,所述代码变更文件包括多个代码变更块。分析模块,用于对所述多个代码变更块进行分析,获得所述多个代码变更块之间的至少一种关联关系。分组模块,用于利用所述至少一种关联关系对所述多个代码变更块进行分组得到n个代码变更组,以便根据所述n个代码变更组分别执行代码提交操作,所述n为正整数。
23.在一些可能的实现方式中,所述装置还包括:
24.调整模块,用于根据第一代码变更组的代码变更块包括的当前版本的代码片段进行代码编译,得到编译提示信息,根据所述编译提示信息调整所述第一代码变更组。
25.在一些可能的实现方式中,所述通信模块还用于:
26.接收用户通过分组界面对第二代码变更组的调整设置;
27.所述装置还包括:
28.调整模块,用于根据所述调整设置调整所述第二代码变更组的代码变更块。
29.在一些可能的实现方式中,所述对第二代码变更组的调整设置包括对第二代码变更组中目标代码变更块的调整设置;
30.所述调整模块具体用于:
31.根据所述调整设置调整所述目标代码变更块;
32.从所述第二代码变更组中确定所述目标代码变更块的关联代码变更块;
33.根据所述调整设置调整所述关联代码变更块。
34.在一些可能的实现方式中,所述通信模块还用于:
35.获取至少一个代码变更组对应的提交模板;
36.所述装置还包括:
37.提交模块,用于根据所述至少一个代码变更组及其对应的提交模版生成提交消息,以便根据所述提交消息执行所述代码提交操作。
38.在一些可能的实现方式中,所述分析模块具体用于:
39.获取所述多个代码变更块中各代码变更块的代码变更动作集合;
40.解析所述代码变更动作集合,获得所述各代码变更块对应的所述当前版本和所述基础版本的元素定义集和元素使用集;
41.根据所述各代码变更块对应的所述当前版本和所述基础版本的元素定义集和元素使用集,获取所述多个代码变更块之间的元素定义与使用关系和元素间接使用关系中的至少一种。
42.第三方面,本技术提供一种计算机,所述计算机包括处理器和存储器。所述处理器、所述存储器进行相互的通信。所述处理器用于执行所述存储器中存储的指令,以使得所述计算机执行如第一方面或第一方面的任一种实现方式中的代码处理方法。
43.第四方面,本技术提供一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述第一方面或第一方面的任一种实现方式所述的代码处理方法。
44.第五方面,本技术提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第一方面或第一方面的任一种实现方式所述的代码处理方法。
45.本技术在上述各方面提供的实现方式的基础上,还可以进行进一步组合以提供更多实现方式。
附图说明
46.为了更清楚地说明本技术实施例的技术方法,下面将对实施例中所需使用的附图作以简单地介绍。
47.图1为本技术实施例提供的一种代码变更文件及代码变更块的示意图;
48.图2为本技术实施例提供的一种代码处理方法的系统架构示意图;
49.图3为本技术实施例提供的一种代码处理方法的交互流程图;
50.图4为本技术实施例提供的一种分组界面的示意图;
51.图5为本技术实施例提供的一种计算机的结构示意图。
具体实施方式
52.下面将结合本技术中的附图,对本技术提供的实施例中的方案进行描述。
53.本技术的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的术语在适当情况下可以互换,这仅仅是描述本技术的实施例中对相同属性的对象在描述时所采用的区分
方式。
54.为了便于理解本技术的技术方案,下面对本技术涉及的一些技术术语进行介绍。
55.代码文件是指按照一定的程序设计语言规范编写的文本文件。在本技术中,代码文件一般是指源代码文件。代码文件包括一系列人类可读的计算机语言指令,其可以通过编译器编译为计算机可以执行的二进制指令。当二进制指令被执行时,可以实现与该二进制指令相应的功能。
56.软件开发过程往往是可持续的,开发者可以在某一版本的代码文件基础上进行再次开发,得到新版本的代码文件。例如,开发者可以修改一个版本的代码文件中的代码缺陷(bug),或者增加新功能(new function)或新特性(new feature)等等,从而得到一个新版本的代码文件。为了方便描述,再次开发之前的版本可以称之为基础版本(base version),再次开发所得的新版本可以称之为当前版本(current version)。
57.当前版本的代码文件相对于基础版本的代码文件的差异部分可以形成代码变更文件。如图1所示,代码变更文件包括多个代码变更块,每个代码变更块包括变更前的代码片段和变更后的代码片段,即上述差异部分对应的基础版本的代码片段和当前版本的代码片段。
58.为了便于理解,本技术还提供了代码变更块的一个实例。如图1所示,该代码变更块中修改前和修改后的代码片段均为循环语句。针对修改前的代码片段,其采用while进行循环,容易产生死循环,从而产生了代码缺陷。针对修改后的代码片段,其采用for进行循环。由于int为32位整型,变量sum在增加到最大值时将会溢出,此时变量sum变为负值,从而结束循环,修复了上述代码缺陷。
59.开发者在进行软件开发时,可以针对多个任务进行开发,从而产生多个代码变更块。开发者可以通过一次代码提交操作提交上述多个代码变更块时,如此产生了复合提交(composite commits)。由于复合提交的提交消息包含代码变更的多个任务,增加了其他用户理解代码变更意图的难度,给代码开发阶段的代码审查以及代码维护阶段的代码恢复(revert)、择优挑选(cherry pick)、回归测试(regression testing)等带来了不便,影响了软件开发效率。
60.基于此,本技术提供了一种代码处理方法。该方法从代码变更块层面对代码变更文件中的多个代码变更块进行分析,获得多个代码变更块之间的至少一种关联关系,然后利用至少一种关联关系对多个代码变更块进行分组,从而得到n个代码变更组。由于以代码变更块为粒度考虑了代码变更块之间的关联关系,减少了对代码变更块分组时的漏报或误报,提高了分组准确度。根据上述n个代码变更组分别执行代码提交操作,每个代码变更组对应的提交消息包含的代码变更的任务大幅减少,如此,降低了其他用户理解代码变更意图的难度,有利于代码开发阶段的代码审查以及代码维护阶段的代码恢复、择优挑选、回归测试,提高了软件开发效率。
61.进一步地,该方法还支持对n个代码变更组中至少一个代码变更组的代码变更块包括的当前版本的代码片段进行代码编译,并基于编译结果调整代码变更组,使得调整后的代码变更组中代码变更块包括的当前版本的代码片段编译通过。由于考虑了分组之后代码编译的正确性,因而进一步提高了分组准确度,提高了软件开发效率。此外,该方法还支持用户对代码变更组进行人工调整,并可以基于用户对代码变更组的调整设置进行自适应
调整,以优化分组结果,使得每个代码变更组对应的提交消息易于理解,为后续的代码开发以及代码维护提供便利。
62.可以理解,本技术提供的代码处理方法可以应用于包括但不限于如图2所示的应用环境中。
63.如图2所示,代码处理装置200包括通信模块202、分析模块204和分组模块206。其中,通信模块202用于获取当前版本的代码文件相对于基础版本的代码文件的代码变更文件,该代码变更文件包括多个代码变更块,分析模块204可以对多个代码变更块进行分析,获得多个代码变更块之间的至少一种关联关系,分组模块206利用至少一种关联关系对多个代码变更块进行分组得到n个代码变更组。其中,n为正整数。
64.进一步地,代码处理装置200还可以包括调整模块208。其中,调整模块208中可以包括编译器。调整模块208可以根据第一代码变更组(n个代码变更组中的任意一个)的代码变更块包括的当前版本的代码片段,利用编译器进行代码编译,得到编译提示信息。然后,调整模块208可以解析编译提示信息,并根据解析结果调整第一代码变更组。例如,编译提示信息提示第一代码变更组中缺少函数定义时,可以其他代码变更组中包括函数定义的代码变更块移动至该第一代码变更组。
65.调整模块208还可以提供分组界面,用户可以通过该分组界面对代码变更组进行调整。具体地,通信模块202还用于接收用户通过分组界面对第二代码变更组(n个代码变更组中的任意一个,其与第一代码变更组可以是同一个代码变更组,也可以是不同的代码变更组)的调整设置,调整模块208响应于该调整设置调整第二代码变更组的代码变更块。在实际应用时,调整模块208可以基于用户通过分组界面对第二代码变更组中目标代码变更块的调整设置,调整目标代码变更块,并从第二代码变变更组中确定目标代码变更块的关联代码变更块,根据上述调整设置调整关联代码变更块。如此,通过至少一轮用户交互以及自适应调整实现分组结果的优化,提高分组准确度。
66.在一些实现方式中,代码处理装置200还包括提交模块210。提交模块210用于根据至少一个代码变更组以及该代码变更组对应的提交模板生成提交消息,基于该提交消息执行代码提交操作。例如,代码处理装置200可以向分类装置100发送代码分组结果,具体为n个代码变更组。分类装置100的通信模块102接收上述n个代码变更组,然后分类装置100的预处理模块104根据n个代码变更组分别生成对应的特征向量,分类装置100的分类模块106可以调用提交类型预测器对各代码变更组的提交类型进行预测。其中,提交类型预测器以特征向量为输入,以提交类型为输出。提交类型预测器可以通过利用大量的提交实例生成的训练样本训练得到。
67.分类模块106还可以根据预测的提交类型从模板库108中获取与提交类型相对应的提交模板。相应地,通信模块102还可以向代码处理装置200发送上述至少一个代码变更组各自对应的提交模板,以便代码处理装置200根据至少一个代码变更组及其对应的提交模板生成提交消息,并基于该提交消息实现智能代码提交。
68.其中,代码处理装置200可以部署在本地,例如部署在本地的终端设备中。该终端设备包括但不限于台式机、笔记本电脑等等。在一些可能的实现方式中,代码处理装置200也可以部署在云端,例如部署在云服务器中。用户可以通过浏览器访问云服务器的方式实现本技术提供的代码处理方法。分类装置100可以部署在终端设备或服务器中。需要说明的
是,代码处理装置200和分类装置100可以部署在不同的设备,如此可以减少代码处理装置200对系统资源的需求,提高可用性。当然,代码处理装置200和分类装置100也可以部署在相同的设备,如此,可以提高代码处理效率。
69.为了使得本技术的技术方案更加清楚、易于理解,下面结合实施例对本技术的代码处理方法进行介绍。该实施例以代码处理装置200和分类装置100分别部署于不同的设备进行示例说明。
70.参见图3所示的代码处理方法的流程图,该方法包括:
71.s302:代码处理装置200获取当前版本的代码文件相对于基础版本的代码文件的代码变更文件。
72.具体地,用户在基于代码处理装置200进行软件开发时,可以对基础版本的代码文件进行变更,如修改基础版本的代码文件中的代码缺陷,在基础版本的代码文件基础上新增新功能或新特性对应的代码,或者是在基础版本的代码文件基础上删除已有功能或已有特性对应的代码等,得到当前版本的代码文件。代码处理装置200可以接收每一次变更行为所变更的代码,获得代码变更文件。
73.该代码变更文件包括每一次变更行为对应的代码变更块。考虑到用户在进行软件开发时,通常会产生多次变更行为,具体是针对不同任务产生多次变更行为,代码变更文件可以包括多个代码变更块。其中,每个代码变更块包括当前版本的代码片段和基础版本的代码片段。
74.s304:代码处理装置200对所述多个代码变更块进行分析,获得所述多个代码变更块之间的至少一种关联关系。
75.代码变更块包括代码片段,而代码片段包括携带元素的语句。本实施例中,元素是代码片段中语句的组成部分,其可以是变量和/或函数等。在使用变量和/函数时,需要对变量和/函数进行定义。
76.基于此,代码处理装置200可以从元素定义与使用角度分析,获得多个代码变更块之间的关联关系。具体地,代码处理装置200可以从变量定义与使用角度分析,获得多个代码变更块之间的变量定义与使用关系。当然,代码处理装置200可以从函数定义与使用角度分析,获得多个代码变更块之间的函数定义与使用关系。
77.其中,上述定义与使用关系属于直接使用关系,在一些可能的实现方式中,代码处理装置200还可以对多个代码变更块进行分析,获得间接使用关系。所谓间接使用关系是指使用同一元素如同一变量或同一函数的不同代码变更块之间的关系。例如,代码变更块1和代码变更块2均使用函数a,则称代码变更块1和代码变更块2之间具有间接使用关系。
78.在从元素定义与使用角度分析时,代码处理装置200可以先获取所述多个代码变更块中各代码变更块的代码变更动作集合,具体地,代码处理装置200可以通过语法解析树差分化算法如gumtree算法、变更蒸馏change distiller算法等确定各代码变更块的代码变更动作集合。其中,代码变更动作集合中包括代码变更块包括的所有变更动作的集合。变更动作包括增加(add)、删除(delete)、修改(change)和移动(move)中的任意一种或多种。
79.然后,代码处理装置200解析所述代码变更动作集合,获得所述各代码变更块对应的所述当前版本和所述基础版本的元素定义集和元素使用集。接着,代码处理装置200根据所述各代码变更块对应的所述当前版本和所述基础版本的元素定义集和元素使用集,获取
所述多个代码变更块之间的元素定义与使用关系和元素间接使用关系中的至少一种关联关系。
80.考虑到相似的代码变更行为的变更意图是相似的,在一些可能的实现方式中,代码处理装置200还可以从变更行为的相似性这一维度对代码变更块进行分析,获得代码变更块之间的关联关系。
81.具体地,代码处理装置200可以确定各个代码变更块的变更对象以及变更操作,基于变更对像的相似程度以及变更操作的相似程度确定代码变更行为的相似程度,并将代码变更行为的相似程度大于预设阈值的代码变更块确定为具有相似变更关系的代码变更块。其中,变更对象是指执行变更操作所针对的对象,该变更对象可以是变量、函数等等。变更操作可以包括增加、删除、修改或者移动等等。
82.在实际应用时,代码处理装置200也可以分别计算多个代码变更块中当前版本的代码片段的相似度以及基础版本的代码片段的相似度,并基于当前版本的代码片段的相似度确定一组相似的代码变更块,基于基础版本的代码片段的相似度确定另一组相似的代码变更块。当上述两组相似的代码变更块为相同的代码变更块时,则确定这一组代码变更块为具有相似变更关系的代码变更块。
83.代码处理装置200可以从多维度对代码变更块进行分析,获得多个代码变更块之间的多种关联关系,如获得多个代码块之间的直接使用关系(包括函数定义与使用关系和变量定义与使用关系)、间接使用关系以及相似变更关系,如此可以提高分组准确度。
84.s306:代码处理装置200利用所述关联关系对所述多个代码变更块进行分组得到n个代码变更组。
85.在具体实现时,代码处理装置200可以利用关联关系,将具有元素定义与使用关系的代码变更块划分至同一代码变更组。具体地,代码处理装置200将具有函数定义与使用关系的代码变更块划分至同一代码变更组,将具有变量定义与使用关系的代码变更块划分至同一代码变更组。
86.例如,代码变更块1定义了变量a和函数a,代码变更块2使用了变量a,代码变更块3使用了函数a,代码变更块4使用了函数b,则代码处理装置200可以将代码变更块1、代码变更块2和代码变更块3划分至同一代码变更组,而将代码变更块4划分至不同代码变更组。
87.在一些可能的实现方式中,代码处理装置200也可以利用关联关系,将具有相似变更关系的代码变更块划分至同一代码变更组。例如,代码变更块1修改了函数a的表达式,代码变更块5也修改了函数a的表达式,变更对象均为函数a,变更操作均为修改,代码处理装置200确定代码变更块1和代码变更块5是具有相似变更关系的代码变更块,故将代码变更块1和代码变更块5划分至同一代码变更组。
88.在具体实现时,代码处理装置200可以利用所述关联关系对所述多个代码变更块构建变更块关系图,然后通过聚类算法对变更块关系图中的节点进行聚类处理,从而实现代码变更块分组。其中,代码处理装置200构建变更块关系图具体是以代码变更块为节点,根据代码变更块的关联关系构建变更块关系图的边。进一步地,代码处理装置200可以根据关联程度为每条边赋予相应的权重,使得变更块关系图能够更为精准地表达代码变更块之间的关联关系。在对变更块关系图进行聚类处理时,具体可以通过k均值(k-means)聚类算法、均值偏移(mean shift)聚类算法或者层次聚类算法对变更块关系图中的节点进行聚
类,从而得到n个代码变更组。
89.需要说明的是,在对代码变更块进行分组时,每个代码变更块归属于一个代码变更组。当某一代码变更块与不同代码变更组的代码变更块具有关联关系时,代码处理装置200可以基于不同关联关系的权重确定该代码变更块最终归属的代码变更组。
90.s308:代码处理装置200根据第一代码变更组的代码变更块包括的当前版本的代码片段进行代码编译,得到编译提示信息。
91.考虑到代码编译正确性,代码处理装置200可以先对代码变更组的代码变更块包括的当前版本的代码片段进行编译,例如,对n个代码变更组中的任意一个代码变更组(即第一代码变更组)的代码变更块包括的当前版本的代码片段进行编译,以提前检出存在编译问题的代码变更组,并对存在编译问题的代码变更组进行调整,避免提交的代码变更组包含编译问题,进一步提高分组准确度。
92.为了便于描述,下文以对n个代码变更组的代码变更块包括的当前版本的代码片段分别进行编译进行示例说明。在具体实现时,代码处理装置200可以根据代码片段的编程语言选择相应的编译器对n个代码变更组中代码变更块包括的当前版本的代码片段分别进行代码编译。例如,针对采用java编程语言的代码片段,代码处理装置200可以采用gradle或mvn进行编译。编译器在编译完成后可以输出编译提示信息。
93.编译提示信息具体可以包括编译错误(compiling error)或者编译报警(compiling warning)等多种类型。其中,编译错误指示代码片段存在错误,不能转换为可执行程序。编译报警指示代码片段存在风险点,该风险点可以导致该代码片段转换的可执行程序在执行时出现异常。
94.为了便于理解,本技术还提供了编译错误和编译报警的一些具体示例。在一个示例中,编译错误可以为未定义函数或未定义变量等等,编译告警可以为缺少括弧、static修饰的xxx函数没有被使用到等等。
95.需要说明的是,编译提示信息中还包括发生编译错误或者编译报警的位置。其中,位置具体可以通过在代码文件中的行号进行表征。
96.s310:代码处理装置200根据所述编译提示信息调整所述第一代码变更组。
97.代码处理装置200可以解析编译提示信息,根据解析结果调整第一代码变更组。具体地,代码处理装置200解析编译提示信息,若解析结果指示第一代码变更组中缺少变量定义,则将包含该变量定义的代码变更块添加至该第一代码变更组,若解析结果指示第一代码变更组中缺少函数定义,则将包含该函数定义的代码变更块添加至该第一代码变更组。
98.进一步地,代码处理装置200可以在根据编译提示信息调整第一代码变更组后,重新执行代码编译步骤。如果编译器仍输出编译错误或编译报警,则可以继续调整第一代码变更组,直至调整后的第一代码变更组中代码变更块包括的当前版本的代码片段均编译通过。如果编译器输出编译成功,则可以执行后续步骤。也即,代码处理装置200还可以循环执行上述s308至s310,直至调整后的代码变更组中所述代码变更块包括的当前版本的代码片段均编译通过。
99.s312:代码处理装置200接收用户通过分组界面对第二代码变更组中目标代码变更块的调整设置。
100.在一些可能的实现方式中,代码处理装置200还支持用户对代码进行分组或者对
已有的分组结果进行调整。当用户认为某个或某些代码变更块的分组不准确时,还可以通过分组界面对分组结果进行调整。
101.具体地,代码处理装置200提供有分组界面,该分组界面可以展示代码处理装置200对多个代码变更块进行分组所获得的n个代码变更组。用户可以通过分组界面对n个代码变更组中的任意一个代码变更组(即第二代码变更组)进行调整,具体是针对第二代码变更组中的任意一个或多个代码变更块(即目标代码变更块)进行调整。例如,用户可以通过分组界面将一个代码变更组中某一个代码变更块移动至另一个代码变更组,如此实现对两个代码变更组进行调整。
102.代码处理装置200接收用户通过分组界面对第二代码变更组中目标代码变更块的调整设置,以便实现对第二代码变更组的手动调整。其中,第二代码变更组与第一代码变更组可以是同一个代码变更组,也可以是不同的代码变更组。
103.图4示出了通过分组界面对代码变更组进行调整的示意图,如图4所示,分组界面的窗体中包括n个子窗体,每个子窗体用于展示一个代码变更组中的代码变更块,n个子窗体用于展示代码处理装置200获得的n个代码变更组中的代码变更块。当用户点击任一代码变更块时,这n个子窗体上方的两个窗体分别展示该代码变更块包括的基础版本的代码片段和当前版本的代码片段,即修改前的代码片段和修改后的代码片段。如此,可以方便查看代码变更块中基础版本的代码片段和当前版本的代码片段的差异。
104.在该示例中,n具体为5。其中,第一个代码变更组包括3个代码变更块,第二至第五个代码变更组分别包括6个代码变更块。用户可以通过拖拽等方式移动代码变更组中所包括的代码变更块。
105.在一些可能的实现方式中,如图4所示,分组界面还可以提供导航栏,导航栏展示有代码文件列表,用户可以通过该导航栏迅速切换到指定文件。当然,分组界面还可以提供变更意图展示栏,当用户点击任一代码变更块时,变更意图展示栏可以展示该代码变更块对应的变更意图,方便用户快速查看变更意图,提高调整效率。需要说明的是,变更意图展示栏还可以提供编辑控件,支持用户通过该编辑控件对变更意图进行修改。当用户认为变更意图不正确时,可以通过上述编辑控件进行修改。
106.需要说明的是,分组界面展示的n个代码变更组可以是经过编译后调整所得的n个代码变更组。当然,上述s308至s310未执行时,分组界面展示的n个代码变更组也可以是代码处理装置200根据多个代码变更块之间的至少一种关联关系划分的n个代码变更组。
107.s314:代码处理装置200根据所述调整设置调整所述目标代码变更块。
108.代码处理装置200可以根据接收到的调整设置,调整第二代码变更组的目标代码变更块。例如,代码处理装置200根据调整设置,将目标代码变更块由上述第二代码变更组移动到另一个代码变更组,或者将目标代码变更块从第二代码变更组中删除。
109.s316:代码处理装置200从所述第二代码变更组中确定所述目标代码变更块的关联代码变更块,根据所述调整设置调整所述关联代码变更块。
110.在一些可能的实现方式中,代码处理装置200记录有执行调整操作的代码变更块的变更信息。该变更信息具体可以包括代码变更块所属的源分组和目的分组,即代码变更块在调整前所属的代码变更组和在调整后所属的代码变更组。代码处理装置200分析用户调整上述代码变更块的原因,结合多个代码变更块之间的至少一种关联关系,确定出需要
随之调整的关联代码变更块,基于上述调整设置调整关联代码变更块。
111.需要说明的是,在一些可能的实现方式中,代码处理装置200也可以不执行上述步骤,由用户手动对关联代码变更块进行调整。
112.s318:代码处理装置200向分类装置100发送分类请求消息。
113.分类请求消息包括n个代码变更组中的至少一个代码变更组。该分类请求消息具体用于对n个代码变更组中至少一个代码变更组进行分类获得至少一个代码变更组的提交类型。
114.所谓提交类型具体是指提交消息(commit message)的类型。在实际应用时,提交类型可以包括缺陷修复(bug fix)、重构(refactor)、新特性(feature)和重设格式(reformat)中的至少一种。代码处理装置200通过向分类装置100发送分类请求消息,以获取n个代码变更组中至少一个代码变更组的提交类型,进而生成至少一个代码变更组的提交消息。
115.s320:分类装置100根据至少一个代码变更组生成特征向量。
116.分类装置100根据每个代码变更组中代码变更块包括的代码片段提取该代码变更组对应的特征向量。具体地,分类装置100可以根据代码变更组中代码变更块包括的代码片段提取代码变更动作集合,然后根据代码变更动作集合生成该代码变更组对应的特征向量。
117.在实际应用时,分类装置100可以对代码变更动作集合进行向量化处理,从而生成代码变更组对应的特征向量。代码变更动作集合中的每个代码变更动作可以通过变更操作和变更对象进行标识。其中,变更操作包括add、delete、change或者move,变更对象可以是变量或者函数等等,具体包括变量声明、函数定义。其中,上述变量声明、函数定义分别对应于语法解析树(abstract syntax tree,ast)中的一个ast节点类型。
118.分类装置100可以将四种变更操作中的每种操作对应n个ast节点类型,按照顺序平铺成一个一维向量。若本次提交中add了某个ast节点类型,则将一维向量中的对应元素的元素值加1。对于四种操作中均不出现的ast节点类型,则将一维向量中的对应元素的元素值置0。如此,即可获得代码变更组对应的特征向量。
119.在一些可能的实现方式中,分类装置100在提取特征向量时不仅可以从微观方面考虑细粒度的代码变更动作,还可以从宏观方面考虑代码变更的统计特征,如代码变更组中代码变更块数目,代码变更组中涉及定义与使用关系的代码变更块的数目,代码变更组中涉及相似变更关系的代码变更块的数目等等。具体地,分类装置100可以在上述一维向量的基础上增加若干元素,并为这些元素赋值为上述统计值。如此,可以提取更为全面的特征向量,给分类模型提供更多的信息,提高分类模型分类的准确度。
120.s322:分类装置100根据所述特征向量对所述至少一个代码变更组的提交类型进行预测。
121.在实际应用时,分类装置100可以利用提交类型预测器对至少一个代码变更组的提交类型进行预测。提交类型预测器以特征向量为输入,以代码变更组的提交类型为输出。因此,分类装置100将至少一个代码变更组的特征向量输入提交类型预测器,提交类型预测器可以对至少一个代码变更组的提交类型进行预测,并输出预测结果。
122.其中,提交类型预测器可以基于预先采集的训练样本,采用机器学习方法进行模
型训练生成。一个训练样本包括一个历史提交消息中包括的代码片段提取的特征向量和提交类型标签。从历史提交消息中包括的代码片段提取特征向量的具体实现可以参见s320相关内容描述,在此不再赘述。提交类型标签可以基于提交日志(commit log)确定。
123.具体地,提交日志的关键词包括提交类型。分类装置100通过分析提交日志,自动生成提交类型标签。提交类型标签可以采用不同数字进行标识。例如,bug fix可以采用数字00标识,refactor可以采用数字01标识。分类装置100将上述特征向量和提交类型标签进行拼接即可生成训练样本。
124.由于训练样本的向量维度较大,多个训练样本构成了一个稀疏的矩阵,因此分类装置100可以采用降维算法去除矩阵的稀疏性。最后,分类装置100采用机器学习算法,例如xgboost对去除稀疏性的矩阵进行模型训练得到提交类型预测器。
125.s324:分类装置100从模板库中获取至少一个代码变更组对应的提交模板。
126.分类装置100可以对代码仓库中存储的各种提交类型的历史提交消息进行挖掘,从而获得各种提交类型的提交消息的通用模板,该通用模板可以作为提交类型对应的提交模板。
127.表1示出了提交模板的示例:
128.表1提交模板示例
129.bug fix:fix an xxx issuerefactor:change xxxnew feature:add/wrap xxx for xxxreformat:change xxx(eg.spaces)
130.其中,表1中的xxx是提交模板中的待填充内容,其可以由代码变更组中提取的代码特征确定。
131.分类装置100可以查询模板库,从模板库中获取至少一个代码变更组的提交类型相匹配的提交模板,作为该代码变更组对应的提交模板。
132.s326:分类装置100向代码处理装置200发送分类响应消息。
133.该分类响应消息中包括至少一个代码变更组对应的提交模板。
134.s328:代码处理装置200根据至少一个代码变更组及其对应的提交模板生成提交消息,以便基于该提交消息执行代码提交操作。
135.具体地,代码处理装置200可以针对至少一个代码变更组提取代码特征,基于代码特征确定关键词,将关键词填充至该代码变更组对应的提交模板中,生成提交消息。基于该提交消息可以触发代码提交操作。
136.在一些可能的实现方式中,代码处理装置200还可以展示提交消息,以便用户确认提交消息的正确性。当用户确认提交消息不正确时,代码处理装置200支持用户对提交消息如提交消息中的关键词进行修改,从而实现通过用户交互的方式确保提交消息的正确性。
137.上述s308至s316为本技术实施例为了进一步提高分组准确度而实施的可选步骤,在一些可能的实现方式中,也可以不执行上述步骤。上述s318至s328为本技术实施例为了生成提交消息而实施的可选步骤,在一些可能的实现方式中,也可以采用其他方式实现。
138.基于上述内容描述,本技术实施例提供了一种代码处理方法。该方法以代码变更块作为分组粒度进行分组,而不是从粒度比较粗的文件级别的变化进行分组,也不是从粒
度过细的每个代码特征的变换进行分组,避免了粒度过大导致分组不准确,以及粒度过细导致分组太多的问题。该方法还可以综合考虑代码特征块之间的多种关联关系,如变量定义与使用关系、函数定义与调用关系、间接使用关系,或是相似变更关系,为代码分组提供了更为丰富且全面的信息,从而提高分组的准确度。
139.进一步地,该方法还结合编译提示信息动态调整分组结果,保证调整后的代码变更组编译通过,进一步提高了代码分组的准确度。此外,该方法还支持通过用户交互方式调整分组结果,根据用户的调整设置自适应调整分组结果,从而获得优化的分组结果。
140.该方法还支持基于上述分组结果确定提交类型,并结合与提交类型对应的提交模板自动生成提交消息。一方面,针对不同代码变更组分别生成对应的提交消息,避免了一个提交消息混杂多个变更任务,导致的变更意图难以理解,影响软件开发的后续流程,进而影响软件开发效率的问题。另一方面,可以改善使用长短期记忆网络(long short-term memory,lstm)生成提交消息导致的准确度不高、泛化能力不强的问题。
141.上文中结合图1至图4,详细描述了本技术所提供的代码处理方法,下面将结合附图,描述根据本技术所提供的装置和设备。
142.参见图2所示的代码处理装置200的结构示意图,该代码处理装置200包括通信模块202、分析模块204和分组模块206。
143.通信模块202,用于获取当前版本的代码文件相对于基础版本的代码文件的代码变更文件,所述代码变更文件包括多个代码变更块。
144.分析模块204,用于对所述多个代码变更块进行分析,获得所述多个代码变更块之间的至少一种关联关系。
145.分组模块206,用于利用所述至少一种关联关系对所述多个代码变更块进行分组得到n个代码变更组,以便根据所述n个代码变更组分别执行代码提交操作,所述n为正整数。
146.在一些可能的实现方式中,所述装置200还包括:
147.调整模块208,用于根据第一代码变更组的代码变更块包括的当前版本的代码片段进行代码编译,得到编译提示信息,根据所述编译提示信息调整所述第一代码变更组。
148.在一些可能的实现方式中,所述通信模块202还用于:
149.接收用户通过分组界面对第二代码变更组的调整设置;
150.所述装置200还包括:
151.调整模块208,用于根据所述调整设置调整所述第二代码变更组的代码变更块。
152.在一些可能的实现方式中,所述对第二代码变更组的调整设置包括对第二代码变更组中目标代码变更块的调整设置;
153.所述调整模块208具体用于:
154.根据所述调整设置调整所述目标代码变更块;
155.从所述第二代码变更组中确定所述目标代码变更块的关联代码变更块;
156.根据所述调整设置调整所述关联代码变更块。
157.在一些可能的实现方式中,所述通信模块202还用于:
158.获取至少一个代码变更组对应的提交模板;
159.所述装置200还包括:
160.提交模块210,用于根据所述至少一个代码变更组及其对应的提交模版生成提交消息,以便根据所述提交消息执行所述代码提交操作。
161.在一些可能的实现方式中,所述分析模块204具体用于:
162.获取所述多个代码变更块中各代码变更块的代码变更动作集合;
163.解析所述代码变更动作集合,获得所述各代码变更块对应的所述当前版本和所述基础版本的元素定义集和元素使用集;
164.根据所述各代码变更块对应的所述当前版本和所述基础版本的元素定义集和元素使用集,获取所述多个代码变更块之间的元素定义与使用关系和元素间接使用关系中的至少一种。
165.根据本技术实施例代码处理装置200可对应于执行本技术实施例中描述的方法,并且代码处理装置200的各个模块的上述和其它操作和/或功能分别为了实现图3中的各个方法的相应流程,为了简洁,在此不再赘述。
166.上述代码处理装置200可以通过计算机实现。图5提供了一种计算机的结构示意图,如图5所示,计算机具体可以用于实现上述图2所示实施例中代码处理装置200的功能。计算机500包括总线501、处理器502、通信接口503和存储器504。处理器502、存储器504和通信接口503之间通过总线501通信。总线501可以是外设部件互连标准(peripheral component interconnect,pci)总线或扩展工业标准结构(extended industry standard architecture,eisa)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图5中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。通信接口503用于与外部通信。例如,通信接口503可以用于获取当前版本的代码文件相对于基础版本的代码文件的代码变更文件等。
167.其中,处理器502可以为中央处理器(central processing unit,cpu)。存储器504可以包括易失性存储器(volatile memory),例如随机存取存储器(random access memory,ram)。存储器504还可以包括非易失性存储器(non-volatile memory),例如只读存储器(read-only memory,rom),快闪存储器,hdd或ssd。
168.存储器504中存储有可执行代码,处理器502执行该可执行代码以执行前述代码处理方法。
169.具体地,在实现图2所示实施例的情况下,且图2实施例中所描述的代码处理装置200的各模块为通过软件实现的情况下,执行图2中的分析模块204、分组模块206、调整模块208和提交模块210功能所需的软件或程序代码存储在存储器504中。通信模块202功能可以通过通信接口503实现。通信接口503获取代码变更文件,将其通过总线501传输至处理器502,处理器502执行存储器504中存储的各模块对应的程序代码,执行代码处理方法,实现对代码变更文件中多个代码变更块进行智能分组。
170.本技术实施例还提供了一种计算机可读存储介质,该计算机可读存储介质包括指令,当其在计算机上运行时,使得计算机执行上述应用于代码处理装置200的代码处理方法。
171.本技术实施例还提供了一种计算机程序产品,所述计算机程序产品被计算机执行时,所述计算机执行前述代码处理方法的任一方法。该计算机程序产品可以为一个软件安装包,在需要使用前述代码处理方法的任一方法的情况下,可以下载该计算机程序产品并
在计算机上执行该计算机程序产品。
172.另外需说明的是,以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。另外,本技术提供的装置实施例附图中,模块之间的连接关系表示它们之间具有通信连接,具体可以实现为一条或多条通信总线或信号线。
173.通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本技术可借助软件加必需的通用硬件的方式来实现,当然也可以通过专用硬件包括专用集成电路、专用cpu、专用存储器、专用元器件等来实现。一般情况下,凡由计算机程序完成的功能都可以很容易地用相应的硬件来实现,而且,用来实现同一功能的具体硬件结构也可以是多种多样的,例如模拟电路、数字电路或专用电路等。但是,对本技术而言更多情况下软件程序实现是更佳的实施方式。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在可读取的存储介质中,如计算机的软盘、u盘、移动硬盘、rom、ram、磁碟或者光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,训练设备,或者网络设备等)执行本技术各个实施例所述的方法。
174.在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。
175.所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本技术实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、训练设备或数据中心通过有线(例如同轴电缆、光纤、数字用户线(dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、训练设备或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存储的任何可用介质或者是包含一个或多个可用介质集成的训练设备、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如固态硬盘(solid state disk,ssd))等。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1