mirror of
https://github.com/zulip/zulip.git
synced 2025-11-06 23:13:25 +00:00
webhooks/github: Suppress "comment edited" events when body is same.
GitHub generates spurious edited events on hiding/unhiding a comment, and on clicking "edit"/"update" without any changes, when the comment "body" contains certain specific characters. Instead of sending a notification message, we suppress those edge cases by comparing the "body" content of the comment and changes in the event payload. Fixes #31042, #26136.
This commit is contained in:
@@ -0,0 +1,244 @@
|
|||||||
|
{
|
||||||
|
"action": "edited",
|
||||||
|
"changes": {
|
||||||
|
"body": {
|
||||||
|
"from": "Cool. @Niloth-p please go ahead and send a PR. You'll want to address that feedback from @AnotherUser, but it's fine for that to happen after the initial revision of the PR — there'll probably be feedback I have on the code that's independent of that point about the sizing behavior of the bottom sheet."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"issue": {
|
||||||
|
"url": "https://api.github.com/repos/Niloth-p/webhook-tester/issues/1",
|
||||||
|
"repository_url": "https://api.github.com/repos/Niloth-p/webhook-tester",
|
||||||
|
"labels_url": "https://api.github.com/repos/Niloth-p/webhook-tester/issues/1/labels{/name}",
|
||||||
|
"comments_url": "https://api.github.com/repos/Niloth-p/webhook-tester/issues/1/comments",
|
||||||
|
"events_url": "https://api.github.com/repos/Niloth-p/webhook-tester/issues/1/events",
|
||||||
|
"html_url": "https://github.com/Niloth-p/webhook-tester/pull/1",
|
||||||
|
"id": 2608853794,
|
||||||
|
"node_id": "PR_kwDONEwUIs9_oLMc",
|
||||||
|
"number": 1,
|
||||||
|
"title": "Generic issue title",
|
||||||
|
"user": {
|
||||||
|
"login": "Niloth-p",
|
||||||
|
"id": 20517308,
|
||||||
|
"node_id": "MDQ6VXNlcjIwMzE1MzA4",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/20319309?v=4",
|
||||||
|
"gravatar_id": "",
|
||||||
|
"url": "https://api.github.com/users/Niloth-p",
|
||||||
|
"html_url": "https://github.com/Niloth-p",
|
||||||
|
"followers_url": "https://api.github.com/users/Niloth-p/followers",
|
||||||
|
"following_url": "https://api.github.com/users/Niloth-p/following{/other_user}",
|
||||||
|
"gists_url": "https://api.github.com/users/Niloth-p/gists{/gist_id}",
|
||||||
|
"starred_url": "https://api.github.com/users/Niloth-p/starred{/owner}{/repo}",
|
||||||
|
"subscriptions_url": "https://api.github.com/users/Niloth-p/subscriptions",
|
||||||
|
"organizations_url": "https://api.github.com/users/Niloth-p/orgs",
|
||||||
|
"repos_url": "https://api.github.com/users/Niloth-p/repos",
|
||||||
|
"events_url": "https://api.github.com/users/Niloth-p/events{/privacy}",
|
||||||
|
"received_events_url": "https://api.github.com/users/Niloth-p/received_events",
|
||||||
|
"type": "User",
|
||||||
|
"user_view_type": "public",
|
||||||
|
"site_admin": false
|
||||||
|
},
|
||||||
|
"labels": [],
|
||||||
|
"state": "open",
|
||||||
|
"locked": false,
|
||||||
|
"assignee": null,
|
||||||
|
"assignees": [],
|
||||||
|
"milestone": null,
|
||||||
|
"comments": 6,
|
||||||
|
"created_at": "2024-10-23T14:31:40Z",
|
||||||
|
"updated_at": "2024-12-20T00:01:51Z",
|
||||||
|
"closed_at": null,
|
||||||
|
"author_association": "OWNER",
|
||||||
|
"active_lock_reason": null,
|
||||||
|
"draft": false,
|
||||||
|
"pull_request": {
|
||||||
|
"url": "https://api.github.com/repos/Niloth-p/webhook-tester/pulls/1",
|
||||||
|
"html_url": "https://github.com/Niloth-p/webhook-tester/pull/1",
|
||||||
|
"diff_url": "https://github.com/Niloth-p/webhook-tester/pull/1.diff",
|
||||||
|
"patch_url": "https://github.com/Niloth-p/webhook-tester/pull/1.patch",
|
||||||
|
"merged_at": null
|
||||||
|
},
|
||||||
|
"body": null,
|
||||||
|
"reactions": {
|
||||||
|
"url": "https://api.github.com/repos/Niloth-p/webhook-tester/issues/1/reactions",
|
||||||
|
"total_count": 0,
|
||||||
|
"+1": 0,
|
||||||
|
"-1": 0,
|
||||||
|
"laugh": 0,
|
||||||
|
"hooray": 0,
|
||||||
|
"confused": 0,
|
||||||
|
"heart": 0,
|
||||||
|
"rocket": 0,
|
||||||
|
"eyes": 0
|
||||||
|
},
|
||||||
|
"timeline_url": "https://api.github.com/repos/Niloth-p/webhook-tester/issues/1/timeline",
|
||||||
|
"performed_via_github_app": null,
|
||||||
|
"state_reason": null
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"url": "https://api.github.com/repos/Niloth-p/webhook-tester/issues/comments/2555981590",
|
||||||
|
"html_url": "https://github.com/Niloth-p/webhook-tester/pull/1#issuecomment-2555981590",
|
||||||
|
"issue_url": "https://api.github.com/repos/Niloth-p/webhook-tester/issues/1",
|
||||||
|
"id": 2555981590,
|
||||||
|
"node_id": "IC_kwDONEtUIs6YWS8W",
|
||||||
|
"user": {
|
||||||
|
"login": "Niloth-p",
|
||||||
|
"id": 20315308,
|
||||||
|
"node_id": "MDQ6VXNlcjIwMzE1MzA4",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/20315308?v=4",
|
||||||
|
"gravatar_id": "",
|
||||||
|
"url": "https://api.github.com/users/Niloth-p",
|
||||||
|
"html_url": "https://github.com/Niloth-p",
|
||||||
|
"followers_url": "https://api.github.com/users/Niloth-p/followers",
|
||||||
|
"following_url": "https://api.github.com/users/Niloth-p/following{/other_user}",
|
||||||
|
"gists_url": "https://api.github.com/users/Niloth-p/gists{/gist_id}",
|
||||||
|
"starred_url": "https://api.github.com/users/Niloth-p/starred{/owner}{/repo}",
|
||||||
|
"subscriptions_url": "https://api.github.com/users/Niloth-p/subscriptions",
|
||||||
|
"organizations_url": "https://api.github.com/users/Niloth-p/orgs",
|
||||||
|
"repos_url": "https://api.github.com/users/Niloth-p/repos",
|
||||||
|
"events_url": "https://api.github.com/users/Niloth-p/events{/privacy}",
|
||||||
|
"received_events_url": "https://api.github.com/users/Niloth-p/received_events",
|
||||||
|
"type": "User",
|
||||||
|
"user_view_type": "public",
|
||||||
|
"site_admin": false
|
||||||
|
},
|
||||||
|
"created_at": "2024-12-20T00:01:30Z",
|
||||||
|
"updated_at": "2024-12-20T00:01:51Z",
|
||||||
|
"author_association": "OWNER",
|
||||||
|
"body": "Cool. @Niloth-p please go ahead and send a PR. You'll want to address that feedback from @AnotherUser, but it's fine for that to happen after the initial revision of the PR — there'll probably be feedback I have on the code that's independent of that point about the sizing behavior of the bottom sheet.",
|
||||||
|
"reactions": {
|
||||||
|
"url": "https://api.github.com/repos/Niloth-p/webhook-tester/issues/comments/2555981590/reactions",
|
||||||
|
"total_count": 0,
|
||||||
|
"+1": 0,
|
||||||
|
"-1": 0,
|
||||||
|
"laugh": 0,
|
||||||
|
"hooray": 0,
|
||||||
|
"confused": 0,
|
||||||
|
"heart": 0,
|
||||||
|
"rocket": 0,
|
||||||
|
"eyes": 0
|
||||||
|
},
|
||||||
|
"performed_via_github_app": null
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"id": 877351970,
|
||||||
|
"node_id": "R_kgDONEtUIg",
|
||||||
|
"name": "webhook-tester",
|
||||||
|
"full_name": "Niloth-p/webhook-tester",
|
||||||
|
"private": true,
|
||||||
|
"owner": {
|
||||||
|
"login": "Niloth-p",
|
||||||
|
"id": 20315308,
|
||||||
|
"node_id": "MDQ6VXNlcjIwMzE1MzA4",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/20315308?v=4",
|
||||||
|
"gravatar_id": "",
|
||||||
|
"url": "https://api.github.com/users/Niloth-p",
|
||||||
|
"html_url": "https://github.com/Niloth-p",
|
||||||
|
"followers_url": "https://api.github.com/users/Niloth-p/followers",
|
||||||
|
"following_url": "https://api.github.com/users/Niloth-p/following{/other_user}",
|
||||||
|
"gists_url": "https://api.github.com/users/Niloth-p/gists{/gist_id}",
|
||||||
|
"starred_url": "https://api.github.com/users/Niloth-p/starred{/owner}{/repo}",
|
||||||
|
"subscriptions_url": "https://api.github.com/users/Niloth-p/subscriptions",
|
||||||
|
"organizations_url": "https://api.github.com/users/Niloth-p/orgs",
|
||||||
|
"repos_url": "https://api.github.com/users/Niloth-p/repos",
|
||||||
|
"events_url": "https://api.github.com/users/Niloth-p/events{/privacy}",
|
||||||
|
"received_events_url": "https://api.github.com/users/Niloth-p/received_events",
|
||||||
|
"type": "User",
|
||||||
|
"user_view_type": "public",
|
||||||
|
"site_admin": false
|
||||||
|
},
|
||||||
|
"html_url": "https://github.com/Niloth-p/webhook-tester",
|
||||||
|
"description": null,
|
||||||
|
"fork": false,
|
||||||
|
"url": "https://api.github.com/repos/Niloth-p/webhook-tester",
|
||||||
|
"forks_url": "https://api.github.com/repos/Niloth-p/webhook-tester/forks",
|
||||||
|
"keys_url": "https://api.github.com/repos/Niloth-p/webhook-tester/keys{/key_id}",
|
||||||
|
"collaborators_url": "https://api.github.com/repos/Niloth-p/webhook-tester/collaborators{/collaborator}",
|
||||||
|
"teams_url": "https://api.github.com/repos/Niloth-p/webhook-tester/teams",
|
||||||
|
"hooks_url": "https://api.github.com/repos/Niloth-p/webhook-tester/hooks",
|
||||||
|
"issue_events_url": "https://api.github.com/repos/Niloth-p/webhook-tester/issues/events{/number}",
|
||||||
|
"events_url": "https://api.github.com/repos/Niloth-p/webhook-tester/events",
|
||||||
|
"assignees_url": "https://api.github.com/repos/Niloth-p/webhook-tester/assignees{/user}",
|
||||||
|
"branches_url": "https://api.github.com/repos/Niloth-p/webhook-tester/branches{/branch}",
|
||||||
|
"tags_url": "https://api.github.com/repos/Niloth-p/webhook-tester/tags",
|
||||||
|
"blobs_url": "https://api.github.com/repos/Niloth-p/webhook-tester/git/blobs{/sha}",
|
||||||
|
"git_tags_url": "https://api.github.com/repos/Niloth-p/webhook-tester/git/tags{/sha}",
|
||||||
|
"git_refs_url": "https://api.github.com/repos/Niloth-p/webhook-tester/git/refs{/sha}",
|
||||||
|
"trees_url": "https://api.github.com/repos/Niloth-p/webhook-tester/git/trees{/sha}",
|
||||||
|
"statuses_url": "https://api.github.com/repos/Niloth-p/webhook-tester/statuses/{sha}",
|
||||||
|
"languages_url": "https://api.github.com/repos/Niloth-p/webhook-tester/languages",
|
||||||
|
"stargazers_url": "https://api.github.com/repos/Niloth-p/webhook-tester/stargazers",
|
||||||
|
"contributors_url": "https://api.github.com/repos/Niloth-p/webhook-tester/contributors",
|
||||||
|
"subscribers_url": "https://api.github.com/repos/Niloth-p/webhook-tester/subscribers",
|
||||||
|
"subscription_url": "https://api.github.com/repos/Niloth-p/webhook-tester/subscription",
|
||||||
|
"commits_url": "https://api.github.com/repos/Niloth-p/webhook-tester/commits{/sha}",
|
||||||
|
"git_commits_url": "https://api.github.com/repos/Niloth-p/webhook-tester/git/commits{/sha}",
|
||||||
|
"comments_url": "https://api.github.com/repos/Niloth-p/webhook-tester/comments{/number}",
|
||||||
|
"issue_comment_url": "https://api.github.com/repos/Niloth-p/webhook-tester/issues/comments{/number}",
|
||||||
|
"contents_url": "https://api.github.com/repos/Niloth-p/webhook-tester/contents/{+path}",
|
||||||
|
"compare_url": "https://api.github.com/repos/Niloth-p/webhook-tester/compare/{base}...{head}",
|
||||||
|
"merges_url": "https://api.github.com/repos/Niloth-p/webhook-tester/merges",
|
||||||
|
"archive_url": "https://api.github.com/repos/Niloth-p/webhook-tester/{archive_format}{/ref}",
|
||||||
|
"downloads_url": "https://api.github.com/repos/Niloth-p/webhook-tester/downloads",
|
||||||
|
"issues_url": "https://api.github.com/repos/Niloth-p/webhook-tester/issues{/number}",
|
||||||
|
"pulls_url": "https://api.github.com/repos/Niloth-p/webhook-tester/pulls{/number}",
|
||||||
|
"milestones_url": "https://api.github.com/repos/Niloth-p/webhook-tester/milestones{/number}",
|
||||||
|
"notifications_url": "https://api.github.com/repos/Niloth-p/webhook-tester/notifications{?since,all,participating}",
|
||||||
|
"labels_url": "https://api.github.com/repos/Niloth-p/webhook-tester/labels{/name}",
|
||||||
|
"releases_url": "https://api.github.com/repos/Niloth-p/webhook-tester/releases{/id}",
|
||||||
|
"deployments_url": "https://api.github.com/repos/Niloth-p/webhook-tester/deployments",
|
||||||
|
"created_at": "2024-10-23T14:00:56Z",
|
||||||
|
"updated_at": "2024-10-23T15:20:20Z",
|
||||||
|
"pushed_at": "2024-10-23T14:30:45Z",
|
||||||
|
"git_url": "git://github.com/Niloth-p/webhook-tester.git",
|
||||||
|
"ssh_url": "git@github.com:Niloth-p/webhook-tester.git",
|
||||||
|
"clone_url": "https://github.com/Niloth-p/webhook-tester.git",
|
||||||
|
"svn_url": "https://github.com/Niloth-p/webhook-tester",
|
||||||
|
"homepage": null,
|
||||||
|
"size": 1,
|
||||||
|
"stargazers_count": 0,
|
||||||
|
"watchers_count": 0,
|
||||||
|
"language": null,
|
||||||
|
"has_issues": true,
|
||||||
|
"has_projects": true,
|
||||||
|
"has_downloads": true,
|
||||||
|
"has_wiki": false,
|
||||||
|
"has_pages": false,
|
||||||
|
"has_discussions": true,
|
||||||
|
"forks_count": 0,
|
||||||
|
"mirror_url": null,
|
||||||
|
"archived": false,
|
||||||
|
"disabled": false,
|
||||||
|
"open_issues_count": 2,
|
||||||
|
"license": null,
|
||||||
|
"allow_forking": true,
|
||||||
|
"is_template": false,
|
||||||
|
"web_commit_signoff_required": false,
|
||||||
|
"topics": [],
|
||||||
|
"visibility": "private",
|
||||||
|
"forks": 0,
|
||||||
|
"open_issues": 25,
|
||||||
|
"watchers": 0,
|
||||||
|
"default_branch": "main"
|
||||||
|
},
|
||||||
|
"sender": {
|
||||||
|
"login": "AnotherUser",
|
||||||
|
"id": 139634087,
|
||||||
|
"node_id": "U_kgDOCFKlpw",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/139634087?v=4",
|
||||||
|
"gravatar_id": "",
|
||||||
|
"url": "https://api.github.com/users/AnotherUser",
|
||||||
|
"html_url": "https://github.com/AnotherUser",
|
||||||
|
"followers_url": "https://api.github.com/users/AnotherUser/followers",
|
||||||
|
"following_url": "https://api.github.com/users/AnotherUser/following{/other_user}",
|
||||||
|
"gists_url": "https://api.github.com/users/AnotherUser/gists{/gist_id}",
|
||||||
|
"starred_url": "https://api.github.com/users/AnotherUser/starred{/owner}{/repo}",
|
||||||
|
"subscriptions_url": "https://api.github.com/users/AnotherUser/subscriptions",
|
||||||
|
"organizations_url": "https://api.github.com/users/AnotherUser/orgs",
|
||||||
|
"repos_url": "https://api.github.com/users/AnotherUser/repos",
|
||||||
|
"events_url": "https://api.github.com/users/AnotherUser/events{/privacy}",
|
||||||
|
"received_events_url": "https://api.github.com/users/AnotherUser/received_events",
|
||||||
|
"type": "User",
|
||||||
|
"user_view_type": "public",
|
||||||
|
"site_admin": false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -629,6 +629,14 @@ A temporary team so that I can get some webhook fixtures!
|
|||||||
expected_message = "sbansal1999 edited a [comment](https://github.com/sbansal1999/testing-gh/discussions/20#discussioncomment-6332416) on [discussion #20](https://github.com/sbansal1999/testing-gh/discussions/20):\n\n~~~ quote\nsome random comment edited\n~~~"
|
expected_message = "sbansal1999 edited a [comment](https://github.com/sbansal1999/testing-gh/discussions/20#discussioncomment-6332416) on [discussion #20](https://github.com/sbansal1999/testing-gh/discussions/20):\n\n~~~ quote\nsome random comment edited\n~~~"
|
||||||
self.check_webhook("discussion_comment__edited", TOPIC_DISCUSSION, expected_message)
|
self.check_webhook("discussion_comment__edited", TOPIC_DISCUSSION, expected_message)
|
||||||
|
|
||||||
|
def test_comment_edited_unchanged_skipped(self) -> None:
|
||||||
|
self.check_webhook(
|
||||||
|
fixture_name="issue_comment__edited__unchanged",
|
||||||
|
expected_topic_name=None,
|
||||||
|
expected_message=None,
|
||||||
|
expect_noop=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class GitHubSponsorsHookTests(WebhookTestCase):
|
class GitHubSponsorsHookTests(WebhookTestCase):
|
||||||
CHANNEL_NAME = "github"
|
CHANNEL_NAME = "github"
|
||||||
|
|||||||
@@ -919,6 +919,17 @@ def api_github_webhook(
|
|||||||
# Ignore private repository events
|
# Ignore private repository events
|
||||||
return json_success(request)
|
return json_success(request)
|
||||||
|
|
||||||
|
# Ignore 'comment edited' events (except discussion comments)
|
||||||
|
# if the comment body remains unchanged.
|
||||||
|
if (
|
||||||
|
"comment" in header_event
|
||||||
|
and "discussion" not in header_event
|
||||||
|
and payload.get("action", "").tame(check_string) == "edited"
|
||||||
|
and payload["changes"]["body"]["from"].tame(check_string)
|
||||||
|
== payload["comment"]["body"].tame(check_string)
|
||||||
|
):
|
||||||
|
return json_success(request)
|
||||||
|
|
||||||
event = get_zulip_event_name(header_event, payload, branches)
|
event = get_zulip_event_name(header_event, payload, branches)
|
||||||
if event is None:
|
if event is None:
|
||||||
# This is nothing to worry about--get_event() returns None
|
# This is nothing to worry about--get_event() returns None
|
||||||
|
|||||||
Reference in New Issue
Block a user