Add PR reviewer suggestions

This commit is contained in:
Sage Vaillancourt 2024-10-11 16:33:57 -04:00
parent 71b9a39a23
commit 59b4246d06
2 changed files with 74 additions and 1 deletions

View File

@ -1,7 +1,7 @@
{ {
"name": "Sage's BitBucket Addon", "name": "Sage's BitBucket Addon",
"description": "Ensure searches don't include forks (and other enhancements)", "description": "Ensure searches don't include forks (and other enhancements)",
"version": "1.0.15", "version": "1.0.16",
"manifest_version": 2, "manifest_version": 2,
"browser_specific_settings": { "browser_specific_settings": {
"gecko": { "gecko": {

View File

@ -33,4 +33,77 @@ const sortSearchResult = () => {
} }
} }
/////////////////////////////
// PR Reviewer Suggestions //
/////////////////////////////
if (location.toString().includes('/pull-requests?create')) {
const names = [
"Tam Nguyen",
"David Daniel",
"Nikalas Culvey",
"Michael Mezzina",
"Sage Vaillancourt",
"John Cyr",
"Adam Weizman",
"Caleb Soper",
"Rockey Liles",
"Fernando Batista"
]
const urlPrefix = 'https://git.add123.com/rest/api/latest'
fetch(`${urlPrefix}/projects/ADD/repos?limit=999`)
.then(resp => resp.json())
.then(async ({values: allRepos}) => {
const prListUrls = allRepos.map(repo => `${urlPrefix}/projects/ADD/repos/${repo.slug}/pull-requests`)
const allPullRequests = (await Promise.all(
prListUrls.map(async prListUrl => await fetch(prListUrl).then(resp => resp.json())))
).flatMap(({values}) => values)
const reviewerCounts = Object.fromEntries(names.map(name => [name, 0]))
allPullRequests.forEach(({reviewers}) => {
reviewers?.map(r => r.user.displayName)
.filter(displayName => !["Chris Gamache", "Tom Keels"].includes(displayName))
.forEach(displayName => {
reviewerCounts[displayName] ??= 0
reviewerCounts[displayName] += 1
})
})
const sortedCounts = Object.entries(reviewerCounts)
.map(([name, count]) => ({ name, count }))
.toSorted((a, b) => a.count - b.count)
const tryDisplay = () => setTimeout(() => {
if (document.getElementById('reviewer-counts')) {
return
}
const formBodyMain = document.querySelector('.create-pull-request-form .form-body .form-body-main')
if (formBodyMain) {
const countsParent = formBodyMain.lastChild.cloneNode(true)
const reviewerCountsNode = document.createElement('ol')
reviewerCountsNode.id = 'reviewer-counts'
reviewerCountsNode.style.columns = '3'
reviewerCountsNode.style.listStyle = 'none'
reviewerCountsNode.style.paddingLeft = '2px'
reviewerCountsNode.style.marginTop = 'auto'
// reviewerCountsNode.style.lineHeight = '95%'
reviewerCountsNode.style.fontSize = '0.9em'
sortedCounts.slice(0, 6).forEach(({ name, count }) => {
const listItem = document.createElement('li')
listItem.innerText = `${count} PR${count !== 1 ? 's' : 's'} ${name}`
reviewerCountsNode.appendChild(listItem)
})
const label = countsParent.querySelector('.form-label')
label.innerText = 'Now reviewing'
const message = countsParent.querySelector('.form-field-content')
message.replaceChildren(reviewerCountsNode)
formBodyMain.appendChild(countsParent)
} else {
tryDisplay()
}
}, 300)
tryDisplay()
})
}
addFix(sortSearchResult) addFix(sortSearchResult)