1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
---
layout: default
title: Post-Receive Hooks
description: Working with GitHub's post-receive web hooks.
categories: advanced
---
_For help testing webhooks, see [this guide](/testing-webhooks)_
If you supply a post-receive URL, GitHub will POST to that URL when someone uses `git push` on that repository.


What we'll send is JSON containing information about the push and the commits involved.
Here's the template we use in Ruby to generate the JSON:
{% highlight ruby %}
{
:before => before,
:after => after,
:ref => ref,
:commits => [{
:id => commit.id,
:message => commit.message,
:timestamp => commit.committed_date.xmlschema,
:url => commit_url,
:added => array_of_added_paths,
:removed => array_of_removed_paths,
:modified => array_of_modified_paths,
:author => {
:name => commit.author.name,
:email => commit.author.email
}
}],
:repository => {
:name => repository.name,
:url => repo_url,
:pledgie => repository.pledgie.id,
:description => repository.description,
:homepage => repository.homepage,
:watchers => repository.watchers.size,
:forks => repository.forks.size,
:private => repository.private?,
:owner => {
:name => repository.owner.login,
:email => repository.owner.email
}
}
}
{% endhighlight %}
This is sent as a POST with a single parameter: 'payload'
So, for example, you'd do something like this in a [Sinatra](http://sinatra.rubyforge.org/) server:
{% highlight ruby %}
post '/' do
push = JSON.parse(params[:payload])
"I got some JSON: #{push.inspect}"
end
{% endhighlight %}
The `commits` array is ordered with the oldest commit as the first element. The last element is the newest commit and should match the "after" value for the branch.
Here's an example payload:
{% highlight javascript %}
{
"before": "5aef35982fb2d34e9d9d4502f6ede1072793222d",
"repository": {
"url": "http://github.com/defunkt/github",
"name": "github",
"description": "You're lookin' at it.",
"watchers": 5,
"forks": 2,
"private": 1,
"owner": {
"email": "chris@ozmm.org",
"name": "defunkt"
}
},
"commits": [
{
"id": "41a212ee83ca127e3c8cf465891ab7216a705f59",
"url": "http://github.com/defunkt/github/commit/41a212ee83ca127e3c8cf465891ab7216a705f59",
"author": {
"email": "chris@ozmm.org",
"name": "Chris Wanstrath"
},
"message": "okay i give in",
"timestamp": "2008-02-15T14:57:17-08:00",
"added": ["filepath.rb"]
},
{
"id": "de8251ff97ee194a289832576287d6f8ad74e3d0",
"url": "http://github.com/defunkt/github/commit/de8251ff97ee194a289832576287d6f8ad74e3d0",
"author": {
"email": "chris@ozmm.org",
"name": "Chris Wanstrath"
},
"message": "update pricing a tad",
"timestamp": "2008-02-15T14:36:34-08:00"
}
],
"after": "de8251ff97ee194a289832576287d6f8ad74e3d0",
"ref": "refs/heads/master"
}
{% endhighlight %}
For more information on this technique, see the [Web Hooks Wiki](http://webhooks.pbwiki.com/).
Links
-----
* [raggi/github_post_receive_server](http://github.com/raggi/github_post_receive_server/) -- A template Rack server
* [jnewland/github-campfire](http://github.com/jnewland/github-campfire/)
* [webs/irccat](http://github.com/webs/irccat)
* [jnunemaker/github-twitter](http://github.com/jnunemaker/github-twitter/)
|