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.28 kB
#!/usr/bin/env node 'use strict';var chunkUNDY3OR3_cjs=require('../chunk-UNDY3OR3.cjs'),chunkFS6RMYAZ_cjs=require('../chunk-FS6RMYAZ.cjs'),path=require('path'),github=require('@actions/github');var d=class i{octokit;constructor(){this.octokit=github.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=chunkUNDY3OR3_cjs.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:github.context.repo.owner,repo:github.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=github.context.payload?.pull_request?.number;return t||(console.log(chunkFS6RMYAZ_cjs.c.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:github.context.repo.owner,repo:github.context.repo.repo,pull_number:t});return e.map(s=>path.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=>chunkUNDY3OR3_cjs.d([c],u.match,f).length>0);m&&(m.crews&&p.push(...m.crews),o.push(...m.goodfellas||[]));}let M=o.filter(({name:c,emailPrefix:m})=>!e.some(u=>c&&u.name===c||m&&u.emailPrefix===m)),T=[...new Set(M.map(({name:c})=>c).filter(Boolean))],U=[...new Set(p)];return {reviewers:T,crews:U}}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:github.context.repo.owner,repo:github.context.repo.repo,pull_number:t,reviewers:r,...o.length>0?{team_reviewers:o}:{}})}};async function y(){try{!process.env.CI&&process.env.GITHUB_ACTIONS!=="true"&&(console.log(chunkFS6RMYAZ_cjs.c.error,"\u{10102} This script is intended to run inside GitHub Actions."),process.exit(1)),process.env.GITHUB_TOKEN||(console.log(chunkFS6RMYAZ_cjs.c.error,"\u{10102} GITHUB_TOKEN is missing. Pass it via `env:` in your workflow to make this work."),process.exit(1));let i=await chunkUNDY3OR3_cjs.f(),t=i.options?.showAscii??!0,e=d.init(),s=e.getPullRequestID(),n=await e.getCommitters(s,i.options?.vouchForAllCommitters),r=await e.getModifiedFiles(s),o=chunkUNDY3OR3_cjs.e(r,n,i);return ((i.codeReviews?.autoAssignGoodfellas??!0)||i.codeReviews?.autoAssignCaporegimes)&&await e.assignReviewers(s,r,n,i),o.errors.length===0&&o.warnings.length===0&&(t&&chunkUNDY3OR3_cjs.c(chunkFS6RMYAZ_cjs.c.success),console.log(chunkFS6RMYAZ_cjs.c.success,chunkUNDY3OR3_cjs.b("success",{committers:n})),process.exit(0)),chunkUNDY3OR3_cjs.g(o,t)}catch(i){let t=i instanceof Error?i.message:String(i);console.log(chunkFS6RMYAZ_cjs.c.error,t),process.exit(1);}}y();