UNPKG

@donedeal0/codefather

Version:

Codefather protects your codebase by controlling who can change what. Set authorization levels, lock down files, and enforce your rules—offline via CLI or online with GitHub Actions.

2 lines • 3 kB
#!/usr/bin/env node import {f,e,g,c,b as b$1,a,d as d$1}from'../chunk-UCSYAM6A.js';import {b}from'../chunk-WALCJIPE.js';import {resolve}from'path';import {getOctokit,context}from'@actions/github';var d=class i{octokit;constructor(){this.octokit=getOctokit(process.env.GITHUB_TOKEN||"");}static init(){return new i}getUniqueCommittersList(t){return t.reduce((e,{commit:s,committer:n})=>{let r=n?.login,o=a(s.author?.email);if(!r&&!o)return e;if(!(e.nameMap.has(r)||e.emailMap.has(o))){let f={name:r,emailPrefix:o};r&&e.nameMap.add(r),o&&e.emailMap.add(o),e.list.push(f);}return e},{nameMap:new Set,emailMap:new Set,list:[]}).list}async getCommitters(t,e=true){let{data:s}=await this.octokit.rest.pulls.listCommits({owner:context.repo.owner,repo:context.repo.repo,pull_number:t});if(!s.length)throw new Error("\u{10102} Couldn't find any commits in this pull request.");let n=e?s:[s[0]],r=this.getUniqueCommittersList(n);if(r.length===0)throw new Error("\u{10102} Couldn\u2019t find email or username in the commit author metadata.");return r}getPullRequestID(){let t=context.payload?.pull_request?.number;return t||(console.log(b.error,"\u{10102} Missing pull request number. Can't proceed without it."),process.exit(1)),t}async getModifiedFiles(t){let{data:e}=await this.octokit.rest.pulls.listFiles({owner:context.repo.owner,repo:context.repo.repo,pull_number:t});return e.map(s=>resolve(s.filename))}getRelevantReviewers(t,e,s){let{caporegimes:n=[],rules:r=[]}=s,o=s.codeReviews?.autoAssignCaporegimes?n:[],p=[],f=process.cwd();for(let c of t){let m=r.find(u=>d$1([c],u.match,f).length>0);m&&(m.crews&&p.push(...m.crews),o.push(...m.goodfellas||[]));}let T=o.filter(({name:c,emailPrefix:m})=>!e.some(u=>c&&u.name===c||m&&u.emailPrefix===m)),U=[...new Set(T.map(({name:c})=>c).filter(Boolean))],k=[...new Set(p)];return {reviewers:U,crews:k}}async assignReviewers(t,e,s,n){let{reviewers:r,crews:o}=this.getRelevantReviewers(e,s,n);if(r.length!==0)return await this.octokit.rest.pulls.requestReviewers({owner:context.repo.owner,repo:context.repo.repo,pull_number:t,reviewers:r,...o.length>0?{team_reviewers:o}:{}})}};async function M(){try{!process.env.CI&&process.env.GITHUB_ACTIONS!=="true"&&(console.log(b.error,"\u{10102} This script is intended to run inside GitHub Actions."),process.exit(1)),process.env.GITHUB_TOKEN||(console.log(b.error,"\u{10102} GITHUB_TOKEN is missing. Pass it via `env:` in your workflow to make this work."),process.exit(1));let i=await f(),t=i.options?.showAscii??!0,e$1=d.init(),s=e$1.getPullRequestID(),n=await e$1.getCommitters(s,i.options?.vouchForAllCommitters),r=await e$1.getModifiedFiles(s),o=e(r,n,i);return ((i.codeReviews?.autoAssignGoodfellas??!0)||i.codeReviews?.autoAssignCaporegimes)&&await e$1.assignReviewers(s,r,n,i),o.errors.length===0&&o.warnings.length===0&&(t&&c(b.success),console.log(b.success,b$1("success",{committers:n})),process.exit(0)),g(o,t)}catch(i){let t=i instanceof Error?i.message:String(i);console.log(b.error,t),process.exit(1);}}M();