'use strict'; const { execFileSync } = require('child_process'); /** * 驗證遠端分支名稱可安全用於 refspec 與 refs/remotes/origin/*。 * * @param {string} refName - 使用者或事件 payload 提供的分支名稱。 * @param {string} fieldName - 錯誤訊息中的欄位名稱。 * @returns {string} 原樣回傳通過驗證的分支名稱。 * @throws {Error} 分支名稱空白、含路徑穿越,或不符合 git 分支 ref 規則時拋出。 */ function assertSafeBranchRef(refName, fieldName) { const value = String(refName || '').trim(); if (!value) throw new Error(`${fieldName} 不可為空。`); if (value.includes('..') || value.startsWith('/') || value.endsWith('/') || value.includes('\\')) { throw new Error(`${fieldName} 不是安全的分支名稱:${value}`); } try { execFileSync('git', ['check-ref-format', '--branch', value], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], }); } catch { throw new Error(`${fieldName} 不是合法的 git 分支名稱:${value}`); } return value; } module.exports = { assertSafeBranchRef, };