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