summaryrefslogtreecommitdiff
path: root/_posts/2009-10-16-post-receive-hooks.markdown
blob: 25db1e84a64547a23a232fb4888933e857d254fc (plain)
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: collaborating
---

_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.

![](http://img.skitch.com/20100620-r8st7468q7q5waf3y85hmpwtqs.png)

![](http://img.skitch.com/20100620-br6dw5iiyk2643fahkqbi54h36.png)

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 most recent commit as the first element.  The last element, therefor, is the oldest commit.

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/)