基于 NodeGit 的周报生成工具
日子走呀走,就沒了蹤影,也忘了是多少周前,團隊從 SVN 切換到 Git,以前寫的 SVN 周報工具也算是安心退役了。前天終于下定決心寫個基于 Git 的周報工具。
我對工具的構思如下:
上一個周報工具是用 Nodejs + svn 命令實現的,這次就不想用 git 命令配合了。于是上網搜了一些資料后,發現 NodeGit 這個庫很適合。那么主旋律確定了,就可以開始動工了,以下是流程圖。
根據流程圖得出以下的整體流程代碼:
async function init() {const folders = fs.readdirSync(config.dir)// 獲取到不存在的git倉庫(約定文件夾都是git倉庫)(其實也可以根據是否有.git 或者 nodeGit的exist)const emptyProjects = config.projects.filter(v => folders.indexOf(v.folder) === -1)if (emptyProjects.length) {// 創建本地不存在git倉庫await createRespository(emptyProjects)}// 獲取commit信息const logs = await getRepositoryLog()// 生成周報renderReport(logs) }復制代碼讀取本地 Git 倉庫目錄,這里取(tou)巧(lan)了,約定存在文件夾即認為存在 git 倉庫,其實也可以根據是否有.git 目錄或者通過 nodeGit 的 exit 來判斷。
不存在與本地的 Git 倉庫,考慮到有很多項目是沒必要 clone 到本地的,所以我并不想把整個 Git 倉庫都拉到本地,只是想創建個鏈接,然后拉取一下 Log 信息。所以實現的功能如同以下命令:
git init git fetch origin git log --all 復制代碼獲取 Git 提交記錄,通過 nodeGit 的 Revwalk 實現 log 所有分支的 commit 信息。其中內部約定重復提交的信息以 update 字符標識,程序上會忽略這個提交信息。
const repo = await nodeGit.Repository.open(`${temporaryFolder}/.git`) const walker = nodeGit.Revwalk.create(repo) // 通過pushGlob來獲取所有分支的提交記錄 walker.pushGlob('*') // 獲取符合日期的commits const commits = await walker.getCommitsUntil(c => {const now = c.date()return now > beginDate && now < endDate })const selfCommits = [] Promise.all(commits.filter(x => {// 過濾不需要記錄的commit信息const regexp = new RegExp(`${projectFolder}|update|merge`, 'gi')return !regexp.test(x.message())}).map(async x => {// 是否需要統計行數const total = needCount ? await countLines(x) : 0// 構建周報信息集selfCommits.push({msg: x.message().split(/\n|;/g).filter(v => v.length),total,project: projectName,committer: x.committer().name()})}) ).then(() => {resolve(selfCommits) })復制代碼生成周報,最后通過 markvis、markdown-it、d3-node 生成周報圖片,具體的項目路徑、名字、賬號、密碼、是否統計行數在 config/index.js 中配置。
// ./config/index.js module.exports = {username: 'username', // Git usernamepassword: 'password', // Git passwordreponame: 'origin', // Repository namedir: 'Git directory path', // /Users/viccici/githubreportDir: 'Report directory path', // /Users/viccici/reportcommiter: {'Git name': 'Real name' // Git committer name matching the real name},projects: [{name: 'Project name', // We often use chinese project namefolder: 'Project folder', // Git folder name that based on git path. [ PS: weekly-report-git ]path: 'Git path',count: true // Whether to count}] } 復制代碼最終的結果如下圖。
該周報工具更多的依賴于團隊的約定,否則周報信息可讀性就很差,后續還需要跟隊員們商量更優的方案。NodeGit 還有很多需要深挖的知識點,后續會花點時間認真研究,從而能優化此周報工具。如有興趣 or 更好想法,可到這里留言觀看。
總結
以上是生活随笔為你收集整理的基于 NodeGit 的周报生成工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TriggerMesh开源用于多云环境的
- 下一篇: JS函数式编程概念理解:函子(Funct