mirror of
https://github.com/zulip/zulip.git
synced 2025-11-06 23:13:25 +00:00
webhooks: Add Bitbucket Server integration.
This commit adds support for all "repo" events.
This commit is contained in:
committed by
Eeshan Garg
parent
33b064aa29
commit
9ed1dcc4b6
BIN
static/images/integrations/bitbucket/004.png
Normal file
BIN
static/images/integrations/bitbucket/004.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
@@ -264,6 +264,13 @@ WEBHOOK_INTEGRATIONS = [
|
|||||||
WebhookIntegration('beanstalk', ['version-control'], stream_name='commits'),
|
WebhookIntegration('beanstalk', ['version-control'], stream_name='commits'),
|
||||||
WebhookIntegration('basecamp', ['project-management']),
|
WebhookIntegration('basecamp', ['project-management']),
|
||||||
WebhookIntegration('beeminder', ['misc'], display_name='Beeminder'),
|
WebhookIntegration('beeminder', ['misc'], display_name='Beeminder'),
|
||||||
|
WebhookIntegration(
|
||||||
|
'bitbucket3',
|
||||||
|
['version-control'],
|
||||||
|
logo='static/images/integrations/logos/bitbucket.svg',
|
||||||
|
display_name='Bitbucket Server',
|
||||||
|
stream_name='bitbucket'
|
||||||
|
),
|
||||||
WebhookIntegration(
|
WebhookIntegration(
|
||||||
'bitbucket2',
|
'bitbucket2',
|
||||||
['version-control'],
|
['version-control'],
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ PUSH_COMMITTERS_LIMIT_INFO = 3
|
|||||||
FORCE_PUSH_COMMITS_MESSAGE_TEMPLATE = ("{user_name} [force pushed]({url}) "
|
FORCE_PUSH_COMMITS_MESSAGE_TEMPLATE = ("{user_name} [force pushed]({url}) "
|
||||||
"to branch {branch_name}. Head is now {head}")
|
"to branch {branch_name}. Head is now {head}")
|
||||||
CREATE_BRANCH_MESSAGE_TEMPLATE = "{user_name} created [{branch_name}]({url}) branch"
|
CREATE_BRANCH_MESSAGE_TEMPLATE = "{user_name} created [{branch_name}]({url}) branch"
|
||||||
|
CREATE_BRANCH_WITHOUT_URL_MESSAGE_TEMPLATE = "{user_name} created {branch_name} branch"
|
||||||
REMOVE_BRANCH_MESSAGE_TEMPLATE = "{user_name} deleted branch {branch_name}"
|
REMOVE_BRANCH_MESSAGE_TEMPLATE = "{user_name} deleted branch {branch_name}"
|
||||||
|
|
||||||
PULL_REQUEST_OR_ISSUE_MESSAGE_TEMPLATE = "{user_name} {action} [{type}{id}]({url})"
|
PULL_REQUEST_OR_ISSUE_MESSAGE_TEMPLATE = "{user_name} {action} [{type}{id}]({url})"
|
||||||
@@ -108,7 +109,12 @@ def get_force_push_commits_event_message(user_name: str, url: str, branch_name:
|
|||||||
head=head
|
head=head
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_create_branch_event_message(user_name: str, url: str, branch_name: str) -> str:
|
def get_create_branch_event_message(user_name: str, url: Optional[str], branch_name: str) -> str:
|
||||||
|
if url is None:
|
||||||
|
return CREATE_BRANCH_WITHOUT_URL_MESSAGE_TEMPLATE.format(
|
||||||
|
user_name=user_name,
|
||||||
|
branch_name=branch_name,
|
||||||
|
)
|
||||||
return CREATE_BRANCH_MESSAGE_TEMPLATE.format(
|
return CREATE_BRANCH_MESSAGE_TEMPLATE.format(
|
||||||
user_name=user_name,
|
user_name=user_name,
|
||||||
url=url,
|
url=url,
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ Bitbucket. This integration is for the new-style Bitbucket
|
|||||||
webhooks used by the Bitbucket SAAS service.
|
webhooks used by the Bitbucket SAAS service.
|
||||||
|
|
||||||
For the old-style Bitbucket webhooks used by Bitbucket Enterprise,
|
For the old-style Bitbucket webhooks used by Bitbucket Enterprise,
|
||||||
click [here](./bitbucket).
|
click [here](./bitbucket), and for the new-style webhooks used by
|
||||||
|
Bitbucket Server click [here](./bitbucket3).
|
||||||
|
|
||||||
1. {!create-stream.md!}
|
1. {!create-stream.md!}
|
||||||
|
|
||||||
|
|||||||
0
zerver/webhooks/bitbucket3/__init__.py
Normal file
0
zerver/webhooks/bitbucket3/__init__.py
Normal file
23
zerver/webhooks/bitbucket3/doc.md
Normal file
23
zerver/webhooks/bitbucket3/doc.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
Zulip supports both Git and Mercurial notifications from
|
||||||
|
Bitbucket. This integration is for the the new-style Bitbucket
|
||||||
|
webhooks used by Bitbucket Server.
|
||||||
|
|
||||||
|
For the old-style Bitbucket webhooks used by Bitbucket Enterprise,
|
||||||
|
click [here](./bitbucket), and for the new-style webhooks used by
|
||||||
|
Bitbucket Cloud (SAAS service) click [here](./bitbucket2).
|
||||||
|
|
||||||
|
1. {!create-stream.md!}
|
||||||
|
|
||||||
|
2. {!create-bot-construct-url-indented.md!}
|
||||||
|
{!git-webhook-url-with-branches-indented.md!}
|
||||||
|
|
||||||
|
3. On your repository's web page, click on **Settings**. Select
|
||||||
|
**Webhooks**, and click **Add webhook**.
|
||||||
|
|
||||||
|
4. Set **Title** to a title of your choice, such as `Zuilp`. Set **URL**
|
||||||
|
to the URL constructed above, and check the **Active** checkbox. Select
|
||||||
|
the **Triggers** you'd like to be notified about, and click **Save**.
|
||||||
|
|
||||||
|
{!congrats.md!}
|
||||||
|
|
||||||
|

|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
{
|
||||||
|
"actor": {
|
||||||
|
"active": true,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in",
|
||||||
|
"slug": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"name": "hypro999"
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"author": {
|
||||||
|
"active": true,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in",
|
||||||
|
"slug": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"name": "hypro999"
|
||||||
|
},
|
||||||
|
"id": 1,
|
||||||
|
"updatedDate": 1553169751306,
|
||||||
|
"tasks": [],
|
||||||
|
"comments": [],
|
||||||
|
"version": 0,
|
||||||
|
"text": "Just an arbitrary comment on a commit.",
|
||||||
|
"createdDate": 1553169751306,
|
||||||
|
"properties": {
|
||||||
|
"repositoryId": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commit": "508d1b67f1f8f3a25f543a030a7a178894aa9907",
|
||||||
|
"repository": {
|
||||||
|
"state": "AVAILABLE",
|
||||||
|
"links": {
|
||||||
|
"clone": [
|
||||||
|
{
|
||||||
|
"href": "ssh://git@139.59.64.214:7999/sbox/sandbox.git",
|
||||||
|
"name": "ssh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/scm/sbox/sandbox.git",
|
||||||
|
"name": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX/repos/sandbox/browse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"forkable": true,
|
||||||
|
"slug": "sandbox",
|
||||||
|
"project": {
|
||||||
|
"key": "SBOX",
|
||||||
|
"public": false,
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "Sandbox"
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"scmId": "git",
|
||||||
|
"public": false,
|
||||||
|
"name": "sandbox",
|
||||||
|
"statusMessage": "Available"
|
||||||
|
},
|
||||||
|
"eventKey": "repo:comment:added",
|
||||||
|
"date": "2019-03-21T17:32:31+0530"
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
{
|
||||||
|
"actor": {
|
||||||
|
"active": true,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in",
|
||||||
|
"slug": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"name": "hypro999"
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"author": {
|
||||||
|
"active": true,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in",
|
||||||
|
"slug": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"name": "hypro999"
|
||||||
|
},
|
||||||
|
"id": 1,
|
||||||
|
"updatedDate": 1553169856827,
|
||||||
|
"tasks": [],
|
||||||
|
"comments": [],
|
||||||
|
"version": 1,
|
||||||
|
"text": "Just an arbitrary comment on a commit. Nothing to see here...",
|
||||||
|
"createdDate": 1553169751306
|
||||||
|
},
|
||||||
|
"commit": "508d1b67f1f8f3a25f543a030a7a178894aa9907",
|
||||||
|
"repository": {
|
||||||
|
"state": "AVAILABLE",
|
||||||
|
"links": {
|
||||||
|
"clone": [
|
||||||
|
{
|
||||||
|
"href": "ssh://git@139.59.64.214:7999/sbox/sandbox.git",
|
||||||
|
"name": "ssh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/scm/sbox/sandbox.git",
|
||||||
|
"name": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX/repos/sandbox/browse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"forkable": true,
|
||||||
|
"slug": "sandbox",
|
||||||
|
"project": {
|
||||||
|
"key": "SBOX",
|
||||||
|
"public": false,
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "Sandbox"
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"scmId": "git",
|
||||||
|
"public": false,
|
||||||
|
"name": "sandbox",
|
||||||
|
"statusMessage": "Available"
|
||||||
|
},
|
||||||
|
"eventKey": "repo:comment:deleted",
|
||||||
|
"date": "2019-03-21T17:34:57+0530"
|
||||||
|
}
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
{
|
||||||
|
"actor": {
|
||||||
|
"active": true,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in",
|
||||||
|
"slug": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"name": "hypro999"
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"author": {
|
||||||
|
"active": true,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in",
|
||||||
|
"slug": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"name": "hypro999"
|
||||||
|
},
|
||||||
|
"id": 1,
|
||||||
|
"updatedDate": 1553169856827,
|
||||||
|
"tasks": [],
|
||||||
|
"comments": [],
|
||||||
|
"version": 1,
|
||||||
|
"text": "Just an arbitrary comment on a commit. Nothing to see here...",
|
||||||
|
"createdDate": 1553169751306,
|
||||||
|
"properties": {
|
||||||
|
"repositoryId": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"previousComment": "Just an arbitrary comment on a commit.",
|
||||||
|
"commit": "508d1b67f1f8f3a25f543a030a7a178894aa9907",
|
||||||
|
"repository": {
|
||||||
|
"state": "AVAILABLE",
|
||||||
|
"links": {
|
||||||
|
"clone": [
|
||||||
|
{
|
||||||
|
"href": "ssh://git@139.59.64.214:7999/sbox/sandbox.git",
|
||||||
|
"name": "ssh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/scm/sbox/sandbox.git",
|
||||||
|
"name": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX/repos/sandbox/browse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"forkable": true,
|
||||||
|
"slug": "sandbox",
|
||||||
|
"project": {
|
||||||
|
"key": "SBOX",
|
||||||
|
"public": false,
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "Sandbox"
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"scmId": "git",
|
||||||
|
"public": false,
|
||||||
|
"name": "sandbox",
|
||||||
|
"statusMessage": "Available"
|
||||||
|
},
|
||||||
|
"eventKey": "repo:comment:edited",
|
||||||
|
"date": "2019-03-21T17:34:16+0530"
|
||||||
|
}
|
||||||
117
zerver/webhooks/bitbucket3/fixtures/repo_forked.json
Normal file
117
zerver/webhooks/bitbucket3/fixtures/repo_forked.json
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
{
|
||||||
|
"actor": {
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"active": true,
|
||||||
|
"slug": "hypro999",
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"links": {
|
||||||
|
"clone": [
|
||||||
|
{
|
||||||
|
"href": "ssh://git@139.59.64.214:7999/~hypro999/sandbox-fork.git",
|
||||||
|
"name": "ssh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/scm/~hypro999/sandbox-fork.git",
|
||||||
|
"name": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999/repos/sandbox-fork/browse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"statusMessage": "Available",
|
||||||
|
"id": 4,
|
||||||
|
"slug": "sandbox-fork",
|
||||||
|
"project": {
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"owner": {
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"active": true,
|
||||||
|
"slug": "hypro999",
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in"
|
||||||
|
},
|
||||||
|
"key": "~HYPRO999",
|
||||||
|
"type": "PERSONAL",
|
||||||
|
"name": "Hemanth V. Alluri",
|
||||||
|
"id": 3
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"links": {
|
||||||
|
"clone": [
|
||||||
|
{
|
||||||
|
"href": "ssh://git@139.59.64.214:7999/sbox/sandbox.git",
|
||||||
|
"name": "ssh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/scm/sbox/sandbox.git",
|
||||||
|
"name": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX/repos/sandbox/browse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"statusMessage": "Available",
|
||||||
|
"id": 2,
|
||||||
|
"slug": "sandbox",
|
||||||
|
"project": {
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"key": "SBOX",
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "Sandbox",
|
||||||
|
"id": 2,
|
||||||
|
"public": false
|
||||||
|
},
|
||||||
|
"name": "sandbox",
|
||||||
|
"state": "AVAILABLE",
|
||||||
|
"forkable": true,
|
||||||
|
"scmId": "git",
|
||||||
|
"public": false
|
||||||
|
},
|
||||||
|
"name": "sandbox fork",
|
||||||
|
"state": "AVAILABLE",
|
||||||
|
"forkable": true,
|
||||||
|
"scmId": "git",
|
||||||
|
"public": false
|
||||||
|
},
|
||||||
|
"date": "2019-03-08T12:25:34+0530",
|
||||||
|
"eventKey": "repo:forked"
|
||||||
|
}
|
||||||
102
zerver/webhooks/bitbucket3/fixtures/repo_modified.json
Normal file
102
zerver/webhooks/bitbucket3/fixtures/repo_modified.json
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
{
|
||||||
|
"actor": {
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"active": true,
|
||||||
|
"slug": "hypro999",
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in"
|
||||||
|
},
|
||||||
|
"old": {
|
||||||
|
"links": {
|
||||||
|
"clone": [
|
||||||
|
{
|
||||||
|
"href": "ssh://git@139.59.64.214:7999/sbox/sandbox-v2.git",
|
||||||
|
"name": "ssh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/scm/sbox/sandbox-v2.git",
|
||||||
|
"name": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX/repos/sandbox/browse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"statusMessage": "Available",
|
||||||
|
"id": 2,
|
||||||
|
"slug": "sandbox",
|
||||||
|
"project": {
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"key": "SBOX",
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "Sandbox",
|
||||||
|
"id": 2,
|
||||||
|
"public": false
|
||||||
|
},
|
||||||
|
"name": "sandbox",
|
||||||
|
"state": "AVAILABLE",
|
||||||
|
"forkable": true,
|
||||||
|
"scmId": "git",
|
||||||
|
"public": false
|
||||||
|
},
|
||||||
|
"date": "2019-03-08T18:20:26+0530",
|
||||||
|
"eventKey": "repo:modified",
|
||||||
|
"new": {
|
||||||
|
"links": {
|
||||||
|
"clone": [
|
||||||
|
{
|
||||||
|
"href": "ssh://git@139.59.64.214:7999/sbox/sandbox-v2.git",
|
||||||
|
"name": "ssh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/scm/sbox/sandbox-v2.git",
|
||||||
|
"name": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX/repos/sandbox-v2/browse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"statusMessage": "Available",
|
||||||
|
"id": 2,
|
||||||
|
"slug": "sandbox-v2",
|
||||||
|
"project": {
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"key": "SBOX",
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "Sandbox",
|
||||||
|
"id": 2,
|
||||||
|
"public": false
|
||||||
|
},
|
||||||
|
"name": "sandbox v2",
|
||||||
|
"state": "AVAILABLE",
|
||||||
|
"forkable": true,
|
||||||
|
"scmId": "git",
|
||||||
|
"public": false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
{
|
||||||
|
"repository": {
|
||||||
|
"state": "AVAILABLE",
|
||||||
|
"links": {
|
||||||
|
"clone": [
|
||||||
|
{
|
||||||
|
"href": "ssh://git@139.59.64.214:7999/sbox/sandbox.git",
|
||||||
|
"name": "ssh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/scm/sbox/sandbox.git",
|
||||||
|
"name": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX/repos/sandbox/browse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"forkable": true,
|
||||||
|
"slug": "sandbox",
|
||||||
|
"project": {
|
||||||
|
"key": "SBOX",
|
||||||
|
"public": false,
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "Sandbox"
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"scmId": "git",
|
||||||
|
"public": false,
|
||||||
|
"name": "sandbox",
|
||||||
|
"statusMessage": "Available"
|
||||||
|
},
|
||||||
|
"actor": {
|
||||||
|
"active": true,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in",
|
||||||
|
"slug": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"name": "hypro999"
|
||||||
|
},
|
||||||
|
"eventKey": "repo:refs_changed",
|
||||||
|
"date": "2019-03-21T09:37:33+0530",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"toHash": "c7fccd35e163571148c42a3e8b11aef6661d19b8",
|
||||||
|
"type": "ADD",
|
||||||
|
"ref": {
|
||||||
|
"type": "BRANCH",
|
||||||
|
"id": "refs/heads/branch2",
|
||||||
|
"displayId": "branch2"
|
||||||
|
},
|
||||||
|
"fromHash": "0000000000000000000000000000000000000000",
|
||||||
|
"refId": "refs/heads/branch2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
74
zerver/webhooks/bitbucket3/fixtures/repo_push_add_tag.json
Normal file
74
zerver/webhooks/bitbucket3/fixtures/repo_push_add_tag.json
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
{
|
||||||
|
"repository": {
|
||||||
|
"state": "AVAILABLE",
|
||||||
|
"links": {
|
||||||
|
"clone": [
|
||||||
|
{
|
||||||
|
"href": "ssh://git@139.59.64.214:7999/sbox/sandbox.git",
|
||||||
|
"name": "ssh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/scm/sbox/sandbox.git",
|
||||||
|
"name": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX/repos/sandbox/browse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"forkable": true,
|
||||||
|
"slug": "sandbox",
|
||||||
|
"project": {
|
||||||
|
"key": "SBOX",
|
||||||
|
"public": false,
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "Sandbox"
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"scmId": "git",
|
||||||
|
"public": false,
|
||||||
|
"name": "sandbox",
|
||||||
|
"statusMessage": "Available"
|
||||||
|
},
|
||||||
|
"actor": {
|
||||||
|
"active": true,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in",
|
||||||
|
"slug": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"name": "hypro999"
|
||||||
|
},
|
||||||
|
"eventKey": "repo:refs_changed",
|
||||||
|
"date": "2019-03-17T22:41:19+0530",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"toHash": "9b5565bec1d0e8d5d60d423fe70b54849d3aacc4",
|
||||||
|
"type": "ADD",
|
||||||
|
"ref": {
|
||||||
|
"type": "TAG",
|
||||||
|
"id": "refs/tags/newtag",
|
||||||
|
"displayId": "newtag"
|
||||||
|
},
|
||||||
|
"fromHash": "0000000000000000000000000000000000000000",
|
||||||
|
"refId": "refs/tags/newtag"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
{
|
||||||
|
"repository": {
|
||||||
|
"state": "AVAILABLE",
|
||||||
|
"links": {
|
||||||
|
"clone": [
|
||||||
|
{
|
||||||
|
"href": "ssh://git@139.59.64.214:7999/sbox/sandbox.git",
|
||||||
|
"name": "ssh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/scm/sbox/sandbox.git",
|
||||||
|
"name": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX/repos/sandbox/browse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"forkable": true,
|
||||||
|
"slug": "sandbox",
|
||||||
|
"project": {
|
||||||
|
"key": "SBOX",
|
||||||
|
"public": false,
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "Sandbox"
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"scmId": "git",
|
||||||
|
"public": false,
|
||||||
|
"name": "sandbox",
|
||||||
|
"statusMessage": "Available"
|
||||||
|
},
|
||||||
|
"actor": {
|
||||||
|
"active": true,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in",
|
||||||
|
"slug": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"name": "hypro999"
|
||||||
|
},
|
||||||
|
"eventKey": "repo:refs_changed",
|
||||||
|
"date": "2019-03-21T09:44:17+0530",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"toHash": "0000000000000000000000000000000000000000",
|
||||||
|
"type": "DELETE",
|
||||||
|
"ref": {
|
||||||
|
"type": "BRANCH",
|
||||||
|
"id": "refs/heads/branch2",
|
||||||
|
"displayId": "branch2"
|
||||||
|
},
|
||||||
|
"fromHash": "c7fccd35e163571148c42a3e8b11aef6661d19b8",
|
||||||
|
"refId": "refs/heads/branch2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
{
|
||||||
|
"repository": {
|
||||||
|
"state": "AVAILABLE",
|
||||||
|
"links": {
|
||||||
|
"clone": [
|
||||||
|
{
|
||||||
|
"href": "ssh://git@139.59.64.214:7999/sbox/sandbox.git",
|
||||||
|
"name": "ssh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/scm/sbox/sandbox.git",
|
||||||
|
"name": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX/repos/sandbox/browse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"forkable": true,
|
||||||
|
"slug": "sandbox",
|
||||||
|
"project": {
|
||||||
|
"key": "SBOX",
|
||||||
|
"public": false,
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "Sandbox"
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"scmId": "git",
|
||||||
|
"public": false,
|
||||||
|
"name": "sandbox",
|
||||||
|
"statusMessage": "Available"
|
||||||
|
},
|
||||||
|
"actor": {
|
||||||
|
"active": true,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in",
|
||||||
|
"slug": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"name": "hypro999"
|
||||||
|
},
|
||||||
|
"eventKey": "repo:refs_changed",
|
||||||
|
"date": "2019-03-21T09:54:37+0530",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"toHash": "0000000000000000000000000000000000000000",
|
||||||
|
"type": "DELETE",
|
||||||
|
"ref": {
|
||||||
|
"type": "TAG",
|
||||||
|
"id": "refs/tags/test-tag",
|
||||||
|
"displayId": "test-tag"
|
||||||
|
},
|
||||||
|
"fromHash": "b223099667fb4f71dd4f6f7d61cd2b7cdb184b37",
|
||||||
|
"refId": "refs/tags/test-tag"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
{
|
||||||
|
"repository": {
|
||||||
|
"state": "AVAILABLE",
|
||||||
|
"links": {
|
||||||
|
"clone": [
|
||||||
|
{
|
||||||
|
"href": "ssh://git@139.59.64.214:7999/sbox/sandbox.git",
|
||||||
|
"name": "ssh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/scm/sbox/sandbox.git",
|
||||||
|
"name": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX/repos/sandbox/browse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"forkable": true,
|
||||||
|
"slug": "sandbox",
|
||||||
|
"project": {
|
||||||
|
"key": "SBOX",
|
||||||
|
"public": false,
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "Sandbox"
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"scmId": "git",
|
||||||
|
"public": false,
|
||||||
|
"name": "sandbox",
|
||||||
|
"statusMessage": "Available"
|
||||||
|
},
|
||||||
|
"actor": {
|
||||||
|
"active": true,
|
||||||
|
"type": "NORMAL",
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in",
|
||||||
|
"slug": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"name": "hypro999"
|
||||||
|
},
|
||||||
|
"eventKey": "repo:refs_changed",
|
||||||
|
"date": "2019-03-17T19:09:40+0530",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"toHash": "3980c2be32a7e23c795741d5dc1a2eecb9b85d6d",
|
||||||
|
"type": "UPDATE",
|
||||||
|
"ref": {
|
||||||
|
"type": "BRANCH",
|
||||||
|
"id": "refs/heads/branch1",
|
||||||
|
"displayId": "branch1"
|
||||||
|
},
|
||||||
|
"fromHash": "9e5afb9f11a396eae4bf24755505d931b530649a",
|
||||||
|
"refId": "refs/heads/branch1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"toHash": "fc43d13cff1abb28631196944ba4fc4ad06a2cf2",
|
||||||
|
"type": "UPDATE",
|
||||||
|
"ref": {
|
||||||
|
"type": "BRANCH",
|
||||||
|
"id": "refs/heads/master",
|
||||||
|
"displayId": "master"
|
||||||
|
},
|
||||||
|
"fromHash": "cb2e368ba3aca8a510f89667ae97b56d6a323db7",
|
||||||
|
"refId": "refs/heads/master"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
{
|
||||||
|
"actor": {
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/users/hypro999"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"displayName": "Hemanth V. Alluri",
|
||||||
|
"active": true,
|
||||||
|
"slug": "hypro999",
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "hypro999",
|
||||||
|
"id": 1,
|
||||||
|
"emailAddress": "f20171170@pilani.bits-pilani.ac.in"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"links": {
|
||||||
|
"clone": [
|
||||||
|
{
|
||||||
|
"href": "ssh://git@139.59.64.214:7999/sbox/sandbox.git",
|
||||||
|
"name": "ssh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/scm/sbox/sandbox.git",
|
||||||
|
"name": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX/repos/sandbox/browse"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"statusMessage": "Available",
|
||||||
|
"id": 2,
|
||||||
|
"slug": "sandbox",
|
||||||
|
"project": {
|
||||||
|
"links": {
|
||||||
|
"self": [
|
||||||
|
{
|
||||||
|
"href": "http://139.59.64.214:7990/projects/SBOX"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"key": "SBOX",
|
||||||
|
"type": "NORMAL",
|
||||||
|
"name": "Sandbox",
|
||||||
|
"id": 2,
|
||||||
|
"public": false
|
||||||
|
},
|
||||||
|
"name": "sandbox",
|
||||||
|
"state": "AVAILABLE",
|
||||||
|
"forkable": true,
|
||||||
|
"scmId": "git",
|
||||||
|
"public": false
|
||||||
|
},
|
||||||
|
"date": "2019-03-17T18:15:52+0530",
|
||||||
|
"eventKey": "repo:refs_changed",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"ref": {
|
||||||
|
"id": "refs/heads/master",
|
||||||
|
"displayId": "master",
|
||||||
|
"type": "BRANCH"
|
||||||
|
},
|
||||||
|
"toHash": "e68c981ef53dbab0a5ca320a2d8d80e216c70528",
|
||||||
|
"refId": "refs/heads/master",
|
||||||
|
"fromHash": "7c4cae30d77990b9095024bdd6c7bf0d545d870b",
|
||||||
|
"type": "UPDATE"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
110
zerver/webhooks/bitbucket3/tests.py
Normal file
110
zerver/webhooks/bitbucket3/tests.py
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from zerver.lib.test_classes import WebhookTestCase
|
||||||
|
|
||||||
|
class Bitbucket3HookTests(WebhookTestCase):
|
||||||
|
STREAM_NAME = "bitbucket3"
|
||||||
|
URL_TEMPLATE = "/api/v1/external/bitbucket3?stream={stream}&api_key={api_key}"
|
||||||
|
FIXTURE_DIR_NAME = "bitbucket3"
|
||||||
|
EXPECTED_TOPIC = "sandbox"
|
||||||
|
EXPECTED_TOPIC_BRANCH_EVENTS = "sandbox / {branch}"
|
||||||
|
|
||||||
|
def test_commit_comment_added(self) -> None:
|
||||||
|
expected_message = """hypro999 commented on [508d1b6](http://139.59.64.214:7990/projects\
|
||||||
|
/SBOX/repos/sandbox/commits/508d1b67f1f8f3a25f543a030a7a178894aa9907)\n~~~ quote\nJust an \
|
||||||
|
arbitrary comment on a commit.\n~~~"""
|
||||||
|
self.send_and_test_stream_message("commit_comment_added",
|
||||||
|
self.EXPECTED_TOPIC,
|
||||||
|
expected_message)
|
||||||
|
|
||||||
|
def test_commit_comment_edited(self) -> None:
|
||||||
|
expected_message = """hypro999 edited their comment on [508d1b6](http://139.59.64.214:7990\
|
||||||
|
/projects/SBOX/repos/sandbox/commits/508d1b67f1f8f3a25f543a030a7a178894aa9907)\n~~~ quote\nJust \
|
||||||
|
an arbitrary comment on a commit. Nothing to see here...\n~~~"""
|
||||||
|
self.send_and_test_stream_message("commit_comment_edited",
|
||||||
|
self.EXPECTED_TOPIC,
|
||||||
|
expected_message)
|
||||||
|
|
||||||
|
def test_commit_comment_deleted(self) -> None:
|
||||||
|
expected_message = """hypro999 deleted their comment on [508d1b6]\
|
||||||
|
(http://139.59.64.214:7990/projects/SBOX/repos/sandbox/commits/508d1b67f1f8f3a25f543a030a7a178894a\
|
||||||
|
a9907)\n~~~ quote\nJust an arbitrary comment on a commit. Nothing to see here...\n~~~"""
|
||||||
|
self.send_and_test_stream_message("commit_comment_deleted",
|
||||||
|
self.EXPECTED_TOPIC,
|
||||||
|
expected_message)
|
||||||
|
|
||||||
|
def test_bitbucket3_repo_forked(self) -> None:
|
||||||
|
expected_message = """User Hemanth V. Alluri(login: hypro999) forked the repository into \
|
||||||
|
[sandbox fork](http://139.59.64.214:7990/users/hypro999/repos/sandbox-fork/browse)."""
|
||||||
|
self.send_and_test_stream_message("repo_forked", self.EXPECTED_TOPIC, expected_message)
|
||||||
|
|
||||||
|
def test_bitbucket3_repo_modified(self) -> None:
|
||||||
|
expected_message = """hypro999 changed the name of the **sandbox** repo from **sandbox** \
|
||||||
|
to **sandbox v2**"""
|
||||||
|
expected_topic = "sandbox v2"
|
||||||
|
self.send_and_test_stream_message("repo_modified", expected_topic, expected_message)
|
||||||
|
|
||||||
|
def test_push_add_branch(self) -> None:
|
||||||
|
expected_message = """hypro999 created branch2 branch"""
|
||||||
|
expected_topic = self.EXPECTED_TOPIC_BRANCH_EVENTS.format(branch="branch2")
|
||||||
|
self.send_and_test_stream_message("repo_push_add_branch",
|
||||||
|
expected_topic,
|
||||||
|
expected_message)
|
||||||
|
|
||||||
|
def test_push_add_tag(self) -> None:
|
||||||
|
expected_message = """hypro999 pushed tag newtag"""
|
||||||
|
self.send_and_test_stream_message("repo_push_add_tag",
|
||||||
|
self.EXPECTED_TOPIC,
|
||||||
|
expected_message)
|
||||||
|
|
||||||
|
def test_push_delete_branch(self) -> None:
|
||||||
|
expected_message = """hypro999 deleted branch branch2"""
|
||||||
|
expected_topic = self.EXPECTED_TOPIC_BRANCH_EVENTS.format(branch="branch2")
|
||||||
|
self.send_and_test_stream_message("repo_push_delete_branch",
|
||||||
|
expected_topic,
|
||||||
|
expected_message)
|
||||||
|
|
||||||
|
def test_push_delete_tag(self) -> None:
|
||||||
|
expected_message = """hypro999 removed tag test-tag"""
|
||||||
|
self.send_and_test_stream_message("repo_push_delete_tag",
|
||||||
|
self.EXPECTED_TOPIC,
|
||||||
|
expected_message)
|
||||||
|
|
||||||
|
def test_push_update_single_branch(self) -> None:
|
||||||
|
expected_message = """hypro999 pushed to branch master. Head is now \
|
||||||
|
e68c981ef53dbab0a5ca320a2d8d80e216c70528"""
|
||||||
|
expected_topic = self.EXPECTED_TOPIC_BRANCH_EVENTS.format(branch="master")
|
||||||
|
self.send_and_test_stream_message("repo_push_update_single_branch",
|
||||||
|
expected_topic,
|
||||||
|
expected_message)
|
||||||
|
|
||||||
|
def test_push_update_multiple_branches(self) -> None:
|
||||||
|
expected_message_first = """hypro999 pushed to branch branch1. Head is now \
|
||||||
|
3980c2be32a7e23c795741d5dc1a2eecb9b85d6d"""
|
||||||
|
expected_message_second = """hypro999 pushed to branch master. Head is now \
|
||||||
|
fc43d13cff1abb28631196944ba4fc4ad06a2cf2"""
|
||||||
|
self.send_and_test_stream_message("repo_push_update_multiple_branches")
|
||||||
|
|
||||||
|
msg = self.get_last_message()
|
||||||
|
self.do_test_topic(msg, self.EXPECTED_TOPIC_BRANCH_EVENTS.format(branch="master"))
|
||||||
|
self.do_test_message(msg, expected_message_second)
|
||||||
|
|
||||||
|
msg = self.get_second_to_last_message()
|
||||||
|
self.do_test_topic(msg, self.EXPECTED_TOPIC_BRANCH_EVENTS.format(branch="branch1"))
|
||||||
|
self.do_test_message(msg, expected_message_first)
|
||||||
|
|
||||||
|
def test_push_update_multiple_branches_with_branch_filter(self) -> None:
|
||||||
|
self.url = self.build_webhook_url(branches='master')
|
||||||
|
expected_message = """hypro999 pushed to branch master. Head is now \
|
||||||
|
fc43d13cff1abb28631196944ba4fc4ad06a2cf2"""
|
||||||
|
expected_topic = self.EXPECTED_TOPIC_BRANCH_EVENTS.format(branch="master")
|
||||||
|
self.send_and_test_stream_message("repo_push_update_multiple_branches",
|
||||||
|
expected_topic,
|
||||||
|
expected_message)
|
||||||
|
|
||||||
|
self.url = self.build_webhook_url(branches='branch1')
|
||||||
|
expected_message = """hypro999 pushed to branch branch1. Head is now \
|
||||||
|
3980c2be32a7e23c795741d5dc1a2eecb9b85d6d"""
|
||||||
|
expected_topic = self.EXPECTED_TOPIC_BRANCH_EVENTS.format(branch="branch1")
|
||||||
|
self.send_and_test_stream_message("repo_push_update_multiple_branches",
|
||||||
|
expected_topic,
|
||||||
|
expected_message)
|
||||||
163
zerver/webhooks/bitbucket3/view.py
Normal file
163
zerver/webhooks/bitbucket3/view.py
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
from inspect import signature
|
||||||
|
from functools import partial
|
||||||
|
from typing import Any, Dict, Optional, List, Callable
|
||||||
|
|
||||||
|
from django.http import HttpRequest, HttpResponse
|
||||||
|
|
||||||
|
from zerver.models import UserProfile
|
||||||
|
from zerver.decorator import api_key_only_webhook_view
|
||||||
|
from zerver.lib.request import REQ, has_request_variables
|
||||||
|
from zerver.lib.response import json_success
|
||||||
|
from zerver.lib.webhooks.git import TOPIC_WITH_BRANCH_TEMPLATE, \
|
||||||
|
get_push_tag_event_message, get_remove_branch_event_message, \
|
||||||
|
get_create_branch_event_message, get_commits_comment_action_message
|
||||||
|
from zerver.lib.webhooks.common import check_send_webhook_message, \
|
||||||
|
UnexpectedWebhookEventType
|
||||||
|
from zerver.webhooks.bitbucket2.view import BITBUCKET_TOPIC_TEMPLATE, \
|
||||||
|
BITBUCKET_FORK_BODY, BITBUCKET_REPO_UPDATED_CHANGED
|
||||||
|
|
||||||
|
BRANCH_UPDATED_MESSAGE_TEMPLATE = "{user_name} pushed to branch {branch_name}. Head is now {head}"
|
||||||
|
|
||||||
|
def repo_comment_handler(payload: Dict[str, Any], action: str) -> List[Dict[str, str]]:
|
||||||
|
repo_name = payload["repository"]["name"]
|
||||||
|
user_name = payload["actor"]["name"]
|
||||||
|
subject = BITBUCKET_TOPIC_TEMPLATE.format(repository_name=repo_name)
|
||||||
|
sha = payload["commit"]
|
||||||
|
commit_url = payload["repository"]["links"]["self"][0]["href"][:-6] # remove the "browse" at the end
|
||||||
|
commit_url += "commits/%s" % (sha,)
|
||||||
|
body = get_commits_comment_action_message(user_name=user_name,
|
||||||
|
action=action,
|
||||||
|
commit_url=commit_url,
|
||||||
|
sha=sha,
|
||||||
|
message=payload["comment"]["text"])
|
||||||
|
return [{"subject": subject, "body": body}]
|
||||||
|
|
||||||
|
def repo_forked_handler(payload: Dict[str, Any]) -> List[Dict[str, str]]:
|
||||||
|
repo_name = payload["repository"]["origin"]["name"]
|
||||||
|
subject = BITBUCKET_TOPIC_TEMPLATE.format(repository_name=repo_name)
|
||||||
|
body = BITBUCKET_FORK_BODY.format(
|
||||||
|
display_name=payload["actor"]["displayName"],
|
||||||
|
username=payload["actor"]["name"],
|
||||||
|
fork_name=payload["repository"]["name"],
|
||||||
|
fork_url=payload["repository"]["links"]["self"][0]["href"]
|
||||||
|
)
|
||||||
|
return [{"subject": subject, "body": body}]
|
||||||
|
|
||||||
|
def repo_modified_handler(payload: Dict[str, Any]) -> List[Dict[str, str]]:
|
||||||
|
subject_new = BITBUCKET_TOPIC_TEMPLATE.format(repository_name=payload["new"]["name"])
|
||||||
|
body = BITBUCKET_REPO_UPDATED_CHANGED.format(
|
||||||
|
actor=payload["actor"]["name"],
|
||||||
|
change="name",
|
||||||
|
repo_name=payload["old"]["name"],
|
||||||
|
old=payload["old"]["name"],
|
||||||
|
new=payload["new"]["name"]
|
||||||
|
) # As of writing this, the only change we'd be notified about is a name change.
|
||||||
|
return [{"subject": subject_new, "body": body}]
|
||||||
|
|
||||||
|
def repo_push_branch_data(payload: Dict[str, Any], change: Dict[str, Any]) -> Dict[str, str]:
|
||||||
|
event_type = change["type"]
|
||||||
|
repo_name = payload["repository"]["name"]
|
||||||
|
user_name = payload["actor"]["name"]
|
||||||
|
branch_name = change["ref"]["displayId"]
|
||||||
|
branch_head = change["toHash"]
|
||||||
|
|
||||||
|
if event_type == "ADD":
|
||||||
|
body = get_create_branch_event_message(user_name=user_name, url=None, branch_name=branch_name)
|
||||||
|
elif event_type == "UPDATE":
|
||||||
|
body = BRANCH_UPDATED_MESSAGE_TEMPLATE.format(user_name=user_name,
|
||||||
|
branch_name=branch_name,
|
||||||
|
head=branch_head)
|
||||||
|
elif event_type == "DELETE":
|
||||||
|
body = get_remove_branch_event_message(user_name, branch_name)
|
||||||
|
else:
|
||||||
|
message = "%s.%s" % (payload["eventKey"], event_type) # nocoverage
|
||||||
|
raise UnexpectedWebhookEventType("BitBucket Server", message)
|
||||||
|
|
||||||
|
subject = TOPIC_WITH_BRANCH_TEMPLATE.format(repo=repo_name, branch=branch_name)
|
||||||
|
return {"subject": subject, "body": body}
|
||||||
|
|
||||||
|
def repo_push_tag_data(payload: Dict[str, Any], change: Dict[str, Any]) -> Dict[str, str]:
|
||||||
|
event_type = change["type"]
|
||||||
|
repo_name = payload["repository"]["name"]
|
||||||
|
tag_name = change["ref"]["displayId"]
|
||||||
|
user_name = payload["actor"]["name"]
|
||||||
|
|
||||||
|
if event_type == "ADD":
|
||||||
|
action = "pushed"
|
||||||
|
elif event_type == "DELETE":
|
||||||
|
action = "removed"
|
||||||
|
else:
|
||||||
|
message = "%s.%s" % (payload["eventKey"], event_type) # nocoverage
|
||||||
|
raise UnexpectedWebhookEventType("BitBucket Server", message)
|
||||||
|
|
||||||
|
subject = BITBUCKET_TOPIC_TEMPLATE.format(repository_name=repo_name)
|
||||||
|
body = get_push_tag_event_message(
|
||||||
|
user_name,
|
||||||
|
tag_name,
|
||||||
|
action=action)
|
||||||
|
return {"subject": subject, "body": body}
|
||||||
|
|
||||||
|
def repo_push_handler(payload: Dict[str, Any], branches: Optional[str]=None) -> List[Dict[str, str]]:
|
||||||
|
data = []
|
||||||
|
for change in payload["changes"]:
|
||||||
|
event_target_type = change["ref"]["type"]
|
||||||
|
if event_target_type == "BRANCH":
|
||||||
|
branch = change["ref"]["displayId"]
|
||||||
|
if branches:
|
||||||
|
if branch not in branches:
|
||||||
|
continue
|
||||||
|
data.append(repo_push_branch_data(payload, change))
|
||||||
|
elif event_target_type == "TAG":
|
||||||
|
data.append(repo_push_tag_data(payload, change))
|
||||||
|
else:
|
||||||
|
message = "%s.%s" % (payload["eventKey"], event_target_type) # nocoverage
|
||||||
|
raise UnexpectedWebhookEventType("BitBucket Server", message)
|
||||||
|
return data
|
||||||
|
|
||||||
|
EVENT_HANDLER_MAP = {
|
||||||
|
"repo:comment:added": partial(repo_comment_handler, action="commented"),
|
||||||
|
"repo:comment:edited": partial(repo_comment_handler, action="edited their comment"),
|
||||||
|
"repo:comment:deleted": partial(repo_comment_handler, action="deleted their comment"),
|
||||||
|
"repo:forked": repo_forked_handler,
|
||||||
|
"repo:modified": repo_modified_handler,
|
||||||
|
"repo:refs_changed": repo_push_handler,
|
||||||
|
"pr:comment:added": None,
|
||||||
|
"pr:comment:edited": None,
|
||||||
|
"pr:comment:deleted": None,
|
||||||
|
"pr:declined": None,
|
||||||
|
"pr:deleted": None,
|
||||||
|
"pr:merged": None,
|
||||||
|
"pr:modified": None,
|
||||||
|
"pr:opened": None,
|
||||||
|
"pr:reviewer:approved": None,
|
||||||
|
"pr:reviewer:needs_work": None,
|
||||||
|
"pr:reviewer:updated": None,
|
||||||
|
"pr:reviewer:unapproved": None,
|
||||||
|
} # type Dict[str, Optional[Callable[..., List[Dict[str, str]]]]]
|
||||||
|
|
||||||
|
def get_event_handler(eventkey: str) -> Callable[..., List[Dict[str, str]]]:
|
||||||
|
# The main reason for this function existance is because of mypy
|
||||||
|
handler = EVENT_HANDLER_MAP.get(eventkey) # type: Any
|
||||||
|
if handler is None:
|
||||||
|
raise UnexpectedWebhookEventType("BitBucket Server", eventkey)
|
||||||
|
return handler
|
||||||
|
|
||||||
|
@api_key_only_webhook_view("Bitbucket3")
|
||||||
|
@has_request_variables
|
||||||
|
def api_bitbucket3_webhook(request: HttpRequest, user_profile: UserProfile,
|
||||||
|
payload: Dict[str, Any]=REQ(argument_type="body"),
|
||||||
|
branches: Optional[str]=REQ(default=None),
|
||||||
|
user_specified_topic: Optional[str]=REQ("topic", default=None)
|
||||||
|
) -> HttpResponse:
|
||||||
|
eventkey = payload["eventKey"]
|
||||||
|
handler = get_event_handler(eventkey)
|
||||||
|
|
||||||
|
if "branches" in signature(handler).parameters:
|
||||||
|
data = handler(payload, branches)
|
||||||
|
else:
|
||||||
|
data = handler(payload)
|
||||||
|
for element in data:
|
||||||
|
check_send_webhook_message(request, user_profile, element["subject"],
|
||||||
|
element["body"], unquote_url_parameters=True)
|
||||||
|
|
||||||
|
return json_success()
|
||||||
Reference in New Issue
Block a user