##// END OF EJS Templates
merge stable changes, via crew-stable
Dirkjan Ochtman -
r7501:732c54ab merge default
parent child Browse files
Show More
@@ -1,773 +1,773 b''
1 HGRC(5)
1 HGRC(5)
2 =======
2 =======
3 Bryan O'Sullivan <bos@serpentine.com>
3 Bryan O'Sullivan <bos@serpentine.com>
4
4
5 NAME
5 NAME
6 ----
6 ----
7 hgrc - configuration files for Mercurial
7 hgrc - configuration files for Mercurial
8
8
9 SYNOPSIS
9 SYNOPSIS
10 --------
10 --------
11
11
12 The Mercurial system uses a set of configuration files to control
12 The Mercurial system uses a set of configuration files to control
13 aspects of its behaviour.
13 aspects of its behaviour.
14
14
15 FILES
15 FILES
16 -----
16 -----
17
17
18 Mercurial reads configuration data from several files, if they exist.
18 Mercurial reads configuration data from several files, if they exist.
19 The names of these files depend on the system on which Mercurial is
19 The names of these files depend on the system on which Mercurial is
20 installed. *.rc files from a single directory are read in
20 installed. *.rc files from a single directory are read in
21 alphabetical order, later ones overriding earlier ones. Where
21 alphabetical order, later ones overriding earlier ones. Where
22 multiple paths are given below, settings from later paths override
22 multiple paths are given below, settings from later paths override
23 earlier ones.
23 earlier ones.
24
24
25 (Unix) <install-root>/etc/mercurial/hgrc.d/*.rc::
25 (Unix) <install-root>/etc/mercurial/hgrc.d/*.rc::
26 (Unix) <install-root>/etc/mercurial/hgrc::
26 (Unix) <install-root>/etc/mercurial/hgrc::
27 Per-installation configuration files, searched for in the
27 Per-installation configuration files, searched for in the
28 directory where Mercurial is installed. <install-root> is the
28 directory where Mercurial is installed. <install-root> is the
29 parent directory of the hg executable (or symlink) being run.
29 parent directory of the hg executable (or symlink) being run.
30 For example, if installed in /shared/tools/bin/hg, Mercurial will
30 For example, if installed in /shared/tools/bin/hg, Mercurial will
31 look in /shared/tools/etc/mercurial/hgrc. Options in these files
31 look in /shared/tools/etc/mercurial/hgrc. Options in these files
32 apply to all Mercurial commands executed by any user in any
32 apply to all Mercurial commands executed by any user in any
33 directory.
33 directory.
34
34
35 (Unix) /etc/mercurial/hgrc.d/*.rc::
35 (Unix) /etc/mercurial/hgrc.d/*.rc::
36 (Unix) /etc/mercurial/hgrc::
36 (Unix) /etc/mercurial/hgrc::
37 Per-system configuration files, for the system on which Mercurial
37 Per-system configuration files, for the system on which Mercurial
38 is running. Options in these files apply to all Mercurial
38 is running. Options in these files apply to all Mercurial
39 commands executed by any user in any directory. Options in these
39 commands executed by any user in any directory. Options in these
40 files override per-installation options.
40 files override per-installation options.
41
41
42 (Windows) <install-dir>\Mercurial.ini::
42 (Windows) <install-dir>\Mercurial.ini::
43 or else::
43 or else::
44 (Windows) HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial::
44 (Windows) HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial::
45 or else::
45 or else::
46 (Windows) C:\Mercurial\Mercurial.ini::
46 (Windows) C:\Mercurial\Mercurial.ini::
47 Per-installation/system configuration files, for the system on
47 Per-installation/system configuration files, for the system on
48 which Mercurial is running. Options in these files apply to all
48 which Mercurial is running. Options in these files apply to all
49 Mercurial commands executed by any user in any directory.
49 Mercurial commands executed by any user in any directory.
50 Registry keys contain PATH-like strings, every part of which must
50 Registry keys contain PATH-like strings, every part of which must
51 reference a Mercurial.ini file or be a directory where *.rc files
51 reference a Mercurial.ini file or be a directory where *.rc files
52 will be read.
52 will be read.
53
53
54 (Unix) $HOME/.hgrc::
54 (Unix) $HOME/.hgrc::
55 (Windows) %HOME%\Mercurial.ini::
55 (Windows) %HOME%\Mercurial.ini::
56 (Windows) %HOME%\.hgrc::
56 (Windows) %HOME%\.hgrc::
57 (Windows) %USERPROFILE%\Mercurial.ini::
57 (Windows) %USERPROFILE%\Mercurial.ini::
58 (Windows) %USERPROFILE%\.hgrc::
58 (Windows) %USERPROFILE%\.hgrc::
59 Per-user configuration file(s), for the user running Mercurial.
59 Per-user configuration file(s), for the user running Mercurial.
60 On Windows 9x, %HOME% is replaced by %APPDATA%.
60 On Windows 9x, %HOME% is replaced by %APPDATA%.
61 Options in these files apply to all Mercurial commands executed
61 Options in these files apply to all Mercurial commands executed
62 by this user in any directory. Options in thes files override
62 by this user in any directory. Options in thes files override
63 per-installation and per-system options.
63 per-installation and per-system options.
64
64
65 (Unix, Windows) <repo>/.hg/hgrc::
65 (Unix, Windows) <repo>/.hg/hgrc::
66 Per-repository configuration options that only apply in a
66 Per-repository configuration options that only apply in a
67 particular repository. This file is not version-controlled, and
67 particular repository. This file is not version-controlled, and
68 will not get transferred during a "clone" operation. Options in
68 will not get transferred during a "clone" operation. Options in
69 this file override options in all other configuration files.
69 this file override options in all other configuration files.
70 On Unix, most of this file will be ignored if it doesn't belong
70 On Unix, most of this file will be ignored if it doesn't belong
71 to a trusted user or to a trusted group. See the documentation
71 to a trusted user or to a trusted group. See the documentation
72 for the trusted section below for more details.
72 for the trusted section below for more details.
73
73
74 SYNTAX
74 SYNTAX
75 ------
75 ------
76
76
77 A configuration file consists of sections, led by a "[section]" header
77 A configuration file consists of sections, led by a "[section]" header
78 and followed by "name: value" entries; "name=value" is also accepted.
78 and followed by "name: value" entries; "name=value" is also accepted.
79
79
80 [spam]
80 [spam]
81 eggs=ham
81 eggs=ham
82 green=
82 green=
83 eggs
83 eggs
84
84
85 Each line contains one entry. If the lines that follow are indented,
85 Each line contains one entry. If the lines that follow are indented,
86 they are treated as continuations of that entry.
86 they are treated as continuations of that entry.
87
87
88 Leading whitespace is removed from values. Empty lines are skipped.
88 Leading whitespace is removed from values. Empty lines are skipped.
89
89
90 The optional values can contain format strings which refer to other
90 The optional values can contain format strings which refer to other
91 values in the same section, or values in a special DEFAULT section.
91 values in the same section, or values in a special DEFAULT section.
92
92
93 Lines beginning with "#" or ";" are ignored and may be used to provide
93 Lines beginning with "#" or ";" are ignored and may be used to provide
94 comments.
94 comments.
95
95
96 SECTIONS
96 SECTIONS
97 --------
97 --------
98
98
99 This section describes the different sections that may appear in a
99 This section describes the different sections that may appear in a
100 Mercurial "hgrc" file, the purpose of each section, its possible
100 Mercurial "hgrc" file, the purpose of each section, its possible
101 keys, and their possible values.
101 keys, and their possible values.
102
102
103 [[decode]]
103 [[decode]]
104 decode/encode::
104 decode/encode::
105 Filters for transforming files on checkout/checkin. This would
105 Filters for transforming files on checkout/checkin. This would
106 typically be used for newline processing or other
106 typically be used for newline processing or other
107 localization/canonicalization of files.
107 localization/canonicalization of files.
108
108
109 Filters consist of a filter pattern followed by a filter command.
109 Filters consist of a filter pattern followed by a filter command.
110 Filter patterns are globs by default, rooted at the repository
110 Filter patterns are globs by default, rooted at the repository
111 root. For example, to match any file ending in ".txt" in the root
111 root. For example, to match any file ending in ".txt" in the root
112 directory only, use the pattern "*.txt". To match any file ending
112 directory only, use the pattern "*.txt". To match any file ending
113 in ".c" anywhere in the repository, use the pattern "**.c".
113 in ".c" anywhere in the repository, use the pattern "**.c".
114
114
115 The filter command can start with a specifier, either "pipe:" or
115 The filter command can start with a specifier, either "pipe:" or
116 "tempfile:". If no specifier is given, "pipe:" is used by default.
116 "tempfile:". If no specifier is given, "pipe:" is used by default.
117
117
118 A "pipe:" command must accept data on stdin and return the
118 A "pipe:" command must accept data on stdin and return the
119 transformed data on stdout.
119 transformed data on stdout.
120
120
121 Pipe example:
121 Pipe example:
122
122
123 [encode]
123 [encode]
124 # uncompress gzip files on checkin to improve delta compression
124 # uncompress gzip files on checkin to improve delta compression
125 # note: not necessarily a good idea, just an example
125 # note: not necessarily a good idea, just an example
126 *.gz = pipe: gunzip
126 *.gz = pipe: gunzip
127
127
128 [decode]
128 [decode]
129 # recompress gzip files when writing them to the working dir (we
129 # recompress gzip files when writing them to the working dir (we
130 # can safely omit "pipe:", because it's the default)
130 # can safely omit "pipe:", because it's the default)
131 *.gz = gzip
131 *.gz = gzip
132
132
133 A "tempfile:" command is a template. The string INFILE is replaced
133 A "tempfile:" command is a template. The string INFILE is replaced
134 with the name of a temporary file that contains the data to be
134 with the name of a temporary file that contains the data to be
135 filtered by the command. The string OUTFILE is replaced with the
135 filtered by the command. The string OUTFILE is replaced with the
136 name of an empty temporary file, where the filtered data must be
136 name of an empty temporary file, where the filtered data must be
137 written by the command.
137 written by the command.
138
138
139 NOTE: the tempfile mechanism is recommended for Windows systems,
139 NOTE: the tempfile mechanism is recommended for Windows systems,
140 where the standard shell I/O redirection operators often have
140 where the standard shell I/O redirection operators often have
141 strange effects and may corrupt the contents of your files.
141 strange effects and may corrupt the contents of your files.
142
142
143 The most common usage is for LF <-> CRLF translation on Windows.
143 The most common usage is for LF <-> CRLF translation on Windows.
144 For this, use the "smart" convertors which check for binary files:
144 For this, use the "smart" convertors which check for binary files:
145
145
146 [extensions]
146 [extensions]
147 hgext.win32text =
147 hgext.win32text =
148 [encode]
148 [encode]
149 ** = cleverencode:
149 ** = cleverencode:
150 [decode]
150 [decode]
151 ** = cleverdecode:
151 ** = cleverdecode:
152
152
153 or if you only want to translate certain files:
153 or if you only want to translate certain files:
154
154
155 [extensions]
155 [extensions]
156 hgext.win32text =
156 hgext.win32text =
157 [encode]
157 [encode]
158 **.txt = dumbencode:
158 **.txt = dumbencode:
159 [decode]
159 [decode]
160 **.txt = dumbdecode:
160 **.txt = dumbdecode:
161
161
162 [[defaults]]
162 [[defaults]]
163 defaults::
163 defaults::
164 Use the [defaults] section to define command defaults, i.e. the
164 Use the [defaults] section to define command defaults, i.e. the
165 default options/arguments to pass to the specified commands.
165 default options/arguments to pass to the specified commands.
166
166
167 The following example makes 'hg log' run in verbose mode, and
167 The following example makes 'hg log' run in verbose mode, and
168 'hg status' show only the modified files, by default.
168 'hg status' show only the modified files, by default.
169
169
170 [defaults]
170 [defaults]
171 log = -v
171 log = -v
172 status = -m
172 status = -m
173
173
174 The actual commands, instead of their aliases, must be used when
174 The actual commands, instead of their aliases, must be used when
175 defining command defaults. The command defaults will also be
175 defining command defaults. The command defaults will also be
176 applied to the aliases of the commands defined.
176 applied to the aliases of the commands defined.
177
177
178 [[diff]]
178 [[diff]]
179 diff::
179 diff::
180 Settings used when displaying diffs. They are all boolean and
180 Settings used when displaying diffs. They are all boolean and
181 defaults to False.
181 defaults to False.
182 git;;
182 git;;
183 Use git extended diff format.
183 Use git extended diff format.
184 nodates;;
184 nodates;;
185 Don't include dates in diff headers.
185 Don't include dates in diff headers.
186 showfunc;;
186 showfunc;;
187 Show which function each change is in.
187 Show which function each change is in.
188 ignorews;;
188 ignorews;;
189 Ignore white space when comparing lines.
189 Ignore white space when comparing lines.
190 ignorewsamount;;
190 ignorewsamount;;
191 Ignore changes in the amount of white space.
191 Ignore changes in the amount of white space.
192 ignoreblanklines;;
192 ignoreblanklines;;
193 Ignore changes whose lines are all blank.
193 Ignore changes whose lines are all blank.
194
194
195 [[email]]
195 [[email]]
196 email::
196 email::
197 Settings for extensions that send email messages.
197 Settings for extensions that send email messages.
198 from;;
198 from;;
199 Optional. Email address to use in "From" header and SMTP envelope
199 Optional. Email address to use in "From" header and SMTP envelope
200 of outgoing messages.
200 of outgoing messages.
201 to;;
201 to;;
202 Optional. Comma-separated list of recipients' email addresses.
202 Optional. Comma-separated list of recipients' email addresses.
203 cc;;
203 cc;;
204 Optional. Comma-separated list of carbon copy recipients'
204 Optional. Comma-separated list of carbon copy recipients'
205 email addresses.
205 email addresses.
206 bcc;;
206 bcc;;
207 Optional. Comma-separated list of blind carbon copy
207 Optional. Comma-separated list of blind carbon copy
208 recipients' email addresses. Cannot be set interactively.
208 recipients' email addresses. Cannot be set interactively.
209 method;;
209 method;;
210 Optional. Method to use to send email messages. If value is
210 Optional. Method to use to send email messages. If value is
211 "smtp" (default), use SMTP (see section "[smtp]" for
211 "smtp" (default), use SMTP (see section "[smtp]" for
212 configuration). Otherwise, use as name of program to run that
212 configuration). Otherwise, use as name of program to run that
213 acts like sendmail (takes "-f" option for sender, list of
213 acts like sendmail (takes "-f" option for sender, list of
214 recipients on command line, message on stdin). Normally, setting
214 recipients on command line, message on stdin). Normally, setting
215 this to "sendmail" or "/usr/sbin/sendmail" is enough to use
215 this to "sendmail" or "/usr/sbin/sendmail" is enough to use
216 sendmail to send messages.
216 sendmail to send messages.
217 charsets;;
217 charsets;;
218 Optional. Comma-separated list of charsets considered
218 Optional. Comma-separated list of charsets considered
219 convenient for recipients. Addresses, headers, and parts not
219 convenient for recipients. Addresses, headers, and parts not
220 containing patches of outgoing messages will be encoded in
220 containing patches of outgoing messages will be encoded in
221 the first charset to which conversion from local encoding
221 the first charset to which conversion from local encoding
222 (ui.encoding, ui.fallbackencoding) succeeds. If correct
222 ($HGENCODING, ui.fallbackencoding) succeeds. If correct
223 conversion fails, the text in question is sent as is.
223 conversion fails, the text in question is sent as is.
224 Defaults to empty (explicit) list.
224 Defaults to empty (explicit) list.
225
225
226 Order of outgoing email charsets:
226 Order of outgoing email charsets:
227
227
228 us-ascii always first, regardless of settings
228 us-ascii always first, regardless of settings
229 email.charsets in order given by user
229 email.charsets in order given by user
230 ui.fallbackencoding if not in email.charsets
230 ui.fallbackencoding if not in email.charsets
231 ui.encoding if not in email.charsets
231 $HGENCODING if not in email.charsets
232 utf-8 always last, regardless of settings
232 utf-8 always last, regardless of settings
233
233
234 Email example:
234 Email example:
235
235
236 [email]
236 [email]
237 from = Joseph User <joe.user@example.com>
237 from = Joseph User <joe.user@example.com>
238 method = /usr/sbin/sendmail
238 method = /usr/sbin/sendmail
239 # charsets for western europeans
239 # charsets for western europeans
240 # us-ascii, utf-8 omitted, as they are tried first and last
240 # us-ascii, utf-8 omitted, as they are tried first and last
241 charsets = iso-8859-1, iso-8859-15, windows-1252
241 charsets = iso-8859-1, iso-8859-15, windows-1252
242
242
243 [[extensions]]
243 [[extensions]]
244 extensions::
244 extensions::
245 Mercurial has an extension mechanism for adding new features. To
245 Mercurial has an extension mechanism for adding new features. To
246 enable an extension, create an entry for it in this section.
246 enable an extension, create an entry for it in this section.
247
247
248 If you know that the extension is already in Python's search path,
248 If you know that the extension is already in Python's search path,
249 you can give the name of the module, followed by "=", with nothing
249 you can give the name of the module, followed by "=", with nothing
250 after the "=".
250 after the "=".
251
251
252 Otherwise, give a name that you choose, followed by "=", followed by
252 Otherwise, give a name that you choose, followed by "=", followed by
253 the path to the ".py" file (including the file name extension) that
253 the path to the ".py" file (including the file name extension) that
254 defines the extension.
254 defines the extension.
255
255
256 To explicitly disable an extension that is enabled in an hgrc of
256 To explicitly disable an extension that is enabled in an hgrc of
257 broader scope, prepend its path with '!', as in
257 broader scope, prepend its path with '!', as in
258 'hgext.foo = !/ext/path' or 'hgext.foo = !' when no path is supplied.
258 'hgext.foo = !/ext/path' or 'hgext.foo = !' when no path is supplied.
259
259
260 Example for ~/.hgrc:
260 Example for ~/.hgrc:
261
261
262 [extensions]
262 [extensions]
263 # (the mq extension will get loaded from mercurial's path)
263 # (the mq extension will get loaded from mercurial's path)
264 hgext.mq =
264 hgext.mq =
265 # (this extension will get loaded from the file specified)
265 # (this extension will get loaded from the file specified)
266 myfeature = ~/.hgext/myfeature.py
266 myfeature = ~/.hgext/myfeature.py
267
267
268 [[format]]
268 [[format]]
269 format::
269 format::
270
270
271 usestore;;
271 usestore;;
272 Enable or disable the "store" repository format which improves
272 Enable or disable the "store" repository format which improves
273 compatibility with systems that fold case or otherwise mangle
273 compatibility with systems that fold case or otherwise mangle
274 filenames. Enabled by default. Disabling this option will allow
274 filenames. Enabled by default. Disabling this option will allow
275 you to store longer filenames in some situations at the expense of
275 you to store longer filenames in some situations at the expense of
276 compatibility and ensures that the on-disk format of newly created
276 compatibility and ensures that the on-disk format of newly created
277 repositories will be compatible with Mercurial before version 0.9.4.
277 repositories will be compatible with Mercurial before version 0.9.4.
278
278
279 usefncache;;
279 usefncache;;
280 Enable or disable the "fncache" repository format which enhances
280 Enable or disable the "fncache" repository format which enhances
281 the "store" repository format (which has to be enabled to use
281 the "store" repository format (which has to be enabled to use
282 fncache) to allow longer filenames and avoids using Windows reserved
282 fncache) to allow longer filenames and avoids using Windows reserved
283 names, e.g. "nul". Enabled by default. Disabling this option ensures
283 names, e.g. "nul". Enabled by default. Disabling this option ensures
284 that the on-disk format of newly created repositories will be
284 that the on-disk format of newly created repositories will be
285 compatible with Mercurial before version 1.1.
285 compatible with Mercurial before version 1.1.
286
286
287 [[merge-patterns]]
287 [[merge-patterns]]
288 merge-patterns::
288 merge-patterns::
289 This section specifies merge tools to associate with particular file
289 This section specifies merge tools to associate with particular file
290 patterns. Tools matched here will take precedence over the default
290 patterns. Tools matched here will take precedence over the default
291 merge tool. Patterns are globs by default, rooted at the repository root.
291 merge tool. Patterns are globs by default, rooted at the repository root.
292
292
293 Example:
293 Example:
294
294
295 [merge-patterns]
295 [merge-patterns]
296 **.c = kdiff3
296 **.c = kdiff3
297 **.jpg = myimgmerge
297 **.jpg = myimgmerge
298
298
299 [[merge-tools]]
299 [[merge-tools]]
300 merge-tools::
300 merge-tools::
301 This section configures external merge tools to use for file-level
301 This section configures external merge tools to use for file-level
302 merges.
302 merges.
303
303
304 Example ~/.hgrc:
304 Example ~/.hgrc:
305
305
306 [merge-tools]
306 [merge-tools]
307 # Override stock tool location
307 # Override stock tool location
308 kdiff3.executable = ~/bin/kdiff3
308 kdiff3.executable = ~/bin/kdiff3
309 # Specify command line
309 # Specify command line
310 kdiff3.args = $base $local $other -o $output
310 kdiff3.args = $base $local $other -o $output
311 # Give higher priority
311 # Give higher priority
312 kdiff3.priority = 1
312 kdiff3.priority = 1
313
313
314 # Define new tool
314 # Define new tool
315 myHtmlTool.args = -m $local $other $base $output
315 myHtmlTool.args = -m $local $other $base $output
316 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
316 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
317 myHtmlTool.priority = 1
317 myHtmlTool.priority = 1
318
318
319 Supported arguments:
319 Supported arguments:
320
320
321 priority;;
321 priority;;
322 The priority in which to evaluate this tool.
322 The priority in which to evaluate this tool.
323 Default: 0.
323 Default: 0.
324 executable;;
324 executable;;
325 Either just the name of the executable or its pathname.
325 Either just the name of the executable or its pathname.
326 Default: the tool name.
326 Default: the tool name.
327 args;;
327 args;;
328 The arguments to pass to the tool executable. You can refer to the files
328 The arguments to pass to the tool executable. You can refer to the files
329 being merged as well as the output file through these variables: $base,
329 being merged as well as the output file through these variables: $base,
330 $local, $other, $output.
330 $local, $other, $output.
331 Default: $local $base $other
331 Default: $local $base $other
332 premerge;;
332 premerge;;
333 Attempt to run internal non-interactive 3-way merge tool before
333 Attempt to run internal non-interactive 3-way merge tool before
334 launching external tool.
334 launching external tool.
335 Default: True
335 Default: True
336 binary;;
336 binary;;
337 This tool can merge binary files. Defaults to False, unless tool
337 This tool can merge binary files. Defaults to False, unless tool
338 was selected by file pattern match.
338 was selected by file pattern match.
339 symlink;;
339 symlink;;
340 This tool can merge symlinks. Defaults to False, even if tool was
340 This tool can merge symlinks. Defaults to False, even if tool was
341 selected by file pattern match.
341 selected by file pattern match.
342 checkconflicts;;
342 checkconflicts;;
343 Check whether there are conflicts even though the tool reported
343 Check whether there are conflicts even though the tool reported
344 success.
344 success.
345 Default: False
345 Default: False
346 checkchanged;;
346 checkchanged;;
347 Check whether outputs were written even though the tool reported
347 Check whether outputs were written even though the tool reported
348 success.
348 success.
349 Default: False
349 Default: False
350 fixeol;;
350 fixeol;;
351 Attempt to fix up EOL changes caused by the merge tool.
351 Attempt to fix up EOL changes caused by the merge tool.
352 Default: False
352 Default: False
353 gui;;
353 gui;;
354 This tool requires a graphical interface to run. Default: False
354 This tool requires a graphical interface to run. Default: False
355 regkey;;
355 regkey;;
356 Windows registry key which describes install location of this tool.
356 Windows registry key which describes install location of this tool.
357 Mercurial will search for this key first under HKEY_CURRENT_USER and
357 Mercurial will search for this key first under HKEY_CURRENT_USER and
358 then under HKEY_LOCAL_MACHINE. Default: None
358 then under HKEY_LOCAL_MACHINE. Default: None
359 regname;;
359 regname;;
360 Name of value to read from specified registry key. Defaults to the
360 Name of value to read from specified registry key. Defaults to the
361 unnamed (default) value.
361 unnamed (default) value.
362 regappend;;
362 regappend;;
363 String to append to the value read from the registry, typically the
363 String to append to the value read from the registry, typically the
364 executable name of the tool. Default: None
364 executable name of the tool. Default: None
365
365
366 [[hooks]]
366 [[hooks]]
367 hooks::
367 hooks::
368 Commands or Python functions that get automatically executed by
368 Commands or Python functions that get automatically executed by
369 various actions such as starting or finishing a commit. Multiple
369 various actions such as starting or finishing a commit. Multiple
370 hooks can be run for the same action by appending a suffix to the
370 hooks can be run for the same action by appending a suffix to the
371 action. Overriding a site-wide hook can be done by changing its
371 action. Overriding a site-wide hook can be done by changing its
372 value or setting it to an empty string.
372 value or setting it to an empty string.
373
373
374 Example .hg/hgrc:
374 Example .hg/hgrc:
375
375
376 [hooks]
376 [hooks]
377 # do not use the site-wide hook
377 # do not use the site-wide hook
378 incoming =
378 incoming =
379 incoming.email = /my/email/hook
379 incoming.email = /my/email/hook
380 incoming.autobuild = /my/build/hook
380 incoming.autobuild = /my/build/hook
381
381
382 Most hooks are run with environment variables set that give added
382 Most hooks are run with environment variables set that give added
383 useful information. For each hook below, the environment variables
383 useful information. For each hook below, the environment variables
384 it is passed are listed with names of the form "$HG_foo".
384 it is passed are listed with names of the form "$HG_foo".
385
385
386 changegroup;;
386 changegroup;;
387 Run after a changegroup has been added via push, pull or
387 Run after a changegroup has been added via push, pull or
388 unbundle. ID of the first new changeset is in $HG_NODE. URL from
388 unbundle. ID of the first new changeset is in $HG_NODE. URL from
389 which changes came is in $HG_URL.
389 which changes came is in $HG_URL.
390 commit;;
390 commit;;
391 Run after a changeset has been created in the local repository.
391 Run after a changeset has been created in the local repository.
392 ID of the newly created changeset is in $HG_NODE. Parent
392 ID of the newly created changeset is in $HG_NODE. Parent
393 changeset IDs are in $HG_PARENT1 and $HG_PARENT2.
393 changeset IDs are in $HG_PARENT1 and $HG_PARENT2.
394 incoming;;
394 incoming;;
395 Run after a changeset has been pulled, pushed, or unbundled into
395 Run after a changeset has been pulled, pushed, or unbundled into
396 the local repository. The ID of the newly arrived changeset is in
396 the local repository. The ID of the newly arrived changeset is in
397 $HG_NODE. URL that was source of changes came is in $HG_URL.
397 $HG_NODE. URL that was source of changes came is in $HG_URL.
398 outgoing;;
398 outgoing;;
399 Run after sending changes from local repository to another. ID of
399 Run after sending changes from local repository to another. ID of
400 first changeset sent is in $HG_NODE. Source of operation is in
400 first changeset sent is in $HG_NODE. Source of operation is in
401 $HG_SOURCE; see "preoutgoing" hook for description.
401 $HG_SOURCE; see "preoutgoing" hook for description.
402 post-<command>;;
402 post-<command>;;
403 Run after successful invocations of the associated command. The
403 Run after successful invocations of the associated command. The
404 contents of the command line are passed as $HG_ARGS and the result
404 contents of the command line are passed as $HG_ARGS and the result
405 code in $HG_RESULT. Hook failure is ignored.
405 code in $HG_RESULT. Hook failure is ignored.
406 pre-<command>;;
406 pre-<command>;;
407 Run before executing the associated command. The contents of the
407 Run before executing the associated command. The contents of the
408 command line are passed as $HG_ARGS. If the hook returns failure,
408 command line are passed as $HG_ARGS. If the hook returns failure,
409 the command doesn't execute and Mercurial returns the failure code.
409 the command doesn't execute and Mercurial returns the failure code.
410 prechangegroup;;
410 prechangegroup;;
411 Run before a changegroup is added via push, pull or unbundle.
411 Run before a changegroup is added via push, pull or unbundle.
412 Exit status 0 allows the changegroup to proceed. Non-zero status
412 Exit status 0 allows the changegroup to proceed. Non-zero status
413 will cause the push, pull or unbundle to fail. URL from which
413 will cause the push, pull or unbundle to fail. URL from which
414 changes will come is in $HG_URL.
414 changes will come is in $HG_URL.
415 precommit;;
415 precommit;;
416 Run before starting a local commit. Exit status 0 allows the
416 Run before starting a local commit. Exit status 0 allows the
417 commit to proceed. Non-zero status will cause the commit to fail.
417 commit to proceed. Non-zero status will cause the commit to fail.
418 Parent changeset IDs are in $HG_PARENT1 and $HG_PARENT2.
418 Parent changeset IDs are in $HG_PARENT1 and $HG_PARENT2.
419 preoutgoing;;
419 preoutgoing;;
420 Run before collecting changes to send from the local repository to
420 Run before collecting changes to send from the local repository to
421 another. Non-zero status will cause failure. This lets you
421 another. Non-zero status will cause failure. This lets you
422 prevent pull over http or ssh. Also prevents against local pull,
422 prevent pull over http or ssh. Also prevents against local pull,
423 push (outbound) or bundle commands, but not effective, since you
423 push (outbound) or bundle commands, but not effective, since you
424 can just copy files instead then. Source of operation is in
424 can just copy files instead then. Source of operation is in
425 $HG_SOURCE. If "serve", operation is happening on behalf of
425 $HG_SOURCE. If "serve", operation is happening on behalf of
426 remote ssh or http repository. If "push", "pull" or "bundle",
426 remote ssh or http repository. If "push", "pull" or "bundle",
427 operation is happening on behalf of repository on same system.
427 operation is happening on behalf of repository on same system.
428 pretag;;
428 pretag;;
429 Run before creating a tag. Exit status 0 allows the tag to be
429 Run before creating a tag. Exit status 0 allows the tag to be
430 created. Non-zero status will cause the tag to fail. ID of
430 created. Non-zero status will cause the tag to fail. ID of
431 changeset to tag is in $HG_NODE. Name of tag is in $HG_TAG. Tag
431 changeset to tag is in $HG_NODE. Name of tag is in $HG_TAG. Tag
432 is local if $HG_LOCAL=1, in repo if $HG_LOCAL=0.
432 is local if $HG_LOCAL=1, in repo if $HG_LOCAL=0.
433 pretxnchangegroup;;
433 pretxnchangegroup;;
434 Run after a changegroup has been added via push, pull or unbundle,
434 Run after a changegroup has been added via push, pull or unbundle,
435 but before the transaction has been committed. Changegroup is
435 but before the transaction has been committed. Changegroup is
436 visible to hook program. This lets you validate incoming changes
436 visible to hook program. This lets you validate incoming changes
437 before accepting them. Passed the ID of the first new changeset
437 before accepting them. Passed the ID of the first new changeset
438 in $HG_NODE. Exit status 0 allows the transaction to commit.
438 in $HG_NODE. Exit status 0 allows the transaction to commit.
439 Non-zero status will cause the transaction to be rolled back and
439 Non-zero status will cause the transaction to be rolled back and
440 the push, pull or unbundle will fail. URL that was source of
440 the push, pull or unbundle will fail. URL that was source of
441 changes is in $HG_URL.
441 changes is in $HG_URL.
442 pretxncommit;;
442 pretxncommit;;
443 Run after a changeset has been created but the transaction not yet
443 Run after a changeset has been created but the transaction not yet
444 committed. Changeset is visible to hook program. This lets you
444 committed. Changeset is visible to hook program. This lets you
445 validate commit message and changes. Exit status 0 allows the
445 validate commit message and changes. Exit status 0 allows the
446 commit to proceed. Non-zero status will cause the transaction to
446 commit to proceed. Non-zero status will cause the transaction to
447 be rolled back. ID of changeset is in $HG_NODE. Parent changeset
447 be rolled back. ID of changeset is in $HG_NODE. Parent changeset
448 IDs are in $HG_PARENT1 and $HG_PARENT2.
448 IDs are in $HG_PARENT1 and $HG_PARENT2.
449 preupdate;;
449 preupdate;;
450 Run before updating the working directory. Exit status 0 allows
450 Run before updating the working directory. Exit status 0 allows
451 the update to proceed. Non-zero status will prevent the update.
451 the update to proceed. Non-zero status will prevent the update.
452 Changeset ID of first new parent is in $HG_PARENT1. If merge, ID
452 Changeset ID of first new parent is in $HG_PARENT1. If merge, ID
453 of second new parent is in $HG_PARENT2.
453 of second new parent is in $HG_PARENT2.
454 tag;;
454 tag;;
455 Run after a tag is created. ID of tagged changeset is in
455 Run after a tag is created. ID of tagged changeset is in
456 $HG_NODE. Name of tag is in $HG_TAG. Tag is local if
456 $HG_NODE. Name of tag is in $HG_TAG. Tag is local if
457 $HG_LOCAL=1, in repo if $HG_LOCAL=0.
457 $HG_LOCAL=1, in repo if $HG_LOCAL=0.
458 update;;
458 update;;
459 Run after updating the working directory. Changeset ID of first
459 Run after updating the working directory. Changeset ID of first
460 new parent is in $HG_PARENT1. If merge, ID of second new parent
460 new parent is in $HG_PARENT1. If merge, ID of second new parent
461 is in $HG_PARENT2. If update succeeded, $HG_ERROR=0. If update
461 is in $HG_PARENT2. If update succeeded, $HG_ERROR=0. If update
462 failed (e.g. because conflicts not resolved), $HG_ERROR=1.
462 failed (e.g. because conflicts not resolved), $HG_ERROR=1.
463
463
464 Note: it is generally better to use standard hooks rather than the
464 Note: it is generally better to use standard hooks rather than the
465 generic pre- and post- command hooks as they are guaranteed to be
465 generic pre- and post- command hooks as they are guaranteed to be
466 called in the appropriate contexts for influencing transactions.
466 called in the appropriate contexts for influencing transactions.
467 Also, hooks like "commit" will be called in all contexts that
467 Also, hooks like "commit" will be called in all contexts that
468 generate a commit (eg. tag) and not just the commit command.
468 generate a commit (eg. tag) and not just the commit command.
469
469
470 Note2: Environment variables with empty values may not be passed to
470 Note2: Environment variables with empty values may not be passed to
471 hooks on platforms like Windows. For instance, $HG_PARENT2 will
471 hooks on platforms like Windows. For instance, $HG_PARENT2 will
472 not be available under Windows for non-merge changesets while being
472 not be available under Windows for non-merge changesets while being
473 set to an empty value under Unix-like systems.
473 set to an empty value under Unix-like systems.
474
474
475 The syntax for Python hooks is as follows:
475 The syntax for Python hooks is as follows:
476
476
477 hookname = python:modulename.submodule.callable
477 hookname = python:modulename.submodule.callable
478
478
479 Python hooks are run within the Mercurial process. Each hook is
479 Python hooks are run within the Mercurial process. Each hook is
480 called with at least three keyword arguments: a ui object (keyword
480 called with at least three keyword arguments: a ui object (keyword
481 "ui"), a repository object (keyword "repo"), and a "hooktype"
481 "ui"), a repository object (keyword "repo"), and a "hooktype"
482 keyword that tells what kind of hook is used. Arguments listed as
482 keyword that tells what kind of hook is used. Arguments listed as
483 environment variables above are passed as keyword arguments, with no
483 environment variables above are passed as keyword arguments, with no
484 "HG_" prefix, and names in lower case.
484 "HG_" prefix, and names in lower case.
485
485
486 If a Python hook returns a "true" value or raises an exception, this
486 If a Python hook returns a "true" value or raises an exception, this
487 is treated as failure of the hook.
487 is treated as failure of the hook.
488
488
489 [[http_proxy]]
489 [[http_proxy]]
490 http_proxy::
490 http_proxy::
491 Used to access web-based Mercurial repositories through a HTTP
491 Used to access web-based Mercurial repositories through a HTTP
492 proxy.
492 proxy.
493 host;;
493 host;;
494 Host name and (optional) port of the proxy server, for example
494 Host name and (optional) port of the proxy server, for example
495 "myproxy:8000".
495 "myproxy:8000".
496 no;;
496 no;;
497 Optional. Comma-separated list of host names that should bypass
497 Optional. Comma-separated list of host names that should bypass
498 the proxy.
498 the proxy.
499 passwd;;
499 passwd;;
500 Optional. Password to authenticate with at the proxy server.
500 Optional. Password to authenticate with at the proxy server.
501 user;;
501 user;;
502 Optional. User name to authenticate with at the proxy server.
502 Optional. User name to authenticate with at the proxy server.
503
503
504 [[smtp]]
504 [[smtp]]
505 smtp::
505 smtp::
506 Configuration for extensions that need to send email messages.
506 Configuration for extensions that need to send email messages.
507 host;;
507 host;;
508 Host name of mail server, e.g. "mail.example.com".
508 Host name of mail server, e.g. "mail.example.com".
509 port;;
509 port;;
510 Optional. Port to connect to on mail server. Default: 25.
510 Optional. Port to connect to on mail server. Default: 25.
511 tls;;
511 tls;;
512 Optional. Whether to connect to mail server using TLS. True or
512 Optional. Whether to connect to mail server using TLS. True or
513 False. Default: False.
513 False. Default: False.
514 username;;
514 username;;
515 Optional. User name to authenticate to SMTP server with.
515 Optional. User name to authenticate to SMTP server with.
516 If username is specified, password must also be specified.
516 If username is specified, password must also be specified.
517 Default: none.
517 Default: none.
518 password;;
518 password;;
519 Optional. Password to authenticate to SMTP server with.
519 Optional. Password to authenticate to SMTP server with.
520 If username is specified, password must also be specified.
520 If username is specified, password must also be specified.
521 Default: none.
521 Default: none.
522 local_hostname;;
522 local_hostname;;
523 Optional. It's the hostname that the sender can use to identify itself
523 Optional. It's the hostname that the sender can use to identify itself
524 to the MTA.
524 to the MTA.
525
525
526 [[paths]]
526 [[paths]]
527 paths::
527 paths::
528 Assigns symbolic names to repositories. The left side is the
528 Assigns symbolic names to repositories. The left side is the
529 symbolic name, and the right gives the directory or URL that is the
529 symbolic name, and the right gives the directory or URL that is the
530 location of the repository. Default paths can be declared by
530 location of the repository. Default paths can be declared by
531 setting the following entries.
531 setting the following entries.
532 default;;
532 default;;
533 Directory or URL to use when pulling if no source is specified.
533 Directory or URL to use when pulling if no source is specified.
534 Default is set to repository from which the current repository
534 Default is set to repository from which the current repository
535 was cloned.
535 was cloned.
536 default-push;;
536 default-push;;
537 Optional. Directory or URL to use when pushing if no destination
537 Optional. Directory or URL to use when pushing if no destination
538 is specified.
538 is specified.
539
539
540 [[server]]
540 [[server]]
541 server::
541 server::
542 Controls generic server settings.
542 Controls generic server settings.
543 uncompressed;;
543 uncompressed;;
544 Whether to allow clients to clone a repo using the uncompressed
544 Whether to allow clients to clone a repo using the uncompressed
545 streaming protocol. This transfers about 40% more data than a
545 streaming protocol. This transfers about 40% more data than a
546 regular clone, but uses less memory and CPU on both server and
546 regular clone, but uses less memory and CPU on both server and
547 client. Over a LAN (100Mbps or better) or a very fast WAN, an
547 client. Over a LAN (100Mbps or better) or a very fast WAN, an
548 uncompressed streaming clone is a lot faster (~10x) than a regular
548 uncompressed streaming clone is a lot faster (~10x) than a regular
549 clone. Over most WAN connections (anything slower than about
549 clone. Over most WAN connections (anything slower than about
550 6Mbps), uncompressed streaming is slower, because of the extra
550 6Mbps), uncompressed streaming is slower, because of the extra
551 data transfer overhead. Default is False.
551 data transfer overhead. Default is False.
552
552
553 [[trusted]]
553 [[trusted]]
554 trusted::
554 trusted::
555 For security reasons, Mercurial will not use the settings in
555 For security reasons, Mercurial will not use the settings in
556 the .hg/hgrc file from a repository if it doesn't belong to a
556 the .hg/hgrc file from a repository if it doesn't belong to a
557 trusted user or to a trusted group. The main exception is the
557 trusted user or to a trusted group. The main exception is the
558 web interface, which automatically uses some safe settings, since
558 web interface, which automatically uses some safe settings, since
559 it's common to serve repositories from different users.
559 it's common to serve repositories from different users.
560
560
561 This section specifies what users and groups are trusted. The
561 This section specifies what users and groups are trusted. The
562 current user is always trusted. To trust everybody, list a user
562 current user is always trusted. To trust everybody, list a user
563 or a group with name "*".
563 or a group with name "*".
564
564
565 users;;
565 users;;
566 Comma-separated list of trusted users.
566 Comma-separated list of trusted users.
567 groups;;
567 groups;;
568 Comma-separated list of trusted groups.
568 Comma-separated list of trusted groups.
569
569
570 [[ui]]
570 [[ui]]
571 ui::
571 ui::
572 User interface controls.
572 User interface controls.
573 archivemeta;;
573 archivemeta;;
574 Whether to include the .hg_archival.txt file containing metadata
574 Whether to include the .hg_archival.txt file containing metadata
575 (hashes for the repository base and for tip) in archives created by
575 (hashes for the repository base and for tip) in archives created by
576 the hg archive command or downloaded via hgweb.
576 the hg archive command or downloaded via hgweb.
577 Default is true.
577 Default is true.
578 askusername;;
578 askusername;;
579 Whether to prompt for a username when committing. If True, and
579 Whether to prompt for a username when committing. If True, and
580 neither $HGUSER nor $EMAIL has been specified, then the user will
580 neither $HGUSER nor $EMAIL has been specified, then the user will
581 be prompted to enter a username. If no username is entered, the
581 be prompted to enter a username. If no username is entered, the
582 default USER@HOST is used instead.
582 default USER@HOST is used instead.
583 Default is False.
583 Default is False.
584 debug;;
584 debug;;
585 Print debugging information. True or False. Default is False.
585 Print debugging information. True or False. Default is False.
586 editor;;
586 editor;;
587 The editor to use during a commit. Default is $EDITOR or "vi".
587 The editor to use during a commit. Default is $EDITOR or "vi".
588 fallbackencoding;;
588 fallbackencoding;;
589 Encoding to try if it's not possible to decode the changelog using
589 Encoding to try if it's not possible to decode the changelog using
590 UTF-8. Default is ISO-8859-1.
590 UTF-8. Default is ISO-8859-1.
591 ignore;;
591 ignore;;
592 A file to read per-user ignore patterns from. This file should be in
592 A file to read per-user ignore patterns from. This file should be in
593 the same format as a repository-wide .hgignore file. This option
593 the same format as a repository-wide .hgignore file. This option
594 supports hook syntax, so if you want to specify multiple ignore
594 supports hook syntax, so if you want to specify multiple ignore
595 files, you can do so by setting something like
595 files, you can do so by setting something like
596 "ignore.other = ~/.hgignore2". For details of the ignore file
596 "ignore.other = ~/.hgignore2". For details of the ignore file
597 format, see the hgignore(5) man page.
597 format, see the hgignore(5) man page.
598 interactive;;
598 interactive;;
599 Allow to prompt the user. True or False. Default is True.
599 Allow to prompt the user. True or False. Default is True.
600 logtemplate;;
600 logtemplate;;
601 Template string for commands that print changesets.
601 Template string for commands that print changesets.
602 merge;;
602 merge;;
603 The conflict resolution program to use during a manual merge.
603 The conflict resolution program to use during a manual merge.
604 There are some internal tools available:
604 There are some internal tools available:
605
605
606 internal:local;;
606 internal:local;;
607 keep the local version
607 keep the local version
608 internal:other;;
608 internal:other;;
609 use the other version
609 use the other version
610 internal:merge;;
610 internal:merge;;
611 use the internal non-interactive merge tool
611 use the internal non-interactive merge tool
612 internal:fail;;
612 internal:fail;;
613 fail to merge
613 fail to merge
614
614
615 See the merge-tools section for more information on configuring tools.
615 See the merge-tools section for more information on configuring tools.
616
616
617 patch;;
617 patch;;
618 command to use to apply patches. Look for 'gpatch' or 'patch' in PATH if
618 command to use to apply patches. Look for 'gpatch' or 'patch' in PATH if
619 unset.
619 unset.
620 quiet;;
620 quiet;;
621 Reduce the amount of output printed. True or False. Default is False.
621 Reduce the amount of output printed. True or False. Default is False.
622 remotecmd;;
622 remotecmd;;
623 remote command to use for clone/push/pull operations. Default is 'hg'.
623 remote command to use for clone/push/pull operations. Default is 'hg'.
624 report_untrusted;;
624 report_untrusted;;
625 Warn if a .hg/hgrc file is ignored due to not being owned by a
625 Warn if a .hg/hgrc file is ignored due to not being owned by a
626 trusted user or group. True or False. Default is True.
626 trusted user or group. True or False. Default is True.
627 slash;;
627 slash;;
628 Display paths using a slash ("/") as the path separator. This only
628 Display paths using a slash ("/") as the path separator. This only
629 makes a difference on systems where the default path separator is not
629 makes a difference on systems where the default path separator is not
630 the slash character (e.g. Windows uses the backslash character ("\")).
630 the slash character (e.g. Windows uses the backslash character ("\")).
631 Default is False.
631 Default is False.
632 ssh;;
632 ssh;;
633 command to use for SSH connections. Default is 'ssh'.
633 command to use for SSH connections. Default is 'ssh'.
634 strict;;
634 strict;;
635 Require exact command names, instead of allowing unambiguous
635 Require exact command names, instead of allowing unambiguous
636 abbreviations. True or False. Default is False.
636 abbreviations. True or False. Default is False.
637 style;;
637 style;;
638 Name of style to use for command output.
638 Name of style to use for command output.
639 timeout;;
639 timeout;;
640 The timeout used when a lock is held (in seconds), a negative value
640 The timeout used when a lock is held (in seconds), a negative value
641 means no timeout. Default is 600.
641 means no timeout. Default is 600.
642 username;;
642 username;;
643 The committer of a changeset created when running "commit".
643 The committer of a changeset created when running "commit".
644 Typically a person's name and email address, e.g. "Fred Widget
644 Typically a person's name and email address, e.g. "Fred Widget
645 <fred@example.com>". Default is $EMAIL or username@hostname.
645 <fred@example.com>". Default is $EMAIL or username@hostname.
646 If the username in hgrc is empty, it has to be specified manually or
646 If the username in hgrc is empty, it has to be specified manually or
647 in a different hgrc file (e.g. $HOME/.hgrc, if the admin set "username ="
647 in a different hgrc file (e.g. $HOME/.hgrc, if the admin set "username ="
648 in the system hgrc).
648 in the system hgrc).
649 verbose;;
649 verbose;;
650 Increase the amount of output printed. True or False. Default is False.
650 Increase the amount of output printed. True or False. Default is False.
651
651
652
652
653 [[web]]
653 [[web]]
654 web::
654 web::
655 Web interface configuration.
655 Web interface configuration.
656 accesslog;;
656 accesslog;;
657 Where to output the access log. Default is stdout.
657 Where to output the access log. Default is stdout.
658 address;;
658 address;;
659 Interface address to bind to. Default is all.
659 Interface address to bind to. Default is all.
660 allow_archive;;
660 allow_archive;;
661 List of archive format (bz2, gz, zip) allowed for downloading.
661 List of archive format (bz2, gz, zip) allowed for downloading.
662 Default is empty.
662 Default is empty.
663 allowbz2;;
663 allowbz2;;
664 (DEPRECATED) Whether to allow .tar.bz2 downloading of repo revisions.
664 (DEPRECATED) Whether to allow .tar.bz2 downloading of repo revisions.
665 Default is false.
665 Default is false.
666 allowgz;;
666 allowgz;;
667 (DEPRECATED) Whether to allow .tar.gz downloading of repo revisions.
667 (DEPRECATED) Whether to allow .tar.gz downloading of repo revisions.
668 Default is false.
668 Default is false.
669 allowpull;;
669 allowpull;;
670 Whether to allow pulling from the repository. Default is true.
670 Whether to allow pulling from the repository. Default is true.
671 allow_push;;
671 allow_push;;
672 Whether to allow pushing to the repository. If empty or not set,
672 Whether to allow pushing to the repository. If empty or not set,
673 push is not allowed. If the special value "*", any remote user
673 push is not allowed. If the special value "*", any remote user
674 can push, including unauthenticated users. Otherwise, the remote
674 can push, including unauthenticated users. Otherwise, the remote
675 user must have been authenticated, and the authenticated user name
675 user must have been authenticated, and the authenticated user name
676 must be present in this list (separated by whitespace or ",").
676 must be present in this list (separated by whitespace or ",").
677 The contents of the allow_push list are examined after the
677 The contents of the allow_push list are examined after the
678 deny_push list.
678 deny_push list.
679 allow_read;;
679 allow_read;;
680 If the user has not already been denied repository access due to the
680 If the user has not already been denied repository access due to the
681 contents of deny_read, this list determines whether to grant repository
681 contents of deny_read, this list determines whether to grant repository
682 access to the user. If this list is not empty, and the user is
682 access to the user. If this list is not empty, and the user is
683 unauthenticated or not present in the list (separated by whitespace or ","),
683 unauthenticated or not present in the list (separated by whitespace or ","),
684 then access is denied for the user. If the list is empty or not set, then
684 then access is denied for the user. If the list is empty or not set, then
685 access is permitted to all users by default. Setting allow_read to the
685 access is permitted to all users by default. Setting allow_read to the
686 special value "*" is equivalent to it not being set (i.e. access is
686 special value "*" is equivalent to it not being set (i.e. access is
687 permitted to all users). The contents of the allow_read list are examined
687 permitted to all users). The contents of the allow_read list are examined
688 after the deny_read list.
688 after the deny_read list.
689 allowzip;;
689 allowzip;;
690 (DEPRECATED) Whether to allow .zip downloading of repo revisions.
690 (DEPRECATED) Whether to allow .zip downloading of repo revisions.
691 Default is false. This feature creates temporary files.
691 Default is false. This feature creates temporary files.
692 baseurl;;
692 baseurl;;
693 Base URL to use when publishing URLs in other locations, so
693 Base URL to use when publishing URLs in other locations, so
694 third-party tools like email notification hooks can construct URLs.
694 third-party tools like email notification hooks can construct URLs.
695 Example: "http://hgserver/repos/"
695 Example: "http://hgserver/repos/"
696 contact;;
696 contact;;
697 Name or email address of the person in charge of the repository.
697 Name or email address of the person in charge of the repository.
698 Defaults to ui.username or $EMAIL or "unknown" if unset or empty.
698 Defaults to ui.username or $EMAIL or "unknown" if unset or empty.
699 deny_push;;
699 deny_push;;
700 Whether to deny pushing to the repository. If empty or not set,
700 Whether to deny pushing to the repository. If empty or not set,
701 push is not denied. If the special value "*", all remote users
701 push is not denied. If the special value "*", all remote users
702 are denied push. Otherwise, unauthenticated users are all denied,
702 are denied push. Otherwise, unauthenticated users are all denied,
703 and any authenticated user name present in this list (separated by
703 and any authenticated user name present in this list (separated by
704 whitespace or ",") is also denied. The contents of the deny_push
704 whitespace or ",") is also denied. The contents of the deny_push
705 list are examined before the allow_push list.
705 list are examined before the allow_push list.
706 deny_read;;
706 deny_read;;
707 Whether to deny reading/viewing of the repository. If this list is not
707 Whether to deny reading/viewing of the repository. If this list is not
708 empty, unauthenticated users are all denied, and any authenticated user name
708 empty, unauthenticated users are all denied, and any authenticated user name
709 present in this list (separated by whitespace or ",") is also denied access
709 present in this list (separated by whitespace or ",") is also denied access
710 to the repository. If set to the special value "*", all remote users are
710 to the repository. If set to the special value "*", all remote users are
711 denied access (rarely needed ;). If deny_read is empty or not set, the
711 denied access (rarely needed ;). If deny_read is empty or not set, the
712 determination of repository access depends on the presence and content of
712 determination of repository access depends on the presence and content of
713 the allow_read list (see description). If both deny_read and allow_read are
713 the allow_read list (see description). If both deny_read and allow_read are
714 empty or not set, then access is permitted to all users by default. If the
714 empty or not set, then access is permitted to all users by default. If the
715 repository is being served via hgwebdir, denied users will not be able to
715 repository is being served via hgwebdir, denied users will not be able to
716 see it in the list of repositories. The contents of the deny_read list have
716 see it in the list of repositories. The contents of the deny_read list have
717 priority over (are examined before) the contents of the allow_read list.
717 priority over (are examined before) the contents of the allow_read list.
718 description;;
718 description;;
719 Textual description of the repository's purpose or contents.
719 Textual description of the repository's purpose or contents.
720 Default is "unknown".
720 Default is "unknown".
721 encoding;;
721 encoding;;
722 Character encoding name.
722 Character encoding name.
723 Example: "UTF-8"
723 Example: "UTF-8"
724 errorlog;;
724 errorlog;;
725 Where to output the error log. Default is stderr.
725 Where to output the error log. Default is stderr.
726 hidden;;
726 hidden;;
727 Whether to hide the repository in the hgwebdir index. Default is false.
727 Whether to hide the repository in the hgwebdir index. Default is false.
728 ipv6;;
728 ipv6;;
729 Whether to use IPv6. Default is false.
729 Whether to use IPv6. Default is false.
730 name;;
730 name;;
731 Repository name to use in the web interface. Default is current
731 Repository name to use in the web interface. Default is current
732 working directory.
732 working directory.
733 maxchanges;;
733 maxchanges;;
734 Maximum number of changes to list on the changelog. Default is 10.
734 Maximum number of changes to list on the changelog. Default is 10.
735 maxfiles;;
735 maxfiles;;
736 Maximum number of files to list per changeset. Default is 10.
736 Maximum number of files to list per changeset. Default is 10.
737 port;;
737 port;;
738 Port to listen on. Default is 8000.
738 Port to listen on. Default is 8000.
739 prefix;;
739 prefix;;
740 Prefix path to serve from. Default is '' (server root).
740 Prefix path to serve from. Default is '' (server root).
741 push_ssl;;
741 push_ssl;;
742 Whether to require that inbound pushes be transported over SSL to
742 Whether to require that inbound pushes be transported over SSL to
743 prevent password sniffing. Default is true.
743 prevent password sniffing. Default is true.
744 staticurl;;
744 staticurl;;
745 Base URL to use for static files. If unset, static files (e.g.
745 Base URL to use for static files. If unset, static files (e.g.
746 the hgicon.png favicon) will be served by the CGI script itself.
746 the hgicon.png favicon) will be served by the CGI script itself.
747 Use this setting to serve them directly with the HTTP server.
747 Use this setting to serve them directly with the HTTP server.
748 Example: "http://hgserver/static/"
748 Example: "http://hgserver/static/"
749 stripes;;
749 stripes;;
750 How many lines a "zebra stripe" should span in multiline output.
750 How many lines a "zebra stripe" should span in multiline output.
751 Default is 1; set to 0 to disable.
751 Default is 1; set to 0 to disable.
752 style;;
752 style;;
753 Which template map style to use.
753 Which template map style to use.
754 templates;;
754 templates;;
755 Where to find the HTML templates. Default is install path.
755 Where to find the HTML templates. Default is install path.
756
756
757
757
758 AUTHOR
758 AUTHOR
759 ------
759 ------
760 Bryan O'Sullivan <bos@serpentine.com>.
760 Bryan O'Sullivan <bos@serpentine.com>.
761
761
762 Mercurial was written by Matt Mackall <mpm@selenic.com>.
762 Mercurial was written by Matt Mackall <mpm@selenic.com>.
763
763
764 SEE ALSO
764 SEE ALSO
765 --------
765 --------
766 hg(1), hgignore(5)
766 hg(1), hgignore(5)
767
767
768 COPYING
768 COPYING
769 -------
769 -------
770 This manual page is copyright 2005 Bryan O'Sullivan.
770 This manual page is copyright 2005 Bryan O'Sullivan.
771 Mercurial is copyright 2005-2007 Matt Mackall.
771 Mercurial is copyright 2005-2007 Matt Mackall.
772 Free use of this software is granted under the terms of the GNU General
772 Free use of this software is granted under the terms of the GNU General
773 Public License (GPL).
773 Public License (GPL).
@@ -1,286 +1,290 b''
1 # notify.py - email notifications for mercurial
1 # notify.py - email notifications for mercurial
2 #
2 #
3 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
3 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
4 #
4 #
5 # This software may be used and distributed according to the terms
5 # This software may be used and distributed according to the terms
6 # of the GNU General Public License, incorporated herein by reference.
6 # of the GNU General Public License, incorporated herein by reference.
7
7
8 '''hook extension to email notifications on commits/pushes
8 '''hook extension to email notifications on commits/pushes
9
9
10 Subscriptions can be managed through hgrc. Default mode is to print
10 Subscriptions can be managed through hgrc. Default mode is to print
11 messages to stdout, for testing and configuring.
11 messages to stdout, for testing and configuring.
12
12
13 To use, configure notify extension and enable in hgrc like this:
13 To use, configure notify extension and enable in hgrc like this:
14
14
15 [extensions]
15 [extensions]
16 hgext.notify =
16 hgext.notify =
17
17
18 [hooks]
18 [hooks]
19 # one email for each incoming changeset
19 # one email for each incoming changeset
20 incoming.notify = python:hgext.notify.hook
20 incoming.notify = python:hgext.notify.hook
21 # batch emails when many changesets incoming at one time
21 # batch emails when many changesets incoming at one time
22 changegroup.notify = python:hgext.notify.hook
22 changegroup.notify = python:hgext.notify.hook
23
23
24 [notify]
24 [notify]
25 # config items go in here
25 # config items go in here
26
26
27 config items:
27 config items:
28
28
29 REQUIRED:
29 REQUIRED:
30 config = /path/to/file # file containing subscriptions
30 config = /path/to/file # file containing subscriptions
31
31
32 OPTIONAL:
32 OPTIONAL:
33 test = True # print messages to stdout for testing
33 test = True # print messages to stdout for testing
34 strip = 3 # number of slashes to strip for url paths
34 strip = 3 # number of slashes to strip for url paths
35 domain = example.com # domain to use if committer missing domain
35 domain = example.com # domain to use if committer missing domain
36 style = ... # style file to use when formatting email
36 style = ... # style file to use when formatting email
37 template = ... # template to use when formatting email
37 template = ... # template to use when formatting email
38 incoming = ... # template to use when run as incoming hook
38 incoming = ... # template to use when run as incoming hook
39 changegroup = ... # template when run as changegroup hook
39 changegroup = ... # template when run as changegroup hook
40 maxdiff = 300 # max lines of diffs to include (0=none, -1=all)
40 maxdiff = 300 # max lines of diffs to include (0=none, -1=all)
41 maxsubject = 67 # truncate subject line longer than this
41 maxsubject = 67 # truncate subject line longer than this
42 diffstat = True # add a diffstat before the diff content
42 diffstat = True # add a diffstat before the diff content
43 sources = serve # notify if source of incoming changes in this list
43 sources = serve # notify if source of incoming changes in this list
44 # (serve == ssh or http, push, pull, bundle)
44 # (serve == ssh or http, push, pull, bundle)
45 [email]
45 [email]
46 from = user@host.com # email address to send as if none given
46 from = user@host.com # email address to send as if none given
47 [web]
47 [web]
48 baseurl = http://hgserver/... # root of hg web site for browsing commits
48 baseurl = http://hgserver/... # root of hg web site for browsing commits
49
49
50 notify config file has same format as regular hgrc. it has two
50 notify config file has same format as regular hgrc. it has two
51 sections so you can express subscriptions in whatever way is handier
51 sections so you can express subscriptions in whatever way is handier
52 for you.
52 for you.
53
53
54 [usersubs]
54 [usersubs]
55 # key is subscriber email, value is ","-separated list of glob patterns
55 # key is subscriber email, value is ","-separated list of glob patterns
56 user@host = pattern
56 user@host = pattern
57
57
58 [reposubs]
58 [reposubs]
59 # key is glob pattern, value is ","-separated list of subscriber emails
59 # key is glob pattern, value is ","-separated list of subscriber emails
60 pattern = user@host
60 pattern = user@host
61
61
62 glob patterns are matched against path to repo root.
62 glob patterns are matched against path to repo root.
63
63
64 if you like, you can put notify config file in repo that users can
64 if you like, you can put notify config file in repo that users can
65 push changes to, they can manage their own subscriptions.'''
65 push changes to, they can manage their own subscriptions.'''
66
66
67 from mercurial.i18n import _
67 from mercurial.i18n import _
68 from mercurial.node import bin, short
68 from mercurial.node import bin, short
69 from mercurial import patch, cmdutil, templater, util, mail
69 from mercurial import patch, cmdutil, templater, util, mail
70 import email.Parser, fnmatch, socket, time
70 import email.Parser, fnmatch, socket, time
71
71
72 # template for single changeset can include email headers.
72 # template for single changeset can include email headers.
73 single_template = '''
73 single_template = '''
74 Subject: changeset in {webroot}: {desc|firstline|strip}
74 Subject: changeset in {webroot}: {desc|firstline|strip}
75 From: {author}
75 From: {author}
76
76
77 changeset {node|short} in {root}
77 changeset {node|short} in {root}
78 details: {baseurl}{webroot}?cmd=changeset;node={node|short}
78 details: {baseurl}{webroot}?cmd=changeset;node={node|short}
79 description:
79 description:
80 \t{desc|tabindent|strip}
80 \t{desc|tabindent|strip}
81 '''.lstrip()
81 '''.lstrip()
82
82
83 # template for multiple changesets should not contain email headers,
83 # template for multiple changesets should not contain email headers,
84 # because only first set of headers will be used and result will look
84 # because only first set of headers will be used and result will look
85 # strange.
85 # strange.
86 multiple_template = '''
86 multiple_template = '''
87 changeset {node|short} in {root}
87 changeset {node|short} in {root}
88 details: {baseurl}{webroot}?cmd=changeset;node={node|short}
88 details: {baseurl}{webroot}?cmd=changeset;node={node|short}
89 summary: {desc|firstline}
89 summary: {desc|firstline}
90 '''
90 '''
91
91
92 deftemplates = {
92 deftemplates = {
93 'changegroup': multiple_template,
93 'changegroup': multiple_template,
94 }
94 }
95
95
96 class notifier(object):
96 class notifier(object):
97 '''email notification class.'''
97 '''email notification class.'''
98
98
99 def __init__(self, ui, repo, hooktype):
99 def __init__(self, ui, repo, hooktype):
100 self.ui = ui
100 self.ui = ui
101 cfg = self.ui.config('notify', 'config')
101 cfg = self.ui.config('notify', 'config')
102 if cfg:
102 if cfg:
103 self.ui.readsections(cfg, 'usersubs', 'reposubs')
103 self.ui.readsections(cfg, 'usersubs', 'reposubs')
104 self.repo = repo
104 self.repo = repo
105 self.stripcount = int(self.ui.config('notify', 'strip', 0))
105 self.stripcount = int(self.ui.config('notify', 'strip', 0))
106 self.root = self.strip(self.repo.root)
106 self.root = self.strip(self.repo.root)
107 self.domain = self.ui.config('notify', 'domain')
107 self.domain = self.ui.config('notify', 'domain')
108 self.test = self.ui.configbool('notify', 'test', True)
108 self.charsets = mail._charsets(self.ui)
109 self.charsets = mail._charsets(self.ui)
109 self.subs = self.subscribers()
110 self.subs = self.subscribers()
110
111
111 mapfile = self.ui.config('notify', 'style')
112 mapfile = self.ui.config('notify', 'style')
112 template = (self.ui.config('notify', hooktype) or
113 template = (self.ui.config('notify', hooktype) or
113 self.ui.config('notify', 'template'))
114 self.ui.config('notify', 'template'))
114 self.t = cmdutil.changeset_templater(self.ui, self.repo,
115 self.t = cmdutil.changeset_templater(self.ui, self.repo,
115 False, mapfile, False)
116 False, mapfile, False)
116 if not mapfile and not template:
117 if not mapfile and not template:
117 template = deftemplates.get(hooktype) or single_template
118 template = deftemplates.get(hooktype) or single_template
118 if template:
119 if template:
119 template = templater.parsestring(template, quoted=False)
120 template = templater.parsestring(template, quoted=False)
120 self.t.use_template(template)
121 self.t.use_template(template)
121
122
122 def strip(self, path):
123 def strip(self, path):
123 '''strip leading slashes from local path, turn into web-safe path.'''
124 '''strip leading slashes from local path, turn into web-safe path.'''
124
125
125 path = util.pconvert(path)
126 path = util.pconvert(path)
126 count = self.stripcount
127 count = self.stripcount
127 while count > 0:
128 while count > 0:
128 c = path.find('/')
129 c = path.find('/')
129 if c == -1:
130 if c == -1:
130 break
131 break
131 path = path[c+1:]
132 path = path[c+1:]
132 count -= 1
133 count -= 1
133 return path
134 return path
134
135
135 def fixmail(self, addr):
136 def fixmail(self, addr):
136 '''try to clean up email addresses.'''
137 '''try to clean up email addresses.'''
137
138
138 addr = util.email(addr.strip())
139 addr = util.email(addr.strip())
139 if self.domain:
140 if self.domain:
140 a = addr.find('@localhost')
141 a = addr.find('@localhost')
141 if a != -1:
142 if a != -1:
142 addr = addr[:a]
143 addr = addr[:a]
143 if '@' not in addr:
144 if '@' not in addr:
144 return addr + '@' + self.domain
145 return addr + '@' + self.domain
145 return addr
146 return addr
146
147
147 def subscribers(self):
148 def subscribers(self):
148 '''return list of email addresses of subscribers to this repo.'''
149 '''return list of email addresses of subscribers to this repo.'''
149
150
150 subs = {}
151 subs = {}
151 for user, pats in self.ui.configitems('usersubs'):
152 for user, pats in self.ui.configitems('usersubs'):
152 for pat in pats.split(','):
153 for pat in pats.split(','):
153 if fnmatch.fnmatch(self.repo.root, pat.strip()):
154 if fnmatch.fnmatch(self.repo.root, pat.strip()):
154 subs[self.fixmail(user)] = 1
155 subs[self.fixmail(user)] = 1
155 for pat, users in self.ui.configitems('reposubs'):
156 for pat, users in self.ui.configitems('reposubs'):
156 if fnmatch.fnmatch(self.repo.root, pat):
157 if fnmatch.fnmatch(self.repo.root, pat):
157 for user in users.split(','):
158 for user in users.split(','):
158 subs[self.fixmail(user)] = 1
159 subs[self.fixmail(user)] = 1
159 subs = util.sort(subs)
160 subs = util.sort(subs)
160 return [mail.addressencode(self.ui, s, self.charsets) for s in subs]
161 return [mail.addressencode(self.ui, s, self.charsets, self.test)
162 for s in subs]
161
163
162 def url(self, path=None):
164 def url(self, path=None):
163 return self.ui.config('web', 'baseurl') + (path or self.root)
165 return self.ui.config('web', 'baseurl') + (path or self.root)
164
166
165 def node(self, node):
167 def node(self, node):
166 '''format one changeset.'''
168 '''format one changeset.'''
167
169
168 self.t.show(self.repo[node], changes=self.repo.changelog.read(node),
170 self.t.show(self.repo[node], changes=self.repo.changelog.read(node),
169 baseurl=self.ui.config('web', 'baseurl'),
171 baseurl=self.ui.config('web', 'baseurl'),
170 root=self.repo.root,
172 root=self.repo.root,
171 webroot=self.root)
173 webroot=self.root)
172
174
173 def skipsource(self, source):
175 def skipsource(self, source):
174 '''true if incoming changes from this source should be skipped.'''
176 '''true if incoming changes from this source should be skipped.'''
175 ok_sources = self.ui.config('notify', 'sources', 'serve').split()
177 ok_sources = self.ui.config('notify', 'sources', 'serve').split()
176 return source not in ok_sources
178 return source not in ok_sources
177
179
178 def send(self, node, count, data):
180 def send(self, node, count, data):
179 '''send message.'''
181 '''send message.'''
180
182
181 p = email.Parser.Parser()
183 p = email.Parser.Parser()
182 msg = p.parsestr(data)
184 msg = p.parsestr(data)
183
185
184 # store sender and subject
186 # store sender and subject
185 sender, subject = msg['From'], msg['Subject']
187 sender, subject = msg['From'], msg['Subject']
186 # create fresh mime message from msg body
188 # create fresh mime message from msg body
187 text = msg.get_payload()
189 text = msg.get_payload()
188 # for notification prefer readability over data precision
190 # for notification prefer readability over data precision
189 msg = mail.mimeencode(self.ui, text, self.charsets)
191 msg = mail.mimeencode(self.ui, text, self.charsets, self.test)
190
192
191 def fix_subject(subject):
193 def fix_subject(subject):
192 '''try to make subject line exist and be useful.'''
194 '''try to make subject line exist and be useful.'''
193
195
194 if not subject:
196 if not subject:
195 if count > 1:
197 if count > 1:
196 subject = _('%s: %d new changesets') % (self.root, count)
198 subject = _('%s: %d new changesets') % (self.root, count)
197 else:
199 else:
198 changes = self.repo.changelog.read(node)
200 changes = self.repo.changelog.read(node)
199 s = changes[4].lstrip().split('\n', 1)[0].rstrip()
201 s = changes[4].lstrip().split('\n', 1)[0].rstrip()
200 subject = '%s: %s' % (self.root, s)
202 subject = '%s: %s' % (self.root, s)
201 maxsubject = int(self.ui.config('notify', 'maxsubject', 67))
203 maxsubject = int(self.ui.config('notify', 'maxsubject', 67))
202 if maxsubject and len(subject) > maxsubject:
204 if maxsubject and len(subject) > maxsubject:
203 subject = subject[:maxsubject-3] + '...'
205 subject = subject[:maxsubject-3] + '...'
204 msg['Subject'] = mail.headencode(self.ui, subject, self.charsets)
206 msg['Subject'] = mail.headencode(self.ui, subject,
207 self.charsets, self.test)
205
208
206 def fix_sender(sender):
209 def fix_sender(sender):
207 '''try to make message have proper sender.'''
210 '''try to make message have proper sender.'''
208
211
209 if not sender:
212 if not sender:
210 sender = self.ui.config('email', 'from') or self.ui.username()
213 sender = self.ui.config('email', 'from') or self.ui.username()
211 if '@' not in sender or '@localhost' in sender:
214 if '@' not in sender or '@localhost' in sender:
212 sender = self.fixmail(sender)
215 sender = self.fixmail(sender)
213 msg['From'] = mail.addressencode(self.ui, sender, self.charsets)
216 msg['From'] = mail.addressencode(self.ui, sender,
217 self.charsets, self.test)
214
218
215 msg['Date'] = util.datestr(format="%a, %d %b %Y %H:%M:%S %1%2")
219 msg['Date'] = util.datestr(format="%a, %d %b %Y %H:%M:%S %1%2")
216 fix_subject(subject)
220 fix_subject(subject)
217 fix_sender(sender)
221 fix_sender(sender)
218
222
219 msg['X-Hg-Notification'] = 'changeset ' + short(node)
223 msg['X-Hg-Notification'] = 'changeset ' + short(node)
220 if not msg['Message-Id']:
224 if not msg['Message-Id']:
221 msg['Message-Id'] = ('<hg.%s.%s.%s@%s>' %
225 msg['Message-Id'] = ('<hg.%s.%s.%s@%s>' %
222 (short(node), int(time.time()),
226 (short(node), int(time.time()),
223 hash(self.repo.root), socket.getfqdn()))
227 hash(self.repo.root), socket.getfqdn()))
224 msg['To'] = ', '.join(self.subs)
228 msg['To'] = ', '.join(self.subs)
225
229
226 msgtext = msg.as_string(0)
230 msgtext = msg.as_string(0)
227 if self.ui.configbool('notify', 'test', True):
231 if self.test:
228 self.ui.write(msgtext)
232 self.ui.write(msgtext)
229 if not msgtext.endswith('\n'):
233 if not msgtext.endswith('\n'):
230 self.ui.write('\n')
234 self.ui.write('\n')
231 else:
235 else:
232 self.ui.status(_('notify: sending %d subscribers %d changes\n') %
236 self.ui.status(_('notify: sending %d subscribers %d changes\n') %
233 (len(self.subs), count))
237 (len(self.subs), count))
234 mail.sendmail(self.ui, util.email(msg['From']),
238 mail.sendmail(self.ui, util.email(msg['From']),
235 self.subs, msgtext)
239 self.subs, msgtext)
236
240
237 def diff(self, node, ref):
241 def diff(self, node, ref):
238 maxdiff = int(self.ui.config('notify', 'maxdiff', 300))
242 maxdiff = int(self.ui.config('notify', 'maxdiff', 300))
239 prev = self.repo.changelog.parents(node)[0]
243 prev = self.repo.changelog.parents(node)[0]
240
244
241 chunks = patch.diff(self.repo, prev, ref, opts=patch.diffopts(self.ui))
245 chunks = patch.diff(self.repo, prev, ref, opts=patch.diffopts(self.ui))
242 difflines = ''.join(chunks).splitlines()
246 difflines = ''.join(chunks).splitlines()
243
247
244 if self.ui.configbool('notify', 'diffstat', True):
248 if self.ui.configbool('notify', 'diffstat', True):
245 s = patch.diffstat(difflines)
249 s = patch.diffstat(difflines)
246 # s may be nil, don't include the header if it is
250 # s may be nil, don't include the header if it is
247 if s:
251 if s:
248 self.ui.write('\ndiffstat:\n\n%s' % s)
252 self.ui.write('\ndiffstat:\n\n%s' % s)
249 if maxdiff == 0:
253 if maxdiff == 0:
250 return
254 return
251 if maxdiff > 0 and len(difflines) > maxdiff:
255 if maxdiff > 0 and len(difflines) > maxdiff:
252 self.ui.write(_('\ndiffs (truncated from %d to %d lines):\n\n') %
256 self.ui.write(_('\ndiffs (truncated from %d to %d lines):\n\n') %
253 (len(difflines), maxdiff))
257 (len(difflines), maxdiff))
254 difflines = difflines[:maxdiff]
258 difflines = difflines[:maxdiff]
255 elif difflines:
259 elif difflines:
256 self.ui.write(_('\ndiffs (%d lines):\n\n') % len(difflines))
260 self.ui.write(_('\ndiffs (%d lines):\n\n') % len(difflines))
257 self.ui.write("\n".join(difflines))
261 self.ui.write("\n".join(difflines))
258
262
259 def hook(ui, repo, hooktype, node=None, source=None, **kwargs):
263 def hook(ui, repo, hooktype, node=None, source=None, **kwargs):
260 '''send email notifications to interested subscribers.
264 '''send email notifications to interested subscribers.
261
265
262 if used as changegroup hook, send one email for all changesets in
266 if used as changegroup hook, send one email for all changesets in
263 changegroup. else send one email per changeset.'''
267 changegroup. else send one email per changeset.'''
264 n = notifier(ui, repo, hooktype)
268 n = notifier(ui, repo, hooktype)
265 if not n.subs:
269 if not n.subs:
266 ui.debug(_('notify: no subscribers to repo %s\n') % n.root)
270 ui.debug(_('notify: no subscribers to repo %s\n') % n.root)
267 return
271 return
268 if n.skipsource(source):
272 if n.skipsource(source):
269 ui.debug(_('notify: changes have source "%s" - skipping\n') %
273 ui.debug(_('notify: changes have source "%s" - skipping\n') %
270 source)
274 source)
271 return
275 return
272 node = bin(node)
276 node = bin(node)
273 ui.pushbuffer()
277 ui.pushbuffer()
274 if hooktype == 'changegroup':
278 if hooktype == 'changegroup':
275 start = repo[node].rev()
279 start = repo[node].rev()
276 end = len(repo)
280 end = len(repo)
277 count = end - start
281 count = end - start
278 for rev in xrange(start, end):
282 for rev in xrange(start, end):
279 n.node(repo[rev].node())
283 n.node(repo[rev].node())
280 n.diff(node, repo.changelog.tip())
284 n.diff(node, repo.changelog.tip())
281 else:
285 else:
282 count = 1
286 count = 1
283 n.node(node)
287 n.node(node)
284 n.diff(node, node)
288 n.diff(node, node)
285 data = ui.popbuffer()
289 data = ui.popbuffer()
286 n.send(node, count, data)
290 n.send(node, count, data)
General Comments 0
You need to be logged in to leave comments. Login now