GetRepoLog.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. const API = require("../../lib/API")
  2. const AccessControl = require("../../lib/AccessControl")
  3. const { BaseStdResponse } = require("../../BaseStdResponse")
  4. const db = require("../../plugin/DataBase/db")
  5. const simpleGit = require('simple-git')
  6. class GetRepoLog extends API {
  7. constructor() {
  8. super()
  9. this.setMethod("GET")
  10. this.setPath("/Repos/Log")
  11. }
  12. async onRequest(req, res) {
  13. let { uuid, session, id } = req.query
  14. if ([uuid, session, id].some(value => value === '' || value === null || value === undefined))
  15. return res.json({
  16. ...BaseStdResponse.MISSING_PARAMETER
  17. })
  18. // 检查 session
  19. if (!await AccessControl.checkSession(uuid, session))
  20. return res.status(401).json({
  21. ...BaseStdResponse.ACCESS_DENIED
  22. })
  23. let sql = 'SELECT state, path, url FROM repos WHERE create_user = ? AND id = ?'
  24. let r = await db.query(sql, [uuid, id])
  25. if (!r || r.length === 0)
  26. return res.json({
  27. ...BaseStdResponse.ERR,
  28. msg: '未找到仓库'
  29. })
  30. if (r[0].state !== 1 || !r[0].path)
  31. return res.json({
  32. ...BaseStdResponse.ERR,
  33. msg: '仓库未成功克隆!'
  34. })
  35. try {
  36. const git = simpleGit()
  37. await git.cwd(r[0].path)
  38. const rawLogs = await git.raw([
  39. "log",
  40. "--no-merges",
  41. "--pretty=format:%H|%an|%ae|%ad|%s",
  42. "--shortstat"
  43. ])
  44. const lines = rawLogs.split("\n")
  45. const commits = []
  46. let current = null
  47. for (let i = 0; i < lines.length; i++) {
  48. const line = lines[i].trim()
  49. // 提交信息行
  50. if (line.includes("|") && !line.includes("file changed")) {
  51. const [hash, name, email, date, ...messageParts] = line.split("|")
  52. current = {
  53. hash,
  54. name,
  55. email,
  56. date,
  57. message: messageParts.join("|").trim()
  58. }
  59. commits.push(current)
  60. }
  61. }
  62. res.json({
  63. ...BaseStdResponse.OK,
  64. data: commits
  65. })
  66. } catch (err) {
  67. res.json({
  68. ...BaseStdResponse.ERR,
  69. message: "Git 日志分析失败"
  70. });
  71. }
  72. }
  73. }
  74. module.exports.GetRepoLog = GetRepoLog