記-統計svn與git的log日誌中的代碼行變動

任務要求git

統計指定時間內,指定git地址與svn地址上的全部人員的代碼行變動狀況。數據庫

 

解決方案json

最初爲根據數據庫中存儲的全部git與svn地址來統計全部人員的提交代碼行。以後因爲庫中存儲的地址不全,改成經過gitlab api,找到上面的全部倉庫,以後統計代碼行。svn因爲數據庫中地址存儲較全,因此仍是從庫中獲取地址。api

 

實際流程curl

git代碼行統計:svn

任意一個git的ip地址內會包含不少倉庫地址,每次調用api最多隻能查出100條地址,須要設置起始查詢的頁數。gitlab

因此先調用api查詢出來一共有多少頁(須要傳入每次每頁展現多少條數據)url

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

 

以後for循環每頁,查詢出該ip地址下全部的倉庫地址。spa

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

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

 

拿到倉庫地址後,須要先將倉庫clone下來。而後查詢該倉庫的全部分支,並循環切換每個分支。

一、先查詢出在指定時間節點上的全部提交人

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

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

而後查詢出該人員在指定時間段內的全部提交hash碼(每一次提交都會生成一個惟一的hash碼)

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

三、此時須要注意一點:若是咱們以某一個分支爲基礎從新拉一個分支,那麼舊分支的提交歷史也被拉到新分支上,統計的時候就會形成重複統計(某一我的只提交了一次,但此次的提交歷史會出如今多個分支上),但相同提交的hash值卻不會重複。

因此咱們在查出「某個git地址的某個分支裏的某次提交的hash值」後,須要將這條暫存起來,當統計該git地址的其餘分支的時候,若是還出現這個提交hash值時,就不要統計了。

四、在肯定該此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}

查詢出具體某變動文件(包括路徑)的某個版本的變動詳情。

 

因此第一步顯示查詢出全部變動文件路徑,而後再對具體文件的具體版本進行變動詳情的查詢。

 

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

一、若是當前行爲"------------------------------------------------------------------------"

則表示下一行該顯示用戶名和版本號了,而後下一行遍歷是就正則出這兩個信息。

二、若是當前行爲"Changed paths:"

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

此處須要對文件路徑進行進一步排查,由於還存在不少:如圖片文件等沒法或不須要統計代碼行的文件被提交的狀況,這些文件就不須要進一步查看他們的內容變動詳情。

三、若是文件格式正確,則能夠經過命令查詢出該版本下此文件的變動詳情,而後進行統計。

依然可經過每行第一位的+-符號來判斷具體行的變動狀況。

 

後續的一些處理操做:

每次統計出結果後,能夠將全部的統計參數傳給其餘腳本文件,最終將此次的統計結果傳入數據庫。

相關文章
相關標籤/搜索