mirror of
https://gitlab.com/openstapps/openstapps.git
synced 2026-01-21 09:03:02 +00:00
fix: build
This commit is contained in:
@@ -12,7 +12,6 @@
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import {asyncPool} from '@krlwlfrt/async-pool';
|
||||
import {Api} from '@openstapps/gitlab-api';
|
||||
import {
|
||||
AccessLevel,
|
||||
@@ -23,8 +22,8 @@ import {
|
||||
User,
|
||||
} from '@openstapps/gitlab-api/lib/types';
|
||||
import {Logger} from '@openstapps/logger';
|
||||
import {WebClient} from '@slack/client';
|
||||
import {CONCURRENCY, GROUPS, MAX_DEPTH_FOR_REMINDER, NOTE_PREFIX, SLACK_CHANNEL} from '../configuration';
|
||||
import {WebClient} from '@slack/web-api';
|
||||
import {GROUPS, MAX_DEPTH_FOR_REMINDER, NOTE_PREFIX, SLACK_CHANNEL} from '../configuration';
|
||||
|
||||
/**
|
||||
* Remind people of open merge requests
|
||||
@@ -55,9 +54,9 @@ export async function remind(api: Api): Promise<void> {
|
||||
|
||||
// instantiate slack client
|
||||
const client =
|
||||
typeof process.env.SLACK_API_TOKEN !== 'undefined'
|
||||
? new WebClient(process.env.SLACK_API_TOKEN)
|
||||
: undefined;
|
||||
typeof process.env.SLACK_API_TOKEN === 'undefined'
|
||||
? undefined
|
||||
: new WebClient(process.env.SLACK_API_TOKEN);
|
||||
|
||||
// get members of main group
|
||||
const members = await api.getMembers(MembershipScope.GROUPS, GROUPS[0]);
|
||||
@@ -75,115 +74,117 @@ export async function remind(api: Api): Promise<void> {
|
||||
|
||||
Logger.info(`Found ${maintainers.length} maintainer(s).`);
|
||||
|
||||
await asyncPool(CONCURRENCY, mergeRequests, async mergeRequest => {
|
||||
// check if merge request is WIP
|
||||
if (mergeRequest.work_in_progress) {
|
||||
Logger.info(`Merge request '${mergeRequest.title}' is WIP.`);
|
||||
await Promise.all(
|
||||
mergeRequests.map(async mergeRequest => {
|
||||
// check if merge request is WIP
|
||||
if (mergeRequest.work_in_progress) {
|
||||
Logger.info(`Merge request '${mergeRequest.title}' is WIP.`);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// get merge request approval
|
||||
const approval = await api.getMergeRequestApproval(mergeRequest.project_id, mergeRequest.iid);
|
||||
|
||||
// get merge request discussions
|
||||
const discussions = await api.getMergeRequestDiscussions(mergeRequest.project_id, mergeRequest.iid);
|
||||
|
||||
// check if at least one of the discussions is unresolved
|
||||
const hasUnresolvedDiscussions = discussions.some(discussion => {
|
||||
return discussion.notes.some(note => {
|
||||
return note.resolvable && (typeof note.resolved === 'undefined' || !note.resolved);
|
||||
});
|
||||
});
|
||||
|
||||
if (hasUnresolvedDiscussions) {
|
||||
let recipient = mergeRequest.author.username;
|
||||
|
||||
if (typeof mergeRequest.assignee !== 'undefined' && mergeRequest.assignee !== null) {
|
||||
recipient = mergeRequest.assignee.username;
|
||||
return;
|
||||
}
|
||||
|
||||
// create note in merge request
|
||||
await api.createNote(
|
||||
mergeRequest.project_id,
|
||||
Scope.MERGE_REQUESTS,
|
||||
mergeRequest.iid,
|
||||
`${NOTE_PREFIX} Please resolve pending discussions, @${recipient}!`,
|
||||
);
|
||||
// get merge request approval
|
||||
const approval = await api.getMergeRequestApproval(mergeRequest.project_id, mergeRequest.iid);
|
||||
|
||||
return;
|
||||
}
|
||||
// get merge request discussions
|
||||
const discussions = await api.getMergeRequestDiscussions(mergeRequest.project_id, mergeRequest.iid);
|
||||
|
||||
if (approval.merge_status === MergeRequestMergeStatus.CAN_BE_MERGED) {
|
||||
if (approval.approvals_left > 0) {
|
||||
Logger.warn(`Merge request '${mergeRequest.title}' needs more approvals!`);
|
||||
|
||||
// get possible appropers, prefixed with '@' and joined with commas
|
||||
const possibleApprovers = maintainerUsernames
|
||||
.filter(username => {
|
||||
if (mergeRequest.assignee.username === username) {
|
||||
return false;
|
||||
}
|
||||
if (username.includes('openstapps') || username.includes('kphilipp')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (approval.approved_by.length === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return approval.approved_by.find(
|
||||
(approver: {
|
||||
/**
|
||||
* Possible approver
|
||||
*/
|
||||
user: User;
|
||||
}) => {
|
||||
return approver.user.username !== username;
|
||||
},
|
||||
);
|
||||
})
|
||||
.map(username => `@${username}`)
|
||||
.join(' ');
|
||||
|
||||
// send message to slack
|
||||
await client?.chat.postMessage({
|
||||
channel: SLACK_CHANNEL,
|
||||
text: `Merge request '${mergeRequest.title}' needs more approvals! See ${mergeRequest.web_url}!`,
|
||||
// check if at least one of the discussions is unresolved
|
||||
const hasUnresolvedDiscussions = discussions.some(discussion => {
|
||||
return discussion.notes.some(note => {
|
||||
return note.resolvable && (typeof note.resolved === 'undefined' || !note.resolved);
|
||||
});
|
||||
});
|
||||
|
||||
// assign reviewers
|
||||
await api.createNote(
|
||||
mergeRequest.project_id,
|
||||
Scope.MERGE_REQUESTS,
|
||||
mergeRequest.iid,
|
||||
`/assign_reviewer ${possibleApprovers}`,
|
||||
);
|
||||
} else {
|
||||
Logger.log(`Merge request '${mergeRequest.title}' is ready to be merged!`);
|
||||
if (hasUnresolvedDiscussions) {
|
||||
let recipient = mergeRequest.author.username;
|
||||
|
||||
// send message to slack
|
||||
await client?.chat.postMessage({
|
||||
channel: SLACK_CHANNEL,
|
||||
text: `Merge request '${mergeRequest.title}' is ready to be merged! See ${mergeRequest.web_url}!`,
|
||||
});
|
||||
|
||||
// prefix maintainers with '@' and join with commas
|
||||
const possibleMergers = maintainerUsernames
|
||||
.filter(username => {
|
||||
return mergeRequest.assignee.username !== username;
|
||||
})
|
||||
.map(username => `@${username}`)
|
||||
.join(', ');
|
||||
if (typeof mergeRequest.assignee !== 'undefined' && mergeRequest.assignee !== null) {
|
||||
recipient = mergeRequest.assignee.username;
|
||||
}
|
||||
|
||||
// create note in merge request
|
||||
await api.createNote(
|
||||
mergeRequest.project_id,
|
||||
Scope.MERGE_REQUESTS,
|
||||
mergeRequest.iid,
|
||||
`${NOTE_PREFIX} Merge request is ready to be merged, ${possibleMergers}!`,
|
||||
`${NOTE_PREFIX} Please resolve pending discussions, @${recipient}!`,
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (approval.merge_status === MergeRequestMergeStatus.CAN_BE_MERGED) {
|
||||
if (approval.approvals_left > 0) {
|
||||
Logger.warn(`Merge request '${mergeRequest.title}' needs more approvals!`);
|
||||
|
||||
// get possible appropers, prefixed with '@' and joined with commas
|
||||
const possibleApprovers = maintainerUsernames
|
||||
.filter(username => {
|
||||
if (mergeRequest.assignee.username === username) {
|
||||
return false;
|
||||
}
|
||||
if (username.includes('openstapps') || username.includes('kphilipp')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (approval.approved_by.length === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return approval.approved_by.find(
|
||||
(approver: {
|
||||
/**
|
||||
* Possible approver
|
||||
*/
|
||||
user: User;
|
||||
}) => {
|
||||
return approver.user.username !== username;
|
||||
},
|
||||
);
|
||||
})
|
||||
.map(username => `@${username}`)
|
||||
.join(' ');
|
||||
|
||||
// send message to slack
|
||||
await client?.chat.postMessage({
|
||||
channel: SLACK_CHANNEL,
|
||||
text: `Merge request '${mergeRequest.title}' needs more approvals! See ${mergeRequest.web_url}!`,
|
||||
});
|
||||
|
||||
// assign reviewers
|
||||
await api.createNote(
|
||||
mergeRequest.project_id,
|
||||
Scope.MERGE_REQUESTS,
|
||||
mergeRequest.iid,
|
||||
`/assign_reviewer ${possibleApprovers}`,
|
||||
);
|
||||
} else {
|
||||
Logger.log(`Merge request '${mergeRequest.title}' is ready to be merged!`);
|
||||
|
||||
// send message to slack
|
||||
await client?.chat.postMessage({
|
||||
channel: SLACK_CHANNEL,
|
||||
text: `Merge request '${mergeRequest.title}' is ready to be merged! See ${mergeRequest.web_url}!`,
|
||||
});
|
||||
|
||||
// prefix maintainers with '@' and join with commas
|
||||
const possibleMergers = maintainerUsernames
|
||||
.filter(username => {
|
||||
return mergeRequest.assignee.username !== username;
|
||||
})
|
||||
.map(username => `@${username}`)
|
||||
.join(', ');
|
||||
|
||||
// create note in merge request
|
||||
await api.createNote(
|
||||
mergeRequest.project_id,
|
||||
Scope.MERGE_REQUESTS,
|
||||
mergeRequest.iid,
|
||||
`${NOTE_PREFIX} Merge request is ready to be merged, ${possibleMergers}!`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user