mirror of
https://github.com/matrix-org/matrix-hookshot.git
synced 2025-03-10 21:19:13 +00:00
Support notifying when a GitLab MR is ready for review (#480)
* Support ready for review GitLab * Create 480.feature * Change event name * Fix name * Fix typo
This commit is contained in:
parent
cbc7718808
commit
23eae91737
1
changelog.d/480.feature
Normal file
1
changelog.d/480.feature
Normal file
@ -0,0 +1 @@
|
||||
Ready/draft state changes for GitLab merge requests are now reported.
|
@ -358,6 +358,12 @@ export class Bridge {
|
||||
(c, data) => c.onMergeRequestReviewed(data),
|
||||
);
|
||||
|
||||
this.bindHandlerToQueue<IGitLabWebhookMREvent, GitLabRepoConnection>(
|
||||
"gitlab.merge_request.update",
|
||||
(data) => connManager.getConnectionsForGitLabRepo(data.project.path_with_namespace),
|
||||
(c, data) => c.onMergeRequestUpdate(data),
|
||||
);
|
||||
|
||||
this.bindHandlerToQueue<IGitLabWebhookReleaseEvent, GitLabRepoConnection>(
|
||||
"gitlab.release.create",
|
||||
(data) => connManager.getConnectionsForGitLabRepo(data.project.path_with_namespace),
|
||||
|
@ -7,7 +7,7 @@ import { MatrixMessageContent } from "../MatrixEvent";
|
||||
import markdown from "markdown-it";
|
||||
import LogWrapper from "../LogWrapper";
|
||||
import { BridgeConfigGitLab, GitLabInstance } from "../Config/Config";
|
||||
import { IGitLabWebhookMREvent, IGitLabWebhookNoteEvent, IGitLabWebhookPushEvent, IGitLabWebhookReleaseEvent, IGitLabWebhookTagPushEvent, IGitLabWebhookWikiPageEvent } from "../Gitlab/WebhookTypes";
|
||||
import { IGitlabMergeRequest, IGitLabWebhookMREvent, IGitLabWebhookNoteEvent, IGitLabWebhookPushEvent, IGitLabWebhookReleaseEvent, IGitLabWebhookTagPushEvent, IGitLabWebhookWikiPageEvent } from "../Gitlab/WebhookTypes";
|
||||
import { CommandConnection } from "./CommandConnection";
|
||||
import { Connection, IConnection, IConnectionState, InstantiateConnectionOpts, ProvisionConnectionOpts } from "./IConnection";
|
||||
import { GetConnectionsResponseItem } from "../provisioning/api";
|
||||
@ -50,6 +50,7 @@ type AllowedEventsNames =
|
||||
"merge_request.close" |
|
||||
"merge_request.merge" |
|
||||
"merge_request.review" |
|
||||
"merge_request.ready_for_review" |
|
||||
"merge_request.review.comments" |
|
||||
`merge_request.${string}` |
|
||||
"merge_request" |
|
||||
@ -65,6 +66,7 @@ const AllowedEvents: AllowedEventsNames[] = [
|
||||
"merge_request.close",
|
||||
"merge_request.merge",
|
||||
"merge_request.review",
|
||||
"merge_request.ready_for_review",
|
||||
"merge_request.review.comments",
|
||||
"merge_request",
|
||||
"tag_push",
|
||||
@ -440,6 +442,38 @@ export class GitLabRepoConnection extends CommandConnection<GitLabRepoConnection
|
||||
});
|
||||
}
|
||||
|
||||
public async onMergeRequestUpdate(event: IGitLabWebhookMREvent) {
|
||||
if (this.shouldSkipHook('merge_request', 'merge_request.ready_for_review')) {
|
||||
return;
|
||||
}
|
||||
log.info(`onMergeRequestUpdate ${this.roomId} ${this.instance}/${this.path} ${event.object_attributes.iid}`);
|
||||
this.validateMREvent(event);
|
||||
// Check if the MR changed to / from a draft
|
||||
if (!event.changes.title) {
|
||||
return;
|
||||
}
|
||||
const orgRepoName = event.project.path_with_namespace;
|
||||
let content: string;
|
||||
const wasDraft = event.changes.title.before.startsWith('Draft: ');
|
||||
const isDraft = event.changes.title.after.startsWith('Draft: ');
|
||||
if (wasDraft && !isDraft) {
|
||||
// Ready for review
|
||||
content = `**${event.user.username}** marked MR [${orgRepoName}#${event.object_attributes.iid}](${event.object_attributes.url}) as ready for review "${event.object_attributes.title}" `;
|
||||
} else if (!wasDraft && isDraft) {
|
||||
// Back to draft.
|
||||
content = `**${event.user.username}** marked MR [${orgRepoName}#${event.object_attributes.iid}](${event.object_attributes.url}) as draft "${event.object_attributes.title}" `;
|
||||
} else {
|
||||
// Nothing changed, drop it.
|
||||
return;
|
||||
}
|
||||
await this.as.botIntent.sendEvent(this.roomId, {
|
||||
msgtype: "m.notice",
|
||||
body: content,
|
||||
formatted_body: md.renderInline(content),
|
||||
format: "org.matrix.custom.html",
|
||||
});
|
||||
}
|
||||
|
||||
public async onGitLabTagPush(event: IGitLabWebhookTagPushEvent) {
|
||||
log.info(`onGitLabTagPush ${this.roomId} ${this.instance.url}/${this.path} ${event.ref}`);
|
||||
if (this.shouldSkipHook('tag_push')) {
|
||||
@ -592,10 +626,8 @@ ${data.description}`;
|
||||
timeout: setTimeout(renderFn, MRRCOMMENT_DEBOUNCE_MS),
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public toString() {
|
||||
return `GitLabRepo ${this.instance.url}/${this.path}`;
|
||||
}
|
||||
|
@ -63,6 +63,12 @@ export interface IGitLabWebhookMREvent {
|
||||
repository: IGitlabRepository;
|
||||
object_attributes: IGitLabMergeRequestObjectAttributes;
|
||||
labels: IGitLabLabel[];
|
||||
changes: {
|
||||
[key: string]: {
|
||||
before: string;
|
||||
after: string;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export interface IGitLabWebhookTagPushEvent {
|
||||
|
@ -166,6 +166,7 @@ const ConnectionConfiguration: FunctionComponent<ConnectionConfigurationProps<ne
|
||||
<EventCheckbox ignoredHooks={ignoredHooks} parentEvent="merge_request" eventName="merge_request.close" onChange={toggleIgnoredHook}>Closed</EventCheckbox>
|
||||
<EventCheckbox ignoredHooks={ignoredHooks} parentEvent="merge_request" eventName="merge_request.merge" onChange={toggleIgnoredHook}>Merged</EventCheckbox>
|
||||
<EventCheckbox ignoredHooks={ignoredHooks} parentEvent="merge_request" eventName="merge_request.review" onChange={toggleIgnoredHook}>Reviewed</EventCheckbox>
|
||||
<EventCheckbox ignoredHooks={ignoredHooks} parentEvent="merge_request" eventName="merge_request.ready_for_review" onChange={toggleIgnoredHook}>Ready for review</EventCheckbox>
|
||||
</ul>
|
||||
<EventCheckbox ignoredHooks={ignoredHooks} eventName="push" onChange={toggleIgnoredHook}>Pushes</EventCheckbox>
|
||||
<EventCheckbox ignoredHooks={ignoredHooks} eventName="tag_push" onChange={toggleIgnoredHook}>Tag pushes</EventCheckbox>
|
||||
|
Loading…
x
Reference in New Issue
Block a user