1. 程式人生 > >記-統計svn與git的log日誌中的程式碼行變更

記-統計svn與git的log日誌中的程式碼行變更

任務要求

統計指定時間內,指定git地址與svn地址上的所有人員的程式碼行變更情況。

 

解決方案

最初為根據資料庫中儲存的所有git與svn地址來統計所有人員的提交程式碼行。之後由於庫中儲存的地址不全,改為通過gitlab api,找到上面的所有倉庫,之後統計程式碼行。svn由於資料庫中地址儲存較全,所以還是從庫中獲取地址。

 

實際流程

git程式碼行統計:

任意一個git的ip地址內會包含很多倉庫地址,每次呼叫api最多隻能查出100條地址,需要設定起始查詢的頁數。

所以先呼叫api查詢出來一共有多少頁(需要傳入每次每頁展示多少條資料)

curl --head
--header 'PRIVATE-TOKEN:Token祕鑰' 'gitlab倉庫ip地址/api/v4/projects?per_page=100'

 

之後for迴圈每頁,查詢出該ip地址下所有的倉庫地址。

這是查詢某一頁的地址的命令,返回的是json結果。

curl --header 'PRIVATE-TOKEN:Token祕鑰' 'gitlab倉庫ip地址/api/v4/projects?page=起始頁數&per_page=查詢條數'

 

拿到倉庫地址後,需要先將倉庫clone下來。然後查詢該倉庫的所有分支,並迴圈切換每一個分支。

1、先查詢出在指定時間節點上的所有提交人

git log  --format='%cn' --since="${start_time}" --until="${end_time}"

2、對人名去重後遍歷每一個提交人,

然後查詢出該人員在指定時間段內的所有提交hash碼(每一次提交都會生成一個唯一的hash碼)

git log --format='%H' --committer="${name}" --since="${start_time}" --until="${end_time}"

3、此時需要注意一點:如果我們以某一個分支為基礎重新拉一個分支,那麼舊分支的提交歷史也被拉到新分支上,統計的時候就會造成重複統計(某一個人只提交了一次,但這次的提交歷史會出現在多個分支上),但相同提交的hash值卻不會重複。

所以我們在查出“某個git地址的某個分支裡的某次提交的hash值”後,需要將這條暫存起來,當統計該git地址的其他分支的時候,如果還出現這個提交hash值時,就不要統計了。

4、在確定該此hash值沒有重複後,根據該hash值查詢出這次的提交詳情

git show ${chash}

根據詳情裡面的+、-符號可以統計出增減的程式碼行,更具體的也能編寫正則區分有效程式碼行、空行與註釋行。

 

到此時我們已經有了 在某個時間段內 某個git地址的某個分支的某個人的某次提交的程式碼變更行數詳情。

 

svn程式碼行統計:

svn的提交歷史的統計與git有所不同。

svn不需要將倉庫下載到本地,可以遠端檢視某一倉庫地址的所有log日誌。

svn的檢視歷史程式碼行詳情為兩個步驟:

一:可以通過命令

svn log -v -r {"$start_time"}:{"$end_time"} ${now_url}

查詢出某個時間段內某個倉庫地址的所有變更檔案的路徑,其中還包括了提交人和“變更的版本號”,但是看不到具體某檔案的變更詳情。

二:可以通過命令

svn diff -c ${rversion} ${fileurl}

查詢出具體某變更檔案(包括路徑)的某個版本的變更詳情。

 

所以第一步顯示查詢出所有變更檔案路徑,然後再對具體檔案的具體版本進行變更詳情的查詢。

 

此處我採用的統計方法有些不穩,我是遍歷每一行,根據每一行的內容,來進行統計。

1、如果當前行為"------------------------------------------------------------------------"

則表示下一行該顯示使用者名稱和版本號了,然後下一行遍歷是就正則出這兩個資訊。

2、如果當前行為"Changed paths:"

則表示下一行該正則出文件路徑了

此處需要對檔案路徑進行進一步排查,因為還存在很多:如圖片檔案等無法或不需要統計程式碼行的檔案被提交的情況,這些檔案就不需要進一步檢視他們的內容變更詳情。

3、如果檔案格式正確,則可以通過命令查詢出該版本下此檔案的變更詳情,然後進行統計。

依然可通過每行第一位的+-符號來判斷具體行的變更情況。

 

後續的一些處理操作:

每次統計出結果後,可以將所有的統計引數傳給其他指令碼檔案,最終將這次的統計結果傳入資料庫。