任務要求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:"
則表示下一行該正則出文件路徑了
此處須要對文件路徑進行進一步排查,由於還存在不少:如圖片文件等沒法或不須要統計代碼行的文件被提交的狀況,這些文件就不須要進一步查看他們的內容變動詳情。
三、若是文件格式正確,則能夠經過命令查詢出該版本下此文件的變動詳情,而後進行統計。
依然可經過每行第一位的+-符號來判斷具體行的變動狀況。
後續的一些處理操做:
每次統計出結果後,能夠將全部的統計參數傳給其餘腳本文件,最終將此次的統計結果傳入數據庫。