实现示例type Rule = { pattern: string; owners: string[] }
type Change = { path: string; author: string }
function match(pattern: string, path: string): boolean {
const rx = new RegExp('^' + pattern.replace(/[.+^${}()|[\]\\]/g, r => '\\' + r).replace(/\*/g, '.*') + '$')
return rx.test(path)
}
function ownersFor(rules: Rule[], path: string): string[] {
const hits = rules.filter(r => match(r.pattern, path))
if (hits.length === 0) return []
const last = hits[hits.length - 1]
return last.owners
}
function requireReview(rules: Rule[], changes: Change[]): { need: { path: string; owners: string[] }[] } {
const need: { path: string; owners: string[] }[] = []
for (const c of changes) {
const o = ownersFor(rules, c.path)
if (o.length > 0 && !o.includes(c.author)) need.push({ path: c.path, owners: o })
}
return { need }
}
审计与运行治理记录关键路径变更与责任人;未满足审查门禁阻断合并。例外需到期与审批人;产线默认拒绝未审批项。

发表评论 取消回复