CN110990055B - 一种基于程序分析的Pull Request功能分类方法 - Google Patents
一种基于程序分析的Pull Request功能分类方法 Download PDFInfo
- Publication number
- CN110990055B CN110990055B CN201911321383.1A CN201911321383A CN110990055B CN 110990055 B CN110990055 B CN 110990055B CN 201911321383 A CN201911321383 A CN 201911321383A CN 110990055 B CN110990055 B CN 110990055B
- Authority
- CN
- China
- Prior art keywords
- graph
- pull request
- file
- files
- call
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Stored Programmes (AREA)
Abstract
本发明为一种基于程序分析的Pull Request功能分类方法:首先,对当前版本项目和Pull Request中修改文件的提取。其次,对于待分析的程序,使用程序分析框架Soot,选择传递方式生成调用图Callgragh,遍历Callgragh直到调用的是第三方库提供的方法,将遍历到的节点和边保存到数据库中。然后,读取并分析数据库中保存的节点和边的关系,以Pull Request中的文件作为图的节点,构建图的邻接表结构。最后,基于图的深度优先遍历算法遍历邻接表的所有结点,以遍历的结果作为文件的功能分类,针对无调用关系的文件,以文件后缀名进行处理。
Description
技术领域
本发明属于计算机技术领域。尤其是软件技术领域。本发明提出了一种基于程序分析来对Pull Request,尤其是可能包含多个功能的提交信息进行功能分类的方法,能够有效地针对当前GitHub等代码仓库无法快速审阅Pull Request中可能存在多个功能提交的情况,同时对同一个功能中文件的审阅顺序进行有效地确认。
背景技术
随着互联网技术的高速发展以及软件行业的逐步扩大,在软件开发的实际中,通常需要在已经发布的程序中添加新的功能并且满足多人协作的要求,版本控制系统帮助软件团队的开发人员协同工作,并存档他们工作的完整历史记录。作为一种典型的版本控制系统,Git具有版本库本地化和分布式的特性,其支持离线提交、快速切换分支、无单点故障且多个开发者相对独立但不影响协同开发,非常适用于业务性强、需求多变以及团队协同开发的软件系统,已然成为最广泛使用的版本控制系统之一。在多人合作项目中,PullRequest是软件开发中必不可少的功能,是将涉及不同功能的代码,纳入主干的一种流程。这个过程中,还可以进行讨论、审核和修改代码。
然而,在审核Pull Request过程中的常见问题是:在很多并不严格遵守代码提交规范的Pull Request中,一个Pull Request中包含多个commit版本,由于修改文件较多并且在目前的代码仓库中文件顺序通常是任意的,这就对审核人员查看和理解提交的PullRequest造成了很大困扰。尽管审核人员通常是项目的核心开发人员,对项目流程非常熟悉,但是仍需花费较大的精力定位代码的修改位置,确定可能存在的多个功能以及多个文件下代码的审核顺序。这些情况都大大增加了代码审核的成本,是团队协作开发过程中所面临的主要挑战之一。
针对这些问题的一个有效解决方案是在Pull Request中提供代码功能划分和文件审阅顺序推荐的功能。这种提示功能应当通过对于开发人员提交合并的代码的分析,确定提交文件所属的功能以及每个功能中文件的审核顺序,帮助审核人员更好地理解提交审核的Pull Request中代码的更改,从而提高审核的效率和准确性。
但在目前的主流版本控制系统中,并不能对Pull Request提交代码中的更改进行合适的功能划分和审核顺序确认,如在GitHub中的Pull Request通常情况下只以文件的后缀名确定文件的展示顺序。因此,本发明的主要目标是研究一种能准确划分提交代码,尤其是Java代码的功能的方法,同时提供每个功能所涉及文件的审核顺序,弥补当前版本控制系统中Pull Request审核方面的不足,有效地帮助审核人员理解提交的代码,更好地完成团队开发任务。
发明内容
本发明的主要工作是提出一种基于程序分析有效对Pull Request进行功能分类并对同一个功能中文件的审阅顺序进行有效确认的方法。首先,本发明主要关注的是代码仓库收到的文件数目较多,可能包含不止一个功能的Pull Request,对项目Pull Request中的文件修改和当前项目进行提取,将此Pull Request的修改预合并到临时分支,将临时分支的程序作为目标待分析程序。其次,对于待分析的程序,使用程序分析框架Soot,设置虚拟程序入口,选择传递方式生成调用图Callgragh,遍历Callgragh直到调用的是第三方库提供的方法,将遍历到的节点和边保存到数据库中。然后,读取并分析数据库中保存的节点和边的关系,以Pull Request中的文件作为图的节点,构建图的邻接表结构。最后,基于图的深度优先遍历算法遍历邻接表的所有结点,以遍历的结果作为文件的功能分类,针对无调用关系的文件,以文件后缀名进行处理。针对以上问题,本发明的工作和贡献如下:
1.基于当前主分支项目版本和Pull Request中修改文件合成待分析程序。本发明中待分析的程序是当前项目主分支程序版本和Pull Request中文件的并集。克隆远程仓库中项目到本地仓库中,根据GitHub API提取项目包含的Pull Request信息,在本地仓库中创建并切换至临时分支,在临时分支中预合并Pull Request作为待分析程序。
2.基于程序分析的调用关系图获取方法的调用关系。对于待分析的程序,通过Soot静态分析框架,选择传递方式构造调用关系图Callgragh,遍历Callgragh直到调用的是第三方库提供的方法,将调用方法作为节点,调用关系作为边,将遍历到的节点和边保存到数据库中。每一条调用的完整记录信息为<数据库主键id,项目名称,调用类,调用方法,被调用类,被调用方法>。
3.提取数据库中的调用关系生成Pull Request中文件的图表示。在工作2中数据库保存了程序间所有方法的调用关系,通过分析这些关系过滤出与Pull Request中文件相关的方法,以文件作为图的节点,生成图的邻接表结构。
4.基于图的深度优先算法遍历获取到的节点和边的关系,根据遍历的结果确定Pull Request中文件的功能分类,针对不存在关系的文件,根据文件的后缀名统一分类。选择邻接表中入度为0的节点进行深度优先遍历,直到遍历到全部节点,根据遍历结果将存在关系的文件聚类为同一个功能,对于不存在关系的单独文件根据文件的后缀名统一处理,本发明提出的方法可以为Java项目的Pull Request提供功能分类。
附图说明
图1为本发明中待分析程序的获取示意图
图2为本发明基于深度优先遍历算法处理调用关系的算法流程示意图
图3为本发明基于程序分析的Pull Request功能分类流程示意图
具体实施方式
如图3所示,本发明的技术方案具体包括以下步骤:
1)首先针对需要进行功能分类的Pull Request,抽取当前版本项目以及PullRequest中修改的文件,新建临时分支并预合并需要分类的Pull Request作为本方法的待分析程序。
2)对待分析程序进行静态分析时,设置虚拟程序入口,选择传递方式生成调用图Callgragh,遍历Callgragh直到调用的是第三方库提供的方法。针对每条调用边生成一条记录信息到数据库中。
3)对于已经保存在数据库中的整个程序的调用关系,以图的邻接表作为文件间是否存在关系的统一表示,对Pull Request中包含的文件建立文件间关系的图表示。
4)基于图的深度优先遍历的算法,选择邻接表中入度为0的节点进行深度优先遍历,直到遍历到全部节点。根据得到的遍历结果,可以将存在关系的文件聚类为同一个功能,对于不存在关系的单独文件根据文件的后缀名统一处理。
步骤1)获取待分析程序,Pull Request为一个信息块,仓库中包含了许多这样的信息块,这些信息块保存于仓库中并且是特殊格式,无法直接使用,所以此阶段需要使用jgit工具抽取仓库信息,同时待分析的程序是当前项目版本和Pull Request中文件修改的并集,为了在不修改主分支的情况下进行程序分析,本方法在仓库中新建分支预合并PullRequest。如图1所示,具体的获取待分析程序的步骤如下:
S1.1、利用jgit抽取仓库中所有Pull Request,得到每个Pull Request的具体信息,所述的信息包括创建时间,标题,作者,状态和Pull Request中修改的文件;
S1.2、克隆项目到本地仓库中;
S1.3、使用jgit中branchCreate().setName(″tempBranch″).call()方法创建临时分支tempBranch,并使用checkout()方法切换到tempBranch分支;
S1.4、对于待分类的Pull Request,根据S1.1中抽取到的信息可以获得该PullRequest所在的分支信息ref;
S1.5、在临时分支tempBranch上合并分支信息ref,将临时分支的程序作为待分析程序。
步骤2)对于待分析的程序,通过Soot静态分析框架,选择传递方式构造调用关系图Callgragh,遍历Callgragh将调用方法作为节点,调用关系作为边,将遍历到的节点和边的关系保存到数据库中。每一条调用的完整记录信息为<序号,项目名称,调用类,调用方法,被调用类,被调用方法>。
步骤3)对于已经保存在数据库中的调用关系构建图的邻接表结构,作为文件间是否存在关系的统一表示,建立Pull Request包含的文件之间关系的图表示。具体包括以下步骤:
S3.1、从数据库中查询步骤2)中保存的本项目的所有调用关系集合;
S3.2、建立Map结构<key,List<Node>>,key表示步骤1)中抽取的Pull Request修改的文件类;
S3.3、遍历S3.1中查询到的调用关系集合,如果集合的记录中调用类和Map结构中的key相同,则将记录中被调用类加入到key对应的List中;
S3.4、重复S3.3直到遍历完所有的调用关系集合。
步骤4)基于图的深度优先遍历的算法遍历步骤3)中生成的图的邻接表结构。根据得到的遍历结果,可以将存在关系的多个文件聚类为同一个功能,对于不存在关系的单独文件跟据文件的后缀名统一处理。参照图2是本发明基于深度优先遍历算法处理调用关系算法流程示意图,算法的具体步骤如下:
S4.1、遍历步骤3)中图的邻接表结构,记录每个节点的入度;
S4.2、选择入度为0的节点,基于图的深度优先遍历邻接表;
S4.3、重复S4.2,直到遍历到图中全部的节点,将节点的序列存放在结果集List<List<Node>>中;
S4.4、如果图中不存在入度为0的节点,表明图中的节点相互之间都有调用关系,属于同一个功能,这时只要遍历一次就能够获取到图中所有的节点;
S4.5、遍历S4.3和S4.4得到的结果集,如果一条结果中包含不止一个文件,则将这条结果中的文件分类为一个功能,并将深度遍历的顺序作为功能的审阅顺序;
S4.6、对于结果只包含单独文件的情况,将所有只包含单独文件的结果记录下来;
S4.7、重复S4.6到S4.7,将单独文件按照文件的后缀名统一分类后得到最终的分类结果。
Soot是一个由Java编写的、代码优化和分析工具,以Java源程序或者字节码或字节码等为输入,以优化的Class文件为输出,其分析和优化建立在内部的中间表示之上。Soot提供了多种字节码分析和变换功能,通过它可以进行过程内和过程间的分析优化,以及程序流图的生成。
Jgit:一种Java的开源库,用于处理Git仓库相关的指令。
Claims (6)
1.一种基于程序分析的Pull Request功能分类方法,其特征是对项目Pull Request中的文件修改和当前项目获取程序代码;接着,对于程序代码,使用程序分析框架Soot生成调用图Callgragh,遍历Callgragh直到调用的是第三方库提供的方法,保存遍历到的节点和边;接着,提取并分析数据库中保存的节点和边的关系,以Pull Request中的文件作为图的节点,构建图的邻接表结构;最后,基于图的深度优先遍历算法遍历邻接表的所有结点,按照节点入度是否为0进行功能分类,针对无调用关系的文件,以文件后缀名进行处理。
2.根据权利要求1所描述的一种基于程序分析的Pull Request功能分类方法,其特征包括以下几个步骤:
1)对项目Pull Request中的文件修改和当前项目进行获取,程序代码是当前版本和Pull Request中文件的并集;
2)基于程序分析的调用关系图获取方法的调用关系,使用程序分析框架Soot生成调用图Callgragh,遍历Callgragh直到调用的是第三方库提供的方法,保存遍历到的节点和边;
3)提取数据库中的调用关系生成Pull Request中文件的图表示,数据库保存了程序间所有方法的调用关系,通过分析这些关系过滤出与PullRequest中文件相关的方法,以文件作为图的节点,生成图的邻接表结构;
4)基于深度优先算法遍历获取到的节点和边以及类之间关系的图表示结构,根据遍历的结果确定Pull Request中文件的功能分类,针对不存在关系的文件,根据文件的后缀名统一分类。
3.根据权利要求2所述的基于程序分析的Pull Request功能分类方法,其特征是步骤1)中,针对项目Pull Request中的文件修改和当前项目进行获取;本发明需要对审核PullRequest的场景进行优化,为了在不修改主分支的情况下进行程序分析,程序代码是当前版本和Pull Request中文件的并集,具体的获取程序代码的步骤如下:
S1.1、利用jgit抽取仓库中所有Pull Request,得到每个Pull Request的具体信息,所述的信息包括创建时间,标题,作者,状态和Pull Request中修改的文件;
S1.2、克隆项目到本地仓库中;
S1.3、调用igit中branchCreate().setName(″tempBranch″).call()方法创建临时分支tempBranch,并使用checkout()方法切换到tempBranch分支;
S1.4、对于待分类的Pull Request,根据S1.1中抽取到的信息可以获得该PullRequest所在的分支信息ref;
S1.5、在临时分支tempBranch上合并分支信息ref。
4.根据权利要求2所述的基于程序分析的Pull Request功能分类方法,其特征是步骤2)中,基于程序分析的调用关系图获取方法的调用关系,对于程序代码,通过Soot静态分析框架,选择传递方式构造调用关系图Callgragh,遍历Callgragh直到调用的是第三方库提供的方法,将调用方法作为节点,调用关系作为边,将遍历到的节点和边保存到数据库中,每一条调用的完整记录信息为<数据库主键id,调用类,调用方法,被调用类,被调用方法>。
5.根据权利要求2所述的基于程序分析的Pull Request功能分类方法,其特征是步骤3)中,对于已经保存在数据库中的调用关系构建图的邻接表结构,作为文件间是否存在关系的统一表示,建立Pull Request包含的文件之间关系的图表示,具体包括以下步骤:
S3.1、从数据库中查询步骤2)中保存的本项目的所有调用关系集合;
S3.2、建立Map结构<key,List<Node>>,key表示步骤1)中抽取的Pull Request修改的文件类;
S3.3、遍历S3.1中查询到的调用关系集合,如果集合的记录中调用类和Map结构中的key相同,则将记录中被调用类加入到key对应的List中;
S3.4、重复S3.3直到遍历完所有的调用关系集合。
6.根据权利要求2所述的基于程序分析的Pull Request功能分类方法,其特征是步骤4)中,基于图的深度优先遍历的算法遍历步骤3)中生成的图的邻接表结构,根据得到的遍历结果,可以将存在关系的多个文件聚类为同一个功能,对于不存在关系的单独文件跟据文件的后缀名统一处理,算法的具体步骤如下:
S4.1、遍历步骤3)中图的邻接表结构,记录每个节点的入度;
S4.2、选择入度为0的节点,基于图的深度优先遍历邻接表;
S4.3、重复S4.2,直到遍历到图中全部的节点,将节点的序列存放在结果集List<List<Node>>中;
S4.4、如果图中不存在入度为0的节点,表明图中的节点相互之间都有调用关系,属于同一个功能,这时只要遍历一次就能够获取到图中所有的节点;
S4.5、遍历S4.3和S4.4得到的结果集,如果一条结果中包含不止一个文件,则将这条结果中的文件分类为一个功能,并将深度遍历的顺序作为功能的审阅顺序;
S4.6、对于结果只包含单独文件的情况,将所有只包含单独文件的结果记录下来;
S4.7、重复S4.6到S4.7,将单独文件按照文件的后缀名统一分类后得到最终的分类结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911321383.1A CN110990055B (zh) | 2019-12-19 | 2019-12-19 | 一种基于程序分析的Pull Request功能分类方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911321383.1A CN110990055B (zh) | 2019-12-19 | 2019-12-19 | 一种基于程序分析的Pull Request功能分类方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110990055A CN110990055A (zh) | 2020-04-10 |
CN110990055B true CN110990055B (zh) | 2022-07-01 |
Family
ID=70065643
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911321383.1A Active CN110990055B (zh) | 2019-12-19 | 2019-12-19 | 一种基于程序分析的Pull Request功能分类方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110990055B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111708747B (zh) * | 2020-06-15 | 2023-02-10 | 中国航空工业集团公司西安飞行自动控制研究所 | 分布式版本管理文档版本树生成方法 |
CN114675839B (zh) * | 2022-05-30 | 2022-08-30 | 炫彩互动网络科技有限公司 | 一种基于有向图的代码仓库Java冲突文件排序分组方法 |
US20230401055A1 (en) * | 2022-06-09 | 2023-12-14 | Microsoft Technology Licensing, Llc | Contextualization of code development |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9430229B1 (en) * | 2013-03-15 | 2016-08-30 | Atlassian Pty Ltd | Merge previewing in a version control system |
CN106557308A (zh) * | 2015-09-29 | 2017-04-05 | 腾讯科技(深圳)有限公司 | 一种软件持续集成方法及装置 |
CN108170469A (zh) * | 2017-12-20 | 2018-06-15 | 南京邮电大学 | 一种基于代码提交历史的Git仓库相似性检测方法 |
CN109086071A (zh) * | 2018-08-22 | 2018-12-25 | 平安普惠企业管理有限公司 | 一种管理软件版本信息的方法及服务器 |
CN110442847A (zh) * | 2019-07-26 | 2019-11-12 | 南京邮电大学 | 基于代码仓库过程管理的代码相似性检测方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20190303541A1 (en) * | 2018-04-02 | 2019-10-03 | Ca, Inc. | Auditing smart contracts configured to manage and document software audits |
-
2019
- 2019-12-19 CN CN201911321383.1A patent/CN110990055B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9430229B1 (en) * | 2013-03-15 | 2016-08-30 | Atlassian Pty Ltd | Merge previewing in a version control system |
CN106557308A (zh) * | 2015-09-29 | 2017-04-05 | 腾讯科技(深圳)有限公司 | 一种软件持续集成方法及装置 |
CN108170469A (zh) * | 2017-12-20 | 2018-06-15 | 南京邮电大学 | 一种基于代码提交历史的Git仓库相似性检测方法 |
CN109086071A (zh) * | 2018-08-22 | 2018-12-25 | 平安普惠企业管理有限公司 | 一种管理软件版本信息的方法及服务器 |
CN110442847A (zh) * | 2019-07-26 | 2019-11-12 | 南京邮电大学 | 基于代码仓库过程管理的代码相似性检测方法及装置 |
Non-Patent Citations (4)
Title |
---|
EARec: Leveraging Expertise and Authority for Pull-Request Reviewer Recommendation in GitHub;Haochao Ying;《2016 IEEE/ACM 3rd International Workshop on CrowdSourcing in Software Engineering (CSI-SE)》;20170109;全文 * |
Work Practices and Challenges in Pull-Based Development: The Contributor"s Perspective;Georgios Gousios;《2016 IEEE/ACM 38th International Conference on Software Engineering (ICSE)》;20170403;全文 * |
Work Practices and Challenges in Pull-Based Development: The Integrator"s Perspective;Georgios Gousios;《2015 IEEE/ACM 37th IEEE International Conference on Software Engineering》;20150817;全文 * |
面向开源社区的群体化协同开发机理实证研究;余跃;《中国博士学位论文全文数据库 信息科技辑》;20171215;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN110990055A (zh) | 2020-04-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110990055B (zh) | 一种基于程序分析的Pull Request功能分类方法 | |
US6490590B1 (en) | Method of generating a logical data model, physical data model, extraction routines and load routines | |
US7418453B2 (en) | Updating a data warehouse schema based on changes in an observation model | |
US7418449B2 (en) | System and method for efficient enrichment of business data | |
EP3674918A2 (en) | Column lineage and metadata propagation | |
CN103514223A (zh) | 一种数据仓库数据同步方法和系统 | |
CN112699055B (zh) | 一种维护成本较低的软件自动化测试方法及系统 | |
CN111026433A (zh) | 基于代码变更历史的软件代码质量问题自动修复方法、系统及介质 | |
CN111858301B (zh) | 基于变更历史的组合服务测试用例集约简方法及装置 | |
US20060136471A1 (en) | Differential management of database schema changes | |
CN112068981A (zh) | Linux操作系统中基于知识库的故障扫描恢复方法及系统 | |
JP6540384B2 (ja) | 評価プログラム、手順書評価方法、および評価装置 | |
US8392892B2 (en) | Method and apparatus for analyzing application | |
JP6588988B2 (ja) | 業務プログラム生成支援システムおよび業務プログラム生成支援方法 | |
CN117236304A (zh) | 一种基于模板配置的Excel通用导入的实现方法 | |
Rao et al. | morebugs: A new dataset for benchmarking algorithms for information retrieval from software repositories | |
CN115168085A (zh) | 一种基于diff代码块匹配的重复冲突方案检测方法 | |
CN114281688A (zh) | 一种无码或低码的自动化用例管理方法和装置 | |
JP5108642B2 (ja) | ユースケースシナリオ作成支援システム、ユースケースシナリオ作成支援方法、およびユースケースシナリオ作成支援プログラム | |
CN115203057B (zh) | 低代码测试自动化方法、装置、设备及存储介质 | |
CN114692595B (zh) | 一种基于文本匹配的重复冲突方案检测方法 | |
CN114968258B (zh) | 面向代码溯源的克隆代码继承关系判定方法、系统及介质 | |
CN112148710B (zh) | 微服务分库方法、系统和介质 | |
KR100656559B1 (ko) | Bibd 방법론을 이용하는 프로그램 자동 개발 장치 | |
JP2004362495A (ja) | エラーログ情報解析支援方法及び実施装置並びに処理プログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |