diff --git a/buildbot_gitea/test/test_webhook.py b/buildbot_gitea/test/test_webhook.py index 8e3cd57..d8728c7 100644 --- a/buildbot_gitea/test/test_webhook.py +++ b/buildbot_gitea/test/test_webhook.py @@ -1171,6 +1171,112 @@ giteaJsonPullRequestFork = rb""" """ +giteaJsonPushEmptyFiles = rb""" +{ + "secret": "pass", + "ref": "refs/heads/develop", + "before": "2437bd7c6b0af7b8da570973c02f0cca07ec787d", + "after": "2437bd7c6b0af7b8da570973c02f0cca07ec787d", + "compare_url": "", + "commits": [ + { + "id": "2437bd7c6b0af7b8da570973c02f0cca07ec787d", + "message": "snip", + "url": "snip/commit/2437bd7c6b0af7b8da570973c02f0cca07ec787d", + "author": { + "name": "snip", + "email": "snip", + "username": "" + }, + "committer": { + "name": "snip", + "email": "snip", + "username": "" + }, + "verification": null, + "timestamp": "0001-01-01T00:00:00Z", + "added": null, + "removed": null, + "modified": null + } + ], + "head_commit": { + "id": "2437bd7c6b0af7b8da570973c02f0cca07ec787d", + "message": "snip", + "url": "snip/commit/2437bd7c6b0af7b8da570973c02f0cca07ec787d", + "author": { + "name": "snip", + "email": "snip", + "username": "" + }, + "committer": { + "name": "snip", + "email": "snip", + "username": "" + }, + "verification": null, + "timestamp": "0001-01-01T00:00:00Z", + "added": null, + "removed": null, + "modified": null + }, + "repository": { + "id": "snip", + "owner": {"id":"snip","login":"snip","full_name":"snip","email":"snip","avatar_url":"snip","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-04T02:15:26+02:00","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"snip"}, + "name": "snip", + "full_name": "snip", + "description": "snip", + "empty": false, + "private": true, + "fork": false, + "template": false, + "parent": null, + "mirror": false, + "size": 19106, + "html_url": "snip", + "ssh_url": "git@snip.git", + "clone_url": "snip.git", + "original_url": "", + "website": "", + "stars_count": 0, + "forks_count": 0, + "watchers_count": 5, + "open_issues_count": 33, + "open_pr_counter": 1, + "release_counter": 0, + "default_branch": "develop", + "archived": false, + "created_at": "2020-08-25T09:34:29+02:00", + "updated_at": "2022-01-19T15:55:11+01:00", + "permissions": { + "admin": false, + "push": false, + "pull": false + }, + "has_issues": true, + "internal_tracker": { + "enable_time_tracker": false, + "allow_only_contributors_to_track_time": true, + "enable_issue_dependencies": true + }, + "has_wiki": true, + "has_pull_requests": true, + "has_projects": false, + "ignore_whitespace_conflicts": false, + "allow_merge_commits": true, + "allow_rebase": true, + "allow_rebase_explicit": false, + "allow_squash_merge": true, + "default_merge_style": "merge", + "avatar_url": "", + "internal": false, + "mirror_interval": "" + }, + "pusher": {"id":"snip","login":"snip","full_name":"snip","email":"snip","avatar_url":"snip","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-01-22T02:15:29+01:00","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"snip"}, + "sender": {"id":"snip","login":"snip","full_name":"snip","email":"snip","avatar_url":"snip","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-01-22T02:15:29+01:00","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"snip"} +} +""" + class TestChangeHookGiteaPush(unittest.TestCase, TestReactorMixin): def setUp(self): self.setUpTestReactor() @@ -1231,6 +1337,23 @@ class TestChangeHookGiteaPush(unittest.TestCase, TestReactorMixin): "https://git.example.com/Test/test/commit/ea07c3148db428876add8b312256239275c395fb") self.assertEqual(change["files"], ["testfile2", "testfile1", "testfile3"]) + def checkNoFileChanges(self, codebase=None): + self.assertEqual(len(self.changeHook.master.data.updates.changesAdded), 1) + change = self.changeHook.master.data.updates.changesAdded[0] + self.assertEqual(change['repository'], 'git@snip.git') + + self.assertEqual( + change["author"], "snip ") + self.assertEqual( + change["revision"], '2437bd7c6b0af7b8da570973c02f0cca07ec787d') + self.assertEqual( + change["comments"], "snip") + self.assertEqual(change["branch"], "develop") + self.assertEqual(change[ + "revlink"], + "snip/commit/2437bd7c6b0af7b8da570973c02f0cca07ec787d") + self.assertEqual(change["files"], []) + def checkChangesFromPullRequest(self, codebase=None): self.assertEqual(len(self.changeHook.master.data.updates.changesAdded), 1) change = self.changeHook.master.data.updates.changesAdded[0] @@ -1307,6 +1430,15 @@ class TestChangeHookGiteaPush(unittest.TestCase, TestReactorMixin): res = yield self.request.test_render(self.changeHook) self.checkFileChanges(res) + @defer.inlineCallbacks + def testNoChangedFiles(self): + self.request = FakeRequest(content=giteaJsonPushEmptyFiles) + self.request.uri = b'/change_hook/gitea' + self.request.method = b'POST' + self.request.received_headers[_HEADER_EVENT_TYPE] = b"push" + res = yield self.request.test_render(self.changeHook) + self.checkNoFileChanges(res) + @defer.inlineCallbacks def testPullRequestEvent(self): self.request = FakeRequest(content=giteaJsonPullRequestPayload) diff --git a/buildbot_gitea/webhook.py b/buildbot_gitea/webhook.py index 49b74d1..fe6bce2 100644 --- a/buildbot_gitea/webhook.py +++ b/buildbot_gitea/webhook.py @@ -41,7 +41,7 @@ class GiteaHandler(BaseHookHandler): for commit in commits: files = [] for kind in ('added', 'modified', 'removed'): - files.extend(commit.get(kind, [])) + files.extend(commit.get(kind, []) or []) timestamp = dateparse(commit['timestamp']) change = { 'author': '{} <{}>'.format(commit['author']['name'], @@ -135,6 +135,7 @@ class GiteaHandler(BaseHookHandler): except Exception as exception: raise ValueError('Error loading JSON: ' + str(exception)) + if secret is not None: p = Properties() p.master = self.master