Browse Source

✨ feat: 完善分支切换功能

Pchen. 3 months ago
parent
commit
ac3e34c487
2 changed files with 100 additions and 11 deletions
  1. 71 0
      apis/GitActions/ChangeBranch.js
  2. 29 11
      apis/Repos/GetRepoStatus.js

+ 71 - 0
apis/GitActions/ChangeBranch.js

@@ -0,0 +1,71 @@
+const API = require("../../lib/API")
+const AccessControl = require("../../lib/AccessControl")
+const { BaseStdResponse } = require("../../BaseStdResponse")
+const db = require("../../plugin/DataBase/db")
+const simpleGit = require('simple-git')
+
+class ChangeBranch extends API {
+    constructor() {
+        super()
+
+        this.setMethod("GET")
+        this.setPath("/GitActions/ChangeBranch")
+    }
+
+    async onRequest(req, res) {
+        let { uuid, session, id, branch } = req.query
+
+        if ([uuid, session, id].some(value => value === '' || value === null || value === undefined))
+            return res.json({
+                ...BaseStdResponse.MISSING_PARAMETER
+            })
+
+        // 检查 session
+        if (!await AccessControl.checkSession(uuid, session))
+            return res.status(401).json({
+                ...BaseStdResponse.ACCESS_DENIED
+            })
+
+        let sql = 'SELECT state, path, url FROM repos WHERE create_user = ? AND id = ?'
+        let r = await db.query(sql, [uuid, id])
+        if (!r || r.length === 0)
+            return res.json({
+                ...BaseStdResponse.ERR,
+                msg: '未找到仓库'
+            })
+
+        if (r[0].state !== 1 || !r[0].path)
+            return res.json({
+                ...BaseStdResponse.ERR,
+                msg: '仓库未成功克隆!'
+            })
+
+        try {
+            const git = simpleGit()
+            await git.cwd(r[0].path)
+
+            const branches = await git.branch()
+            if(!branches.all.includes(branch))
+                return res.json({
+                    ...BaseStdResponse.ERR,
+                    msg: '分支不存在!'
+                })
+
+            await git.checkout(branch)
+            
+            res.json({
+                ...BaseStdResponse.OK
+            })
+
+        } catch (error) {
+            this.logger.error('切换仓库分支失败!' + error.stack)
+            return res.json({
+                ...BaseStdResponse.ERR,
+                msg: '切换仓库分支失败!'
+            })
+        }
+
+    }
+}
+
+module.exports.ChangeBranch = ChangeBranch

+ 29 - 11
apis/Repos/GetRepoStatus.js

@@ -2,8 +2,7 @@ const API = require("../../lib/API")
 const AccessControl = require("../../lib/AccessControl")
 const { BaseStdResponse } = require("../../BaseStdResponse")
 const db = require("../../plugin/DataBase/db")
-const axios = require('axios')
-const { core_url } = require('../../config.json')
+const simpleGit = require('simple-git')
 
 class GetRepoStatus extends API {
     constructor() {
@@ -27,7 +26,7 @@ class GetRepoStatus extends API {
                 ...BaseStdResponse.ACCESS_DENIED
             })
 
-        let sql = 'SELECT state, path, url FROM repos WHERE create_user = ? AND id = ?'
+        let sql = 'SELECT name, logo, create_time, update_time, state, path, url FROM repos WHERE create_user = ? AND id = ?'
         let r = await db.query(sql, [uuid, id])
         if (!r || r.length === 0)
             return res.json({
@@ -42,16 +41,35 @@ class GetRepoStatus extends API {
             })
 
         try {
-            const clone_url = core_url + '/git/status'
-            const response = await axios.post(clone_url, { uuid, repo_url: r[0].url })
-            if (!response || !response.data)
-                return res.json({
-                    ...BaseStdResponse.ERR,
-                    msg: '获取仓库状态失败!'
-                })
+            const git = simpleGit()
+            await git.cwd(r[0].path)
+            let status = await git.status()
+            const branches = await git.branch()
+            const remoteBranches = Object.keys(branches.branches)
+                .filter(branch => branch.startsWith('remotes/origin/'))
+                .reduce((acc, branch) => {
+                    const newBranchName = branch.replace('remotes/origin/', '')
+                    acc[newBranchName] = {
+                        ...branches.branches[branch], 
+                        name: newBranchName
+                    };
+                    return acc
+                }, {})
+
             res.json({
                 ...BaseStdResponse.OK,
-                data: response.data
+                data: {
+                    status,
+                    branches: remoteBranches,
+                    info: {
+                        name: r[0].name,
+                        url: r[0].url,
+                        logo: r[0].logo,
+                        create_time: r[0].create_time,
+                        update_time: r[0].update_time,
+                        state: r[0].state
+                    },
+                }
             })
 
         } catch (error) {