代码统计

现有的:

gitstats 安装

  1. git clone git://github.com/hoxu/gitstats.git
  2. cd gitstats
  3. make install
  4. 提示gnuplot not found,需要安装gnuplot
  5. brew install gnuplot(这个过程很慢,需要安装大量包)
  6. 使用方式:gitstats 项目目录 输出目录

比较好的可视化网站:https://gitstats.report/

github: https://github.com/arjun27/gitstats

它实现的功能有:

  1. 近5周的activity summary(activity包括:commits、comments)
  2. 按项目、按人员筛选
  3. code review提出者、评论者

项目维度:

  1. 可以获取gitlab所有项目
  2. 可以获取某个用户owned所有项目(但无法获取某个用户参与的所有项目)
  3. 可以获取一个项目的所有成员(可以根据返回的username筛选项目)

commits维度:只能获取指定项目的commits

我要实现的功能及步骤:

  1. 组管理:只能通过group来获取团队的所有项目。手动录入group信息,再从组中拉取所有项目。
  2. 所有项目的commit数(可以按成员、日期筛选):x轴是项目,y轴是commit数
    1. 遍历组,获取每个组下的项目和成员
    2. 获取所有成员的项目:先获取所有项目,然后根据username进行筛选
    3. 获取每个项目的commit:循环所有项目,对每个项目获取commit
  3. 所有成员的commit数(可以按项目、日期筛选):x轴是成员,y轴是commit数
    1. 获取所有成员的项目:先获取所有项目,然后根据username进行筛选
    2. 获取每个项目的commit:循环所有项目,对每个项目获取commit
    3. 把commit分给成员
  4. 统计+1量
  5. 统计代码量
    1. 获取所有成员的项目:先获取所有项目,然后根据username进行筛选
    2. 获取每个项目的commit:循环所有项目,对每个项目获取commit
    3. 把commit分给成员
    4. 对每个成员的commit获取详情,统计行数

如何鉴权?

gitlab提供三种方式进行鉴权,鉴权方式

方案一:使用private token

  1. 一进入页面时,判断session里是否存在private token,不存在则弹窗让用户输入private token。输入完成后,把private token存入session。然后再发请求。

优点:实现简单

缺点:

  1. 需要用户手动输入private token
  2. session有效期过了以后,用户需要重新在gitlab上生成private token(因为gitlab生成token后只能让用户看到一次),然后再输入,比较麻烦

方案二:使用oauth2 token

  1. 把gitlab当作oauth2服务提供者,注册一个application,设置好回调地址Callback URL,会生成Application IDSecret
  2. 通过https://gitlab.example.com/oauth/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=token&state=YOUR_UNIQUE_STATE_HASH可以得到一个code,这里我应该使用https://git.xiaojukeji.com/oauth/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=token,state可以不加。APP_ID就是Application ID
  3. 得到code后,发起post请求至https://gitlab.example/com/oauth/token,参数是
    { "client_id": "APP_ID", "client_secret": "APP_SECRET", "code": "RETURN_CODE", "grant_type": "authorization_code", "redirect_uri": "REDIRECT_URI" }
    这样可以得到如下的返回结果,其中access_token是我们想要的:
    { "access_token": "1f0af717251950dbd4d73154fdf0a474a5c5119adad999683f5b450c460726aa", "token_type": "bearer", "expires_in": 7200 }
  4. 得到access_token后,就可以正常发起请求了

过程:

  1. 初次访问页面时,判断session里是否有token,若有,则直接请求。
  2. 若无,则重新请求token,存入session

问题:是否会过期?