基于Git的跨版本迁移的软件评审设计与实现
2018-08-01关婷婷任洪敏江金莲
关婷婷,任洪敏,江金莲
(上海海事大学信息工程学院,上海 201306)
0 引言
软件开发实践表明,大部分缺陷从软件开发的最早阶段起,就存在于软件之中。经验表明,在制定技术规范期间产生的问题如果在集成测试或者产品使用时被发现,与在设计编码期间被发现相比较,返工的成本前者比后者高10-100倍。软件评审是用于开发过程检查和纠正缺陷的最佳途径。它们可以检查未形成的执行代码的文档缺陷,用评审发现缺陷的成本与其他的是相当低的,并且可以提高项目的生产率更早的发现缺陷从而减少返工时间和测试时间。软件评审工具不仅可以节约评审会议的时间而且不再限制参与评审人员的时间和地点,也更好地记录了评审的全部信息。随着Git软件项目托管平台的普遍应用给软件开发人员对文件和代码的修改带来便捷。从而同时存储的软件项目都存在多个版本,致使软件评审的工作需要不断地随之变更给软件评审活动带来不便极大地降低了软件评审的效率。所以本文将Git版本控制的原理融入到软件评审的方式中,研究出一个可以跨版本迁移的软件评审系统。版本控制是一种软体工程技巧,籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新。版本控制透过文档控制记录程序各个模组的改动,并为每次改动编上序号。通过这些生成的32位具有唯一性的编号可以实现将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态。则跨版本迁移正是利用项目当前版本与历史版本的比对,根据差异对比实现当前版本与历史评审信息的比对。从而实现软件评审的工作结果随软件项目的改动而自动变动。不再因为软件项目的修改而从新开始软件评审工作。
1 Git的版本控制原理
1.1 Git Log历史版本回顾
版本控制是一种软体工程技巧,籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新。版本控制透过文档控制记录程序各个模组的改动,并为每次改动编上序号。Git是一个开源的分布式版本控制系统,可以有效、高速f处理从很小到非常大的项目版本管理。利用Git命令中的日志查询命令Git Log的原理来获取当前文件的所有历史版本的版本号。版本的信息会按提交时间列出所有的更新,最后一次提交的信息会在最上面。Git Log会展示出所有提交过版本的信息,这些信息包括32位版本号、提交时间、提交者姓名、版本的提示信息。通过git log命令,可以根据时间从最近到最远显示提交日志,如下列所示第一行是Git的编号。与SVN编号不同这串数字并不是按数值递增的,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。每提交一次Git实质就将所有版本按时间穿成一条时间线。在Git中用HEAD表示当前版本也就是当前版本cae098d…,使用git reset实现版本回退,Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD的指针指向改变到新的版本上而已,然后顺便把工作区的文件更新了。
commit cae098ddaf9cecd1bc3dceaddc3db27bc7632e18
(HEAD->master)
Author:Guan Ting Ting
Date:Fri Mar 23 13:07:14 2018+0800
----commit–m"comments on a form"
1.2 git diff版本差异对比
可以通过版本序号可以对比出两个历史版本的差异对比,或者当前版本和一个历史版本的文件的对比。通过git diff序列号得到如下信息:
diff--git a/src/Main.java b/src/Main.java
index e69de29..dca0fe6 100644
---a/src/Main.java
+++b/src/Main.java
@@-1,2+1,2@@
第一行表示结果为Git格式的diff。进行比较的是a版本a.java(即变动前)和b版本的a.java(变动后),第二行表示两个版本的Git哈希值,index区域的4ef7e28对象与工作目录区域的3ec1e0f对象进行比较。最后的六位数字是对象的模式为普通文件644权限。第三行和第四行表示进行比较的两个文件。“---”表示变动前的版本,“+++”表示变动后的版本。变动的位置用两个@座作为起首和结束。后面跟随的是变动信息的具体情况如图代表第一个版本变动从第一行开始连续变动四行,第二个版本变动从第一行开始连续57行。后面则是变动的具体内容。
2 跨版本迁移的软件评审平台设计与实现
2.1 跨版本迁移的软件评审的总体设计
系统设计流程如下:
(1)视图获取所选的文件仓库ID、分支、文件名称。
(2)根据仓库ID在数据库中搜索相对的路径,然后读取文件内容。
(3)获取当前文件所有历史版本号,并获得所有版本的数据库中的评价信息。
(4)将每条评价的版本号与当前版本作git diff对比,得到相对增加或加少的行。
(5)根据增加减少的行与此条记录作动态运算得到当前版本此条评论应该显示的行号。
(6)将读取到的文件、文件所有的评论、每条评论在当前版本的行号一并返回视图层。
(7)添加评论是将仓库ID、branch、文件名、行号、评论内容存入数据库中生成记录。跨版本迁移的软件评审实现流程如下:
图1 跨版本迁移的实现流程
2.2 实现技术
平台前端页面采用Syntaxhighlighter框架结合jQuery实现不同软件文件内容的高亮显示,很好地支持了Java、XML、PHP等16种文件形式,并结合HT⁃ML5、CSS3等前端技术呈现友好的界面。后台程序以Spring Boot为框架,以Java为主要开发语言,通过Java调用JGit的API实现对Git仓库的相关操作,后台与数据库MySQL的连接、查询、添加等数据交互是通过JSON数据对象来实现。使用面向对象的开发结构和MVC模式;后台通过JGit实现本地仓库信息的读取,并在前端通过AJAX接收返回的数据和对应的评审结果。JGit是一款由Eclipse基金会提供支持的轻量级、Java库实现的Git版本控制系统,包括三大部分:(1)版本库访问程序(2)网络协议(3)核心版本控制算法。图2为本平台的技术框架。
3 跨版本迁移的算法实现
3.1 历史版本评论及文件读取的实现步骤
Step1:前端通过AJAX传递当前文件的仓库编码、文件名称、分支,后台根据仓库编码得到在数据库中存储的对应的仓库路径。
Step2:根据仓库编码在数据库中查找仓库路径,从而得到当前文件在Git仓库中的路径。
Step3:通过获取的文件路径从字符输入流中读取本地Git仓库的文件,创建BufferedReader对象逐行缓冲各个字符,并将读取的字符存储到一个ArrayList的结构中。
Step4:通过JGit提供的获得文件版本编号的API获得所有提交过的日志信息中的版本编号。
Step5:将获得的所有版本编号拼成一个字符串,用之在数据库中查找所有历史版本的评论。
3.2 git diff差异对比的算法实现
跨版本文件中评论信息的迁移主要由两部分实现:首先获得提交日志中所有版本中的评论信息,将每条评论信息所在的版本与当前版本作git diff的对比,从而得知相对当前版本增加的行号和减少的行号。通过使用JGit提供的git diff的API,实现两个文件差异的比较。
3.3 动态计算跨版本迁移行号
动态计算原理:通过分析git diff返回的对比结果,历史版本对于当前版本新增行数的数组和删减行数的数组。遍历增加的行数数组,历史版本中记录评论的行号后移分为两种情况:①若新增的行号小于历史版本中记录行号,则历史版本记录行号需向后移动一位。②若新增行号等于历史版本记录行号,连续增加几行则历史行号需后移几位。同理历史版本中记录评论的行号向前移动亦然。用一个变量diffCount记录需要增加或删减的行数,则当前版本中的评论行号就等于历史版本中记录的行号加变量diffCount。
4 实验结果
4.1 实验环境
开发过程中开发人员不断的对文件进行修改,然后不断地提交修改到版本库里。跨版本迁移平台实现了评审的文件的多个版本的切换,评论结果不丢失,并对应匹配文件行号。本文跨版本迁移的软件评审平台需要的环境配置如下:
表1 实验环境软件工具表
4.2 实验结果对比
目前流行的软件评审系统大致分为三种。第一种是简单的和轻量级的评审系统,但是这种只是单纯的代码评审工具并没有关联到远程代码仓库。不能立即对更新的代码做最新的评审降低评审效率。需要每次手动导入带评审项目,给评审带来便。第二种就如谷歌开发的Gerrit一样,实际上一个Git服务器,它为在其服务器上托管的Git仓库提供一系列权限控制。这种评审系统庞大,不仅需要进行复杂的公钥、私钥配置。第三种是基于SVN的软件评审系统,SVN采用集中式代码管理,频繁的提交代码会致使服务器压力过大,数据库容量暴增。并且如果连接不到服务器就无法工作非常受限。而本文研发的基于Git的跨版本迁移的软件评审系统不仅省去繁琐的配置工作,也不需要随文件的改动手动再次导入需要评审的文件,提高了开发的效率为开发人员节省了工作时间。
5 结语
本文研发的系统是一个基于Web在线的代码评审系统原型,使用Git版本控制系统读取Git仓库文件作代码评审。操作简单不需要手动导入待评审文件也不需要繁琐的公钥、秘钥配置。目前并没有一个软件评审工具具有跨版本的迁移功能。评审文件各个版本之间自由切换,评审标记和评审信息随之改变。这样每次开放人员提交新的版本就不需要从新评审。系统将自动与之前的版本做对比显示标注和评审信息。使软件评审的过程更加轻巧便捷,开发人员随时掌握软件代码的最新状态节省了开发时间,提升了评审效率。