Documentation improvements.
[irker.git] / irkerhook.xml
1 <!DOCTYPE refentry PUBLIC 
2    "-//OASIS//DTD DocBook XML V4.1.2//EN"
3    "docbook/docbookx.dtd">
4 <refentry id='irkerhook.1'>
5 <refmeta>
6 <refentrytitle>irkerhook</refentrytitle>
7 <manvolnum>1</manvolnum>
8 <refmiscinfo class='date'>Aug 27 2012</refmiscinfo>
9 <refmiscinfo class='source'>irker</refmiscinfo>
10 <refmiscinfo class='product'>irker</refmiscinfo>
11 <refmiscinfo class='manual'>Commands</refmiscinfo>
12 </refmeta>
13 <refnamediv id='name'>
14 <refname>irkerhook</refname>
15 <refpurpose>repository hook script issuing irker notifications</refpurpose>
16 </refnamediv>
17 <refsynopsisdiv id='synopsis'>
18
19 <cmdsynopsis>
20   <command>irkerhook.py</command>
21      <arg>-n</arg>
22      <arg>-V</arg>
23      <group><arg rep='repeat'><replaceable>--variable=value</replaceable></arg></group>
24      <group><arg rep='repeat'><replaceable>commit-id</replaceable></arg></group>
25 </cmdsynopsis>
26 </refsynopsisdiv>
27
28 <refsect1 id='description'><title>DESCRIPTION</title>
29
30 <para><application>irkerhook.py</application> is a Python script intended 
31 to be called from the post-commit hook of a version-control repository. Its
32 job is to collect information about the commit that fired the hook (and
33 possibly preferences set by the repository owner) and ship that information
34 to an instance of <application>irkerd</application> for forwarding to
35 various announcement channels.</para>
36
37 <para>The proper invocation and behavior of 
38 <application>irkerhook.py</application> varies depending on which
39 VCS (version-control system) is calling it.  There are four different places
40 from which it may extract information:</para>
41
42 <orderedlist>
43 <listitem><para>Calls to VCS utilities.</para></listitem>
44 <listitem><para>In VCSes like git that support user-settable configuration
45 variables, variables with the prefix "irker.".</para></listitem>
46 <listitem><para>In other VCSes, a configuration file, "irker.conf", in the
47 repository's internals directory.</para></listitem>
48 <listitem><para>Command-line arguments of the form
49 --variable=value.</para></listitem>
50 </orderedlist>
51
52 <para>The following variables are general to all supported VCSes:</para>
53
54 <variablelist>
55 <varlistentry>
56 <term>project</term>
57 <listitem>
58 <para>The name of the project.  Should be a relatively short identifier;
59 will usually appear at the very beginning of a notification.</para>
60 </listitem>
61 </varlistentry>
62 <varlistentry>
63 <term>repo</term>
64 <listitem>
65 <para>The name of the repository top-level directory.  If not
66 specified, defaults to a lowercased copy of the project name.</para>
67 </listitem>
68 </varlistentry>
69 <varlistentry>
70 <term>channels</term>
71 <listitem>
72 <para>An IRC channel URL, or comma-separated list of same, identifying
73 channels to which notifications are to be sent. If not specified, the
74 defaults channel list id the freenode #commits channel plus the freenode
75 channel named by the project variable.</para>
76 </listitem>
77 </varlistentry>
78 <varlistentry>
79 <term>server</term>
80 <listitem>
81 <para>The host on which the notification-relaying irker daemon is expected
82 to reside. Defaults to "localhost".</para>
83 </listitem>
84 </varlistentry>
85 <varlistentry>
86 <term>tcp</term>
87 <listitem>
88 <para>If "true", use TCP for communication; if "false", use UDP.
89 Defaults to "false".</para>
90 </listitem>
91 </varlistentry>
92 <varlistentry>
93 <term>urlprefix</term>
94 <listitem>
95 <para>Changeset URL prefix for your repo. When the commit ID is appended
96 to this, it should point at a CGI that will display the commit
97 through cgit,gitweb or something similar. The defaults will probably
98 work if you have a typical gitweb/cgit setup.</para>
99
100 <para>If the value of this variable is "None", generation of the URL
101 field in commit notifications will be suppressed. Other magic values
102 are "cgit", "gitweb", and "viewcvs", which expand to URL templates
103 that will usually work with those systems.</para>
104
105 <para>The magic cookies "%(host)s" and %(repo)s" may occur in this
106 URL.  The former is expanded to the FQDN of the host on which
107 <application>irkerhook.py</application> is running; the latter is
108 expanded to the value of the "repo" variable.</para>
109 </listitem>
110 </varlistentry>
111 <varlistentry>
112 <term>tinyifier</term>
113 <listitem>
114 <para>URL template pointing to a service for compressing URLs so they
115 will take up less space in the notification line. If the value of this
116 variable is "None", no compression will be attempted.</para>
117 </listitem>
118 </varlistentry>
119 <varlistentry>
120 <term>color</term>
121 <listitem>
122 <para>If "mIRC", highlight notification fields with mIRC color codes.
123 If "ANSI", highlight notification fields with ANSI color escape sequences.
124 Defaults to "none" (no colors). Note: if you turn this on and
125 notifications stop appearing on your channel, you need to turn off
126 IRC's color filter on that channel.  To do this you will need op
127 privileges; issue the command "/mode #irker -c".  You may need to
128 first issue the command "/msg chanserv set #irker MLOCK
129 +nt-slk".</para>
130 </listitem>
131 </varlistentry>
132 <varlistentry>
133 <term>maxchannels</term>
134 <listitem>
135 <para>Interpreted as an integer. If not zero, limits the number of
136 channels the hook will interpret from the "channels" variable.</para>
137
138 <para>This variable cannot be set through VCS configuration variables
139 or <filename>irker.conf</filename>; it can only be set with a command-line
140 argument.  Thus, on a forge site in which repository owners are not
141 allowed to modify their post-commit scripts, a site administrator can set it 
142 to prevent shotgun spamming by malicious project owners.  Setting it to
143 a value less than 2, however, would probably be unwise.</para>
144 </listitem>
145 </varlistentry>
146 </variablelist>
147
148 <refsect2 id="git"><title>git</title>
149
150 <para>Under git, the normal way to invoke this hook (from within the
151 update hook) passes with a refname followed by a list of commits.  Because 
152 <command>git rev-list</command> normally lists from most recent to oldest,
153 you'll want to use --reverse to make notifications be omitted in chronological
154 order. In a normal update script, the invocation should look like this</para>
155
156 <programlisting>
157 refname=$1
158 old=$2
159 new=$3
160 irkerhook.py --refname=${refname} $(git rev-list --reverse ${old}..${new})
161 </programlisting>
162
163 <para>except that you'll need an absolute path for irkerhook.py.</para>
164
165 <para>For testing purposes and backward compatibility, if you invoke
166 <application>irkerhook.py</application> with no arguments (as in a
167 post-commit hook) it will behave as though it had been called like
168 this:</para>
169
170 <programlisting>
171 irkerhook.py --refname=refs/heads/master HEAD
172 </programlisting>
173
174 <para>However, this will not give the right result when you push to 
175 a non-default branch of a bare repo.</para>
176
177 <para>Preferences may be set in the repo <filename>config</filename>
178 file in an [irker] section. Here is an example of what that can look
179 like:</para>
180
181 <programlisting>
182 [irker]
183     project = gpsd
184     color = ANSI
185     channels = {irc://chat.freenode.net/gpsd, irc://chat.freenode.net/commits}
186 </programlisting>
187
188 <para> You should not set the "repository" variable (an equivalent
189 will be computed). No attempt is made to interpret an
190 <filename>irker.conf</filename> file.</para>
191
192 <para>The default value of the "project" variable is the basename
193 of the repository directory. The default value of the "urlprefix"
194 variable is "cgit".</para>
195
196 <para>There is one git-specific variable, "revformat", controlling
197 the format of the commit identifier in a notification. It
198 may have the following values:</para>
199
200 <variablelist>
201 <varlistentry>
202 <term>raw</term>
203 <listitem><para>full hex ID of commit</para></listitem>
204 </varlistentry>
205 <varlistentry>
206 <term>short</term>
207 <listitem><para>first 12 chars of hex ID</para></listitem>
208 </varlistentry>
209 <varlistentry>
210 <term>describe</term>
211 <listitem><para>describe relative to last tag, falling back to short</para></listitem>
212 </varlistentry>
213 </variablelist>
214
215 <para>The default is 'describe'.</para>
216 </refsect2>
217
218 <refsect2 id="svn"><title>Subversion</title>
219
220 <para>Under Subversion, <application>irkerhook.py</application>
221 accepts a --repository option with value (the absolute pathname of the
222 Subversion repository) and a commit argument (the numeric revision level of
223 the commit).  The defaults are the current working directory and HEAD,
224 respectively.</para>
225
226 <para>Note, however, that you <emphasis>cannot</emphasis> default the
227 repository argumment inside a Subversion post-commit hook.  Instead,
228 the values must be the two arguments that Subversion passes to that
229 hook as arguments. Thus, a typical invocation in the post-commit
230 script will look like this:</para>
231
232 <programlisting>
233 REPO=$1
234 REV=$2
235 irkerhook.py --repository=$REPO $REV
236 </programlisting>
237
238 <para>Other --variable=value settings may also be
239 given on the command line, and will override any settings in an
240 <filename>irker.conf</filename> file.</para>
241
242 <para>The default for the project variable is the basename of the
243 repository. The default value of the "urlprefix" variable is
244 "viewcvs".</para>
245
246 <para>If an <filename>irker.conf</filename> file exists in the repository
247 root directory (not the checkout directory but where internals such as the
248 "format" file live) the hook will interpret variable settings from it.  Here
249 is an example of what such a file might look like:</para>
250
251 <programlisting>
252 # irkerhook variable settings for the irker project
253 project = irker
254 channels  = irc://chat.freenode/irker,irc://chat.freenode/commits
255 tcp = false
256 </programlisting>
257
258 <para>Don't set the "repository" or "commit" variables in this file;
259 that would have unhappy results.</para>
260
261 <para>There are no Subversion-specific variables.</para>
262
263 </refsect2>
264
265 <refsect2 id="hg"><title>Mercurial</title>
266
267 <para>Under Mercurial, <application>irkerhook.py</application> can be
268 invoked in two ways: either as a Python hook (preferred) or as a
269 script.</para>
270
271 <para>To call it as a Python hook, add the collowing to the 
272 "commit" or "incoming" hook declaration in your Mercurial
273 repository:</para>
274
275 <programlisting>
276 [hooks]
277         incoming.irker = python:/path/to/irkerhook.py:hg_hook
278 </programlisting>
279
280 <para>When called as a script, the hook accepts a --repository option
281 with value (the absolute pathname of the Mercurial repository) and can
282 take a commit argument (the Mercurial hash ID of the commit or a
283 reference to it). The default for the repository argument is the 
284 current directory. The default commit argument is '-1', designating
285 the current tip commit.</para>
286
287 <para>As for git, in both cases all variables may be set in the repo
288 <filename>hgrc</filename> file in an [irker] section.  Command-line
289 variable=value arguments are accepted but not required for script
290 invocation.  No attempt is made to interpret an
291 <filename>irker.conf</filename> file.</para>
292
293 <para>The default value of the "project" variable is the basename
294 of the repository directory. The default value of the "urlprefix"
295 variable is the value of the "web.baseurl" config value, if it
296 exists.</para>
297
298 </refsect2>
299
300 <refsect2 id="filter"><title>Filtering</title>
301
302 <para>It is possible to filter commits before sending them to
303 <application>irkerd</application>.</para>
304
305 <para>You have to specify the <option>filtercmd</option> option, which
306 will be the command <application>irkerhook.py</application> will
307 run. This command should accept one arguments, which is a JSON
308 representation of commit and extractor metadata (including the
309 channels variable). The command should emit to standard output a JSON
310 representation of (possibly altered) metadata.</para>
311
312 <para>Below is an example filter:</para>
313
314 <programlisting>
315 #!/usr/bin/env python
316 # This is a trivial example of a metadata filter.
317 # All it does is change the name of the commit's author.
318
319 import sys, json
320 metadata = json.loads(sys.argv[1])
321
322 metadata['author'] = "The Great and Powerful Oz"
323
324 print json.dumps(metadata)
325 # end
326 </programlisting>
327
328 <para>Standard error is available to the hook for progress and
329 error messages.</para>
330
331 </refsect2>
332
333 </refsect1>
334
335 <refsect1 id='options'><title>OPTIONS</title>
336
337 <para><application>irkerhook.py</application> takes the following
338 options:</para>
339
340 <variablelist>
341 <varlistentry>
342 <term>-n</term>
343 <listitem><para>Suppress transmission to a daemon. Instead, dump the
344 generated JSON request to standard output. Useful for
345 debugging.</para></listitem>
346 </varlistentry>
347 <varlistentry>
348 <term>-V</term>
349 <listitem><para>Write the program version to stdout and
350 terminate.</para></listitem>
351 </varlistentry>
352 </variablelist>
353
354 </refsect1>
355
356 <refsect1 id='authors'><title>AUTHOR</title>
357 <para>Eric S. Raymond <email>esr@snark.thyrsus.com</email>.  See the
358 project page at <ulink
359 url='http://www.catb.org/~esr/irker'>http://www.catb.org/~esr/irker</ulink>
360 for updates and other resources.</para>
361 </refsect1>
362 </refentry>
363