日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于 NodeGit 的周报生成工具

發(fā)布時(shí)間:2025/5/22 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于 NodeGit 的周报生成工具 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

日子走呀走,就沒了蹤影,也忘了是多少周前,團(tuán)隊(duì)從 SVN 切換到 Git,以前寫的 SVN 周報(bào)工具也算是安心退役了。前天終于下定決心寫個(gè)基于 Git 的周報(bào)工具。

我對工具的構(gòu)思如下:

  • 團(tuán)隊(duì)成員約定每次提交都簡短描述變更的功能
  • 功能描述以「分號」或者「換行」分隔
  • 如果再次提交相同功能則以“update”作為標(biāo)識提交信息
  • 周報(bào)內(nèi)容為各個(gè)項(xiàng)目下各成員的工作信息
  • 生成一張周報(bào)圖片利于我發(fā)郵件
  • 上一個(gè)周報(bào)工具是用 Nodejs + svn 命令實(shí)現(xiàn)的,這次就不想用 git 命令配合了。于是上網(wǎng)搜了一些資料后,發(fā)現(xiàn) NodeGit 這個(gè)庫很適合。那么主旋律確定了,就可以開始動(dòng)工了,以下是流程圖。

    根據(jù)流程圖得出以下的整體流程代碼:

    async function init() {const folders = fs.readdirSync(config.dir)// 獲取到不存在的git倉庫(約定文件夾都是git倉庫)(其實(shí)也可以根據(jù)是否有.git 或者 nodeGit的exist)const emptyProjects = config.projects.filter(v => folders.indexOf(v.folder) === -1)if (emptyProjects.length) {// 創(chuàng)建本地不存在git倉庫await createRespository(emptyProjects)}// 獲取commit信息const logs = await getRepositoryLog()// 生成周報(bào)renderReport(logs) }復(fù)制代碼

    讀取本地 Git 倉庫目錄,這里取(tou)巧(lan)了,約定存在文件夾即認(rèn)為存在 git 倉庫,其實(shí)也可以根據(jù)是否有.git 目錄或者通過 nodeGit 的 exit 來判斷。

    不存在與本地的 Git 倉庫,考慮到有很多項(xiàng)目是沒必要 clone 到本地的,所以我并不想把整個(gè) Git 倉庫都拉到本地,只是想創(chuàng)建個(gè)鏈接,然后拉取一下 Log 信息。所以實(shí)現(xiàn)的功能如同以下命令:

    git init git fetch origin git log --all 復(fù)制代碼

    獲取 Git 提交記錄,通過 nodeGit 的 Revwalk 實(shí)現(xiàn) log 所有分支的 commit 信息。其中內(nèi)部約定重復(fù)提交的信息以 update 字符標(biāo)識,程序上會忽略這個(gè)提交信息。

    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 => {// 是否需要統(tǒng)計(jì)行數(shù)const total = needCount ? await countLines(x) : 0// 構(gòu)建周報(bào)信息集selfCommits.push({msg: x.message().split(/\n|;/g).filter(v => v.length),total,project: projectName,committer: x.committer().name()})}) ).then(() => {resolve(selfCommits) })復(fù)制代碼

    生成周報(bào),最后通過 markvis、markdown-it、d3-node 生成周報(bào)圖片,具體的項(xiàng)目路徑、名字、賬號、密碼、是否統(tǒng)計(jì)行數(shù)在 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}] } 復(fù)制代碼

    最終的結(jié)果如下圖。

    該周報(bào)工具更多的依賴于團(tuán)隊(duì)的約定,否則周報(bào)信息可讀性就很差,后續(xù)還需要跟隊(duì)員們商量更優(yōu)的方案。NodeGit 還有很多需要深挖的知識點(diǎn),后續(xù)會花點(diǎn)時(shí)間認(rèn)真研究,從而能優(yōu)化此周報(bào)工具。如有興趣 or 更好想法,可到這里留言觀看。

    總結(jié)

    以上是生活随笔為你收集整理的基于 NodeGit 的周报生成工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。