關(guān)婷婷,任洪敏,江金蓮
(上海海事大學(xué)信息工程學(xué)院,上海 201306)
軟件開(kāi)發(fā)實(shí)踐表明,大部分缺陷從軟件開(kāi)發(fā)的最早階段起,就存在于軟件之中。經(jīng)驗(yàn)表明,在制定技術(shù)規(guī)范期間產(chǎn)生的問(wèn)題如果在集成測(cè)試或者產(chǎn)品使用時(shí)被發(fā)現(xiàn),與在設(shè)計(jì)編碼期間被發(fā)現(xiàn)相比較,返工的成本前者比后者高10-100倍。軟件評(píng)審是用于開(kāi)發(fā)過(guò)程檢查和糾正缺陷的最佳途徑。它們可以檢查未形成的執(zhí)行代碼的文檔缺陷,用評(píng)審發(fā)現(xiàn)缺陷的成本與其他的是相當(dāng)?shù)偷?,并且可以提高?xiàng)目的生產(chǎn)率更早的發(fā)現(xiàn)缺陷從而減少返工時(shí)間和測(cè)試時(shí)間。軟件評(píng)審工具不僅可以節(jié)約評(píng)審會(huì)議的時(shí)間而且不再限制參與評(píng)審人員的時(shí)間和地點(diǎn),也更好地記錄了評(píng)審的全部信息。隨著Git軟件項(xiàng)目托管平臺(tái)的普遍應(yīng)用給軟件開(kāi)發(fā)人員對(duì)文件和代碼的修改帶來(lái)便捷。從而同時(shí)存儲(chǔ)的軟件項(xiàng)目都存在多個(gè)版本,致使軟件評(píng)審的工作需要不斷地隨之變更給軟件評(píng)審活動(dòng)帶來(lái)不便極大地降低了軟件評(píng)審的效率。所以本文將Git版本控制的原理融入到軟件評(píng)審的方式中,研究出一個(gè)可以跨版本遷移的軟件評(píng)審系統(tǒng)。版本控制是一種軟體工程技巧,籍以在開(kāi)發(fā)的過(guò)程中,確保由不同人所編輯的同一檔案都得到更新。版本控制透過(guò)文檔控制記錄程序各個(gè)模組的改動(dòng),并為每次改動(dòng)編上序號(hào)。通過(guò)這些生成的32位具有唯一性的編號(hào)可以實(shí)現(xiàn)將某個(gè)文件回溯到之前的狀態(tài),甚至將整個(gè)項(xiàng)目都回退到過(guò)去某個(gè)時(shí)間點(diǎn)的狀態(tài)。則跨版本遷移正是利用項(xiàng)目當(dāng)前版本與歷史版本的比對(duì),根據(jù)差異對(duì)比實(shí)現(xiàn)當(dāng)前版本與歷史評(píng)審信息的比對(duì)。從而實(shí)現(xiàn)軟件評(píng)審的工作結(jié)果隨軟件項(xiàng)目的改動(dòng)而自動(dòng)變動(dòng)。不再因?yàn)檐浖?xiàng)目的修改而從新開(kāi)始軟件評(píng)審工作。
版本控制是一種軟體工程技巧,籍以在開(kāi)發(fā)的過(guò)程中,確保由不同人所編輯的同一檔案都得到更新。版本控制透過(guò)文檔控制記錄程序各個(gè)模組的改動(dòng),并為每次改動(dòng)編上序號(hào)。Git是一個(gè)開(kāi)源的分布式版本控制系統(tǒng),可以有效、高速f處理從很小到非常大的項(xiàng)目版本管理。利用Git命令中的日志查詢命令Git Log的原理來(lái)獲取當(dāng)前文件的所有歷史版本的版本號(hào)。版本的信息會(huì)按提交時(shí)間列出所有的更新,最后一次提交的信息會(huì)在最上面。Git Log會(huì)展示出所有提交過(guò)版本的信息,這些信息包括32位版本號(hào)、提交時(shí)間、提交者姓名、版本的提示信息。通過(guò)git log命令,可以根據(jù)時(shí)間從最近到最遠(yuǎn)顯示提交日志,如下列所示第一行是Git的編號(hào)。與SVN編號(hào)不同這串?dāng)?shù)字并不是按數(shù)值遞增的,而是一個(gè)SHA1計(jì)算出來(lái)的一個(gè)非常大的數(shù)字,用十六進(jìn)制表示。每提交一次Git實(shí)質(zhì)就將所有版本按時(shí)間穿成一條時(shí)間線。在Git中用HEAD表示當(dāng)前版本也就是當(dāng)前版本cae098d…,使用git reset實(shí)現(xiàn)版本回退,Git的版本回退速度非???,因?yàn)镚it在內(nèi)部有個(gè)指向當(dāng)前版本的HEAD指針,當(dāng)你回退版本的時(shí)候,Git僅僅是把HEAD的指針指向改變到新的版本上而已,然后順便把工作區(qū)的文件更新了。
commit cae098ddaf9cecd1bc3dceaddc3db27bc7632e18
(HEAD->master)
Author:Guan Ting Ting
Date:Fri Mar 23 13:07:14 2018+0800
----commit–m"comments on a form"
可以通過(guò)版本序號(hào)可以對(duì)比出兩個(gè)歷史版本的差異對(duì)比,或者當(dāng)前版本和一個(gè)歷史版本的文件的對(duì)比。通過(guò)git diff序列號(hào)得到如下信息:
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@@
第一行表示結(jié)果為Git格式的diff。進(jìn)行比較的是a版本a.java(即變動(dòng)前)和b版本的a.java(變動(dòng)后),第二行表示兩個(gè)版本的Git哈希值,index區(qū)域的4ef7e28對(duì)象與工作目錄區(qū)域的3ec1e0f對(duì)象進(jìn)行比較。最后的六位數(shù)字是對(duì)象的模式為普通文件644權(quán)限。第三行和第四行表示進(jìn)行比較的兩個(gè)文件?!?--”表示變動(dòng)前的版本,“+++”表示變動(dòng)后的版本。變動(dòng)的位置用兩個(gè)@座作為起首和結(jié)束。后面跟隨的是變動(dòng)信息的具體情況如圖代表第一個(gè)版本變動(dòng)從第一行開(kāi)始連續(xù)變動(dòng)四行,第二個(gè)版本變動(dòng)從第一行開(kāi)始連續(xù)57行。后面則是變動(dòng)的具體內(nèi)容。
系統(tǒng)設(shè)計(jì)流程如下:
(1)視圖獲取所選的文件倉(cāng)庫(kù)ID、分支、文件名稱。
(2)根據(jù)倉(cāng)庫(kù)ID在數(shù)據(jù)庫(kù)中搜索相對(duì)的路徑,然后讀取文件內(nèi)容。
(3)獲取當(dāng)前文件所有歷史版本號(hào),并獲得所有版本的數(shù)據(jù)庫(kù)中的評(píng)價(jià)信息。
(4)將每條評(píng)價(jià)的版本號(hào)與當(dāng)前版本作git diff對(duì)比,得到相對(duì)增加或加少的行。
(5)根據(jù)增加減少的行與此條記錄作動(dòng)態(tài)運(yùn)算得到當(dāng)前版本此條評(píng)論應(yīng)該顯示的行號(hào)。
(6)將讀取到的文件、文件所有的評(píng)論、每條評(píng)論在當(dāng)前版本的行號(hào)一并返回視圖層。
(7)添加評(píng)論是將倉(cāng)庫(kù)ID、branch、文件名、行號(hào)、評(píng)論內(nèi)容存入數(shù)據(jù)庫(kù)中生成記錄??绨姹具w移的軟件評(píng)審實(shí)現(xiàn)流程如下:
圖1 跨版本遷移的實(shí)現(xiàn)流程
平臺(tái)前端頁(yè)面采用Syntaxhighlighter框架結(jié)合jQuery實(shí)現(xiàn)不同軟件文件內(nèi)容的高亮顯示,很好地支持了Java、XML、PHP等16種文件形式,并結(jié)合HT?ML5、CSS3等前端技術(shù)呈現(xiàn)友好的界面。后臺(tái)程序以Spring Boot為框架,以Java為主要開(kāi)發(fā)語(yǔ)言,通過(guò)Java調(diào)用JGit的API實(shí)現(xiàn)對(duì)Git倉(cāng)庫(kù)的相關(guān)操作,后臺(tái)與數(shù)據(jù)庫(kù)MySQL的連接、查詢、添加等數(shù)據(jù)交互是通過(guò)JSON數(shù)據(jù)對(duì)象來(lái)實(shí)現(xiàn)。使用面向?qū)ο蟮拈_(kāi)發(fā)結(jié)構(gòu)和MVC模式;后臺(tái)通過(guò)JGit實(shí)現(xiàn)本地倉(cāng)庫(kù)信息的讀取,并在前端通過(guò)AJAX接收返回的數(shù)據(jù)和對(duì)應(yīng)的評(píng)審結(jié)果。JGit是一款由Eclipse基金會(huì)提供支持的輕量級(jí)、Java庫(kù)實(shí)現(xiàn)的Git版本控制系統(tǒng),包括三大部分:(1)版本庫(kù)訪問(wèn)程序(2)網(wǎng)絡(luò)協(xié)議(3)核心版本控制算法。圖2為本平臺(tái)的技術(shù)框架。
Step1:前端通過(guò)AJAX傳遞當(dāng)前文件的倉(cāng)庫(kù)編碼、文件名稱、分支,后臺(tái)根據(jù)倉(cāng)庫(kù)編碼得到在數(shù)據(jù)庫(kù)中存儲(chǔ)的對(duì)應(yīng)的倉(cāng)庫(kù)路徑。
Step2:根據(jù)倉(cāng)庫(kù)編碼在數(shù)據(jù)庫(kù)中查找倉(cāng)庫(kù)路徑,從而得到當(dāng)前文件在Git倉(cāng)庫(kù)中的路徑。
Step3:通過(guò)獲取的文件路徑從字符輸入流中讀取本地Git倉(cāng)庫(kù)的文件,創(chuàng)建BufferedReader對(duì)象逐行緩沖各個(gè)字符,并將讀取的字符存儲(chǔ)到一個(gè)ArrayList的結(jié)構(gòu)中。
Step4:通過(guò)JGit提供的獲得文件版本編號(hào)的API獲得所有提交過(guò)的日志信息中的版本編號(hào)。
Step5:將獲得的所有版本編號(hào)拼成一個(gè)字符串,用之在數(shù)據(jù)庫(kù)中查找所有歷史版本的評(píng)論。
跨版本文件中評(píng)論信息的遷移主要由兩部分實(shí)現(xiàn):首先獲得提交日志中所有版本中的評(píng)論信息,將每條評(píng)論信息所在的版本與當(dāng)前版本作git diff的對(duì)比,從而得知相對(duì)當(dāng)前版本增加的行號(hào)和減少的行號(hào)。通過(guò)使用JGit提供的git diff的API,實(shí)現(xiàn)兩個(gè)文件差異的比較。
動(dòng)態(tài)計(jì)算原理:通過(guò)分析git diff返回的對(duì)比結(jié)果,歷史版本對(duì)于當(dāng)前版本新增行數(shù)的數(shù)組和刪減行數(shù)的數(shù)組。遍歷增加的行數(shù)數(shù)組,歷史版本中記錄評(píng)論的行號(hào)后移分為兩種情況:①若新增的行號(hào)小于歷史版本中記錄行號(hào),則歷史版本記錄行號(hào)需向后移動(dòng)一位。②若新增行號(hào)等于歷史版本記錄行號(hào),連續(xù)增加幾行則歷史行號(hào)需后移幾位。同理歷史版本中記錄評(píng)論的行號(hào)向前移動(dòng)亦然。用一個(gè)變量diffCount記錄需要增加或刪減的行數(shù),則當(dāng)前版本中的評(píng)論行號(hào)就等于歷史版本中記錄的行號(hào)加變量diffCount。
開(kāi)發(fā)過(guò)程中開(kāi)發(fā)人員不斷的對(duì)文件進(jìn)行修改,然后不斷地提交修改到版本庫(kù)里??绨姹具w移平臺(tái)實(shí)現(xiàn)了評(píng)審的文件的多個(gè)版本的切換,評(píng)論結(jié)果不丟失,并對(duì)應(yīng)匹配文件行號(hào)。本文跨版本遷移的軟件評(píng)審平臺(tái)需要的環(huán)境配置如下:
表1 實(shí)驗(yàn)環(huán)境軟件工具表
目前流行的軟件評(píng)審系統(tǒng)大致分為三種。第一種是簡(jiǎn)單的和輕量級(jí)的評(píng)審系統(tǒng),但是這種只是單純的代碼評(píng)審工具并沒(méi)有關(guān)聯(lián)到遠(yuǎn)程代碼倉(cāng)庫(kù)。不能立即對(duì)更新的代碼做最新的評(píng)審降低評(píng)審效率。需要每次手動(dòng)導(dǎo)入帶評(píng)審項(xiàng)目,給評(píng)審帶來(lái)便。第二種就如谷歌開(kāi)發(fā)的Gerrit一樣,實(shí)際上一個(gè)Git服務(wù)器,它為在其服務(wù)器上托管的Git倉(cāng)庫(kù)提供一系列權(quán)限控制。這種評(píng)審系統(tǒng)龐大,不僅需要進(jìn)行復(fù)雜的公鑰、私鑰配置。第三種是基于SVN的軟件評(píng)審系統(tǒng),SVN采用集中式代碼管理,頻繁的提交代碼會(huì)致使服務(wù)器壓力過(guò)大,數(shù)據(jù)庫(kù)容量暴增。并且如果連接不到服務(wù)器就無(wú)法工作非常受限。而本文研發(fā)的基于Git的跨版本遷移的軟件評(píng)審系統(tǒng)不僅省去繁瑣的配置工作,也不需要隨文件的改動(dòng)手動(dòng)再次導(dǎo)入需要評(píng)審的文件,提高了開(kāi)發(fā)的效率為開(kāi)發(fā)人員節(jié)省了工作時(shí)間。
本文研發(fā)的系統(tǒng)是一個(gè)基于Web在線的代碼評(píng)審系統(tǒng)原型,使用Git版本控制系統(tǒng)讀取Git倉(cāng)庫(kù)文件作代碼評(píng)審。操作簡(jiǎn)單不需要手動(dòng)導(dǎo)入待評(píng)審文件也不需要繁瑣的公鑰、秘鑰配置。目前并沒(méi)有一個(gè)軟件評(píng)審工具具有跨版本的遷移功能。評(píng)審文件各個(gè)版本之間自由切換,評(píng)審標(biāo)記和評(píng)審信息隨之改變。這樣每次開(kāi)放人員提交新的版本就不需要從新評(píng)審。系統(tǒng)將自動(dòng)與之前的版本做對(duì)比顯示標(biāo)注和評(píng)審信息。使軟件評(píng)審的過(guò)程更加輕巧便捷,開(kāi)發(fā)人員隨時(shí)掌握軟件代碼的最新?tīng)顟B(tài)節(jié)省了開(kāi)發(fā)時(shí)間,提升了評(píng)審效率。