##// END OF EJS Templates
Add config option to disable putting .hg_archival.txt inside archives.
Thomas Arendsen Hein -
r6183:0750e4ba default
parent child Browse files
Show More
@@ -1,681 +1,686 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. Windows registry keys contain PATH-like strings, every
20 installed. Windows registry keys contain PATH-like strings, every
21 part must reference a Mercurial.ini file or be a directory where *.rc
21 part must reference a Mercurial.ini file or be a directory where *.rc
22 files will be read.
22 files will be read.
23
23
24 (Unix) <install-root>/etc/mercurial/hgrc.d/*.rc::
24 (Unix) <install-root>/etc/mercurial/hgrc.d/*.rc::
25 (Unix) <install-root>/etc/mercurial/hgrc::
25 (Unix) <install-root>/etc/mercurial/hgrc::
26 Per-installation configuration files, searched for in the
26 Per-installation configuration files, searched for in the
27 directory where Mercurial is installed. For example, if installed
27 directory where Mercurial is installed. For example, if installed
28 in /shared/tools, Mercurial will look in
28 in /shared/tools, Mercurial will look in
29 /shared/tools/etc/mercurial/hgrc. Options in these files apply to
29 /shared/tools/etc/mercurial/hgrc. Options in these files apply to
30 all Mercurial commands executed by any user in any directory.
30 all Mercurial commands executed by any user in any directory.
31
31
32 (Unix) /etc/mercurial/hgrc.d/*.rc::
32 (Unix) /etc/mercurial/hgrc.d/*.rc::
33 (Unix) /etc/mercurial/hgrc::
33 (Unix) /etc/mercurial/hgrc::
34 (Windows) HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial::
34 (Windows) HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial::
35 or::
35 or::
36 (Windows) C:\Mercurial\Mercurial.ini::
36 (Windows) C:\Mercurial\Mercurial.ini::
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 (Unix) $HOME/.hgrc::
42 (Unix) $HOME/.hgrc::
43 (Windows) C:\Documents and Settings\USERNAME\Mercurial.ini::
43 (Windows) C:\Documents and Settings\USERNAME\Mercurial.ini::
44 (Windows) $HOME\Mercurial.ini::
44 (Windows) $HOME\Mercurial.ini::
45 Per-user configuration file, for the user running Mercurial.
45 Per-user configuration file, for the user running Mercurial.
46 Options in this file apply to all Mercurial commands executed by
46 Options in this file apply to all Mercurial commands executed by
47 any user in any directory. Options in this file override
47 any user in any directory. Options in this file override
48 per-installation and per-system options.
48 per-installation and per-system options.
49 On Windows system, one of these is chosen exclusively according
49 On Windows system, one of these is chosen exclusively according
50 to definition of HOME environment variable.
50 to definition of HOME environment variable.
51
51
52 (Unix, Windows) <repo>/.hg/hgrc::
52 (Unix, Windows) <repo>/.hg/hgrc::
53 Per-repository configuration options that only apply in a
53 Per-repository configuration options that only apply in a
54 particular repository. This file is not version-controlled, and
54 particular repository. This file is not version-controlled, and
55 will not get transferred during a "clone" operation. Options in
55 will not get transferred during a "clone" operation. Options in
56 this file override options in all other configuration files.
56 this file override options in all other configuration files.
57 On Unix, most of this file will be ignored if it doesn't belong
57 On Unix, most of this file will be ignored if it doesn't belong
58 to a trusted user or to a trusted group. See the documentation
58 to a trusted user or to a trusted group. See the documentation
59 for the trusted section below for more details.
59 for the trusted section below for more details.
60
60
61 SYNTAX
61 SYNTAX
62 ------
62 ------
63
63
64 A configuration file consists of sections, led by a "[section]" header
64 A configuration file consists of sections, led by a "[section]" header
65 and followed by "name: value" entries; "name=value" is also accepted.
65 and followed by "name: value" entries; "name=value" is also accepted.
66
66
67 [spam]
67 [spam]
68 eggs=ham
68 eggs=ham
69 green=
69 green=
70 eggs
70 eggs
71
71
72 Each line contains one entry. If the lines that follow are indented,
72 Each line contains one entry. If the lines that follow are indented,
73 they are treated as continuations of that entry.
73 they are treated as continuations of that entry.
74
74
75 Leading whitespace is removed from values. Empty lines are skipped.
75 Leading whitespace is removed from values. Empty lines are skipped.
76
76
77 The optional values can contain format strings which refer to other
77 The optional values can contain format strings which refer to other
78 values in the same section, or values in a special DEFAULT section.
78 values in the same section, or values in a special DEFAULT section.
79
79
80 Lines beginning with "#" or ";" are ignored and may be used to provide
80 Lines beginning with "#" or ";" are ignored and may be used to provide
81 comments.
81 comments.
82
82
83 SECTIONS
83 SECTIONS
84 --------
84 --------
85
85
86 This section describes the different sections that may appear in a
86 This section describes the different sections that may appear in a
87 Mercurial "hgrc" file, the purpose of each section, its possible
87 Mercurial "hgrc" file, the purpose of each section, its possible
88 keys, and their possible values.
88 keys, and their possible values.
89
89
90 decode/encode::
90 decode/encode::
91 Filters for transforming files on checkout/checkin. This would
91 Filters for transforming files on checkout/checkin. This would
92 typically be used for newline processing or other
92 typically be used for newline processing or other
93 localization/canonicalization of files.
93 localization/canonicalization of files.
94
94
95 Filters consist of a filter pattern followed by a filter command.
95 Filters consist of a filter pattern followed by a filter command.
96 Filter patterns are globs by default, rooted at the repository
96 Filter patterns are globs by default, rooted at the repository
97 root. For example, to match any file ending in ".txt" in the root
97 root. For example, to match any file ending in ".txt" in the root
98 directory only, use the pattern "*.txt". To match any file ending
98 directory only, use the pattern "*.txt". To match any file ending
99 in ".c" anywhere in the repository, use the pattern "**.c".
99 in ".c" anywhere in the repository, use the pattern "**.c".
100
100
101 The filter command can start with a specifier, either "pipe:" or
101 The filter command can start with a specifier, either "pipe:" or
102 "tempfile:". If no specifier is given, "pipe:" is used by default.
102 "tempfile:". If no specifier is given, "pipe:" is used by default.
103
103
104 A "pipe:" command must accept data on stdin and return the
104 A "pipe:" command must accept data on stdin and return the
105 transformed data on stdout.
105 transformed data on stdout.
106
106
107 Pipe example:
107 Pipe example:
108
108
109 [encode]
109 [encode]
110 # uncompress gzip files on checkin to improve delta compression
110 # uncompress gzip files on checkin to improve delta compression
111 # note: not necessarily a good idea, just an example
111 # note: not necessarily a good idea, just an example
112 *.gz = pipe: gunzip
112 *.gz = pipe: gunzip
113
113
114 [decode]
114 [decode]
115 # recompress gzip files when writing them to the working dir (we
115 # recompress gzip files when writing them to the working dir (we
116 # can safely omit "pipe:", because it's the default)
116 # can safely omit "pipe:", because it's the default)
117 *.gz = gzip
117 *.gz = gzip
118
118
119 A "tempfile:" command is a template. The string INFILE is replaced
119 A "tempfile:" command is a template. The string INFILE is replaced
120 with the name of a temporary file that contains the data to be
120 with the name of a temporary file that contains the data to be
121 filtered by the command. The string OUTFILE is replaced with the
121 filtered by the command. The string OUTFILE is replaced with the
122 name of an empty temporary file, where the filtered data must be
122 name of an empty temporary file, where the filtered data must be
123 written by the command.
123 written by the command.
124
124
125 NOTE: the tempfile mechanism is recommended for Windows systems,
125 NOTE: the tempfile mechanism is recommended for Windows systems,
126 where the standard shell I/O redirection operators often have
126 where the standard shell I/O redirection operators often have
127 strange effects and may corrupt the contents of your files.
127 strange effects and may corrupt the contents of your files.
128
128
129 The most common usage is for LF <-> CRLF translation on Windows.
129 The most common usage is for LF <-> CRLF translation on Windows.
130 For this, use the "smart" convertors which check for binary files:
130 For this, use the "smart" convertors which check for binary files:
131
131
132 [extensions]
132 [extensions]
133 hgext.win32text =
133 hgext.win32text =
134 [encode]
134 [encode]
135 ** = cleverencode:
135 ** = cleverencode:
136 [decode]
136 [decode]
137 ** = cleverdecode:
137 ** = cleverdecode:
138
138
139 or if you only want to translate certain files:
139 or if you only want to translate certain files:
140
140
141 [extensions]
141 [extensions]
142 hgext.win32text =
142 hgext.win32text =
143 [encode]
143 [encode]
144 **.txt = dumbencode:
144 **.txt = dumbencode:
145 [decode]
145 [decode]
146 **.txt = dumbdecode:
146 **.txt = dumbdecode:
147
147
148 defaults::
148 defaults::
149 Use the [defaults] section to define command defaults, i.e. the
149 Use the [defaults] section to define command defaults, i.e. the
150 default options/arguments to pass to the specified commands.
150 default options/arguments to pass to the specified commands.
151
151
152 The following example makes 'hg log' run in verbose mode, and
152 The following example makes 'hg log' run in verbose mode, and
153 'hg status' show only the modified files, by default.
153 'hg status' show only the modified files, by default.
154
154
155 [defaults]
155 [defaults]
156 log = -v
156 log = -v
157 status = -m
157 status = -m
158
158
159 The actual commands, instead of their aliases, must be used when
159 The actual commands, instead of their aliases, must be used when
160 defining command defaults. The command defaults will also be
160 defining command defaults. The command defaults will also be
161 applied to the aliases of the commands defined.
161 applied to the aliases of the commands defined.
162
162
163 diff::
163 diff::
164 Settings used when displaying diffs. They are all boolean and
164 Settings used when displaying diffs. They are all boolean and
165 defaults to False.
165 defaults to False.
166 git;;
166 git;;
167 Use git extended diff format.
167 Use git extended diff format.
168 nodates;;
168 nodates;;
169 Don't include dates in diff headers.
169 Don't include dates in diff headers.
170 showfunc;;
170 showfunc;;
171 Show which function each change is in.
171 Show which function each change is in.
172 ignorews;;
172 ignorews;;
173 Ignore white space when comparing lines.
173 Ignore white space when comparing lines.
174 ignorewsamount;;
174 ignorewsamount;;
175 Ignore changes in the amount of white space.
175 Ignore changes in the amount of white space.
176 ignoreblanklines;;
176 ignoreblanklines;;
177 Ignore changes whose lines are all blank.
177 Ignore changes whose lines are all blank.
178
178
179 email::
179 email::
180 Settings for extensions that send email messages.
180 Settings for extensions that send email messages.
181 from;;
181 from;;
182 Optional. Email address to use in "From" header and SMTP envelope
182 Optional. Email address to use in "From" header and SMTP envelope
183 of outgoing messages.
183 of outgoing messages.
184 to;;
184 to;;
185 Optional. Comma-separated list of recipients' email addresses.
185 Optional. Comma-separated list of recipients' email addresses.
186 cc;;
186 cc;;
187 Optional. Comma-separated list of carbon copy recipients'
187 Optional. Comma-separated list of carbon copy recipients'
188 email addresses.
188 email addresses.
189 bcc;;
189 bcc;;
190 Optional. Comma-separated list of blind carbon copy
190 Optional. Comma-separated list of blind carbon copy
191 recipients' email addresses. Cannot be set interactively.
191 recipients' email addresses. Cannot be set interactively.
192 method;;
192 method;;
193 Optional. Method to use to send email messages. If value is
193 Optional. Method to use to send email messages. If value is
194 "smtp" (default), use SMTP (see section "[smtp]" for
194 "smtp" (default), use SMTP (see section "[smtp]" for
195 configuration). Otherwise, use as name of program to run that
195 configuration). Otherwise, use as name of program to run that
196 acts like sendmail (takes "-f" option for sender, list of
196 acts like sendmail (takes "-f" option for sender, list of
197 recipients on command line, message on stdin). Normally, setting
197 recipients on command line, message on stdin). Normally, setting
198 this to "sendmail" or "/usr/sbin/sendmail" is enough to use
198 this to "sendmail" or "/usr/sbin/sendmail" is enough to use
199 sendmail to send messages.
199 sendmail to send messages.
200
200
201 Email example:
201 Email example:
202
202
203 [email]
203 [email]
204 from = Joseph User <joe.user@example.com>
204 from = Joseph User <joe.user@example.com>
205 method = /usr/sbin/sendmail
205 method = /usr/sbin/sendmail
206
206
207 extensions::
207 extensions::
208 Mercurial has an extension mechanism for adding new features. To
208 Mercurial has an extension mechanism for adding new features. To
209 enable an extension, create an entry for it in this section.
209 enable an extension, create an entry for it in this section.
210
210
211 If you know that the extension is already in Python's search path,
211 If you know that the extension is already in Python's search path,
212 you can give the name of the module, followed by "=", with nothing
212 you can give the name of the module, followed by "=", with nothing
213 after the "=".
213 after the "=".
214
214
215 Otherwise, give a name that you choose, followed by "=", followed by
215 Otherwise, give a name that you choose, followed by "=", followed by
216 the path to the ".py" file (including the file name extension) that
216 the path to the ".py" file (including the file name extension) that
217 defines the extension.
217 defines the extension.
218
218
219 To explicitly disable an extension that is enabled in an hgrc of
219 To explicitly disable an extension that is enabled in an hgrc of
220 broader scope, prepend its path with '!', as in
220 broader scope, prepend its path with '!', as in
221 'hgext.foo = !/ext/path' or 'hgext.foo = !' when no path is supplied.
221 'hgext.foo = !/ext/path' or 'hgext.foo = !' when no path is supplied.
222
222
223 Example for ~/.hgrc:
223 Example for ~/.hgrc:
224
224
225 [extensions]
225 [extensions]
226 # (the mq extension will get loaded from mercurial's path)
226 # (the mq extension will get loaded from mercurial's path)
227 hgext.mq =
227 hgext.mq =
228 # (this extension will get loaded from the file specified)
228 # (this extension will get loaded from the file specified)
229 myfeature = ~/.hgext/myfeature.py
229 myfeature = ~/.hgext/myfeature.py
230
230
231 format::
231 format::
232
232
233 usestore;;
233 usestore;;
234 Enable or disable the "store" repository format which improves
234 Enable or disable the "store" repository format which improves
235 compatibility with systems that fold case or otherwise mangle
235 compatibility with systems that fold case or otherwise mangle
236 filenames. Enabled by default. Disabling this option will allow
236 filenames. Enabled by default. Disabling this option will allow
237 you to store longer filenames in some situations at the expense of
237 you to store longer filenames in some situations at the expense of
238 compatibility.
238 compatibility.
239
239
240 merge-patterns::
240 merge-patterns::
241 This section specifies merge tools to associate with particular file
241 This section specifies merge tools to associate with particular file
242 patterns. Tools matched here will take precedence over the default
242 patterns. Tools matched here will take precedence over the default
243 merge tool. Patterns are globs by default, rooted at the repository root.
243 merge tool. Patterns are globs by default, rooted at the repository root.
244
244
245 Example:
245 Example:
246
246
247 [merge-patterns]
247 [merge-patterns]
248 **.c = kdiff3
248 **.c = kdiff3
249 **.jpg = myimgmerge
249 **.jpg = myimgmerge
250
250
251 merge-tools::
251 merge-tools::
252 This section configures external merge tools to use for file-level
252 This section configures external merge tools to use for file-level
253 merges.
253 merges.
254
254
255 Example ~/.hgrc:
255 Example ~/.hgrc:
256
256
257 [merge-tools]
257 [merge-tools]
258 # Override stock tool location
258 # Override stock tool location
259 kdiff3.executable = ~/bin/kdiff3
259 kdiff3.executable = ~/bin/kdiff3
260 # Specify command line
260 # Specify command line
261 kdiff3.args = $base $local $other -o $output
261 kdiff3.args = $base $local $other -o $output
262 # Give higher priority
262 # Give higher priority
263 kdiff3.priority = 1
263 kdiff3.priority = 1
264
264
265 # Define new tool
265 # Define new tool
266 myHtmlTool.args = -m $local $other $base $output
266 myHtmlTool.args = -m $local $other $base $output
267 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
267 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
268 myHtmlTool.priority = 1
268 myHtmlTool.priority = 1
269
269
270 Supported arguments:
270 Supported arguments:
271 priority;;
271 priority;;
272 The priority in which to evaluate this tool.
272 The priority in which to evaluate this tool.
273 Default: 0.
273 Default: 0.
274 executable;;
274 executable;;
275 Either just the name of the executable or its pathname.
275 Either just the name of the executable or its pathname.
276 Default: the tool name.
276 Default: the tool name.
277 args;;
277 args;;
278 The arguments to pass to the tool executable. You can refer to the files
278 The arguments to pass to the tool executable. You can refer to the files
279 being merged as well as the output file through these variables: $base,
279 being merged as well as the output file through these variables: $base,
280 $local, $other, $output.
280 $local, $other, $output.
281 Default: $local $base $other
281 Default: $local $base $other
282 premerge;;
282 premerge;;
283 Attempt to run internal non-interactive 3-way merge tool before
283 Attempt to run internal non-interactive 3-way merge tool before
284 launching external tool.
284 launching external tool.
285 Default: True
285 Default: True
286 binary;;
286 binary;;
287 This tool can merge binary files. Defaults to False, unless tool
287 This tool can merge binary files. Defaults to False, unless tool
288 was selected by file pattern match.
288 was selected by file pattern match.
289 symlink;;
289 symlink;;
290 This tool can merge symlinks. Defaults to False, even if tool was
290 This tool can merge symlinks. Defaults to False, even if tool was
291 selected by file pattern match.
291 selected by file pattern match.
292 checkconflicts;;
292 checkconflicts;;
293 Check whether there are conflicts even though the tool reported
293 Check whether there are conflicts even though the tool reported
294 success.
294 success.
295 Default: False
295 Default: False
296 checkchanged;;
296 checkchanged;;
297 Check whether outputs were written even though the tool reported
297 Check whether outputs were written even though the tool reported
298 success.
298 success.
299 Default: False
299 Default: False
300 fixeol;;
300 fixeol;;
301 Attempt to fix up EOL changes caused by the merge tool.
301 Attempt to fix up EOL changes caused by the merge tool.
302 Default: False
302 Default: False
303 gui:;
303 gui:;
304 This tool requires a graphical interface to run. Default: False
304 This tool requires a graphical interface to run. Default: False
305 regkey;;
305 regkey;;
306 Windows registry key which describes install location of this tool.
306 Windows registry key which describes install location of this tool.
307 Mercurial will search for this key first under HKEY_CURRENT_USER and
307 Mercurial will search for this key first under HKEY_CURRENT_USER and
308 then under HKEY_LOCAL_MACHINE. Default: None
308 then under HKEY_LOCAL_MACHINE. Default: None
309 regname;;
309 regname;;
310 Name of value to read from specified registry key. Defaults to the
310 Name of value to read from specified registry key. Defaults to the
311 unnamed (default) value.
311 unnamed (default) value.
312 regappend;;
312 regappend;;
313 String to append to the value read from the registry, typically the
313 String to append to the value read from the registry, typically the
314 executable name of the tool. Default: None
314 executable name of the tool. Default: None
315
315
316 hooks::
316 hooks::
317 Commands or Python functions that get automatically executed by
317 Commands or Python functions that get automatically executed by
318 various actions such as starting or finishing a commit. Multiple
318 various actions such as starting or finishing a commit. Multiple
319 hooks can be run for the same action by appending a suffix to the
319 hooks can be run for the same action by appending a suffix to the
320 action. Overriding a site-wide hook can be done by changing its
320 action. Overriding a site-wide hook can be done by changing its
321 value or setting it to an empty string.
321 value or setting it to an empty string.
322
322
323 Example .hg/hgrc:
323 Example .hg/hgrc:
324
324
325 [hooks]
325 [hooks]
326 # do not use the site-wide hook
326 # do not use the site-wide hook
327 incoming =
327 incoming =
328 incoming.email = /my/email/hook
328 incoming.email = /my/email/hook
329 incoming.autobuild = /my/build/hook
329 incoming.autobuild = /my/build/hook
330
330
331 Most hooks are run with environment variables set that give added
331 Most hooks are run with environment variables set that give added
332 useful information. For each hook below, the environment variables
332 useful information. For each hook below, the environment variables
333 it is passed are listed with names of the form "$HG_foo".
333 it is passed are listed with names of the form "$HG_foo".
334
334
335 changegroup;;
335 changegroup;;
336 Run after a changegroup has been added via push, pull or
336 Run after a changegroup has been added via push, pull or
337 unbundle. ID of the first new changeset is in $HG_NODE. URL from
337 unbundle. ID of the first new changeset is in $HG_NODE. URL from
338 which changes came is in $HG_URL.
338 which changes came is in $HG_URL.
339 commit;;
339 commit;;
340 Run after a changeset has been created in the local repository.
340 Run after a changeset has been created in the local repository.
341 ID of the newly created changeset is in $HG_NODE. Parent
341 ID of the newly created changeset is in $HG_NODE. Parent
342 changeset IDs are in $HG_PARENT1 and $HG_PARENT2.
342 changeset IDs are in $HG_PARENT1 and $HG_PARENT2.
343 incoming;;
343 incoming;;
344 Run after a changeset has been pulled, pushed, or unbundled into
344 Run after a changeset has been pulled, pushed, or unbundled into
345 the local repository. The ID of the newly arrived changeset is in
345 the local repository. The ID of the newly arrived changeset is in
346 $HG_NODE. URL that was source of changes came is in $HG_URL.
346 $HG_NODE. URL that was source of changes came is in $HG_URL.
347 outgoing;;
347 outgoing;;
348 Run after sending changes from local repository to another. ID of
348 Run after sending changes from local repository to another. ID of
349 first changeset sent is in $HG_NODE. Source of operation is in
349 first changeset sent is in $HG_NODE. Source of operation is in
350 $HG_SOURCE; see "preoutgoing" hook for description.
350 $HG_SOURCE; see "preoutgoing" hook for description.
351 post-<command>;;
351 post-<command>;;
352 Run after successful invocations of the associated command. The
352 Run after successful invocations of the associated command. The
353 contents of the command line are passed as $HG_ARGS and the result
353 contents of the command line are passed as $HG_ARGS and the result
354 code in $HG_RESULT. Hook failure is ignored.
354 code in $HG_RESULT. Hook failure is ignored.
355 pre-<command>;;
355 pre-<command>;;
356 Run before executing the associated command. The contents of the
356 Run before executing the associated command. The contents of the
357 command line are passed as $HG_ARGS. If the hook returns failure,
357 command line are passed as $HG_ARGS. If the hook returns failure,
358 the command doesn't execute and Mercurial returns the failure code.
358 the command doesn't execute and Mercurial returns the failure code.
359 prechangegroup;;
359 prechangegroup;;
360 Run before a changegroup is added via push, pull or unbundle.
360 Run before a changegroup is added via push, pull or unbundle.
361 Exit status 0 allows the changegroup to proceed. Non-zero status
361 Exit status 0 allows the changegroup to proceed. Non-zero status
362 will cause the push, pull or unbundle to fail. URL from which
362 will cause the push, pull or unbundle to fail. URL from which
363 changes will come is in $HG_URL.
363 changes will come is in $HG_URL.
364 precommit;;
364 precommit;;
365 Run before starting a local commit. Exit status 0 allows the
365 Run before starting a local commit. Exit status 0 allows the
366 commit to proceed. Non-zero status will cause the commit to fail.
366 commit to proceed. Non-zero status will cause the commit to fail.
367 Parent changeset IDs are in $HG_PARENT1 and $HG_PARENT2.
367 Parent changeset IDs are in $HG_PARENT1 and $HG_PARENT2.
368 preoutgoing;;
368 preoutgoing;;
369 Run before collecting changes to send from the local repository to
369 Run before collecting changes to send from the local repository to
370 another. Non-zero status will cause failure. This lets you
370 another. Non-zero status will cause failure. This lets you
371 prevent pull over http or ssh. Also prevents against local pull,
371 prevent pull over http or ssh. Also prevents against local pull,
372 push (outbound) or bundle commands, but not effective, since you
372 push (outbound) or bundle commands, but not effective, since you
373 can just copy files instead then. Source of operation is in
373 can just copy files instead then. Source of operation is in
374 $HG_SOURCE. If "serve", operation is happening on behalf of
374 $HG_SOURCE. If "serve", operation is happening on behalf of
375 remote ssh or http repository. If "push", "pull" or "bundle",
375 remote ssh or http repository. If "push", "pull" or "bundle",
376 operation is happening on behalf of repository on same system.
376 operation is happening on behalf of repository on same system.
377 pretag;;
377 pretag;;
378 Run before creating a tag. Exit status 0 allows the tag to be
378 Run before creating a tag. Exit status 0 allows the tag to be
379 created. Non-zero status will cause the tag to fail. ID of
379 created. Non-zero status will cause the tag to fail. ID of
380 changeset to tag is in $HG_NODE. Name of tag is in $HG_TAG. Tag
380 changeset to tag is in $HG_NODE. Name of tag is in $HG_TAG. Tag
381 is local if $HG_LOCAL=1, in repo if $HG_LOCAL=0.
381 is local if $HG_LOCAL=1, in repo if $HG_LOCAL=0.
382 pretxnchangegroup;;
382 pretxnchangegroup;;
383 Run after a changegroup has been added via push, pull or unbundle,
383 Run after a changegroup has been added via push, pull or unbundle,
384 but before the transaction has been committed. Changegroup is
384 but before the transaction has been committed. Changegroup is
385 visible to hook program. This lets you validate incoming changes
385 visible to hook program. This lets you validate incoming changes
386 before accepting them. Passed the ID of the first new changeset
386 before accepting them. Passed the ID of the first new changeset
387 in $HG_NODE. Exit status 0 allows the transaction to commit.
387 in $HG_NODE. Exit status 0 allows the transaction to commit.
388 Non-zero status will cause the transaction to be rolled back and
388 Non-zero status will cause the transaction to be rolled back and
389 the push, pull or unbundle will fail. URL that was source of
389 the push, pull or unbundle will fail. URL that was source of
390 changes is in $HG_URL.
390 changes is in $HG_URL.
391 pretxncommit;;
391 pretxncommit;;
392 Run after a changeset has been created but the transaction not yet
392 Run after a changeset has been created but the transaction not yet
393 committed. Changeset is visible to hook program. This lets you
393 committed. Changeset is visible to hook program. This lets you
394 validate commit message and changes. Exit status 0 allows the
394 validate commit message and changes. Exit status 0 allows the
395 commit to proceed. Non-zero status will cause the transaction to
395 commit to proceed. Non-zero status will cause the transaction to
396 be rolled back. ID of changeset is in $HG_NODE. Parent changeset
396 be rolled back. ID of changeset is in $HG_NODE. Parent changeset
397 IDs are in $HG_PARENT1 and $HG_PARENT2.
397 IDs are in $HG_PARENT1 and $HG_PARENT2.
398 preupdate;;
398 preupdate;;
399 Run before updating the working directory. Exit status 0 allows
399 Run before updating the working directory. Exit status 0 allows
400 the update to proceed. Non-zero status will prevent the update.
400 the update to proceed. Non-zero status will prevent the update.
401 Changeset ID of first new parent is in $HG_PARENT1. If merge, ID
401 Changeset ID of first new parent is in $HG_PARENT1. If merge, ID
402 of second new parent is in $HG_PARENT2.
402 of second new parent is in $HG_PARENT2.
403 tag;;
403 tag;;
404 Run after a tag is created. ID of tagged changeset is in
404 Run after a tag is created. ID of tagged changeset is in
405 $HG_NODE. Name of tag is in $HG_TAG. Tag is local if
405 $HG_NODE. Name of tag is in $HG_TAG. Tag is local if
406 $HG_LOCAL=1, in repo if $HG_LOCAL=0.
406 $HG_LOCAL=1, in repo if $HG_LOCAL=0.
407 update;;
407 update;;
408 Run after updating the working directory. Changeset ID of first
408 Run after updating the working directory. Changeset ID of first
409 new parent is in $HG_PARENT1. If merge, ID of second new parent
409 new parent is in $HG_PARENT1. If merge, ID of second new parent
410 is in $HG_PARENT2. If update succeeded, $HG_ERROR=0. If update
410 is in $HG_PARENT2. If update succeeded, $HG_ERROR=0. If update
411 failed (e.g. because conflicts not resolved), $HG_ERROR=1.
411 failed (e.g. because conflicts not resolved), $HG_ERROR=1.
412
412
413 Note: it is generally better to use standard hooks rather than the
413 Note: it is generally better to use standard hooks rather than the
414 generic pre- and post- command hooks as they are guaranteed to be
414 generic pre- and post- command hooks as they are guaranteed to be
415 called in the appropriate contexts for influencing transactions.
415 called in the appropriate contexts for influencing transactions.
416 Also, hooks like "commit" will be called in all contexts that
416 Also, hooks like "commit" will be called in all contexts that
417 generate a commit (eg. tag) and not just the commit command.
417 generate a commit (eg. tag) and not just the commit command.
418
418
419 Note2: Environment variables with empty values may not be passed to
419 Note2: Environment variables with empty values may not be passed to
420 hooks on platforms like Windows. For instance, $HG_PARENT2 will
420 hooks on platforms like Windows. For instance, $HG_PARENT2 will
421 not be available under Windows for non-merge changesets while being
421 not be available under Windows for non-merge changesets while being
422 set to an empty value under Unix-like systems.
422 set to an empty value under Unix-like systems.
423
423
424 The syntax for Python hooks is as follows:
424 The syntax for Python hooks is as follows:
425
425
426 hookname = python:modulename.submodule.callable
426 hookname = python:modulename.submodule.callable
427
427
428 Python hooks are run within the Mercurial process. Each hook is
428 Python hooks are run within the Mercurial process. Each hook is
429 called with at least three keyword arguments: a ui object (keyword
429 called with at least three keyword arguments: a ui object (keyword
430 "ui"), a repository object (keyword "repo"), and a "hooktype"
430 "ui"), a repository object (keyword "repo"), and a "hooktype"
431 keyword that tells what kind of hook is used. Arguments listed as
431 keyword that tells what kind of hook is used. Arguments listed as
432 environment variables above are passed as keyword arguments, with no
432 environment variables above are passed as keyword arguments, with no
433 "HG_" prefix, and names in lower case.
433 "HG_" prefix, and names in lower case.
434
434
435 If a Python hook returns a "true" value or raises an exception, this
435 If a Python hook returns a "true" value or raises an exception, this
436 is treated as failure of the hook.
436 is treated as failure of the hook.
437
437
438 http_proxy::
438 http_proxy::
439 Used to access web-based Mercurial repositories through a HTTP
439 Used to access web-based Mercurial repositories through a HTTP
440 proxy.
440 proxy.
441 host;;
441 host;;
442 Host name and (optional) port of the proxy server, for example
442 Host name and (optional) port of the proxy server, for example
443 "myproxy:8000".
443 "myproxy:8000".
444 no;;
444 no;;
445 Optional. Comma-separated list of host names that should bypass
445 Optional. Comma-separated list of host names that should bypass
446 the proxy.
446 the proxy.
447 passwd;;
447 passwd;;
448 Optional. Password to authenticate with at the proxy server.
448 Optional. Password to authenticate with at the proxy server.
449 user;;
449 user;;
450 Optional. User name to authenticate with at the proxy server.
450 Optional. User name to authenticate with at the proxy server.
451
451
452 smtp::
452 smtp::
453 Configuration for extensions that need to send email messages.
453 Configuration for extensions that need to send email messages.
454 host;;
454 host;;
455 Host name of mail server, e.g. "mail.example.com".
455 Host name of mail server, e.g. "mail.example.com".
456 port;;
456 port;;
457 Optional. Port to connect to on mail server. Default: 25.
457 Optional. Port to connect to on mail server. Default: 25.
458 tls;;
458 tls;;
459 Optional. Whether to connect to mail server using TLS. True or
459 Optional. Whether to connect to mail server using TLS. True or
460 False. Default: False.
460 False. Default: False.
461 username;;
461 username;;
462 Optional. User name to authenticate to SMTP server with.
462 Optional. User name to authenticate to SMTP server with.
463 If username is specified, password must also be specified.
463 If username is specified, password must also be specified.
464 Default: none.
464 Default: none.
465 password;;
465 password;;
466 Optional. Password to authenticate to SMTP server with.
466 Optional. Password to authenticate to SMTP server with.
467 If username is specified, password must also be specified.
467 If username is specified, password must also be specified.
468 Default: none.
468 Default: none.
469 local_hostname;;
469 local_hostname;;
470 Optional. It's the hostname that the sender can use to identify itself
470 Optional. It's the hostname that the sender can use to identify itself
471 to the MTA.
471 to the MTA.
472
472
473 paths::
473 paths::
474 Assigns symbolic names to repositories. The left side is the
474 Assigns symbolic names to repositories. The left side is the
475 symbolic name, and the right gives the directory or URL that is the
475 symbolic name, and the right gives the directory or URL that is the
476 location of the repository. Default paths can be declared by
476 location of the repository. Default paths can be declared by
477 setting the following entries.
477 setting the following entries.
478 default;;
478 default;;
479 Directory or URL to use when pulling if no source is specified.
479 Directory or URL to use when pulling if no source is specified.
480 Default is set to repository from which the current repository
480 Default is set to repository from which the current repository
481 was cloned.
481 was cloned.
482 default-push;;
482 default-push;;
483 Optional. Directory or URL to use when pushing if no destination
483 Optional. Directory or URL to use when pushing if no destination
484 is specified.
484 is specified.
485
485
486 server::
486 server::
487 Controls generic server settings.
487 Controls generic server settings.
488 uncompressed;;
488 uncompressed;;
489 Whether to allow clients to clone a repo using the uncompressed
489 Whether to allow clients to clone a repo using the uncompressed
490 streaming protocol. This transfers about 40% more data than a
490 streaming protocol. This transfers about 40% more data than a
491 regular clone, but uses less memory and CPU on both server and
491 regular clone, but uses less memory and CPU on both server and
492 client. Over a LAN (100Mbps or better) or a very fast WAN, an
492 client. Over a LAN (100Mbps or better) or a very fast WAN, an
493 uncompressed streaming clone is a lot faster (~10x) than a regular
493 uncompressed streaming clone is a lot faster (~10x) than a regular
494 clone. Over most WAN connections (anything slower than about
494 clone. Over most WAN connections (anything slower than about
495 6Mbps), uncompressed streaming is slower, because of the extra
495 6Mbps), uncompressed streaming is slower, because of the extra
496 data transfer overhead. Default is False.
496 data transfer overhead. Default is False.
497
497
498 trusted::
498 trusted::
499 For security reasons, Mercurial will not use the settings in
499 For security reasons, Mercurial will not use the settings in
500 the .hg/hgrc file from a repository if it doesn't belong to a
500 the .hg/hgrc file from a repository if it doesn't belong to a
501 trusted user or to a trusted group. The main exception is the
501 trusted user or to a trusted group. The main exception is the
502 web interface, which automatically uses some safe settings, since
502 web interface, which automatically uses some safe settings, since
503 it's common to serve repositories from different users.
503 it's common to serve repositories from different users.
504
504
505 This section specifies what users and groups are trusted. The
505 This section specifies what users and groups are trusted. The
506 current user is always trusted. To trust everybody, list a user
506 current user is always trusted. To trust everybody, list a user
507 or a group with name "*".
507 or a group with name "*".
508
508
509 users;;
509 users;;
510 Comma-separated list of trusted users.
510 Comma-separated list of trusted users.
511 groups;;
511 groups;;
512 Comma-separated list of trusted groups.
512 Comma-separated list of trusted groups.
513
513
514 ui::
514 ui::
515 User interface controls.
515 User interface controls.
516 archivemeta;;
517 Whether to include the .hg_archival.txt file containing metadata
518 (hashes for the repository base and for tip) in archives created by
519 the hg archive command or downloaded via hgweb.
520 Default is true.
516 debug;;
521 debug;;
517 Print debugging information. True or False. Default is False.
522 Print debugging information. True or False. Default is False.
518 editor;;
523 editor;;
519 The editor to use during a commit. Default is $EDITOR or "vi".
524 The editor to use during a commit. Default is $EDITOR or "vi".
520 fallbackencoding;;
525 fallbackencoding;;
521 Encoding to try if it's not possible to decode the changelog using
526 Encoding to try if it's not possible to decode the changelog using
522 UTF-8. Default is ISO-8859-1.
527 UTF-8. Default is ISO-8859-1.
523 ignore;;
528 ignore;;
524 A file to read per-user ignore patterns from. This file should be in
529 A file to read per-user ignore patterns from. This file should be in
525 the same format as a repository-wide .hgignore file. This option
530 the same format as a repository-wide .hgignore file. This option
526 supports hook syntax, so if you want to specify multiple ignore
531 supports hook syntax, so if you want to specify multiple ignore
527 files, you can do so by setting something like
532 files, you can do so by setting something like
528 "ignore.other = ~/.hgignore2". For details of the ignore file
533 "ignore.other = ~/.hgignore2". For details of the ignore file
529 format, see the hgignore(5) man page.
534 format, see the hgignore(5) man page.
530 interactive;;
535 interactive;;
531 Allow to prompt the user. True or False. Default is True.
536 Allow to prompt the user. True or False. Default is True.
532 logtemplate;;
537 logtemplate;;
533 Template string for commands that print changesets.
538 Template string for commands that print changesets.
534 merge;;
539 merge;;
535 The conflict resolution program to use during a manual merge.
540 The conflict resolution program to use during a manual merge.
536 There are some internal tools available:
541 There are some internal tools available:
537
542
538 internal:local;;
543 internal:local;;
539 keep the local version
544 keep the local version
540 internal:other;;
545 internal:other;;
541 use the other version
546 use the other version
542 internal:merge;;
547 internal:merge;;
543 use the internal non-interactive merge tool
548 use the internal non-interactive merge tool
544 internal:fail;;
549 internal:fail;;
545 fail to merge
550 fail to merge
546
551
547 See the merge-tools section for more information on configuring tools.
552 See the merge-tools section for more information on configuring tools.
548 patch;;
553 patch;;
549 command to use to apply patches. Look for 'gpatch' or 'patch' in PATH if
554 command to use to apply patches. Look for 'gpatch' or 'patch' in PATH if
550 unset.
555 unset.
551 quiet;;
556 quiet;;
552 Reduce the amount of output printed. True or False. Default is False.
557 Reduce the amount of output printed. True or False. Default is False.
553 remotecmd;;
558 remotecmd;;
554 remote command to use for clone/push/pull operations. Default is 'hg'.
559 remote command to use for clone/push/pull operations. Default is 'hg'.
555 report_untrusted;;
560 report_untrusted;;
556 Warn if a .hg/hgrc file is ignored due to not being owned by a
561 Warn if a .hg/hgrc file is ignored due to not being owned by a
557 trusted user or group. True or False. Default is True.
562 trusted user or group. True or False. Default is True.
558 slash;;
563 slash;;
559 Display paths using a slash ("/") as the path separator. This only
564 Display paths using a slash ("/") as the path separator. This only
560 makes a difference on systems where the default path separator is not
565 makes a difference on systems where the default path separator is not
561 the slash character (e.g. Windows uses the backslash character ("\")).
566 the slash character (e.g. Windows uses the backslash character ("\")).
562 Default is False.
567 Default is False.
563 ssh;;
568 ssh;;
564 command to use for SSH connections. Default is 'ssh'.
569 command to use for SSH connections. Default is 'ssh'.
565 strict;;
570 strict;;
566 Require exact command names, instead of allowing unambiguous
571 Require exact command names, instead of allowing unambiguous
567 abbreviations. True or False. Default is False.
572 abbreviations. True or False. Default is False.
568 style;;
573 style;;
569 Name of style to use for command output.
574 Name of style to use for command output.
570 timeout;;
575 timeout;;
571 The timeout used when a lock is held (in seconds), a negative value
576 The timeout used when a lock is held (in seconds), a negative value
572 means no timeout. Default is 600.
577 means no timeout. Default is 600.
573 username;;
578 username;;
574 The committer of a changeset created when running "commit".
579 The committer of a changeset created when running "commit".
575 Typically a person's name and email address, e.g. "Fred Widget
580 Typically a person's name and email address, e.g. "Fred Widget
576 <fred@example.com>". Default is $EMAIL or username@hostname.
581 <fred@example.com>". Default is $EMAIL or username@hostname.
577 If the username in hgrc is empty, it has to be specified manually or
582 If the username in hgrc is empty, it has to be specified manually or
578 in a different hgrc file (e.g. $HOME/.hgrc, if the admin set "username ="
583 in a different hgrc file (e.g. $HOME/.hgrc, if the admin set "username ="
579 in the system hgrc).
584 in the system hgrc).
580 verbose;;
585 verbose;;
581 Increase the amount of output printed. True or False. Default is False.
586 Increase the amount of output printed. True or False. Default is False.
582
587
583
588
584 web::
589 web::
585 Web interface configuration.
590 Web interface configuration.
586 accesslog;;
591 accesslog;;
587 Where to output the access log. Default is stdout.
592 Where to output the access log. Default is stdout.
588 address;;
593 address;;
589 Interface address to bind to. Default is all.
594 Interface address to bind to. Default is all.
590 allow_archive;;
595 allow_archive;;
591 List of archive format (bz2, gz, zip) allowed for downloading.
596 List of archive format (bz2, gz, zip) allowed for downloading.
592 Default is empty.
597 Default is empty.
593 allowbz2;;
598 allowbz2;;
594 (DEPRECATED) Whether to allow .tar.bz2 downloading of repo revisions.
599 (DEPRECATED) Whether to allow .tar.bz2 downloading of repo revisions.
595 Default is false.
600 Default is false.
596 allowgz;;
601 allowgz;;
597 (DEPRECATED) Whether to allow .tar.gz downloading of repo revisions.
602 (DEPRECATED) Whether to allow .tar.gz downloading of repo revisions.
598 Default is false.
603 Default is false.
599 allowpull;;
604 allowpull;;
600 Whether to allow pulling from the repository. Default is true.
605 Whether to allow pulling from the repository. Default is true.
601 allow_push;;
606 allow_push;;
602 Whether to allow pushing to the repository. If empty or not set,
607 Whether to allow pushing to the repository. If empty or not set,
603 push is not allowed. If the special value "*", any remote user
608 push is not allowed. If the special value "*", any remote user
604 can push, including unauthenticated users. Otherwise, the remote
609 can push, including unauthenticated users. Otherwise, the remote
605 user must have been authenticated, and the authenticated user name
610 user must have been authenticated, and the authenticated user name
606 must be present in this list (separated by whitespace or ",").
611 must be present in this list (separated by whitespace or ",").
607 The contents of the allow_push list are examined after the
612 The contents of the allow_push list are examined after the
608 deny_push list.
613 deny_push list.
609 allowzip;;
614 allowzip;;
610 (DEPRECATED) Whether to allow .zip downloading of repo revisions.
615 (DEPRECATED) Whether to allow .zip downloading of repo revisions.
611 Default is false. This feature creates temporary files.
616 Default is false. This feature creates temporary files.
612 baseurl;;
617 baseurl;;
613 Base URL to use when publishing URLs in other locations, so
618 Base URL to use when publishing URLs in other locations, so
614 third-party tools like email notification hooks can construct URLs.
619 third-party tools like email notification hooks can construct URLs.
615 Example: "http://hgserver/repos/"
620 Example: "http://hgserver/repos/"
616 contact;;
621 contact;;
617 Name or email address of the person in charge of the repository.
622 Name or email address of the person in charge of the repository.
618 Defaults to ui.username or $EMAIL or "unknown" if unset or empty.
623 Defaults to ui.username or $EMAIL or "unknown" if unset or empty.
619 deny_push;;
624 deny_push;;
620 Whether to deny pushing to the repository. If empty or not set,
625 Whether to deny pushing to the repository. If empty or not set,
621 push is not denied. If the special value "*", all remote users
626 push is not denied. If the special value "*", all remote users
622 are denied push. Otherwise, unauthenticated users are all denied,
627 are denied push. Otherwise, unauthenticated users are all denied,
623 and any authenticated user name present in this list (separated by
628 and any authenticated user name present in this list (separated by
624 whitespace or ",") is also denied. The contents of the deny_push
629 whitespace or ",") is also denied. The contents of the deny_push
625 list are examined before the allow_push list.
630 list are examined before the allow_push list.
626 description;;
631 description;;
627 Textual description of the repository's purpose or contents.
632 Textual description of the repository's purpose or contents.
628 Default is "unknown".
633 Default is "unknown".
629 encoding;;
634 encoding;;
630 Character encoding name.
635 Character encoding name.
631 Example: "UTF-8"
636 Example: "UTF-8"
632 errorlog;;
637 errorlog;;
633 Where to output the error log. Default is stderr.
638 Where to output the error log. Default is stderr.
634 hidden;;
639 hidden;;
635 Whether to hide the repository in the hgwebdir index. Default is false.
640 Whether to hide the repository in the hgwebdir index. Default is false.
636 ipv6;;
641 ipv6;;
637 Whether to use IPv6. Default is false.
642 Whether to use IPv6. Default is false.
638 name;;
643 name;;
639 Repository name to use in the web interface. Default is current
644 Repository name to use in the web interface. Default is current
640 working directory.
645 working directory.
641 maxchanges;;
646 maxchanges;;
642 Maximum number of changes to list on the changelog. Default is 10.
647 Maximum number of changes to list on the changelog. Default is 10.
643 maxfiles;;
648 maxfiles;;
644 Maximum number of files to list per changeset. Default is 10.
649 Maximum number of files to list per changeset. Default is 10.
645 port;;
650 port;;
646 Port to listen on. Default is 8000.
651 Port to listen on. Default is 8000.
647 prefix;;
652 prefix;;
648 Prefix path to serve from. Default is '' (server root).
653 Prefix path to serve from. Default is '' (server root).
649 push_ssl;;
654 push_ssl;;
650 Whether to require that inbound pushes be transported over SSL to
655 Whether to require that inbound pushes be transported over SSL to
651 prevent password sniffing. Default is true.
656 prevent password sniffing. Default is true.
652 staticurl;;
657 staticurl;;
653 Base URL to use for static files. If unset, static files (e.g.
658 Base URL to use for static files. If unset, static files (e.g.
654 the hgicon.png favicon) will be served by the CGI script itself.
659 the hgicon.png favicon) will be served by the CGI script itself.
655 Use this setting to serve them directly with the HTTP server.
660 Use this setting to serve them directly with the HTTP server.
656 Example: "http://hgserver/static/"
661 Example: "http://hgserver/static/"
657 stripes;;
662 stripes;;
658 How many lines a "zebra stripe" should span in multiline output.
663 How many lines a "zebra stripe" should span in multiline output.
659 Default is 1; set to 0 to disable.
664 Default is 1; set to 0 to disable.
660 style;;
665 style;;
661 Which template map style to use.
666 Which template map style to use.
662 templates;;
667 templates;;
663 Where to find the HTML templates. Default is install path.
668 Where to find the HTML templates. Default is install path.
664
669
665
670
666 AUTHOR
671 AUTHOR
667 ------
672 ------
668 Bryan O'Sullivan <bos@serpentine.com>.
673 Bryan O'Sullivan <bos@serpentine.com>.
669
674
670 Mercurial was written by Matt Mackall <mpm@selenic.com>.
675 Mercurial was written by Matt Mackall <mpm@selenic.com>.
671
676
672 SEE ALSO
677 SEE ALSO
673 --------
678 --------
674 hg(1), hgignore(5)
679 hg(1), hgignore(5)
675
680
676 COPYING
681 COPYING
677 -------
682 -------
678 This manual page is copyright 2005 Bryan O'Sullivan.
683 This manual page is copyright 2005 Bryan O'Sullivan.
679 Mercurial is copyright 2005-2007 Matt Mackall.
684 Mercurial is copyright 2005-2007 Matt Mackall.
680 Free use of this software is granted under the terms of the GNU General
685 Free use of this software is granted under the terms of the GNU General
681 Public License (GPL).
686 Public License (GPL).
@@ -1,222 +1,224 b''
1 # archival.py - revision archival for mercurial
1 # archival.py - revision archival 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 of
5 # This software may be used and distributed according to the terms of
6 # the GNU General Public License, incorporated herein by reference.
6 # the GNU General Public License, incorporated herein by reference.
7
7
8 from i18n import _
8 from i18n import _
9 from node import *
9 from node import *
10 import cStringIO, os, stat, tarfile, time, util, zipfile
10 import cStringIO, os, stat, tarfile, time, util, zipfile
11 import zlib, gzip
11 import zlib, gzip
12
12
13 def tidyprefix(dest, prefix, suffixes):
13 def tidyprefix(dest, prefix, suffixes):
14 '''choose prefix to use for names in archive. make sure prefix is
14 '''choose prefix to use for names in archive. make sure prefix is
15 safe for consumers.'''
15 safe for consumers.'''
16
16
17 if prefix:
17 if prefix:
18 prefix = util.normpath(prefix)
18 prefix = util.normpath(prefix)
19 else:
19 else:
20 if not isinstance(dest, str):
20 if not isinstance(dest, str):
21 raise ValueError('dest must be string if no prefix')
21 raise ValueError('dest must be string if no prefix')
22 prefix = os.path.basename(dest)
22 prefix = os.path.basename(dest)
23 lower = prefix.lower()
23 lower = prefix.lower()
24 for sfx in suffixes:
24 for sfx in suffixes:
25 if lower.endswith(sfx):
25 if lower.endswith(sfx):
26 prefix = prefix[:-len(sfx)]
26 prefix = prefix[:-len(sfx)]
27 break
27 break
28 lpfx = os.path.normpath(util.localpath(prefix))
28 lpfx = os.path.normpath(util.localpath(prefix))
29 prefix = util.pconvert(lpfx)
29 prefix = util.pconvert(lpfx)
30 if not prefix.endswith('/'):
30 if not prefix.endswith('/'):
31 prefix += '/'
31 prefix += '/'
32 if prefix.startswith('../') or os.path.isabs(lpfx) or '/../' in prefix:
32 if prefix.startswith('../') or os.path.isabs(lpfx) or '/../' in prefix:
33 raise util.Abort(_('archive prefix contains illegal components'))
33 raise util.Abort(_('archive prefix contains illegal components'))
34 return prefix
34 return prefix
35
35
36 class tarit:
36 class tarit:
37 '''write archive to tar file or stream. can write uncompressed,
37 '''write archive to tar file or stream. can write uncompressed,
38 or compress with gzip or bzip2.'''
38 or compress with gzip or bzip2.'''
39
39
40 class GzipFileWithTime(gzip.GzipFile):
40 class GzipFileWithTime(gzip.GzipFile):
41
41
42 def __init__(self, *args, **kw):
42 def __init__(self, *args, **kw):
43 timestamp = None
43 timestamp = None
44 if 'timestamp' in kw:
44 if 'timestamp' in kw:
45 timestamp = kw.pop('timestamp')
45 timestamp = kw.pop('timestamp')
46 if timestamp == None:
46 if timestamp == None:
47 self.timestamp = time.time()
47 self.timestamp = time.time()
48 else:
48 else:
49 self.timestamp = timestamp
49 self.timestamp = timestamp
50 gzip.GzipFile.__init__(self, *args, **kw)
50 gzip.GzipFile.__init__(self, *args, **kw)
51
51
52 def _write_gzip_header(self):
52 def _write_gzip_header(self):
53 self.fileobj.write('\037\213') # magic header
53 self.fileobj.write('\037\213') # magic header
54 self.fileobj.write('\010') # compression method
54 self.fileobj.write('\010') # compression method
55 fname = self.filename[:-3]
55 fname = self.filename[:-3]
56 flags = 0
56 flags = 0
57 if fname:
57 if fname:
58 flags = gzip.FNAME
58 flags = gzip.FNAME
59 self.fileobj.write(chr(flags))
59 self.fileobj.write(chr(flags))
60 gzip.write32u(self.fileobj, long(self.timestamp))
60 gzip.write32u(self.fileobj, long(self.timestamp))
61 self.fileobj.write('\002')
61 self.fileobj.write('\002')
62 self.fileobj.write('\377')
62 self.fileobj.write('\377')
63 if fname:
63 if fname:
64 self.fileobj.write(fname + '\000')
64 self.fileobj.write(fname + '\000')
65
65
66 def __init__(self, dest, prefix, mtime, kind=''):
66 def __init__(self, dest, prefix, mtime, kind=''):
67 self.prefix = tidyprefix(dest, prefix, ['.tar', '.tar.bz2', '.tar.gz',
67 self.prefix = tidyprefix(dest, prefix, ['.tar', '.tar.bz2', '.tar.gz',
68 '.tgz', '.tbz2'])
68 '.tgz', '.tbz2'])
69 self.mtime = mtime
69 self.mtime = mtime
70
70
71 def taropen(name, mode, fileobj=None):
71 def taropen(name, mode, fileobj=None):
72 if kind == 'gz':
72 if kind == 'gz':
73 mode = mode[0]
73 mode = mode[0]
74 if not fileobj:
74 if not fileobj:
75 fileobj = open(name, mode + 'b')
75 fileobj = open(name, mode + 'b')
76 gzfileobj = self.GzipFileWithTime(name, mode + 'b',
76 gzfileobj = self.GzipFileWithTime(name, mode + 'b',
77 zlib.Z_BEST_COMPRESSION,
77 zlib.Z_BEST_COMPRESSION,
78 fileobj, timestamp=mtime)
78 fileobj, timestamp=mtime)
79 return tarfile.TarFile.taropen(name, mode, gzfileobj)
79 return tarfile.TarFile.taropen(name, mode, gzfileobj)
80 else:
80 else:
81 return tarfile.open(name, mode + kind, fileobj)
81 return tarfile.open(name, mode + kind, fileobj)
82
82
83 if isinstance(dest, str):
83 if isinstance(dest, str):
84 self.z = taropen(dest, mode='w:')
84 self.z = taropen(dest, mode='w:')
85 else:
85 else:
86 # Python 2.5-2.5.1 have a regression that requires a name arg
86 # Python 2.5-2.5.1 have a regression that requires a name arg
87 self.z = taropen(name='', mode='w|', fileobj=dest)
87 self.z = taropen(name='', mode='w|', fileobj=dest)
88
88
89 def addfile(self, name, mode, islink, data):
89 def addfile(self, name, mode, islink, data):
90 i = tarfile.TarInfo(self.prefix + name)
90 i = tarfile.TarInfo(self.prefix + name)
91 i.mtime = self.mtime
91 i.mtime = self.mtime
92 i.size = len(data)
92 i.size = len(data)
93 if islink:
93 if islink:
94 i.type = tarfile.SYMTYPE
94 i.type = tarfile.SYMTYPE
95 i.mode = 0777
95 i.mode = 0777
96 i.linkname = data
96 i.linkname = data
97 data = None
97 data = None
98 else:
98 else:
99 i.mode = mode
99 i.mode = mode
100 data = cStringIO.StringIO(data)
100 data = cStringIO.StringIO(data)
101 self.z.addfile(i, data)
101 self.z.addfile(i, data)
102
102
103 def done(self):
103 def done(self):
104 self.z.close()
104 self.z.close()
105
105
106 class tellable:
106 class tellable:
107 '''provide tell method for zipfile.ZipFile when writing to http
107 '''provide tell method for zipfile.ZipFile when writing to http
108 response file object.'''
108 response file object.'''
109
109
110 def __init__(self, fp):
110 def __init__(self, fp):
111 self.fp = fp
111 self.fp = fp
112 self.offset = 0
112 self.offset = 0
113
113
114 def __getattr__(self, key):
114 def __getattr__(self, key):
115 return getattr(self.fp, key)
115 return getattr(self.fp, key)
116
116
117 def write(self, s):
117 def write(self, s):
118 self.fp.write(s)
118 self.fp.write(s)
119 self.offset += len(s)
119 self.offset += len(s)
120
120
121 def tell(self):
121 def tell(self):
122 return self.offset
122 return self.offset
123
123
124 class zipit:
124 class zipit:
125 '''write archive to zip file or stream. can write uncompressed,
125 '''write archive to zip file or stream. can write uncompressed,
126 or compressed with deflate.'''
126 or compressed with deflate.'''
127
127
128 def __init__(self, dest, prefix, mtime, compress=True):
128 def __init__(self, dest, prefix, mtime, compress=True):
129 self.prefix = tidyprefix(dest, prefix, ('.zip',))
129 self.prefix = tidyprefix(dest, prefix, ('.zip',))
130 if not isinstance(dest, str):
130 if not isinstance(dest, str):
131 try:
131 try:
132 dest.tell()
132 dest.tell()
133 except (AttributeError, IOError):
133 except (AttributeError, IOError):
134 dest = tellable(dest)
134 dest = tellable(dest)
135 self.z = zipfile.ZipFile(dest, 'w',
135 self.z = zipfile.ZipFile(dest, 'w',
136 compress and zipfile.ZIP_DEFLATED or
136 compress and zipfile.ZIP_DEFLATED or
137 zipfile.ZIP_STORED)
137 zipfile.ZIP_STORED)
138 self.date_time = time.gmtime(mtime)[:6]
138 self.date_time = time.gmtime(mtime)[:6]
139
139
140 def addfile(self, name, mode, islink, data):
140 def addfile(self, name, mode, islink, data):
141 i = zipfile.ZipInfo(self.prefix + name, self.date_time)
141 i = zipfile.ZipInfo(self.prefix + name, self.date_time)
142 i.compress_type = self.z.compression
142 i.compress_type = self.z.compression
143 # unzip will not honor unix file modes unless file creator is
143 # unzip will not honor unix file modes unless file creator is
144 # set to unix (id 3).
144 # set to unix (id 3).
145 i.create_system = 3
145 i.create_system = 3
146 ftype = stat.S_IFREG
146 ftype = stat.S_IFREG
147 if islink:
147 if islink:
148 mode = 0777
148 mode = 0777
149 ftype = stat.S_IFLNK
149 ftype = stat.S_IFLNK
150 i.external_attr = (mode | ftype) << 16L
150 i.external_attr = (mode | ftype) << 16L
151 self.z.writestr(i, data)
151 self.z.writestr(i, data)
152
152
153 def done(self):
153 def done(self):
154 self.z.close()
154 self.z.close()
155
155
156 class fileit:
156 class fileit:
157 '''write archive as files in directory.'''
157 '''write archive as files in directory.'''
158
158
159 def __init__(self, name, prefix, mtime):
159 def __init__(self, name, prefix, mtime):
160 if prefix:
160 if prefix:
161 raise util.Abort(_('cannot give prefix when archiving to files'))
161 raise util.Abort(_('cannot give prefix when archiving to files'))
162 self.basedir = name
162 self.basedir = name
163 self.opener = util.opener(self.basedir)
163 self.opener = util.opener(self.basedir)
164
164
165 def addfile(self, name, mode, islink, data):
165 def addfile(self, name, mode, islink, data):
166 if islink:
166 if islink:
167 self.opener.symlink(data, name)
167 self.opener.symlink(data, name)
168 return
168 return
169 f = self.opener(name, "w", atomictemp=True)
169 f = self.opener(name, "w", atomictemp=True)
170 f.write(data)
170 f.write(data)
171 f.rename()
171 f.rename()
172 destfile = os.path.join(self.basedir, name)
172 destfile = os.path.join(self.basedir, name)
173 os.chmod(destfile, mode)
173 os.chmod(destfile, mode)
174
174
175 def done(self):
175 def done(self):
176 pass
176 pass
177
177
178 archivers = {
178 archivers = {
179 'files': fileit,
179 'files': fileit,
180 'tar': tarit,
180 'tar': tarit,
181 'tbz2': lambda name, prefix, mtime: tarit(name, prefix, mtime, 'bz2'),
181 'tbz2': lambda name, prefix, mtime: tarit(name, prefix, mtime, 'bz2'),
182 'tgz': lambda name, prefix, mtime: tarit(name, prefix, mtime, 'gz'),
182 'tgz': lambda name, prefix, mtime: tarit(name, prefix, mtime, 'gz'),
183 'uzip': lambda name, prefix, mtime: zipit(name, prefix, mtime, False),
183 'uzip': lambda name, prefix, mtime: zipit(name, prefix, mtime, False),
184 'zip': zipit,
184 'zip': zipit,
185 }
185 }
186
186
187 def archive(repo, dest, node, kind, decode=True, matchfn=None,
187 def archive(repo, dest, node, kind, decode=True, matchfn=None,
188 prefix=None, mtime=None):
188 prefix=None, mtime=None):
189 '''create archive of repo as it was at node.
189 '''create archive of repo as it was at node.
190
190
191 dest can be name of directory, name of archive file, or file
191 dest can be name of directory, name of archive file, or file
192 object to write archive to.
192 object to write archive to.
193
193
194 kind is type of archive to create.
194 kind is type of archive to create.
195
195
196 decode tells whether to put files through decode filters from
196 decode tells whether to put files through decode filters from
197 hgrc.
197 hgrc.
198
198
199 matchfn is function to filter names of files to write to archive.
199 matchfn is function to filter names of files to write to archive.
200
200
201 prefix is name of path to put before every archive member.'''
201 prefix is name of path to put before every archive member.'''
202
202
203 def write(name, mode, islink, getdata):
203 def write(name, mode, islink, getdata):
204 if matchfn and not matchfn(name): return
204 if matchfn and not matchfn(name): return
205 data = getdata()
205 data = getdata()
206 if decode:
206 if decode:
207 data = repo.wwritedata(name, data)
207 data = repo.wwritedata(name, data)
208 archiver.addfile(name, mode, islink, data)
208 archiver.addfile(name, mode, islink, data)
209
209
210 ctx = repo.changectx(node)
210 ctx = repo.changectx(node)
211 if kind not in archivers:
211 if kind not in archivers:
212 raise util.Abort(_("unknown archive type '%s'" % kind))
212 raise util.Abort(_("unknown archive type '%s'" % kind))
213 archiver = archivers[kind](dest, prefix, mtime or ctx.date()[0])
213 archiver = archivers[kind](dest, prefix, mtime or ctx.date()[0])
214 m = ctx.manifest()
214 m = ctx.manifest()
215 items = m.items()
215 items = m.items()
216 items.sort()
216 items.sort()
217 if repo.ui.configbool("ui", "archivemeta", True):
217 write('.hg_archival.txt', 0644, False,
218 write('.hg_archival.txt', 0644, False,
218 lambda: 'repo: %s\nnode: %s\n' % (hex(repo.changelog.node(0)), hex(node)))
219 lambda: 'repo: %s\nnode: %s\n' % (
220 hex(repo.changelog.node(0)), hex(node)))
219 for filename, filenode in items:
221 for filename, filenode in items:
220 write(filename, m.execf(filename) and 0755 or 0644, m.linkf(filename),
222 write(filename, m.execf(filename) and 0755 or 0644, m.linkf(filename),
221 lambda: repo.file(filename).read(filenode))
223 lambda: repo.file(filename).read(filenode))
222 archiver.done()
224 archiver.done()
@@ -1,82 +1,82 b''
1 #!/bin/sh
1 #!/bin/sh
2
2
3 mkdir test
3 mkdir test
4 cd test
4 cd test
5 hg init
5 hg init
6 echo foo>foo
6 echo foo>foo
7 hg commit -Am 1 -d '1 0'
7 hg commit -Am 1 -d '1 0'
8 echo bar>bar
8 echo bar>bar
9 hg commit -Am 2 -d '2 0'
9 hg commit -Am 2 -d '2 0'
10 mkdir baz
10 mkdir baz
11 echo bletch>baz/bletch
11 echo bletch>baz/bletch
12 hg commit -Am 3 -d '1000000000 0'
12 hg commit -Am 3 -d '1000000000 0'
13 echo "[web]" >> .hg/hgrc
13 echo "[web]" >> .hg/hgrc
14 echo "name = test-archive" >> .hg/hgrc
14 echo "name = test-archive" >> .hg/hgrc
15 echo "allow_archive = gz bz2, zip" >> .hg/hgrc
15 echo "allow_archive = gz bz2, zip" >> .hg/hgrc
16 hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log
16 hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log
17 cat hg.pid >> $DAEMON_PIDS
17 cat hg.pid >> $DAEMON_PIDS
18
18
19 TIP=`hg id -v | cut -f1 -d' '`
19 TIP=`hg id -v | cut -f1 -d' '`
20 QTIP=`hg id -q`
20 QTIP=`hg id -q`
21 cat > getarchive.py <<EOF
21 cat > getarchive.py <<EOF
22 import os, sys, urllib2
22 import os, sys, urllib2
23 node, archive = sys.argv[1:]
23 node, archive = sys.argv[1:]
24 f = urllib2.urlopen('http://127.0.0.1:%s/?cmd=archive;node=%s;type=%s'
24 f = urllib2.urlopen('http://127.0.0.1:%s/?cmd=archive;node=%s;type=%s'
25 % (os.environ['HGPORT'], node, archive))
25 % (os.environ['HGPORT'], node, archive))
26 sys.stdout.write(f.read())
26 sys.stdout.write(f.read())
27 EOF
27 EOF
28 http_proxy= python getarchive.py "$TIP" gz | gunzip | tar tf - | sed "s/$QTIP/TIP/"
28 http_proxy= python getarchive.py "$TIP" gz | gunzip | tar tf - | sed "s/$QTIP/TIP/"
29 http_proxy= python getarchive.py "$TIP" bz2 | bunzip2 | tar tf - | sed "s/$QTIP/TIP/"
29 http_proxy= python getarchive.py "$TIP" bz2 | bunzip2 | tar tf - | sed "s/$QTIP/TIP/"
30 http_proxy= python getarchive.py "$TIP" zip > archive.zip
30 http_proxy= python getarchive.py "$TIP" zip > archive.zip
31 unzip -t archive.zip | sed "s/$QTIP/TIP/"
31 unzip -t archive.zip | sed "s/$QTIP/TIP/"
32
32
33 hg archive -t tar test.tar
33 hg archive -t tar test.tar
34 tar tf test.tar
34 tar tf test.tar
35
35
36 hg archive -t tbz2 -X baz test.tar.bz2
36 hg archive -t tbz2 -X baz test.tar.bz2
37 bunzip2 -dc test.tar.bz2 | tar tf -
37 bunzip2 -dc test.tar.bz2 | tar tf -
38
38
39 hg archive -t tgz -p %b-%h test-%h.tar.gz
39 hg archive -t tgz -p %b-%h test-%h.tar.gz
40 gzip -dc test-$QTIP.tar.gz | tar tf - | sed "s/$QTIP/TIP/"
40 gzip -dc test-$QTIP.tar.gz | tar tf - | sed "s/$QTIP/TIP/"
41
41
42 cat > md5comp.py <<EOF
42 cat > md5comp.py <<EOF
43 import md5, sys
43 import md5, sys
44 f1, f2 = sys.argv[1:3]
44 f1, f2 = sys.argv[1:3]
45 h1 = md5.md5(file(f1, 'rb').read()).hexdigest()
45 h1 = md5.md5(file(f1, 'rb').read()).hexdigest()
46 h2 = md5.md5(file(f2, 'rb').read()).hexdigest()
46 h2 = md5.md5(file(f2, 'rb').read()).hexdigest()
47 print h1 == h2 or "md5 differ: " + repr((h1, h2))
47 print h1 == h2 or "md5 differ: " + repr((h1, h2))
48 EOF
48 EOF
49
49
50 # archive name is stored in the archive, so create similar
50 # archive name is stored in the archive, so create similar
51 # archives and rename them afterwards.
51 # archives and rename them afterwards.
52 hg archive -t tgz tip.tar.gz
52 hg archive -t tgz tip.tar.gz
53 mv tip.tar.gz tip1.tar.gz
53 mv tip.tar.gz tip1.tar.gz
54 sleep 1
54 sleep 1
55 hg archive -t tgz tip.tar.gz
55 hg archive -t tgz tip.tar.gz
56 mv tip.tar.gz tip2.tar.gz
56 mv tip.tar.gz tip2.tar.gz
57 python md5comp.py tip1.tar.gz tip2.tar.gz
57 python md5comp.py tip1.tar.gz tip2.tar.gz
58
58
59 hg archive -t zip -p /illegal test.zip
59 hg archive -t zip -p /illegal test.zip
60 hg archive -t zip -p very/../bad test.zip
60 hg archive -t zip -p very/../bad test.zip
61
61
62 hg archive -t zip -r 2 test.zip
62 hg archive --config ui.archivemeta=false -t zip -r 2 test.zip
63 unzip -t test.zip
63 unzip -t test.zip
64
64
65 hg archive -t tar - | tar tf - | sed "s/$QTIP/TIP/"
65 hg archive -t tar - | tar tf - | sed "s/$QTIP/TIP/"
66
66
67 hg archive -r 0 -t tar rev-%r.tar
67 hg archive -r 0 -t tar rev-%r.tar
68 if [ -f rev-0.tar ]; then
68 if [ -f rev-0.tar ]; then
69 echo 'rev-0.tar created'
69 echo 'rev-0.tar created'
70 fi
70 fi
71
71
72 hg archive -t bogus test.bogus
72 hg archive -t bogus test.bogus
73
73
74 echo % server errors
74 echo % server errors
75 cat errors.log
75 cat errors.log
76
76
77 echo '% empty repo'
77 echo '% empty repo'
78 hg init ../empty
78 hg init ../empty
79 cd ../empty
79 cd ../empty
80 hg archive ../test-empty
80 hg archive ../test-empty
81
81
82 exit 0
82 exit 0
@@ -1,45 +1,44 b''
1 adding foo
1 adding foo
2 adding bar
2 adding bar
3 adding baz/bletch
3 adding baz/bletch
4 test-archive-TIP/.hg_archival.txt
4 test-archive-TIP/.hg_archival.txt
5 test-archive-TIP/bar
5 test-archive-TIP/bar
6 test-archive-TIP/baz/bletch
6 test-archive-TIP/baz/bletch
7 test-archive-TIP/foo
7 test-archive-TIP/foo
8 test-archive-TIP/.hg_archival.txt
8 test-archive-TIP/.hg_archival.txt
9 test-archive-TIP/bar
9 test-archive-TIP/bar
10 test-archive-TIP/baz/bletch
10 test-archive-TIP/baz/bletch
11 test-archive-TIP/foo
11 test-archive-TIP/foo
12 Archive: archive.zip
12 Archive: archive.zip
13 testing: test-archive-TIP/.hg_archival.txt OK
13 testing: test-archive-TIP/.hg_archival.txt OK
14 testing: test-archive-TIP/bar OK
14 testing: test-archive-TIP/bar OK
15 testing: test-archive-TIP/baz/bletch OK
15 testing: test-archive-TIP/baz/bletch OK
16 testing: test-archive-TIP/foo OK
16 testing: test-archive-TIP/foo OK
17 No errors detected in compressed data of archive.zip.
17 No errors detected in compressed data of archive.zip.
18 test/.hg_archival.txt
18 test/.hg_archival.txt
19 test/bar
19 test/bar
20 test/baz/bletch
20 test/baz/bletch
21 test/foo
21 test/foo
22 test/.hg_archival.txt
22 test/.hg_archival.txt
23 test/bar
23 test/bar
24 test/foo
24 test/foo
25 test-TIP/.hg_archival.txt
25 test-TIP/.hg_archival.txt
26 test-TIP/bar
26 test-TIP/bar
27 test-TIP/baz/bletch
27 test-TIP/baz/bletch
28 test-TIP/foo
28 test-TIP/foo
29 True
29 True
30 abort: archive prefix contains illegal components
30 abort: archive prefix contains illegal components
31 Archive: test.zip
31 Archive: test.zip
32 testing: test/.hg_archival.txt OK
33 testing: test/bar OK
32 testing: test/bar OK
34 testing: test/baz/bletch OK
33 testing: test/baz/bletch OK
35 testing: test/foo OK
34 testing: test/foo OK
36 No errors detected in compressed data of test.zip.
35 No errors detected in compressed data of test.zip.
37 test-TIP/.hg_archival.txt
36 test-TIP/.hg_archival.txt
38 test-TIP/bar
37 test-TIP/bar
39 test-TIP/baz/bletch
38 test-TIP/baz/bletch
40 test-TIP/foo
39 test-TIP/foo
41 rev-0.tar created
40 rev-0.tar created
42 abort: unknown archive type 'bogus'
41 abort: unknown archive type 'bogus'
43 % server errors
42 % server errors
44 % empty repo
43 % empty repo
45 abort: repository has no revisions
44 abort: repository has no revisions
General Comments 0
You need to be logged in to leave comments. Login now