Fix PR error duplications.
Also, extract pr-reviewer-suggestions.js 1.0.19.xpi
This commit is contained in:
parent
945d819f0e
commit
fc18f4e929
|
@ -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.18",
|
"version": "1.0.19",
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"browser_specific_settings": {
|
"browser_specific_settings": {
|
||||||
"gecko": {
|
"gecko": {
|
||||||
|
@ -30,6 +30,7 @@
|
||||||
"backtick-comments.js",
|
"backtick-comments.js",
|
||||||
"csharp-quotes.js",
|
"csharp-quotes.js",
|
||||||
"file-scroll.js",
|
"file-scroll.js",
|
||||||
|
"pr-reviewer-suggestions.js",
|
||||||
"repo-search-sorter.js",
|
"repo-search-sorter.js",
|
||||||
"show-errored-prs.js",
|
"show-errored-prs.js",
|
||||||
"var-highlighter.js"
|
"var-highlighter.js"
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
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()
|
||||||
|
})
|
||||||
|
}
|
|
@ -33,77 +33,4 @@ 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)
|
||||||
|
|
Binary file not shown.
|
@ -3,7 +3,6 @@ const bbUrlPrefix = 'https://git.add123.com/rest/api/latest'
|
||||||
const pullRequestHasErrored = async pr => {
|
const pullRequestHasErrored = async pr => {
|
||||||
const latestCommitId = pr?.fromRef?.latestCommit
|
const latestCommitId = pr?.fromRef?.latestCommit
|
||||||
if (!latestCommitId) {
|
if (!latestCommitId) {
|
||||||
console.log('no latestCommitId on pr', pr)
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
const buildStats = await fetch(`https://git.add123.com/rest/build-status/latest/commits/stats/${latestCommitId}`).then(resp => resp.json())
|
const buildStats = await fetch(`https://git.add123.com/rest/build-status/latest/commits/stats/${latestCommitId}`).then(resp => resp.json())
|
||||||
|
@ -20,7 +19,7 @@ const getAllRepos = async () => {
|
||||||
return allRepos
|
return allRepos
|
||||||
}
|
}
|
||||||
|
|
||||||
const withErroredPrs = async action => {
|
const getErroredPrs = async () => {
|
||||||
const allPullRequests = (await getAllRepos()
|
const allPullRequests = (await getAllRepos()
|
||||||
.then(async allRepos => {
|
.then(async allRepos => {
|
||||||
const prListUrls = allRepos.map(repo => `${bbUrlPrefix}/projects/ADD/repos/${repo.slug}/pull-requests`)
|
const prListUrls = allRepos.map(repo => `${bbUrlPrefix}/projects/ADD/repos/${repo.slug}/pull-requests`)
|
||||||
|
@ -31,7 +30,7 @@ const withErroredPrs = async action => {
|
||||||
const erroredPullRequests = []
|
const erroredPullRequests = []
|
||||||
for (const pullRequest of allPullRequests) {
|
for (const pullRequest of allPullRequests) {
|
||||||
if (await pullRequestHasErrored(pullRequest)) {
|
if (await pullRequestHasErrored(pullRequest)) {
|
||||||
action(pullRequest)
|
erroredPullRequests.push(pullRequest)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return erroredPullRequests
|
return erroredPullRequests
|
||||||
|
@ -55,6 +54,7 @@ const showErroredPrs = async () => {
|
||||||
let errorList = document.getElementById('bb-addon-pr-error-list')
|
let errorList = document.getElementById('bb-addon-pr-error-list')
|
||||||
if (!errorParent) {
|
if (!errorParent) {
|
||||||
errorParent = mainPanel.getElementsByClassName('dashboard-pull-request-table')[0].cloneNode()
|
errorParent = mainPanel.getElementsByClassName('dashboard-pull-request-table')[0].cloneNode()
|
||||||
|
errorParent.id = 'bb-addon-pr-error-table'
|
||||||
|
|
||||||
const header = document.createElement('h3')
|
const header = document.createElement('h3')
|
||||||
header.innerText = 'Pull requests with errors'
|
header.innerText = 'Pull requests with errors'
|
||||||
|
@ -68,9 +68,10 @@ const showErroredPrs = async () => {
|
||||||
|
|
||||||
mainPanel.insertBefore(errorParent, getElementAfterErrorList(mainPanel))
|
mainPanel.insertBefore(errorParent, getElementAfterErrorList(mainPanel))
|
||||||
}
|
}
|
||||||
Array.from(errorList.children).slice(1).forEach(child => errorList.removeChild(child))
|
|
||||||
|
|
||||||
await withErroredPrs(pr => {
|
const erroredPrs = await getErroredPrs()
|
||||||
|
Array.from(errorList.children).forEach(child => errorList.removeChild(child))
|
||||||
|
erroredPrs.forEach(pr => {
|
||||||
const element = document.createElement('li')
|
const element = document.createElement('li')
|
||||||
const link = document.createElement('a')
|
const link = document.createElement('a')
|
||||||
link.href = pr.links.self[0].href
|
link.href = pr.links.self[0].href
|
||||||
|
@ -83,5 +84,5 @@ const showErroredPrs = async () => {
|
||||||
|
|
||||||
if (location.toString().includes('/dashboard')) {
|
if (location.toString().includes('/dashboard')) {
|
||||||
addFix(() => showErroredPrs().catch(console.error))
|
addFix(() => showErroredPrs().catch(console.error))
|
||||||
setInterval(() => showErroredPrs().catch(console.error), 1000 * 60 * 5)
|
setInterval(() => showErroredPrs().catch(console.error), 1000 * 60 * 2)
|
||||||
}
|
}
|
Loading…
Reference in New Issue