日子走呀走,就没了踪影,也忘了是多少周前,团队从 SVN 切换到 Git,以前写的 SVN 周报工具也算是安心退役了。前天终于下定决心写个基于 Git 的周报工具。

我对工具的构思如下:

  1. 团队成员约定每次提交都简短描述变更的功能
  2. 功能描述以「分号」或者「换行」分隔
  3. 如果再次提交相同功能则以“update”作为标识提交信息
  4. 周报内容为各个项目下各成员的工作信息
  5. 生成一张周报图片利于我发邮件

上一个周报工具是用 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 的周报生成工具相关推荐

  1. java beandw_【开发童鞋福音】基于数据库的自动化生成工具-TableGo,生成JavaBean、数据库文档等等...

    [Java] 纯文本查看 复制代码/* * Welcome to use the TableGo Tools. * * http://vipbooks.iteye.com * http://blog. ...

  2. AI 工具分享第 4 期:13 款国外免费AI视频生成工具

    0. 未来百科 未来百科,是一个知名的AI产品导航网站 -- 为发现全球优质AI工具而生 .目前已 聚集全球3000+优质AI工具产品 ,旨在帮助用户发现全球最好的AI工具,同时为研发AI垂直应用的创 ...

  3. sql自动生成工具_可自动生成代码,5款基于AI的开发工具

    如今,对机器学习潜力感兴趣的程序员都在讨论,如何使用人工智能和基于人工智能的软件开发工具构建应用程序.例如PyTorch和TensorFlow之类的解决方案. 除此之外,机器学习技术正以另一种有趣的方 ...

  4. java 接口文档工具_一款Java基于注释的接口文档生成工具

    一. 痛点 你还在手动维护接口文档嘛,花一个下午不停的复制粘贴代码里面的注释 接口字段变动,还得去更新文档,更新不及时导致文档不同步 或者你使用了swagger之类的基于注解,依靠运行时的文档工具,看 ...

  5. 基于bboss开发平台eclipse开发工程生成工具介绍

    为什么80%的码农都做不了架构师?>>>    基于bboss开发平台eclipse开发工程生成工具介绍 一.工具简介   bboss开发平台发布出两个资源包:  war部署包  数 ...

  6. 用java写ods系统_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo是基于数据库的代码自动生成工具,低代码编程技术的实现,可以零代码自动生成SpringBoot项目工程.生成JavaBean.生成前后端分离的CRUD代码.生成MyBaits的Mapper ...

  7. 最简单的基于FFmpeg的libswscale的示例附件:测试图片生成工具

    ===================================================== 最简单的基于FFmpeg的libswscale的示例系列文章列表: 最简单的基于FFmpeg ...

  8. java生成iso9660工具_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo_20210212 v7.0.0 正式版发布,此次版本更新如下: 1.新增对DB2数据库的支持 2.新增按字段生成文件,支持把字段.JSON.XML数据转换成任何代码 3.新增大量新的自 ...

  9. freemarker mysql 生成bean_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.6.6版)...

    TableGo_20191026 v6.6.6 正式发布,此次版本更新如下: 1.新增通过自定义模板生成Word文档的功能,可以使用FreeMarker模板生成自定义格式的数据库文档. 2.新增 Sw ...

最新文章

  1. 服务器端物理实现(二)
  2. console用法java_使用console对javaScirpt进行全面调试-全面分析console用法
  3. 详解静态路由(入门类)
  4. kmdjs api reference
  5. Unhandled promise rejection Error: errCode: -501007 invalid parameters | errMsg: Invalid Key Name: _
  6. 理解图像配准中的LMeds、M-estimators与RANSAC算法
  7. ASP.NET模拟其他用户进行关机
  8. Linux环境下Python的安装过程
  9. 【Linux】Another app is currently holding the yum lock; waiting for it to exit...
  10. java excel 2007兼容包_Office 2007兼容包官方下载_2007 Office system 兼容包免费版下载-华军软件园...
  11. 一个磁力API接口,可自动将磁力链接转换成种子文件提供下载,并返回磁力和磁力对应的种子的详细信息
  12. win10自带录屏工具
  13. TFIDF的原理及实现
  14. 知其然知其所以然 itoa实现 整型转字符串
  15. 2021年P气瓶充装模拟考试及P气瓶充装考试试题
  16. 360 电脑重装系统服务器,电脑如何重装系统?360快速重装电脑系统教程
  17. 【python】删除excel表格重复行,数据预处理
  18. php基本变量,PHP-语法及变量基本操作
  19. 短时交通预测方法总结
  20. 12月php粉红色婚恋交友源码V6.0分享下载研究学习

热门文章

  1. golang中的strings.IndexRune
  2. golang中的二维数组和二维切片
  3. fin.is_open()与fin.open()有什么区别?
  4. pyqt5中信号与槽的认识
  5. 介绍什么是极限编程?
  6. 【js基础】理清Object、Object.prototype、Function、Function.prototype
  7. 【译】JS基础算法脚本:类数组(arguments)去重
  8. Qtopia-2.2.0 的配置和交叉编译
  9. Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍
  10. NIO入门系列之第3章:从理论到实践:NIO 中的读和写