##// END OF EJS Templates
commands: Try to improve help options text for basic commands...
timeless@mozdev.org -
r10375:adf9505e default
parent child Browse files
Show More
@@ -1,951 +1,951
1 #compdef hg
1 #compdef hg
2
2
3 # Zsh completion script for mercurial. Rename this file to _hg and copy
3 # Zsh completion script for mercurial. Rename this file to _hg and copy
4 # it into your zsh function path (/usr/share/zsh/site-functions for
4 # it into your zsh function path (/usr/share/zsh/site-functions for
5 # instance)
5 # instance)
6 #
6 #
7 # If you do not want to install it globally, you can copy it somewhere
7 # If you do not want to install it globally, you can copy it somewhere
8 # else and add that directory to $fpath. This must be done before
8 # else and add that directory to $fpath. This must be done before
9 # compinit is called. If the file is copied to ~/.zsh.d, your ~/.zshrc
9 # compinit is called. If the file is copied to ~/.zsh.d, your ~/.zshrc
10 # file could look like this:
10 # file could look like this:
11 #
11 #
12 # fpath=("$HOME/.zsh.d" $fpath)
12 # fpath=("$HOME/.zsh.d" $fpath)
13 # autoload -U compinit
13 # autoload -U compinit
14 # compinit
14 # compinit
15 #
15 #
16 # Copyright (C) 2005, 2006 Steve Borho <steve@borho.org>
16 # Copyright (C) 2005, 2006 Steve Borho <steve@borho.org>
17 # Copyright (C) 2006-9 Brendan Cully <brendan@kublai.com>
17 # Copyright (C) 2006-9 Brendan Cully <brendan@kublai.com>
18 #
18 #
19 # Permission is hereby granted, without written agreement and without
19 # Permission is hereby granted, without written agreement and without
20 # licence or royalty fees, to use, copy, modify, and distribute this
20 # licence or royalty fees, to use, copy, modify, and distribute this
21 # software and to distribute modified versions of this software for any
21 # software and to distribute modified versions of this software for any
22 # purpose, provided that the above copyright notice and the following
22 # purpose, provided that the above copyright notice and the following
23 # two paragraphs appear in all copies of this software.
23 # two paragraphs appear in all copies of this software.
24 #
24 #
25 # In no event shall the authors be liable to any party for direct,
25 # In no event shall the authors be liable to any party for direct,
26 # indirect, special, incidental, or consequential damages arising out of
26 # indirect, special, incidental, or consequential damages arising out of
27 # the use of this software and its documentation, even if the authors
27 # the use of this software and its documentation, even if the authors
28 # have been advised of the possibility of such damage.
28 # have been advised of the possibility of such damage.
29 #
29 #
30 # The authors specifically disclaim any warranties, including, but not
30 # The authors specifically disclaim any warranties, including, but not
31 # limited to, the implied warranties of merchantability and fitness for
31 # limited to, the implied warranties of merchantability and fitness for
32 # a particular purpose. The software provided hereunder is on an "as
32 # a particular purpose. The software provided hereunder is on an "as
33 # is" basis, and the authors have no obligation to provide maintenance,
33 # is" basis, and the authors have no obligation to provide maintenance,
34 # support, updates, enhancements, or modifications.
34 # support, updates, enhancements, or modifications.
35
35
36 emulate -LR zsh
36 emulate -LR zsh
37 setopt extendedglob
37 setopt extendedglob
38
38
39 local curcontext="$curcontext" state line
39 local curcontext="$curcontext" state line
40 typeset -A _hg_cmd_globals
40 typeset -A _hg_cmd_globals
41
41
42 _hg() {
42 _hg() {
43 local cmd _hg_root
43 local cmd _hg_root
44 integer i=2
44 integer i=2
45 _hg_cmd_globals=()
45 _hg_cmd_globals=()
46
46
47 while (( i < $#words ))
47 while (( i < $#words ))
48 do
48 do
49 case "$words[$i]" in
49 case "$words[$i]" in
50 -R|--repository)
50 -R|--repository)
51 eval _hg_root="$words[$i+1]"
51 eval _hg_root="$words[$i+1]"
52 _hg_cmd_globals+=("$words[$i]" "$_hg_root")
52 _hg_cmd_globals+=("$words[$i]" "$_hg_root")
53 (( i += 2 ))
53 (( i += 2 ))
54 continue
54 continue
55 ;;
55 ;;
56 -R*)
56 -R*)
57 _hg_cmd_globals+="$words[$i]"
57 _hg_cmd_globals+="$words[$i]"
58 eval _hg_root="${words[$i]#-R}"
58 eval _hg_root="${words[$i]#-R}"
59 (( i++ ))
59 (( i++ ))
60 continue
60 continue
61 ;;
61 ;;
62 --cwd|--config)
62 --cwd|--config)
63 # pass along arguments to hg completer
63 # pass along arguments to hg completer
64 _hg_cmd_globals+=("$words[$i]" "$words[$i+1]")
64 _hg_cmd_globals+=("$words[$i]" "$words[$i+1]")
65 (( i += 2 ))
65 (( i += 2 ))
66 continue
66 continue
67 ;;
67 ;;
68 -*)
68 -*)
69 # skip option
69 # skip option
70 (( i++ ))
70 (( i++ ))
71 continue
71 continue
72 ;;
72 ;;
73 esac
73 esac
74 if [[ -z "$cmd" ]]
74 if [[ -z "$cmd" ]]
75 then
75 then
76 cmd="$words[$i]"
76 cmd="$words[$i]"
77 words[$i]=()
77 words[$i]=()
78 (( CURRENT-- ))
78 (( CURRENT-- ))
79 fi
79 fi
80 (( i++ ))
80 (( i++ ))
81 done
81 done
82
82
83 if [[ -z "$cmd" ]]
83 if [[ -z "$cmd" ]]
84 then
84 then
85 _arguments -s -w : $_hg_global_opts \
85 _arguments -s -w : $_hg_global_opts \
86 ':mercurial command:_hg_commands'
86 ':mercurial command:_hg_commands'
87 return
87 return
88 fi
88 fi
89
89
90 # resolve abbreviations and aliases
90 # resolve abbreviations and aliases
91 if ! (( $+functions[_hg_cmd_${cmd}] ))
91 if ! (( $+functions[_hg_cmd_${cmd}] ))
92 then
92 then
93 local cmdexp
93 local cmdexp
94 (( $#_hg_cmd_list )) || _hg_get_commands
94 (( $#_hg_cmd_list )) || _hg_get_commands
95
95
96 cmdexp=$_hg_cmd_list[(r)${cmd}*]
96 cmdexp=$_hg_cmd_list[(r)${cmd}*]
97 if [[ $cmdexp == $_hg_cmd_list[(R)${cmd}*] ]]
97 if [[ $cmdexp == $_hg_cmd_list[(R)${cmd}*] ]]
98 then
98 then
99 # might be nice to rewrite the command line with the expansion
99 # might be nice to rewrite the command line with the expansion
100 cmd="$cmdexp"
100 cmd="$cmdexp"
101 fi
101 fi
102 if [[ -n $_hg_alias_list[$cmd] ]]
102 if [[ -n $_hg_alias_list[$cmd] ]]
103 then
103 then
104 cmd=$_hg_alias_list[$cmd]
104 cmd=$_hg_alias_list[$cmd]
105 fi
105 fi
106 fi
106 fi
107
107
108 curcontext="${curcontext%:*:*}:hg-${cmd}:"
108 curcontext="${curcontext%:*:*}:hg-${cmd}:"
109
109
110 zstyle -s ":completion:$curcontext:" cache-policy update_policy
110 zstyle -s ":completion:$curcontext:" cache-policy update_policy
111
111
112 if [[ -z "$update_policy" ]]
112 if [[ -z "$update_policy" ]]
113 then
113 then
114 zstyle ":completion:$curcontext:" cache-policy _hg_cache_policy
114 zstyle ":completion:$curcontext:" cache-policy _hg_cache_policy
115 fi
115 fi
116
116
117 if (( $+functions[_hg_cmd_${cmd}] ))
117 if (( $+functions[_hg_cmd_${cmd}] ))
118 then
118 then
119 _hg_cmd_${cmd}
119 _hg_cmd_${cmd}
120 else
120 else
121 # complete unknown commands normally
121 # complete unknown commands normally
122 _arguments -s -w : $_hg_global_opts \
122 _arguments -s -w : $_hg_global_opts \
123 '*:files:_hg_files'
123 '*:files:_hg_files'
124 fi
124 fi
125 }
125 }
126
126
127 _hg_cache_policy() {
127 _hg_cache_policy() {
128 typeset -a old
128 typeset -a old
129
129
130 # cache for a minute
130 # cache for a minute
131 old=( "$1"(mm+10) )
131 old=( "$1"(mm+10) )
132 (( $#old )) && return 0
132 (( $#old )) && return 0
133
133
134 return 1
134 return 1
135 }
135 }
136
136
137 _hg_get_commands() {
137 _hg_get_commands() {
138 typeset -ga _hg_cmd_list
138 typeset -ga _hg_cmd_list
139 typeset -gA _hg_alias_list
139 typeset -gA _hg_alias_list
140 local hline cmd cmdalias
140 local hline cmd cmdalias
141
141
142 _call_program hg hg debugcomplete -v | while read -A hline
142 _call_program hg hg debugcomplete -v | while read -A hline
143 do
143 do
144 cmd=$hline[1]
144 cmd=$hline[1]
145 _hg_cmd_list+=($cmd)
145 _hg_cmd_list+=($cmd)
146
146
147 for cmdalias in $hline[2,-1]
147 for cmdalias in $hline[2,-1]
148 do
148 do
149 _hg_cmd_list+=($cmdalias)
149 _hg_cmd_list+=($cmdalias)
150 _hg_alias_list+=($cmdalias $cmd)
150 _hg_alias_list+=($cmdalias $cmd)
151 done
151 done
152 done
152 done
153 }
153 }
154
154
155 _hg_commands() {
155 _hg_commands() {
156 (( $#_hg_cmd_list )) || _hg_get_commands
156 (( $#_hg_cmd_list )) || _hg_get_commands
157 _describe -t commands 'mercurial command' _hg_cmd_list
157 _describe -t commands 'mercurial command' _hg_cmd_list
158 }
158 }
159
159
160 _hg_revrange() {
160 _hg_revrange() {
161 compset -P 1 '*:'
161 compset -P 1 '*:'
162 _hg_tags "$@"
162 _hg_tags "$@"
163 }
163 }
164
164
165 _hg_tags() {
165 _hg_tags() {
166 typeset -a tags
166 typeset -a tags
167 local tag rev
167 local tag rev
168
168
169 _hg_cmd tags | while read tag
169 _hg_cmd tags | while read tag
170 do
170 do
171 tags+=(${tag/ # [0-9]#:*})
171 tags+=(${tag/ # [0-9]#:*})
172 done
172 done
173 (( $#tags )) && _describe -t tags 'tags' tags
173 (( $#tags )) && _describe -t tags 'tags' tags
174 }
174 }
175
175
176 # likely merge candidates
176 # likely merge candidates
177 _hg_mergerevs() {
177 _hg_mergerevs() {
178 typeset -a heads
178 typeset -a heads
179 local myrev
179 local myrev
180
180
181 heads=(${(f)"$(_hg_cmd heads --template '{rev}\\n')"})
181 heads=(${(f)"$(_hg_cmd heads --template '{rev}\\n')"})
182 # exclude own revision
182 # exclude own revision
183 myrev=$(_hg_cmd log -r . --template '{rev}\\n')
183 myrev=$(_hg_cmd log -r . --template '{rev}\\n')
184 heads=(${heads:#$myrev})
184 heads=(${heads:#$myrev})
185
185
186 (( $#heads )) && _describe -t heads 'heads' heads
186 (( $#heads )) && _describe -t heads 'heads' heads
187 }
187 }
188
188
189 _hg_files() {
189 _hg_files() {
190 if [[ -n "$_hg_root" ]]
190 if [[ -n "$_hg_root" ]]
191 then
191 then
192 [[ -d "$_hg_root/.hg" ]] || return
192 [[ -d "$_hg_root/.hg" ]] || return
193 case "$_hg_root" in
193 case "$_hg_root" in
194 /*)
194 /*)
195 _files -W $_hg_root
195 _files -W $_hg_root
196 ;;
196 ;;
197 *)
197 *)
198 _files -W $PWD/$_hg_root
198 _files -W $PWD/$_hg_root
199 ;;
199 ;;
200 esac
200 esac
201 else
201 else
202 _files
202 _files
203 fi
203 fi
204 }
204 }
205
205
206 _hg_status() {
206 _hg_status() {
207 [[ -d $PREFIX ]] || PREFIX=$PREFIX:h
207 [[ -d $PREFIX ]] || PREFIX=$PREFIX:h
208 status_files=(${(ps:\0:)"$(_hg_cmd status -0n$1 ./$PREFIX)"})
208 status_files=(${(ps:\0:)"$(_hg_cmd status -0n$1 ./$PREFIX)"})
209 }
209 }
210
210
211 _hg_unknown() {
211 _hg_unknown() {
212 typeset -a status_files
212 typeset -a status_files
213 _hg_status u
213 _hg_status u
214 _wanted files expl 'unknown files' _multi_parts / status_files
214 _wanted files expl 'unknown files' _multi_parts / status_files
215 }
215 }
216
216
217 _hg_missing() {
217 _hg_missing() {
218 typeset -a status_files
218 typeset -a status_files
219 _hg_status d
219 _hg_status d
220 _wanted files expl 'missing files' _multi_parts / status_files
220 _wanted files expl 'missing files' _multi_parts / status_files
221 }
221 }
222
222
223 _hg_modified() {
223 _hg_modified() {
224 typeset -a status_files
224 typeset -a status_files
225 _hg_status m
225 _hg_status m
226 _wanted files expl 'modified files' _multi_parts / status_files
226 _wanted files expl 'modified files' _multi_parts / status_files
227 }
227 }
228
228
229 _hg_resolve() {
229 _hg_resolve() {
230 local rstate rpath
230 local rstate rpath
231
231
232 [[ -d $PREFIX ]] || PREFIX=$PREFIX:h
232 [[ -d $PREFIX ]] || PREFIX=$PREFIX:h
233
233
234 _hg_cmd resolve -l ./$PREFIX | while read rstate rpath
234 _hg_cmd resolve -l ./$PREFIX | while read rstate rpath
235 do
235 do
236 [[ $rstate == 'R' ]] && resolved_files+=($rpath)
236 [[ $rstate == 'R' ]] && resolved_files+=($rpath)
237 [[ $rstate == 'U' ]] && unresolved_files+=($rpath)
237 [[ $rstate == 'U' ]] && unresolved_files+=($rpath)
238 done
238 done
239 }
239 }
240
240
241 _hg_resolved() {
241 _hg_resolved() {
242 typeset -a resolved_files unresolved_files
242 typeset -a resolved_files unresolved_files
243 _hg_resolve
243 _hg_resolve
244 _wanted files expl 'resolved files' _multi_parts / resolved_files
244 _wanted files expl 'resolved files' _multi_parts / resolved_files
245 }
245 }
246
246
247 _hg_unresolved() {
247 _hg_unresolved() {
248 typeset -a resolved_files unresolved_files
248 typeset -a resolved_files unresolved_files
249 _hg_resolve
249 _hg_resolve
250 _wanted files expl 'unresolved files' _multi_parts / unresolved_files
250 _wanted files expl 'unresolved files' _multi_parts / unresolved_files
251 }
251 }
252
252
253 _hg_config() {
253 _hg_config() {
254 typeset -a items
254 typeset -a items
255 items=(${${(%f)"$(_call_program hg hg showconfig)"}%%\=*})
255 items=(${${(%f)"$(_call_program hg hg showconfig)"}%%\=*})
256 (( $#items )) && _describe -t config 'config item' items
256 (( $#items )) && _describe -t config 'config item' items
257 }
257 }
258
258
259 _hg_addremove() {
259 _hg_addremove() {
260 _alternative 'files:unknown files:_hg_unknown' \
260 _alternative 'files:unknown files:_hg_unknown' \
261 'files:missing files:_hg_missing'
261 'files:missing files:_hg_missing'
262 }
262 }
263
263
264 _hg_ssh_urls() {
264 _hg_ssh_urls() {
265 if [[ -prefix */ ]]
265 if [[ -prefix */ ]]
266 then
266 then
267 if zstyle -T ":completion:${curcontext}:files" remote-access
267 if zstyle -T ":completion:${curcontext}:files" remote-access
268 then
268 then
269 local host=${PREFIX%%/*}
269 local host=${PREFIX%%/*}
270 typeset -a remdirs
270 typeset -a remdirs
271 compset -p $(( $#host + 1 ))
271 compset -p $(( $#host + 1 ))
272 local rempath=${(M)PREFIX##*/}
272 local rempath=${(M)PREFIX##*/}
273 local cacheid="hg:${host}-${rempath//\//_}"
273 local cacheid="hg:${host}-${rempath//\//_}"
274 cacheid=${cacheid%[-_]}
274 cacheid=${cacheid%[-_]}
275 compset -P '*/'
275 compset -P '*/'
276 if _cache_invalid "$cacheid" || ! _retrieve_cache "$cacheid"
276 if _cache_invalid "$cacheid" || ! _retrieve_cache "$cacheid"
277 then
277 then
278 remdirs=(${${(M)${(f)"$(_call_program files ssh -a -x $host ls -1FL "${(q)rempath}")"}##*/}%/})
278 remdirs=(${${(M)${(f)"$(_call_program files ssh -a -x $host ls -1FL "${(q)rempath}")"}##*/}%/})
279 _store_cache "$cacheid" remdirs
279 _store_cache "$cacheid" remdirs
280 fi
280 fi
281 _describe -t directories 'remote directory' remdirs -S/
281 _describe -t directories 'remote directory' remdirs -S/
282 else
282 else
283 _message 'remote directory'
283 _message 'remote directory'
284 fi
284 fi
285 else
285 else
286 if compset -P '*@'
286 if compset -P '*@'
287 then
287 then
288 _hosts -S/
288 _hosts -S/
289 else
289 else
290 _alternative 'hosts:remote host name:_hosts -S/' \
290 _alternative 'hosts:remote host name:_hosts -S/' \
291 'users:user:_users -S@'
291 'users:user:_users -S@'
292 fi
292 fi
293 fi
293 fi
294 }
294 }
295
295
296 _hg_urls() {
296 _hg_urls() {
297 if compset -P bundle://
297 if compset -P bundle://
298 then
298 then
299 _files
299 _files
300 elif compset -P ssh://
300 elif compset -P ssh://
301 then
301 then
302 _hg_ssh_urls
302 _hg_ssh_urls
303 elif [[ -prefix *: ]]
303 elif [[ -prefix *: ]]
304 then
304 then
305 _urls
305 _urls
306 else
306 else
307 local expl
307 local expl
308 compset -S '[^:]*'
308 compset -S '[^:]*'
309 _wanted url-schemas expl 'URL schema' compadd -S '' - \
309 _wanted url-schemas expl 'URL schema' compadd -S '' - \
310 http:// https:// ssh:// bundle://
310 http:// https:// ssh:// bundle://
311 fi
311 fi
312 }
312 }
313
313
314 _hg_paths() {
314 _hg_paths() {
315 typeset -a paths pnames
315 typeset -a paths pnames
316 _hg_cmd paths | while read -A pnames
316 _hg_cmd paths | while read -A pnames
317 do
317 do
318 paths+=($pnames[1])
318 paths+=($pnames[1])
319 done
319 done
320 (( $#paths )) && _describe -t path-aliases 'repository alias' paths
320 (( $#paths )) && _describe -t path-aliases 'repository alias' paths
321 }
321 }
322
322
323 _hg_remote() {
323 _hg_remote() {
324 _alternative 'path-aliases:repository alias:_hg_paths' \
324 _alternative 'path-aliases:repository alias:_hg_paths' \
325 'directories:directory:_files -/' \
325 'directories:directory:_files -/' \
326 'urls:URL:_hg_urls'
326 'urls:URL:_hg_urls'
327 }
327 }
328
328
329 _hg_clone_dest() {
329 _hg_clone_dest() {
330 _alternative 'directories:directory:_files -/' \
330 _alternative 'directories:directory:_files -/' \
331 'urls:URL:_hg_urls'
331 'urls:URL:_hg_urls'
332 }
332 }
333
333
334 # Common options
334 # Common options
335 _hg_global_opts=(
335 _hg_global_opts=(
336 '(--repository -R)'{-R+,--repository}'[repository root directory]:repository:_files -/'
336 '(--repository -R)'{-R+,--repository}'[repository root directory]:repository:_files -/'
337 '--cwd[change working directory]:new working directory:_files -/'
337 '--cwd[change working directory]:new working directory:_files -/'
338 '(--noninteractive -y)'{-y,--noninteractive}'[do not prompt, assume yes for any required answers]'
338 '(--noninteractive -y)'{-y,--noninteractive}'[do not prompt, assume yes for any required answers]'
339 '(--verbose -v)'{-v,--verbose}'[enable additional output]'
339 '(--verbose -v)'{-v,--verbose}'[enable additional output]'
340 '*--config[set/override config option]:defined config items:_hg_config'
340 '*--config[set/override config option]:defined config items:_hg_config'
341 '(--quiet -q)'{-q,--quiet}'[suppress output]'
341 '(--quiet -q)'{-q,--quiet}'[suppress output]'
342 '(--help -h)'{-h,--help}'[display help and exit]'
342 '(--help -h)'{-h,--help}'[display help and exit]'
343 '--debug[debug mode]'
343 '--debug[debug mode]'
344 '--debugger[start debugger]'
344 '--debugger[start debugger]'
345 '--encoding[set the charset encoding (default: UTF8)]'
345 '--encoding[set the charset encoding (default: UTF8)]'
346 '--encodingmode[set the charset encoding mode (default: strict)]'
346 '--encodingmode[set the charset encoding mode (default: strict)]'
347 '--lsprof[print improved command execution profile]'
347 '--lsprof[print improved command execution profile]'
348 '--traceback[print traceback on exception]'
348 '--traceback[print traceback on exception]'
349 '--time[time how long the command takes]'
349 '--time[time how long the command takes]'
350 '--profile[profile]'
350 '--profile[profile]'
351 '--version[output version information and exit]'
351 '--version[output version information and exit]'
352 )
352 )
353
353
354 _hg_pat_opts=(
354 _hg_pat_opts=(
355 '*'{-I+,--include}'[include names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/'
355 '*'{-I+,--include}'[include names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/'
356 '*'{-X+,--exclude}'[exclude names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/')
356 '*'{-X+,--exclude}'[exclude names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/')
357
357
358 _hg_diff_opts=(
358 _hg_diff_opts=(
359 '(--text -a)'{-a,--text}'[treat all files as text]'
359 '(--text -a)'{-a,--text}'[treat all files as text]'
360 '(--git -g)'{-g,--git}'[use git extended diff format]'
360 '(--git -g)'{-g,--git}'[use git extended diff format]'
361 "--nodates[don't include dates in diff headers]")
361 "--nodates[omit dates from diff headers]")
362
362
363 _hg_dryrun_opts=(
363 _hg_dryrun_opts=(
364 '(--dry-run -n)'{-n,--dry-run}'[do not perform actions, just print output]')
364 '(--dry-run -n)'{-n,--dry-run}'[do not perform actions, just print output]')
365
365
366 _hg_style_opts=(
366 _hg_style_opts=(
367 '--style[display using template map file]:'
367 '--style[display using template map file]:'
368 '--template[display with template]:')
368 '--template[display with template]:')
369
369
370 _hg_commit_opts=(
370 _hg_commit_opts=(
371 '(-m --message -l --logfile --edit -e)'{-e,--edit}'[edit commit message]'
371 '(-m --message -l --logfile --edit -e)'{-e,--edit}'[edit commit message]'
372 '(-e --edit -l --logfile --message -m)'{-m+,--message}'[use <text> as commit message]:message:'
372 '(-e --edit -l --logfile --message -m)'{-m+,--message}'[use <text> as commit message]:message:'
373 '(-e --edit -m --message --logfile -l)'{-l+,--logfile}'[read the commit message from <file>]:log file:_files')
373 '(-e --edit -m --message --logfile -l)'{-l+,--logfile}'[read the commit message from <file>]:log file:_files')
374
374
375 _hg_remote_opts=(
375 _hg_remote_opts=(
376 '(--ssh -e)'{-e+,--ssh}'[specify ssh command to use]:'
376 '(--ssh -e)'{-e+,--ssh}'[specify ssh command to use]:'
377 '--remotecmd[specify hg command to run on the remote side]:')
377 '--remotecmd[specify hg command to run on the remote side]:')
378
378
379 _hg_cmd() {
379 _hg_cmd() {
380 _call_program hg hg --config ui.verbose=0 --config defaults."$1"= \
380 _call_program hg hg --config ui.verbose=0 --config defaults."$1"= \
381 "$_hg_cmd_globals[@]" "$@" 2> /dev/null
381 "$_hg_cmd_globals[@]" "$@" 2> /dev/null
382 }
382 }
383
383
384 _hg_cmd_add() {
384 _hg_cmd_add() {
385 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
385 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
386 '*:unknown files:_hg_unknown'
386 '*:unknown files:_hg_unknown'
387 }
387 }
388
388
389 _hg_cmd_addremove() {
389 _hg_cmd_addremove() {
390 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
390 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
391 '(--similarity -s)'{-s+,--similarity}'[guess renamed files by similarity (0<=s<=100)]:' \
391 '(--similarity -s)'{-s+,--similarity}'[guess renamed files by similarity (0<=s<=100)]:' \
392 '*:unknown or missing files:_hg_addremove'
392 '*:unknown or missing files:_hg_addremove'
393 }
393 }
394
394
395 _hg_cmd_annotate() {
395 _hg_cmd_annotate() {
396 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
396 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
397 '(--rev -r)'{-r+,--rev}'[annotate the specified revision]:revision:_hg_tags' \
397 '(--rev -r)'{-r+,--rev}'[annotate the specified revision]:revision:_hg_tags' \
398 '(--follow -f)'{-f,--follow}'[follow file copies and renames]' \
398 '(--follow -f)'{-f,--follow}'[follow file copies and renames]' \
399 '(--text -a)'{-a,--text}'[treat all files as text]' \
399 '(--text -a)'{-a,--text}'[treat all files as text]' \
400 '(--user -u)'{-u,--user}'[list the author]' \
400 '(--user -u)'{-u,--user}'[list the author]' \
401 '(--date -d)'{-d,--date}'[list the date]' \
401 '(--date -d)'{-d,--date}'[list the date]' \
402 '(--number -n)'{-n,--number}'[list the revision number (default)]' \
402 '(--number -n)'{-n,--number}'[list the revision number (default)]' \
403 '(--changeset -c)'{-c,--changeset}'[list the changeset]' \
403 '(--changeset -c)'{-c,--changeset}'[list the changeset]' \
404 '*:files:_hg_files'
404 '*:files:_hg_files'
405 }
405 }
406
406
407 _hg_cmd_archive() {
407 _hg_cmd_archive() {
408 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
408 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
409 '--no-decode[do not pass files through decoders]' \
409 '--no-decode[do not pass files through decoders]' \
410 '(--prefix -p)'{-p+,--prefix}'[directory prefix for files in archive]:' \
410 '(--prefix -p)'{-p+,--prefix}'[directory prefix for files in archive]:' \
411 '(--rev -r)'{-r+,--rev}'[revision to distribute]:revision:_hg_tags' \
411 '(--rev -r)'{-r+,--rev}'[revision to distribute]:revision:_hg_tags' \
412 '(--type -t)'{-t+,--type}'[type of distribution to create]:archive type:(files tar tbz2 tgz uzip zip)' \
412 '(--type -t)'{-t+,--type}'[type of distribution to create]:archive type:(files tar tbz2 tgz uzip zip)' \
413 '*:destination:_files'
413 '*:destination:_files'
414 }
414 }
415
415
416 _hg_cmd_backout() {
416 _hg_cmd_backout() {
417 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
417 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
418 '--merge[merge with old dirstate parent after backout]' \
418 '--merge[merge with old dirstate parent after backout]' \
419 '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
419 '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
420 '--parent[parent to choose when backing out merge]' \
420 '--parent[parent to choose when backing out merge]' \
421 '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
421 '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
422 '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
422 '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
423 '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
423 '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
424 '(--logfile -l)'{-l+,--logfile}'[read commit message from <file>]:log file:_files -g \*.txt'
424 '(--logfile -l)'{-l+,--logfile}'[read commit message from <file>]:log file:_files -g \*.txt'
425 }
425 }
426
426
427 _hg_cmd_bisect() {
427 _hg_cmd_bisect() {
428 _arguments -s -w : $_hg_global_opts \
428 _arguments -s -w : $_hg_global_opts \
429 '(-)'{-r,--reset}'[reset bisect state]' \
429 '(-)'{-r,--reset}'[reset bisect state]' \
430 '(--good -g --bad -b --skip -s --reset -r)'{-g,--good}'[mark changeset good]'::revision:_hg_tags \
430 '(--good -g --bad -b --skip -s --reset -r)'{-g,--good}'[mark changeset good]'::revision:_hg_tags \
431 '(--good -g --bad -b --skip -s --reset -r)'{-b,--bad}'[mark changeset bad]'::revision:_hg_tags \
431 '(--good -g --bad -b --skip -s --reset -r)'{-b,--bad}'[mark changeset bad]'::revision:_hg_tags \
432 '(--good -g --bad -b --skip -s --reset -r)'{-s,--skip}'[skip testing changeset]' \
432 '(--good -g --bad -b --skip -s --reset -r)'{-s,--skip}'[skip testing changeset]' \
433 '(--command -c --noupdate -U)'{-c+,--command}'[use command to check changeset state]':commands:_command_names \
433 '(--command -c --noupdate -U)'{-c+,--command}'[use command to check changeset state]':commands:_command_names \
434 '(--command -c --noupdate -U)'{-U,--noupdate}'[do not update to target]'
434 '(--command -c --noupdate -U)'{-U,--noupdate}'[do not update to target]'
435 }
435 }
436
436
437 _hg_cmd_branch() {
437 _hg_cmd_branch() {
438 _arguments -s -w : $_hg_global_opts \
438 _arguments -s -w : $_hg_global_opts \
439 '(--force -f)'{-f,--force}'[set branch name even if it shadows an existing branch]' \
439 '(--force -f)'{-f,--force}'[set branch name even if it shadows an existing branch]' \
440 '(--clean -C)'{-C,--clean}'[reset branch name to parent branch name]'
440 '(--clean -C)'{-C,--clean}'[reset branch name to parent branch name]'
441 }
441 }
442
442
443 _hg_cmd_branches() {
443 _hg_cmd_branches() {
444 _arguments -s -w : $_hg_global_opts \
444 _arguments -s -w : $_hg_global_opts \
445 '(--active -a)'{-a,--active}'[show only branches that have unmerge heads]'
445 '(--active -a)'{-a,--active}'[show only branches that have unmerge heads]'
446 }
446 }
447
447
448 _hg_cmd_bundle() {
448 _hg_cmd_bundle() {
449 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
449 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
450 '(--force -f)'{-f,--force}'[run even when remote repository is unrelated]' \
450 '(--force -f)'{-f,--force}'[run even when remote repository is unrelated]' \
451 '(2)*--base[a base changeset to specify instead of a destination]:revision:_hg_tags' \
451 '(2)*--base[a base changeset to specify instead of a destination]:revision:_hg_tags' \
452 ':output file:_files' \
452 ':output file:_files' \
453 ':destination repository:_files -/'
453 ':destination repository:_files -/'
454 }
454 }
455
455
456 _hg_cmd_cat() {
456 _hg_cmd_cat() {
457 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
457 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
458 '(--output -o)'{-o+,--output}'[print output to file with formatted name]:filespec:' \
458 '(--output -o)'{-o+,--output}'[print output to file with formatted name]:filespec:' \
459 '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
459 '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
460 '*:file:_hg_files'
460 '*:file:_hg_files'
461 }
461 }
462
462
463 _hg_cmd_clone() {
463 _hg_cmd_clone() {
464 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
464 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
465 '(--noupdate -U)'{-U,--noupdate}'[do not update the new working directory]' \
465 '(--noupdate -U)'{-U,--noupdate}'[do not update the new working directory]' \
466 '(--rev -r)'{-r+,--rev}'[a changeset you would like to have after cloning]:' \
466 '(--rev -r)'{-r+,--rev}'[a changeset you would like to have after cloning]:' \
467 '--uncompressed[use uncompressed transfer (fast over LAN)]' \
467 '--uncompressed[use uncompressed transfer (fast over LAN)]' \
468 ':source repository:_hg_remote' \
468 ':source repository:_hg_remote' \
469 ':destination:_hg_clone_dest'
469 ':destination:_hg_clone_dest'
470 }
470 }
471
471
472 _hg_cmd_commit() {
472 _hg_cmd_commit() {
473 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
473 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
474 '(--addremove -A)'{-A,--addremove}'[mark new/missing files as added/removed before committing]' \
474 '(--addremove -A)'{-A,--addremove}'[mark new/missing files as added/removed before committing]' \
475 '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
475 '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
476 '(--logfile -l)'{-l+,--logfile}'[read commit message from <file>]:log file:_files -g \*.txt' \
476 '(--logfile -l)'{-l+,--logfile}'[read commit message from <file>]:log file:_files -g \*.txt' \
477 '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
477 '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
478 '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
478 '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
479 '*:file:_hg_files'
479 '*:file:_hg_files'
480 }
480 }
481
481
482 _hg_cmd_copy() {
482 _hg_cmd_copy() {
483 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
483 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
484 '(--after -A)'{-A,--after}'[record a copy that has already occurred]' \
484 '(--after -A)'{-A,--after}'[record a copy that has already occurred]' \
485 '(--force -f)'{-f,--force}'[forcibly copy over an existing managed file]' \
485 '(--force -f)'{-f,--force}'[forcibly copy over an existing managed file]' \
486 '*:file:_hg_files'
486 '*:file:_hg_files'
487 }
487 }
488
488
489 _hg_cmd_diff() {
489 _hg_cmd_diff() {
490 typeset -A opt_args
490 typeset -A opt_args
491 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_diff_opts \
491 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_diff_opts \
492 '*'{-r,--rev}'+[revision]:revision:_hg_revrange' \
492 '*'{-r,--rev}'+[revision]:revision:_hg_revrange' \
493 '(--show-function -p)'{-p,--show-function}'[show which function each change is in]' \
493 '(--show-function -p)'{-p,--show-function}'[show which function each change is in]' \
494 '(--ignore-all-space -w)'{-w,--ignore-all-space}'[ignore white space when comparing lines]' \
494 '(--ignore-all-space -w)'{-w,--ignore-all-space}'[ignore white space when comparing lines]' \
495 '(--ignore-space-change -b)'{-b,--ignore-space-change}'[ignore changes in the amount of white space]' \
495 '(--ignore-space-change -b)'{-b,--ignore-space-change}'[ignore changes in the amount of white space]' \
496 '(--ignore-blank-lines -B)'{-B,--ignore-blank-lines}'[ignore changes whose lines are all blank]' \
496 '(--ignore-blank-lines -B)'{-B,--ignore-blank-lines}'[ignore changes whose lines are all blank]' \
497 '*:file:->diff_files'
497 '*:file:->diff_files'
498
498
499 if [[ $state == 'diff_files' ]]
499 if [[ $state == 'diff_files' ]]
500 then
500 then
501 if [[ -n $opt_args[-r] ]]
501 if [[ -n $opt_args[-r] ]]
502 then
502 then
503 _hg_files
503 _hg_files
504 else
504 else
505 _hg_modified
505 _hg_modified
506 fi
506 fi
507 fi
507 fi
508 }
508 }
509
509
510 _hg_cmd_export() {
510 _hg_cmd_export() {
511 _arguments -s -w : $_hg_global_opts $_hg_diff_opts \
511 _arguments -s -w : $_hg_global_opts $_hg_diff_opts \
512 '(--outout -o)'{-o+,--output}'[print output to file with formatted name]:filespec:' \
512 '(--outout -o)'{-o+,--output}'[print output to file with formatted name]:filespec:' \
513 '--switch-parent[diff against the second parent]' \
513 '--switch-parent[diff against the second parent]' \
514 '*:revision:_hg_tags'
514 '*:revision:_hg_tags'
515 }
515 }
516
516
517 _hg_cmd_grep() {
517 _hg_cmd_grep() {
518 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
518 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
519 '(--print0 -0)'{-0,--print0}'[end filenames with NUL]' \
519 '(--print0 -0)'{-0,--print0}'[end filenames with NUL]' \
520 '--all[print all revisions with matches]' \
520 '--all[print all revisions with matches]' \
521 '(--follow -f)'{-f,--follow}'[follow changeset or file history]' \
521 '(--follow -f)'{-f,--follow}'[follow changeset or file history]' \
522 '(--ignore-case -i)'{-i,--ignore-case}'[ignore case when matching]' \
522 '(--ignore-case -i)'{-i,--ignore-case}'[ignore case when matching]' \
523 '(--files-with-matches -l)'{-l,--files-with-matches}'[print only filenames and revs that match]' \
523 '(--files-with-matches -l)'{-l,--files-with-matches}'[print only filenames and revs that match]' \
524 '(--line-number -n)'{-n,--line-number}'[print matching line numbers]' \
524 '(--line-number -n)'{-n,--line-number}'[print matching line numbers]' \
525 '*'{-r+,--rev}'[search in given revision range]:revision:_hg_revrange' \
525 '*'{-r+,--rev}'[search in given revision range]:revision:_hg_revrange' \
526 '(--user -u)'{-u,--user}'[print user who committed change]' \
526 '(--user -u)'{-u,--user}'[print user who committed change]' \
527 '1:search pattern:' \
527 '1:search pattern:' \
528 '*:files:_hg_files'
528 '*:files:_hg_files'
529 }
529 }
530
530
531 _hg_cmd_heads() {
531 _hg_cmd_heads() {
532 _arguments -s -w : $_hg_global_opts $_hg_style_opts \
532 _arguments -s -w : $_hg_global_opts $_hg_style_opts \
533 '(--rev -r)'{-r+,--rev}'[show only heads which are descendants of rev]:revision:_hg_tags'
533 '(--rev -r)'{-r+,--rev}'[show only heads which are descendants of rev]:revision:_hg_tags'
534 }
534 }
535
535
536 _hg_cmd_help() {
536 _hg_cmd_help() {
537 _arguments -s -w : $_hg_global_opts \
537 _arguments -s -w : $_hg_global_opts \
538 '*:mercurial command:_hg_commands'
538 '*:mercurial command:_hg_commands'
539 }
539 }
540
540
541 _hg_cmd_identify() {
541 _hg_cmd_identify() {
542 _arguments -s -w : $_hg_global_opts \
542 _arguments -s -w : $_hg_global_opts \
543 '(--rev -r)'{-r+,--rev}'[identify the specified rev]:revision:_hg_tags' \
543 '(--rev -r)'{-r+,--rev}'[identify the specified rev]:revision:_hg_tags' \
544 '(--num -n)'{-n+,--num}'[show local revision number]' \
544 '(--num -n)'{-n+,--num}'[show local revision number]' \
545 '(--id -i)'{-i+,--id}'[show global revision id]' \
545 '(--id -i)'{-i+,--id}'[show global revision id]' \
546 '(--branch -b)'{-b+,--branch}'[show branch]' \
546 '(--branch -b)'{-b+,--branch}'[show branch]' \
547 '(--tags -t)'{-t+,--tags}'[show tags]'
547 '(--tags -t)'{-t+,--tags}'[show tags]'
548 }
548 }
549
549
550 _hg_cmd_import() {
550 _hg_cmd_import() {
551 _arguments -s -w : $_hg_global_opts \
551 _arguments -s -w : $_hg_global_opts \
552 '(--strip -p)'{-p+,--strip}'[directory strip option for patch (default: 1)]:count:' \
552 '(--strip -p)'{-p+,--strip}'[directory strip option for patch (default: 1)]:count:' \
553 '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
553 '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
554 '(--force -f)'{-f,--force}'[skip check for outstanding uncommitted changes]' \
554 '(--force -f)'{-f,--force}'[skip check for outstanding uncommitted changes]' \
555 '*:patch:_files'
555 '*:patch:_files'
556 }
556 }
557
557
558 _hg_cmd_incoming() {
558 _hg_cmd_incoming() {
559 _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
559 _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
560 '(--no-merges -M)'{-M,--no-merges}'[do not show merge revisions]' \
560 '(--no-merges -M)'{-M,--no-merges}'[do not show merge revisions]' \
561 '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
561 '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
562 '(--patch -p)'{-p,--patch}'[show patch]' \
562 '(--patch -p)'{-p,--patch}'[show patch]' \
563 '(--rev -r)'{-r+,--rev}'[a specific revision up to which you would like to pull]:revision:_hg_tags' \
563 '(--rev -r)'{-r+,--rev}'[a specific revision up to which you would like to pull]:revision:_hg_tags' \
564 '(--newest-first -n)'{-n,--newest-first}'[show newest record first]' \
564 '(--newest-first -n)'{-n,--newest-first}'[show newest record first]' \
565 '--bundle[file to store the bundles into]:bundle file:_files' \
565 '--bundle[file to store the bundles into]:bundle file:_files' \
566 ':source:_hg_remote'
566 ':source:_hg_remote'
567 }
567 }
568
568
569 _hg_cmd_init() {
569 _hg_cmd_init() {
570 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
570 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
571 ':dir:_files -/'
571 ':dir:_files -/'
572 }
572 }
573
573
574 _hg_cmd_locate() {
574 _hg_cmd_locate() {
575 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
575 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
576 '(--rev -r)'{-r+,--rev}'[search repository as it stood at revision]:revision:_hg_tags' \
576 '(--rev -r)'{-r+,--rev}'[search repository as it stood at revision]:revision:_hg_tags' \
577 '(--print0 -0)'{-0,--print0}'[end filenames with NUL, for use with xargs]' \
577 '(--print0 -0)'{-0,--print0}'[end filenames with NUL, for use with xargs]' \
578 '(--fullpath -f)'{-f,--fullpath}'[print complete paths]' \
578 '(--fullpath -f)'{-f,--fullpath}'[print complete paths]' \
579 '*:search pattern:_hg_files'
579 '*:search pattern:_hg_files'
580 }
580 }
581
581
582 _hg_cmd_log() {
582 _hg_cmd_log() {
583 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_style_opts \
583 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_style_opts \
584 '(--follow --follow-first -f)'{-f,--follow}'[follow changeset or history]' \
584 '(--follow --follow-first -f)'{-f,--follow}'[follow changeset or history]' \
585 '(-f --follow)--follow-first[only follow the first parent of merge changesets]' \
585 '(-f --follow)--follow-first[only follow the first parent of merge changesets]' \
586 '(--copies -C)'{-C,--copies}'[show copied files]' \
586 '(--copies -C)'{-C,--copies}'[show copied files]' \
587 '(--keyword -k)'{-k+,--keyword}'[search for a keyword]:' \
587 '(--keyword -k)'{-k+,--keyword}'[search for a keyword]:' \
588 '(--limit -l)'{-l+,--limit}'[limit number of changes displayed]:' \
588 '(--limit -l)'{-l+,--limit}'[limit number of changes displayed]:' \
589 '*'{-r,--rev}'[show the specified revision or range]:revision:_hg_revrange' \
589 '*'{-r,--rev}'[show the specified revision or range]:revision:_hg_revrange' \
590 '(--no-merges -M)'{-M,--no-merges}'[do not show merges]' \
590 '(--no-merges -M)'{-M,--no-merges}'[do not show merges]' \
591 '(--only-merges -m)'{-m,--only-merges}'[show only merges]' \
591 '(--only-merges -m)'{-m,--only-merges}'[show only merges]' \
592 '(--patch -p)'{-p,--patch}'[show patch]' \
592 '(--patch -p)'{-p,--patch}'[show patch]' \
593 '(--prune -P)'{-P+,--prune}'[do not display revision or any of its ancestors]:revision:_hg_tags' \
593 '(--prune -P)'{-P+,--prune}'[do not display revision or any of its ancestors]:revision:_hg_tags' \
594 '*:files:_hg_files'
594 '*:files:_hg_files'
595 }
595 }
596
596
597 _hg_cmd_manifest() {
597 _hg_cmd_manifest() {
598 _arguments -s -w : $_hg_global_opts \
598 _arguments -s -w : $_hg_global_opts \
599 ':revision:_hg_tags'
599 ':revision:_hg_tags'
600 }
600 }
601
601
602 _hg_cmd_merge() {
602 _hg_cmd_merge() {
603 _arguments -s -w : $_hg_global_opts \
603 _arguments -s -w : $_hg_global_opts \
604 '(--force -f)'{-f,--force}'[force a merge with outstanding changes]' \
604 '(--force -f)'{-f,--force}'[force a merge with outstanding changes]' \
605 '(--rev -r 1)'{-r,--rev}'[revision to merge]:revision:_hg_mergerevs' \
605 '(--rev -r 1)'{-r,--rev}'[revision to merge]:revision:_hg_mergerevs' \
606 '(--preview -P)'{-P,--preview}'[review revisions to merge (no merge is performed)]' \
606 '(--preview -P)'{-P,--preview}'[review revisions to merge (no merge is performed)]' \
607 ':revision:_hg_mergerevs'
607 ':revision:_hg_mergerevs'
608 }
608 }
609
609
610 _hg_cmd_outgoing() {
610 _hg_cmd_outgoing() {
611 _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
611 _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
612 '(--no-merges -M)'{-M,--no-merges}'[do not show merge revisions]' \
612 '(--no-merges -M)'{-M,--no-merges}'[do not show merge revisions]' \
613 '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
613 '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
614 '(--patch -p)'{-p,--patch}'[show patch]' \
614 '(--patch -p)'{-p,--patch}'[show patch]' \
615 '(--rev -r)'{-r+,--rev}'[a specific revision you would like to push]' \
615 '(--rev -r)'{-r+,--rev}'[a specific revision you would like to push]' \
616 '(--newest-first -n)'{-n,--newest-first}'[show newest record first]' \
616 '(--newest-first -n)'{-n,--newest-first}'[show newest record first]' \
617 ':destination:_hg_remote'
617 ':destination:_hg_remote'
618 }
618 }
619
619
620 _hg_cmd_parents() {
620 _hg_cmd_parents() {
621 _arguments -s -w : $_hg_global_opts $_hg_style_opts \
621 _arguments -s -w : $_hg_global_opts $_hg_style_opts \
622 '(--rev -r)'{-r+,--rev}'[show parents of the specified rev]:revision:_hg_tags' \
622 '(--rev -r)'{-r+,--rev}'[show parents of the specified rev]:revision:_hg_tags' \
623 ':last modified file:_hg_files'
623 ':last modified file:_hg_files'
624 }
624 }
625
625
626 _hg_cmd_paths() {
626 _hg_cmd_paths() {
627 _arguments -s -w : $_hg_global_opts \
627 _arguments -s -w : $_hg_global_opts \
628 ':path:_hg_paths'
628 ':path:_hg_paths'
629 }
629 }
630
630
631 _hg_cmd_pull() {
631 _hg_cmd_pull() {
632 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
632 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
633 '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
633 '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
634 '(--update -u)'{-u,--update}'[update to new tip if changesets were pulled]' \
634 '(--update -u)'{-u,--update}'[update to new tip if changesets were pulled]' \
635 '(--rev -r)'{-r+,--rev}'[a specific revision up to which you would like to pull]:revision:' \
635 '(--rev -r)'{-r+,--rev}'[a specific revision up to which you would like to pull]:revision:' \
636 ':source:_hg_remote'
636 ':source:_hg_remote'
637 }
637 }
638
638
639 _hg_cmd_push() {
639 _hg_cmd_push() {
640 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
640 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
641 '(--force -f)'{-f,--force}'[force push]' \
641 '(--force -f)'{-f,--force}'[force push]' \
642 '(--rev -r)'{-r+,--rev}'[a specific revision you would like to push]:revision:_hg_tags' \
642 '(--rev -r)'{-r+,--rev}'[a specific revision you would like to push]:revision:_hg_tags' \
643 ':destination:_hg_remote'
643 ':destination:_hg_remote'
644 }
644 }
645
645
646 _hg_cmd_remove() {
646 _hg_cmd_remove() {
647 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
647 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
648 '(--after -A)'{-A,--after}'[record remove that has already occurred]' \
648 '(--after -A)'{-A,--after}'[record remove that has already occurred]' \
649 '(--force -f)'{-f,--force}'[remove file even if modified]' \
649 '(--force -f)'{-f,--force}'[remove file even if modified]' \
650 '*:file:_hg_files'
650 '*:file:_hg_files'
651 }
651 }
652
652
653 _hg_cmd_rename() {
653 _hg_cmd_rename() {
654 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
654 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
655 '(--after -A)'{-A,--after}'[record a rename that has already occurred]' \
655 '(--after -A)'{-A,--after}'[record a rename that has already occurred]' \
656 '(--force -f)'{-f,--force}'[forcibly copy over an existing managed file]' \
656 '(--force -f)'{-f,--force}'[forcibly copy over an existing managed file]' \
657 '*:file:_hg_files'
657 '*:file:_hg_files'
658 }
658 }
659
659
660 _hg_cmd_resolve() {
660 _hg_cmd_resolve() {
661 local context state line
661 local context state line
662 typeset -A opt_args
662 typeset -A opt_args
663
663
664 _arguments -s -w : $_hg_global_opts \
664 _arguments -s -w : $_hg_global_opts \
665 '(--list -l --mark -m --unmark -u)'{-l,--list}'[list state of files needing merge]:*:merged files:->resolve_files' \
665 '(--list -l --mark -m --unmark -u)'{-l,--list}'[list state of files needing merge]:*:merged files:->resolve_files' \
666 '(--mark -m --list -l --unmark -u)'{-m,--mark}'[mark files as resolved]:*:unresolved files:_hg_unresolved' \
666 '(--mark -m --list -l --unmark -u)'{-m,--mark}'[mark files as resolved]:*:unresolved files:_hg_unresolved' \
667 '(--unmark -u --list -l --mark -m)'{-u,--unmark}'[unmark files as resolved]:*:resolved files:_hg_resolved' \
667 '(--unmark -u --list -l --mark -m)'{-u,--unmark}'[unmark files as resolved]:*:resolved files:_hg_resolved' \
668 '*:file:_hg_unresolved'
668 '*:file:_hg_unresolved'
669
669
670 if [[ $state == 'resolve_files' ]]
670 if [[ $state == 'resolve_files' ]]
671 then
671 then
672 _alternative 'files:resolved files:_hg_resolved' \
672 _alternative 'files:resolved files:_hg_resolved' \
673 'files:unresolved files:_hg_unresolved'
673 'files:unresolved files:_hg_unresolved'
674 fi
674 fi
675 }
675 }
676
676
677 _hg_cmd_revert() {
677 _hg_cmd_revert() {
678 local context state line
678 local context state line
679 typeset -A opt_args
679 typeset -A opt_args
680
680
681 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
681 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
682 '(--all -a :)'{-a,--all}'[revert all changes when no arguments given]' \
682 '(--all -a :)'{-a,--all}'[revert all changes when no arguments given]' \
683 '(--rev -r)'{-r+,--rev}'[revision to revert to]:revision:_hg_tags' \
683 '(--rev -r)'{-r+,--rev}'[revision to revert to]:revision:_hg_tags' \
684 '--no-backup[do not save backup copies of files]' \
684 '--no-backup[do not save backup copies of files]' \
685 '*:file:->diff_files'
685 '*:file:->diff_files'
686
686
687 if [[ $state == 'diff_files' ]]
687 if [[ $state == 'diff_files' ]]
688 then
688 then
689 if [[ -n $opt_args[-r] ]]
689 if [[ -n $opt_args[-r] ]]
690 then
690 then
691 _hg_files
691 _hg_files
692 else
692 else
693 typeset -a status_files
693 typeset -a status_files
694 _hg_status mard
694 _hg_status mard
695 _wanted files expl 'modified, added, removed or deleted file' _multi_parts / status_files
695 _wanted files expl 'modified, added, removed or deleted file' _multi_parts / status_files
696 fi
696 fi
697 fi
697 fi
698 }
698 }
699
699
700 _hg_cmd_serve() {
700 _hg_cmd_serve() {
701 _arguments -s -w : $_hg_global_opts \
701 _arguments -s -w : $_hg_global_opts \
702 '(--accesslog -A)'{-A+,--accesslog}'[name of access log file]:log file:_files' \
702 '(--accesslog -A)'{-A+,--accesslog}'[name of access log file]:log file:_files' \
703 '(--errorlog -E)'{-E+,--errorlog}'[name of error log file]:log file:_files' \
703 '(--errorlog -E)'{-E+,--errorlog}'[name of error log file]:log file:_files' \
704 '(--daemon -d)'{-d,--daemon}'[run server in background]' \
704 '(--daemon -d)'{-d,--daemon}'[run server in background]' \
705 '(--port -p)'{-p+,--port}'[listen port]:listen port:' \
705 '(--port -p)'{-p+,--port}'[listen port]:listen port:' \
706 '(--address -a)'{-a+,--address}'[interface address]:interface address:' \
706 '(--address -a)'{-a+,--address}'[interface address]:interface address:' \
707 '(--name -n)'{-n+,--name}'[name to show in web pages]:repository name:' \
707 '(--name -n)'{-n+,--name}'[name to show in web pages]:repository name:' \
708 '(--templates -t)'{-t,--templates}'[web template directory]:template dir:_files -/' \
708 '(--templates -t)'{-t,--templates}'[web template directory]:template dir:_files -/' \
709 '--style[web template style]:style' \
709 '--style[web template style]:style' \
710 '--stdio[for remote clients]' \
710 '--stdio[for remote clients]' \
711 '(--ipv6 -6)'{-6,--ipv6}'[use IPv6 in addition to IPv4]'
711 '(--ipv6 -6)'{-6,--ipv6}'[use IPv6 in addition to IPv4]'
712 }
712 }
713
713
714 _hg_cmd_showconfig() {
714 _hg_cmd_showconfig() {
715 _arguments -s -w : $_hg_global_opts \
715 _arguments -s -w : $_hg_global_opts \
716 '(--untrusted -u)'{-u+,--untrusted}'[show untrusted configuration options]' \
716 '(--untrusted -u)'{-u+,--untrusted}'[show untrusted configuration options]' \
717 ':config item:_hg_config'
717 ':config item:_hg_config'
718 }
718 }
719
719
720 _hg_cmd_status() {
720 _hg_cmd_status() {
721 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
721 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
722 '(--all -A)'{-A,--all}'[show status of all files]' \
722 '(--all -A)'{-A,--all}'[show status of all files]' \
723 '(--modified -m)'{-m,--modified}'[show only modified files]' \
723 '(--modified -m)'{-m,--modified}'[show only modified files]' \
724 '(--added -a)'{-a,--added}'[show only added files]' \
724 '(--added -a)'{-a,--added}'[show only added files]' \
725 '(--removed -r)'{-r,--removed}'[show only removed files]' \
725 '(--removed -r)'{-r,--removed}'[show only removed files]' \
726 '(--deleted -d)'{-d,--deleted}'[show only deleted (but tracked) files]' \
726 '(--deleted -d)'{-d,--deleted}'[show only deleted (but tracked) files]' \
727 '(--clean -c)'{-c,--clean}'[show only files without changes]' \
727 '(--clean -c)'{-c,--clean}'[show only files without changes]' \
728 '(--unknown -u)'{-u,--unknown}'[show only unknown files]' \
728 '(--unknown -u)'{-u,--unknown}'[show only unknown files]' \
729 '(--ignored -i)'{-i,--ignored}'[show ignored files]' \
729 '(--ignored -i)'{-i,--ignored}'[show ignored files]' \
730 '(--no-status -n)'{-n,--no-status}'[hide status prefix]' \
730 '(--no-status -n)'{-n,--no-status}'[hide status prefix]' \
731 '(--copies -C)'{-C,--copies}'[show source of copied files]' \
731 '(--copies -C)'{-C,--copies}'[show source of copied files]' \
732 '(--print0 -0)'{-0,--print0}'[end filenames with NUL, for use with xargs]' \
732 '(--print0 -0)'{-0,--print0}'[end filenames with NUL, for use with xargs]' \
733 '--rev[show difference from revision]:revision:_hg_tags' \
733 '--rev[show difference from revision]:revision:_hg_tags' \
734 '*:files:_files'
734 '*:files:_files'
735 }
735 }
736
736
737 _hg_cmd_summary() {
737 _hg_cmd_summary() {
738 _arguments -s -w : $_hg_global_opts \
738 _arguments -s -w : $_hg_global_opts \
739 '--remote[check for push and pull]'
739 '--remote[check for push and pull]'
740 }
740 }
741
741
742 _hg_cmd_tag() {
742 _hg_cmd_tag() {
743 _arguments -s -w : $_hg_global_opts \
743 _arguments -s -w : $_hg_global_opts \
744 '(--local -l)'{-l,--local}'[make the tag local]' \
744 '(--local -l)'{-l,--local}'[make the tag local]' \
745 '(--message -m)'{-m+,--message}'[message for tag commit log entry]:message:' \
745 '(--message -m)'{-m+,--message}'[message for tag commit log entry]:message:' \
746 '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
746 '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
747 '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
747 '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
748 '(--rev -r)'{-r+,--rev}'[revision to tag]:revision:_hg_tags' \
748 '(--rev -r)'{-r+,--rev}'[revision to tag]:revision:_hg_tags' \
749 ':tag name:'
749 ':tag name:'
750 }
750 }
751
751
752 _hg_cmd_tip() {
752 _hg_cmd_tip() {
753 _arguments -s -w : $_hg_global_opts $_hg_style_opts \
753 _arguments -s -w : $_hg_global_opts $_hg_style_opts \
754 '(--patch -p)'{-p,--patch}'[show patch]'
754 '(--patch -p)'{-p,--patch}'[show patch]'
755 }
755 }
756
756
757 _hg_cmd_unbundle() {
757 _hg_cmd_unbundle() {
758 _arguments -s -w : $_hg_global_opts \
758 _arguments -s -w : $_hg_global_opts \
759 '(--update -u)'{-u,--update}'[update to new tip if changesets were unbundled]' \
759 '(--update -u)'{-u,--update}'[update to new tip if changesets were unbundled]' \
760 ':files:_files'
760 ':files:_files'
761 }
761 }
762
762
763 _hg_cmd_update() {
763 _hg_cmd_update() {
764 _arguments -s -w : $_hg_global_opts \
764 _arguments -s -w : $_hg_global_opts \
765 '(--clean -C)'{-C,--clean}'[overwrite locally modified files]' \
765 '(--clean -C)'{-C,--clean}'[overwrite locally modified files]' \
766 '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
766 '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
767 ':revision:_hg_tags'
767 ':revision:_hg_tags'
768 }
768 }
769
769
770 # HGK
770 # HGK
771 _hg_cmd_view() {
771 _hg_cmd_view() {
772 _arguments -s -w : $_hg_global_opts \
772 _arguments -s -w : $_hg_global_opts \
773 '(--limit -l)'{-l+,--limit}'[limit number of changes displayed]:' \
773 '(--limit -l)'{-l+,--limit}'[limit number of changes displayed]:' \
774 ':revision range:_hg_tags'
774 ':revision range:_hg_tags'
775 }
775 }
776
776
777 # MQ
777 # MQ
778 _hg_qseries() {
778 _hg_qseries() {
779 typeset -a patches
779 typeset -a patches
780 patches=(${(f)"$(_hg_cmd qseries)"})
780 patches=(${(f)"$(_hg_cmd qseries)"})
781 (( $#patches )) && _describe -t hg-patches 'patches' patches
781 (( $#patches )) && _describe -t hg-patches 'patches' patches
782 }
782 }
783
783
784 _hg_qapplied() {
784 _hg_qapplied() {
785 typeset -a patches
785 typeset -a patches
786 patches=(${(f)"$(_hg_cmd qapplied)"})
786 patches=(${(f)"$(_hg_cmd qapplied)"})
787 if (( $#patches ))
787 if (( $#patches ))
788 then
788 then
789 patches+=(qbase qtip)
789 patches+=(qbase qtip)
790 _describe -t hg-applied-patches 'applied patches' patches
790 _describe -t hg-applied-patches 'applied patches' patches
791 fi
791 fi
792 }
792 }
793
793
794 _hg_qunapplied() {
794 _hg_qunapplied() {
795 typeset -a patches
795 typeset -a patches
796 patches=(${(f)"$(_hg_cmd qunapplied)"})
796 patches=(${(f)"$(_hg_cmd qunapplied)"})
797 (( $#patches )) && _describe -t hg-unapplied-patches 'unapplied patches' patches
797 (( $#patches )) && _describe -t hg-unapplied-patches 'unapplied patches' patches
798 }
798 }
799
799
800 # unapplied, including guarded patches
800 # unapplied, including guarded patches
801 _hg_qdeletable() {
801 _hg_qdeletable() {
802 typeset -a unapplied
802 typeset -a unapplied
803 unapplied=(${(f)"$(_hg_cmd qseries)"})
803 unapplied=(${(f)"$(_hg_cmd qseries)"})
804 for p in $(_hg_cmd qapplied)
804 for p in $(_hg_cmd qapplied)
805 do
805 do
806 unapplied=(${unapplied:#$p})
806 unapplied=(${unapplied:#$p})
807 done
807 done
808
808
809 (( $#unapplied )) && _describe -t hg-allunapplied-patches 'all unapplied patches' unapplied
809 (( $#unapplied )) && _describe -t hg-allunapplied-patches 'all unapplied patches' unapplied
810 }
810 }
811
811
812 _hg_qguards() {
812 _hg_qguards() {
813 typeset -a guards
813 typeset -a guards
814 local guard
814 local guard
815 compset -P "+|-"
815 compset -P "+|-"
816 _hg_cmd qselect -s | while read guard
816 _hg_cmd qselect -s | while read guard
817 do
817 do
818 guards+=(${guard#(+|-)})
818 guards+=(${guard#(+|-)})
819 done
819 done
820 (( $#guards )) && _describe -t hg-guards 'guards' guards
820 (( $#guards )) && _describe -t hg-guards 'guards' guards
821 }
821 }
822
822
823 _hg_qseries_opts=(
823 _hg_qseries_opts=(
824 '(--summary -s)'{-s,--summary}'[print first line of patch header]')
824 '(--summary -s)'{-s,--summary}'[print first line of patch header]')
825
825
826 _hg_cmd_qapplied() {
826 _hg_cmd_qapplied() {
827 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
827 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
828 }
828 }
829
829
830 _hg_cmd_qdelete() {
830 _hg_cmd_qdelete() {
831 _arguments -s -w : $_hg_global_opts \
831 _arguments -s -w : $_hg_global_opts \
832 '(--keep -k)'{-k,--keep}'[keep patch file]' \
832 '(--keep -k)'{-k,--keep}'[keep patch file]' \
833 '*'{-r+,--rev}'[stop managing a revision]:applied patch:_hg_revrange' \
833 '*'{-r+,--rev}'[stop managing a revision]:applied patch:_hg_revrange' \
834 '*:unapplied patch:_hg_qdeletable'
834 '*:unapplied patch:_hg_qdeletable'
835 }
835 }
836
836
837 _hg_cmd_qdiff() {
837 _hg_cmd_qdiff() {
838 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
838 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
839 '*:pattern:_hg_files'
839 '*:pattern:_hg_files'
840 }
840 }
841
841
842 _hg_cmd_qfold() {
842 _hg_cmd_qfold() {
843 _arguments -s -w : $_hg_global_opts $_h_commit_opts \
843 _arguments -s -w : $_hg_global_opts $_h_commit_opts \
844 '(--keep,-k)'{-k,--keep}'[keep folded patch files]' \
844 '(--keep,-k)'{-k,--keep}'[keep folded patch files]' \
845 '*:unapplied patch:_hg_qunapplied'
845 '*:unapplied patch:_hg_qunapplied'
846 }
846 }
847
847
848 _hg_cmd_qgoto() {
848 _hg_cmd_qgoto() {
849 _arguments -s -w : $_hg_global_opts \
849 _arguments -s -w : $_hg_global_opts \
850 '(--force -f)'{-f,--force}'[overwrite any local changes]' \
850 '(--force -f)'{-f,--force}'[overwrite any local changes]' \
851 ':patch:_hg_qseries'
851 ':patch:_hg_qseries'
852 }
852 }
853
853
854 _hg_cmd_qguard() {
854 _hg_cmd_qguard() {
855 _arguments -s -w : $_hg_global_opts \
855 _arguments -s -w : $_hg_global_opts \
856 '(--list -l)'{-l,--list}'[list all patches and guards]' \
856 '(--list -l)'{-l,--list}'[list all patches and guards]' \
857 '(--none -n)'{-n,--none}'[drop all guards]' \
857 '(--none -n)'{-n,--none}'[drop all guards]' \
858 ':patch:_hg_qseries' \
858 ':patch:_hg_qseries' \
859 '*:guards:_hg_qguards'
859 '*:guards:_hg_qguards'
860 }
860 }
861
861
862 _hg_cmd_qheader() {
862 _hg_cmd_qheader() {
863 _arguments -s -w : $_hg_global_opts \
863 _arguments -s -w : $_hg_global_opts \
864 ':patch:_hg_qseries'
864 ':patch:_hg_qseries'
865 }
865 }
866
866
867 _hg_cmd_qimport() {
867 _hg_cmd_qimport() {
868 _arguments -s -w : $_hg_global_opts \
868 _arguments -s -w : $_hg_global_opts \
869 '(--existing -e)'{-e,--existing}'[import file in patch dir]' \
869 '(--existing -e)'{-e,--existing}'[import file in patch dir]' \
870 '(--name -n 2)'{-n+,--name}'[patch file name]:name:' \
870 '(--name -n 2)'{-n+,--name}'[patch file name]:name:' \
871 '(--force -f)'{-f,--force}'[overwrite existing files]' \
871 '(--force -f)'{-f,--force}'[overwrite existing files]' \
872 '*'{-r+,--rev}'[place existing revisions under mq control]:revision:_hg_revrange' \
872 '*'{-r+,--rev}'[place existing revisions under mq control]:revision:_hg_revrange' \
873 '*:patch:_files'
873 '*:patch:_files'
874 }
874 }
875
875
876 _hg_cmd_qnew() {
876 _hg_cmd_qnew() {
877 _arguments -s -w : $_hg_global_opts $_hg_commit_opts \
877 _arguments -s -w : $_hg_global_opts $_hg_commit_opts \
878 '(--force -f)'{-f,--force}'[import uncommitted changes into patch]' \
878 '(--force -f)'{-f,--force}'[import uncommitted changes into patch]' \
879 ':patch:'
879 ':patch:'
880 }
880 }
881
881
882 _hg_cmd_qnext() {
882 _hg_cmd_qnext() {
883 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
883 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
884 }
884 }
885
885
886 _hg_cmd_qpop() {
886 _hg_cmd_qpop() {
887 _arguments -s -w : $_hg_global_opts \
887 _arguments -s -w : $_hg_global_opts \
888 '(--all -a :)'{-a,--all}'[pop all patches]' \
888 '(--all -a :)'{-a,--all}'[pop all patches]' \
889 '(--name -n)'{-n+,--name}'[queue name to pop]:' \
889 '(--name -n)'{-n+,--name}'[queue name to pop]:' \
890 '(--force -f)'{-f,--force}'[forget any local changes]' \
890 '(--force -f)'{-f,--force}'[forget any local changes]' \
891 ':patch:_hg_qapplied'
891 ':patch:_hg_qapplied'
892 }
892 }
893
893
894 _hg_cmd_qprev() {
894 _hg_cmd_qprev() {
895 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
895 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
896 }
896 }
897
897
898 _hg_cmd_qpush() {
898 _hg_cmd_qpush() {
899 _arguments -s -w : $_hg_global_opts \
899 _arguments -s -w : $_hg_global_opts \
900 '(--all -a :)'{-a,--all}'[apply all patches]' \
900 '(--all -a :)'{-a,--all}'[apply all patches]' \
901 '(--list -l)'{-l,--list}'[list patch name in commit text]' \
901 '(--list -l)'{-l,--list}'[list patch name in commit text]' \
902 '(--merge -m)'{-m+,--merge}'[merge from another queue]:' \
902 '(--merge -m)'{-m+,--merge}'[merge from another queue]:' \
903 '(--name -n)'{-n+,--name}'[merge queue name]:' \
903 '(--name -n)'{-n+,--name}'[merge queue name]:' \
904 '(--force -f)'{-f,--force}'[apply if the patch has rejects]' \
904 '(--force -f)'{-f,--force}'[apply if the patch has rejects]' \
905 ':patch:_hg_qunapplied'
905 ':patch:_hg_qunapplied'
906 }
906 }
907
907
908 _hg_cmd_qrefresh() {
908 _hg_cmd_qrefresh() {
909 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_commit_opts \
909 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_commit_opts \
910 '(--git -g)'{-g,--git}'[use git extended diff format]' \
910 '(--git -g)'{-g,--git}'[use git extended diff format]' \
911 '(--short -s)'{-s,--short}'[short refresh]' \
911 '(--short -s)'{-s,--short}'[short refresh]' \
912 '*:files:_hg_files'
912 '*:files:_hg_files'
913 }
913 }
914
914
915 _hg_cmd_qrename() {
915 _hg_cmd_qrename() {
916 _arguments -s -w : $_hg_global_opts \
916 _arguments -s -w : $_hg_global_opts \
917 ':patch:_hg_qseries' \
917 ':patch:_hg_qseries' \
918 ':destination:'
918 ':destination:'
919 }
919 }
920
920
921 _hg_cmd_qselect() {
921 _hg_cmd_qselect() {
922 _arguments -s -w : $_hg_global_opts \
922 _arguments -s -w : $_hg_global_opts \
923 '(--none -n :)'{-n,--none}'[disable all guards]' \
923 '(--none -n :)'{-n,--none}'[disable all guards]' \
924 '(--series -s :)'{-s,--series}'[list all guards in series file]' \
924 '(--series -s :)'{-s,--series}'[list all guards in series file]' \
925 '--pop[pop to before first guarded applied patch]' \
925 '--pop[pop to before first guarded applied patch]' \
926 '--reapply[pop and reapply patches]' \
926 '--reapply[pop and reapply patches]' \
927 '*:guards:_hg_qguards'
927 '*:guards:_hg_qguards'
928 }
928 }
929
929
930 _hg_cmd_qseries() {
930 _hg_cmd_qseries() {
931 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts \
931 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts \
932 '(--missing -m)'{-m,--missing}'[print patches not in series]'
932 '(--missing -m)'{-m,--missing}'[print patches not in series]'
933 }
933 }
934
934
935 _hg_cmd_qunapplied() {
935 _hg_cmd_qunapplied() {
936 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
936 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
937 }
937 }
938
938
939 _hg_cmd_qtop() {
939 _hg_cmd_qtop() {
940 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
940 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
941 }
941 }
942
942
943 _hg_cmd_strip() {
943 _hg_cmd_strip() {
944 _arguments -s -w : $_hg_global_opts \
944 _arguments -s -w : $_hg_global_opts \
945 '(--force -f)'{-f,--force}'[force multi-head removal]' \
945 '(--force -f)'{-f,--force}'[force multi-head removal]' \
946 '(--backup -b)'{-b,--backup}'[bundle unrelated changesets]' \
946 '(--backup -b)'{-b,--backup}'[bundle unrelated changesets]' \
947 '(--nobackup -n)'{-n,--nobackup}'[no backups]' \
947 '(--nobackup -n)'{-n,--nobackup}'[no backups]' \
948 ':revision:_hg_tags'
948 ':revision:_hg_tags'
949 }
949 }
950
950
951 _hg "$@"
951 _hg "$@"
@@ -1,3765 +1,3765
1 # commands.py - command processing for mercurial
1 # commands.py - command processing for mercurial
2 #
2 #
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 from node import hex, nullid, nullrev, short
8 from node import hex, nullid, nullrev, short
9 from lock import release
9 from lock import release
10 from i18n import _, gettext
10 from i18n import _, gettext
11 import os, re, sys, difflib, time, tempfile
11 import os, re, sys, difflib, time, tempfile
12 import hg, util, revlog, bundlerepo, extensions, copies, error
12 import hg, util, revlog, bundlerepo, extensions, copies, error
13 import patch, help, mdiff, url, encoding, templatekw
13 import patch, help, mdiff, url, encoding, templatekw
14 import archival, changegroup, cmdutil, sshserver, hbisect
14 import archival, changegroup, cmdutil, sshserver, hbisect
15 from hgweb import server
15 from hgweb import server
16 import merge as merge_
16 import merge as merge_
17 import minirst
17 import minirst
18
18
19 # Commands start here, listed alphabetically
19 # Commands start here, listed alphabetically
20
20
21 def add(ui, repo, *pats, **opts):
21 def add(ui, repo, *pats, **opts):
22 """add the specified files on the next commit
22 """add the specified files on the next commit
23
23
24 Schedule files to be version controlled and added to the
24 Schedule files to be version controlled and added to the
25 repository.
25 repository.
26
26
27 The files will be added to the repository at the next commit. To
27 The files will be added to the repository at the next commit. To
28 undo an add before that, see hg forget.
28 undo an add before that, see hg forget.
29
29
30 If no names are given, add all files to the repository.
30 If no names are given, add all files to the repository.
31 """
31 """
32
32
33 bad = []
33 bad = []
34 names = []
34 names = []
35 m = cmdutil.match(repo, pats, opts)
35 m = cmdutil.match(repo, pats, opts)
36 oldbad = m.bad
36 oldbad = m.bad
37 m.bad = lambda x, y: bad.append(x) or oldbad(x, y)
37 m.bad = lambda x, y: bad.append(x) or oldbad(x, y)
38
38
39 for f in repo.walk(m):
39 for f in repo.walk(m):
40 exact = m.exact(f)
40 exact = m.exact(f)
41 if exact or f not in repo.dirstate:
41 if exact or f not in repo.dirstate:
42 names.append(f)
42 names.append(f)
43 if ui.verbose or not exact:
43 if ui.verbose or not exact:
44 ui.status(_('adding %s\n') % m.rel(f))
44 ui.status(_('adding %s\n') % m.rel(f))
45 if not opts.get('dry_run'):
45 if not opts.get('dry_run'):
46 bad += [f for f in repo.add(names) if f in m.files()]
46 bad += [f for f in repo.add(names) if f in m.files()]
47 return bad and 1 or 0
47 return bad and 1 or 0
48
48
49 def addremove(ui, repo, *pats, **opts):
49 def addremove(ui, repo, *pats, **opts):
50 """add all new files, delete all missing files
50 """add all new files, delete all missing files
51
51
52 Add all new files and remove all missing files from the
52 Add all new files and remove all missing files from the
53 repository.
53 repository.
54
54
55 New files are ignored if they match any of the patterns in
55 New files are ignored if they match any of the patterns in
56 .hgignore. As with add, these changes take effect at the next
56 .hgignore. As with add, these changes take effect at the next
57 commit.
57 commit.
58
58
59 Use the -s/--similarity option to detect renamed files. With a
59 Use the -s/--similarity option to detect renamed files. With a
60 parameter greater than 0, this compares every removed file with
60 parameter greater than 0, this compares every removed file with
61 every added file and records those similar enough as renames. This
61 every added file and records those similar enough as renames. This
62 option takes a percentage between 0 (disabled) and 100 (files must
62 option takes a percentage between 0 (disabled) and 100 (files must
63 be identical) as its parameter. Detecting renamed files this way
63 be identical) as its parameter. Detecting renamed files this way
64 can be expensive.
64 can be expensive.
65 """
65 """
66 try:
66 try:
67 sim = float(opts.get('similarity') or 0)
67 sim = float(opts.get('similarity') or 0)
68 except ValueError:
68 except ValueError:
69 raise util.Abort(_('similarity must be a number'))
69 raise util.Abort(_('similarity must be a number'))
70 if sim < 0 or sim > 100:
70 if sim < 0 or sim > 100:
71 raise util.Abort(_('similarity must be between 0 and 100'))
71 raise util.Abort(_('similarity must be between 0 and 100'))
72 return cmdutil.addremove(repo, pats, opts, similarity=sim / 100.0)
72 return cmdutil.addremove(repo, pats, opts, similarity=sim / 100.0)
73
73
74 def annotate(ui, repo, *pats, **opts):
74 def annotate(ui, repo, *pats, **opts):
75 """show changeset information by line for each file
75 """show changeset information by line for each file
76
76
77 List changes in files, showing the revision id responsible for
77 List changes in files, showing the revision id responsible for
78 each line
78 each line
79
79
80 This command is useful for discovering when a change was made and
80 This command is useful for discovering when a change was made and
81 by whom.
81 by whom.
82
82
83 Without the -a/--text option, annotate will avoid processing files
83 Without the -a/--text option, annotate will avoid processing files
84 it detects as binary. With -a, annotate will annotate the file
84 it detects as binary. With -a, annotate will annotate the file
85 anyway, although the results will probably be neither useful
85 anyway, although the results will probably be neither useful
86 nor desirable.
86 nor desirable.
87 """
87 """
88 datefunc = ui.quiet and util.shortdate or util.datestr
88 datefunc = ui.quiet and util.shortdate or util.datestr
89 getdate = util.cachefunc(lambda x: datefunc(x[0].date()))
89 getdate = util.cachefunc(lambda x: datefunc(x[0].date()))
90
90
91 if not pats:
91 if not pats:
92 raise util.Abort(_('at least one filename or pattern is required'))
92 raise util.Abort(_('at least one filename or pattern is required'))
93
93
94 opmap = [('user', lambda x: ui.shortuser(x[0].user())),
94 opmap = [('user', lambda x: ui.shortuser(x[0].user())),
95 ('number', lambda x: str(x[0].rev())),
95 ('number', lambda x: str(x[0].rev())),
96 ('changeset', lambda x: short(x[0].node())),
96 ('changeset', lambda x: short(x[0].node())),
97 ('date', getdate),
97 ('date', getdate),
98 ('file', lambda x: x[0].path()),
98 ('file', lambda x: x[0].path()),
99 ]
99 ]
100
100
101 if (not opts.get('user') and not opts.get('changeset')
101 if (not opts.get('user') and not opts.get('changeset')
102 and not opts.get('date') and not opts.get('file')):
102 and not opts.get('date') and not opts.get('file')):
103 opts['number'] = 1
103 opts['number'] = 1
104
104
105 linenumber = opts.get('line_number') is not None
105 linenumber = opts.get('line_number') is not None
106 if (linenumber and (not opts.get('changeset')) and (not opts.get('number'))):
106 if (linenumber and (not opts.get('changeset')) and (not opts.get('number'))):
107 raise util.Abort(_('at least one of -n/-c is required for -l'))
107 raise util.Abort(_('at least one of -n/-c is required for -l'))
108
108
109 funcmap = [func for op, func in opmap if opts.get(op)]
109 funcmap = [func for op, func in opmap if opts.get(op)]
110 if linenumber:
110 if linenumber:
111 lastfunc = funcmap[-1]
111 lastfunc = funcmap[-1]
112 funcmap[-1] = lambda x: "%s:%s" % (lastfunc(x), x[1])
112 funcmap[-1] = lambda x: "%s:%s" % (lastfunc(x), x[1])
113
113
114 ctx = repo[opts.get('rev')]
114 ctx = repo[opts.get('rev')]
115 m = cmdutil.match(repo, pats, opts)
115 m = cmdutil.match(repo, pats, opts)
116 follow = not opts.get('no_follow')
116 follow = not opts.get('no_follow')
117 for abs in ctx.walk(m):
117 for abs in ctx.walk(m):
118 fctx = ctx[abs]
118 fctx = ctx[abs]
119 if not opts.get('text') and util.binary(fctx.data()):
119 if not opts.get('text') and util.binary(fctx.data()):
120 ui.write(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
120 ui.write(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
121 continue
121 continue
122
122
123 lines = fctx.annotate(follow=follow, linenumber=linenumber)
123 lines = fctx.annotate(follow=follow, linenumber=linenumber)
124 pieces = []
124 pieces = []
125
125
126 for f in funcmap:
126 for f in funcmap:
127 l = [f(n) for n, dummy in lines]
127 l = [f(n) for n, dummy in lines]
128 if l:
128 if l:
129 ml = max(map(len, l))
129 ml = max(map(len, l))
130 pieces.append(["%*s" % (ml, x) for x in l])
130 pieces.append(["%*s" % (ml, x) for x in l])
131
131
132 if pieces:
132 if pieces:
133 for p, l in zip(zip(*pieces), lines):
133 for p, l in zip(zip(*pieces), lines):
134 ui.write("%s: %s" % (" ".join(p), l[1]))
134 ui.write("%s: %s" % (" ".join(p), l[1]))
135
135
136 def archive(ui, repo, dest, **opts):
136 def archive(ui, repo, dest, **opts):
137 '''create an unversioned archive of a repository revision
137 '''create an unversioned archive of a repository revision
138
138
139 By default, the revision used is the parent of the working
139 By default, the revision used is the parent of the working
140 directory; use -r/--rev to specify a different revision.
140 directory; use -r/--rev to specify a different revision.
141
141
142 To specify the type of archive to create, use -t/--type. Valid
142 To specify the type of archive to create, use -t/--type. Valid
143 types are:
143 types are:
144
144
145 :``files``: a directory full of files (default)
145 :``files``: a directory full of files (default)
146 :``tar``: tar archive, uncompressed
146 :``tar``: tar archive, uncompressed
147 :``tbz2``: tar archive, compressed using bzip2
147 :``tbz2``: tar archive, compressed using bzip2
148 :``tgz``: tar archive, compressed using gzip
148 :``tgz``: tar archive, compressed using gzip
149 :``uzip``: zip archive, uncompressed
149 :``uzip``: zip archive, uncompressed
150 :``zip``: zip archive, compressed using deflate
150 :``zip``: zip archive, compressed using deflate
151
151
152 The exact name of the destination archive or directory is given
152 The exact name of the destination archive or directory is given
153 using a format string; see 'hg help export' for details.
153 using a format string; see 'hg help export' for details.
154
154
155 Each member added to an archive file has a directory prefix
155 Each member added to an archive file has a directory prefix
156 prepended. Use -p/--prefix to specify a format string for the
156 prepended. Use -p/--prefix to specify a format string for the
157 prefix. The default is the basename of the archive, with suffixes
157 prefix. The default is the basename of the archive, with suffixes
158 removed.
158 removed.
159 '''
159 '''
160
160
161 ctx = repo[opts.get('rev')]
161 ctx = repo[opts.get('rev')]
162 if not ctx:
162 if not ctx:
163 raise util.Abort(_('no working directory: please specify a revision'))
163 raise util.Abort(_('no working directory: please specify a revision'))
164 node = ctx.node()
164 node = ctx.node()
165 dest = cmdutil.make_filename(repo, dest, node)
165 dest = cmdutil.make_filename(repo, dest, node)
166 if os.path.realpath(dest) == repo.root:
166 if os.path.realpath(dest) == repo.root:
167 raise util.Abort(_('repository root cannot be destination'))
167 raise util.Abort(_('repository root cannot be destination'))
168 matchfn = cmdutil.match(repo, [], opts)
168 matchfn = cmdutil.match(repo, [], opts)
169 kind = opts.get('type') or 'files'
169 kind = opts.get('type') or 'files'
170 prefix = opts.get('prefix')
170 prefix = opts.get('prefix')
171 if dest == '-':
171 if dest == '-':
172 if kind == 'files':
172 if kind == 'files':
173 raise util.Abort(_('cannot archive plain files to stdout'))
173 raise util.Abort(_('cannot archive plain files to stdout'))
174 dest = sys.stdout
174 dest = sys.stdout
175 if not prefix:
175 if not prefix:
176 prefix = os.path.basename(repo.root) + '-%h'
176 prefix = os.path.basename(repo.root) + '-%h'
177 prefix = cmdutil.make_filename(repo, prefix, node)
177 prefix = cmdutil.make_filename(repo, prefix, node)
178 archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
178 archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
179 matchfn, prefix)
179 matchfn, prefix)
180
180
181 def backout(ui, repo, node=None, rev=None, **opts):
181 def backout(ui, repo, node=None, rev=None, **opts):
182 '''reverse effect of earlier changeset
182 '''reverse effect of earlier changeset
183
183
184 Commit the backed out changes as a new changeset. The new
184 Commit the backed out changes as a new changeset. The new
185 changeset is a child of the backed out changeset.
185 changeset is a child of the backed out changeset.
186
186
187 If you backout a changeset other than the tip, a new head is
187 If you backout a changeset other than the tip, a new head is
188 created. This head will be the new tip and you should merge this
188 created. This head will be the new tip and you should merge this
189 backout changeset with another head.
189 backout changeset with another head.
190
190
191 The --merge option remembers the parent of the working directory
191 The --merge option remembers the parent of the working directory
192 before starting the backout, then merges the new head with that
192 before starting the backout, then merges the new head with that
193 changeset afterwards. This saves you from doing the merge by hand.
193 changeset afterwards. This saves you from doing the merge by hand.
194 The result of this merge is not committed, as with a normal merge.
194 The result of this merge is not committed, as with a normal merge.
195
195
196 See 'hg help dates' for a list of formats valid for -d/--date.
196 See 'hg help dates' for a list of formats valid for -d/--date.
197 '''
197 '''
198 if rev and node:
198 if rev and node:
199 raise util.Abort(_("please specify just one revision"))
199 raise util.Abort(_("please specify just one revision"))
200
200
201 if not rev:
201 if not rev:
202 rev = node
202 rev = node
203
203
204 if not rev:
204 if not rev:
205 raise util.Abort(_("please specify a revision to backout"))
205 raise util.Abort(_("please specify a revision to backout"))
206
206
207 date = opts.get('date')
207 date = opts.get('date')
208 if date:
208 if date:
209 opts['date'] = util.parsedate(date)
209 opts['date'] = util.parsedate(date)
210
210
211 cmdutil.bail_if_changed(repo)
211 cmdutil.bail_if_changed(repo)
212 node = repo.lookup(rev)
212 node = repo.lookup(rev)
213
213
214 op1, op2 = repo.dirstate.parents()
214 op1, op2 = repo.dirstate.parents()
215 a = repo.changelog.ancestor(op1, node)
215 a = repo.changelog.ancestor(op1, node)
216 if a != node:
216 if a != node:
217 raise util.Abort(_('cannot backout change on a different branch'))
217 raise util.Abort(_('cannot backout change on a different branch'))
218
218
219 p1, p2 = repo.changelog.parents(node)
219 p1, p2 = repo.changelog.parents(node)
220 if p1 == nullid:
220 if p1 == nullid:
221 raise util.Abort(_('cannot backout a change with no parents'))
221 raise util.Abort(_('cannot backout a change with no parents'))
222 if p2 != nullid:
222 if p2 != nullid:
223 if not opts.get('parent'):
223 if not opts.get('parent'):
224 raise util.Abort(_('cannot backout a merge changeset without '
224 raise util.Abort(_('cannot backout a merge changeset without '
225 '--parent'))
225 '--parent'))
226 p = repo.lookup(opts['parent'])
226 p = repo.lookup(opts['parent'])
227 if p not in (p1, p2):
227 if p not in (p1, p2):
228 raise util.Abort(_('%s is not a parent of %s') %
228 raise util.Abort(_('%s is not a parent of %s') %
229 (short(p), short(node)))
229 (short(p), short(node)))
230 parent = p
230 parent = p
231 else:
231 else:
232 if opts.get('parent'):
232 if opts.get('parent'):
233 raise util.Abort(_('cannot use --parent on non-merge changeset'))
233 raise util.Abort(_('cannot use --parent on non-merge changeset'))
234 parent = p1
234 parent = p1
235
235
236 # the backout should appear on the same branch
236 # the backout should appear on the same branch
237 branch = repo.dirstate.branch()
237 branch = repo.dirstate.branch()
238 hg.clean(repo, node, show_stats=False)
238 hg.clean(repo, node, show_stats=False)
239 repo.dirstate.setbranch(branch)
239 repo.dirstate.setbranch(branch)
240 revert_opts = opts.copy()
240 revert_opts = opts.copy()
241 revert_opts['date'] = None
241 revert_opts['date'] = None
242 revert_opts['all'] = True
242 revert_opts['all'] = True
243 revert_opts['rev'] = hex(parent)
243 revert_opts['rev'] = hex(parent)
244 revert_opts['no_backup'] = None
244 revert_opts['no_backup'] = None
245 revert(ui, repo, **revert_opts)
245 revert(ui, repo, **revert_opts)
246 commit_opts = opts.copy()
246 commit_opts = opts.copy()
247 commit_opts['addremove'] = False
247 commit_opts['addremove'] = False
248 if not commit_opts['message'] and not commit_opts['logfile']:
248 if not commit_opts['message'] and not commit_opts['logfile']:
249 # we don't translate commit messages
249 # we don't translate commit messages
250 commit_opts['message'] = "Backed out changeset %s" % short(node)
250 commit_opts['message'] = "Backed out changeset %s" % short(node)
251 commit_opts['force_editor'] = True
251 commit_opts['force_editor'] = True
252 commit(ui, repo, **commit_opts)
252 commit(ui, repo, **commit_opts)
253 def nice(node):
253 def nice(node):
254 return '%d:%s' % (repo.changelog.rev(node), short(node))
254 return '%d:%s' % (repo.changelog.rev(node), short(node))
255 ui.status(_('changeset %s backs out changeset %s\n') %
255 ui.status(_('changeset %s backs out changeset %s\n') %
256 (nice(repo.changelog.tip()), nice(node)))
256 (nice(repo.changelog.tip()), nice(node)))
257 if op1 != node:
257 if op1 != node:
258 hg.clean(repo, op1, show_stats=False)
258 hg.clean(repo, op1, show_stats=False)
259 if opts.get('merge'):
259 if opts.get('merge'):
260 ui.status(_('merging with changeset %s\n')
260 ui.status(_('merging with changeset %s\n')
261 % nice(repo.changelog.tip()))
261 % nice(repo.changelog.tip()))
262 hg.merge(repo, hex(repo.changelog.tip()))
262 hg.merge(repo, hex(repo.changelog.tip()))
263 else:
263 else:
264 ui.status(_('the backout changeset is a new head - '
264 ui.status(_('the backout changeset is a new head - '
265 'do not forget to merge\n'))
265 'do not forget to merge\n'))
266 ui.status(_('(use "backout --merge" '
266 ui.status(_('(use "backout --merge" '
267 'if you want to auto-merge)\n'))
267 'if you want to auto-merge)\n'))
268
268
269 def bisect(ui, repo, rev=None, extra=None, command=None,
269 def bisect(ui, repo, rev=None, extra=None, command=None,
270 reset=None, good=None, bad=None, skip=None, noupdate=None):
270 reset=None, good=None, bad=None, skip=None, noupdate=None):
271 """subdivision search of changesets
271 """subdivision search of changesets
272
272
273 This command helps to find changesets which introduce problems. To
273 This command helps to find changesets which introduce problems. To
274 use, mark the earliest changeset you know exhibits the problem as
274 use, mark the earliest changeset you know exhibits the problem as
275 bad, then mark the latest changeset which is free from the problem
275 bad, then mark the latest changeset which is free from the problem
276 as good. Bisect will update your working directory to a revision
276 as good. Bisect will update your working directory to a revision
277 for testing (unless the -U/--noupdate option is specified). Once
277 for testing (unless the -U/--noupdate option is specified). Once
278 you have performed tests, mark the working directory as good or
278 you have performed tests, mark the working directory as good or
279 bad, and bisect will either update to another candidate changeset
279 bad, and bisect will either update to another candidate changeset
280 or announce that it has found the bad revision.
280 or announce that it has found the bad revision.
281
281
282 As a shortcut, you can also use the revision argument to mark a
282 As a shortcut, you can also use the revision argument to mark a
283 revision as good or bad without checking it out first.
283 revision as good or bad without checking it out first.
284
284
285 If you supply a command, it will be used for automatic bisection.
285 If you supply a command, it will be used for automatic bisection.
286 Its exit status will be used to mark revisions as good or bad:
286 Its exit status will be used to mark revisions as good or bad:
287 status 0 means good, 125 means to skip the revision, 127
287 status 0 means good, 125 means to skip the revision, 127
288 (command not found) will abort the bisection, and any other
288 (command not found) will abort the bisection, and any other
289 non-zero exit status means the revision is bad.
289 non-zero exit status means the revision is bad.
290 """
290 """
291 def print_result(nodes, good):
291 def print_result(nodes, good):
292 displayer = cmdutil.show_changeset(ui, repo, {})
292 displayer = cmdutil.show_changeset(ui, repo, {})
293 if len(nodes) == 1:
293 if len(nodes) == 1:
294 # narrowed it down to a single revision
294 # narrowed it down to a single revision
295 if good:
295 if good:
296 ui.write(_("The first good revision is:\n"))
296 ui.write(_("The first good revision is:\n"))
297 else:
297 else:
298 ui.write(_("The first bad revision is:\n"))
298 ui.write(_("The first bad revision is:\n"))
299 displayer.show(repo[nodes[0]])
299 displayer.show(repo[nodes[0]])
300 else:
300 else:
301 # multiple possible revisions
301 # multiple possible revisions
302 if good:
302 if good:
303 ui.write(_("Due to skipped revisions, the first "
303 ui.write(_("Due to skipped revisions, the first "
304 "good revision could be any of:\n"))
304 "good revision could be any of:\n"))
305 else:
305 else:
306 ui.write(_("Due to skipped revisions, the first "
306 ui.write(_("Due to skipped revisions, the first "
307 "bad revision could be any of:\n"))
307 "bad revision could be any of:\n"))
308 for n in nodes:
308 for n in nodes:
309 displayer.show(repo[n])
309 displayer.show(repo[n])
310 displayer.close()
310 displayer.close()
311
311
312 def check_state(state, interactive=True):
312 def check_state(state, interactive=True):
313 if not state['good'] or not state['bad']:
313 if not state['good'] or not state['bad']:
314 if (good or bad or skip or reset) and interactive:
314 if (good or bad or skip or reset) and interactive:
315 return
315 return
316 if not state['good']:
316 if not state['good']:
317 raise util.Abort(_('cannot bisect (no known good revisions)'))
317 raise util.Abort(_('cannot bisect (no known good revisions)'))
318 else:
318 else:
319 raise util.Abort(_('cannot bisect (no known bad revisions)'))
319 raise util.Abort(_('cannot bisect (no known bad revisions)'))
320 return True
320 return True
321
321
322 # backward compatibility
322 # backward compatibility
323 if rev in "good bad reset init".split():
323 if rev in "good bad reset init".split():
324 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
324 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
325 cmd, rev, extra = rev, extra, None
325 cmd, rev, extra = rev, extra, None
326 if cmd == "good":
326 if cmd == "good":
327 good = True
327 good = True
328 elif cmd == "bad":
328 elif cmd == "bad":
329 bad = True
329 bad = True
330 else:
330 else:
331 reset = True
331 reset = True
332 elif extra or good + bad + skip + reset + bool(command) > 1:
332 elif extra or good + bad + skip + reset + bool(command) > 1:
333 raise util.Abort(_('incompatible arguments'))
333 raise util.Abort(_('incompatible arguments'))
334
334
335 if reset:
335 if reset:
336 p = repo.join("bisect.state")
336 p = repo.join("bisect.state")
337 if os.path.exists(p):
337 if os.path.exists(p):
338 os.unlink(p)
338 os.unlink(p)
339 return
339 return
340
340
341 state = hbisect.load_state(repo)
341 state = hbisect.load_state(repo)
342
342
343 if command:
343 if command:
344 changesets = 1
344 changesets = 1
345 try:
345 try:
346 while changesets:
346 while changesets:
347 # update state
347 # update state
348 status = util.system(command)
348 status = util.system(command)
349 if status == 125:
349 if status == 125:
350 transition = "skip"
350 transition = "skip"
351 elif status == 0:
351 elif status == 0:
352 transition = "good"
352 transition = "good"
353 # status < 0 means process was killed
353 # status < 0 means process was killed
354 elif status == 127:
354 elif status == 127:
355 raise util.Abort(_("failed to execute %s") % command)
355 raise util.Abort(_("failed to execute %s") % command)
356 elif status < 0:
356 elif status < 0:
357 raise util.Abort(_("%s killed") % command)
357 raise util.Abort(_("%s killed") % command)
358 else:
358 else:
359 transition = "bad"
359 transition = "bad"
360 ctx = repo[rev or '.']
360 ctx = repo[rev or '.']
361 state[transition].append(ctx.node())
361 state[transition].append(ctx.node())
362 ui.status(_('Changeset %d:%s: %s\n') % (ctx, ctx, transition))
362 ui.status(_('Changeset %d:%s: %s\n') % (ctx, ctx, transition))
363 check_state(state, interactive=False)
363 check_state(state, interactive=False)
364 # bisect
364 # bisect
365 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
365 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
366 # update to next check
366 # update to next check
367 cmdutil.bail_if_changed(repo)
367 cmdutil.bail_if_changed(repo)
368 hg.clean(repo, nodes[0], show_stats=False)
368 hg.clean(repo, nodes[0], show_stats=False)
369 finally:
369 finally:
370 hbisect.save_state(repo, state)
370 hbisect.save_state(repo, state)
371 return print_result(nodes, good)
371 return print_result(nodes, good)
372
372
373 # update state
373 # update state
374 node = repo.lookup(rev or '.')
374 node = repo.lookup(rev or '.')
375 if good or bad or skip:
375 if good or bad or skip:
376 if good:
376 if good:
377 state['good'].append(node)
377 state['good'].append(node)
378 elif bad:
378 elif bad:
379 state['bad'].append(node)
379 state['bad'].append(node)
380 elif skip:
380 elif skip:
381 state['skip'].append(node)
381 state['skip'].append(node)
382 hbisect.save_state(repo, state)
382 hbisect.save_state(repo, state)
383
383
384 if not check_state(state):
384 if not check_state(state):
385 return
385 return
386
386
387 # actually bisect
387 # actually bisect
388 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
388 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
389 if changesets == 0:
389 if changesets == 0:
390 print_result(nodes, good)
390 print_result(nodes, good)
391 else:
391 else:
392 assert len(nodes) == 1 # only a single node can be tested next
392 assert len(nodes) == 1 # only a single node can be tested next
393 node = nodes[0]
393 node = nodes[0]
394 # compute the approximate number of remaining tests
394 # compute the approximate number of remaining tests
395 tests, size = 0, 2
395 tests, size = 0, 2
396 while size <= changesets:
396 while size <= changesets:
397 tests, size = tests + 1, size * 2
397 tests, size = tests + 1, size * 2
398 rev = repo.changelog.rev(node)
398 rev = repo.changelog.rev(node)
399 ui.write(_("Testing changeset %d:%s "
399 ui.write(_("Testing changeset %d:%s "
400 "(%d changesets remaining, ~%d tests)\n")
400 "(%d changesets remaining, ~%d tests)\n")
401 % (rev, short(node), changesets, tests))
401 % (rev, short(node), changesets, tests))
402 if not noupdate:
402 if not noupdate:
403 cmdutil.bail_if_changed(repo)
403 cmdutil.bail_if_changed(repo)
404 return hg.clean(repo, node)
404 return hg.clean(repo, node)
405
405
406 def branch(ui, repo, label=None, **opts):
406 def branch(ui, repo, label=None, **opts):
407 """set or show the current branch name
407 """set or show the current branch name
408
408
409 With no argument, show the current branch name. With one argument,
409 With no argument, show the current branch name. With one argument,
410 set the working directory branch name (the branch will not exist
410 set the working directory branch name (the branch will not exist
411 in the repository until the next commit). Standard practice
411 in the repository until the next commit). Standard practice
412 recommends that primary development take place on the 'default'
412 recommends that primary development take place on the 'default'
413 branch.
413 branch.
414
414
415 Unless -f/--force is specified, branch will not let you set a
415 Unless -f/--force is specified, branch will not let you set a
416 branch name that already exists, even if it's inactive.
416 branch name that already exists, even if it's inactive.
417
417
418 Use -C/--clean to reset the working directory branch to that of
418 Use -C/--clean to reset the working directory branch to that of
419 the parent of the working directory, negating a previous branch
419 the parent of the working directory, negating a previous branch
420 change.
420 change.
421
421
422 Use the command 'hg update' to switch to an existing branch. Use
422 Use the command 'hg update' to switch to an existing branch. Use
423 'hg commit --close-branch' to mark this branch as closed.
423 'hg commit --close-branch' to mark this branch as closed.
424 """
424 """
425
425
426 if opts.get('clean'):
426 if opts.get('clean'):
427 label = repo[None].parents()[0].branch()
427 label = repo[None].parents()[0].branch()
428 repo.dirstate.setbranch(label)
428 repo.dirstate.setbranch(label)
429 ui.status(_('reset working directory to branch %s\n') % label)
429 ui.status(_('reset working directory to branch %s\n') % label)
430 elif label:
430 elif label:
431 utflabel = encoding.fromlocal(label)
431 utflabel = encoding.fromlocal(label)
432 if not opts.get('force') and utflabel in repo.branchtags():
432 if not opts.get('force') and utflabel in repo.branchtags():
433 if label not in [p.branch() for p in repo.parents()]:
433 if label not in [p.branch() for p in repo.parents()]:
434 raise util.Abort(_('a branch of the same name already exists'
434 raise util.Abort(_('a branch of the same name already exists'
435 ' (use --force to override)'))
435 ' (use --force to override)'))
436 repo.dirstate.setbranch(utflabel)
436 repo.dirstate.setbranch(utflabel)
437 ui.status(_('marked working directory as branch %s\n') % label)
437 ui.status(_('marked working directory as branch %s\n') % label)
438 else:
438 else:
439 ui.write("%s\n" % encoding.tolocal(repo.dirstate.branch()))
439 ui.write("%s\n" % encoding.tolocal(repo.dirstate.branch()))
440
440
441 def branches(ui, repo, active=False, closed=False):
441 def branches(ui, repo, active=False, closed=False):
442 """list repository named branches
442 """list repository named branches
443
443
444 List the repository's named branches, indicating which ones are
444 List the repository's named branches, indicating which ones are
445 inactive. If -c/--closed is specified, also list branches which have
445 inactive. If -c/--closed is specified, also list branches which have
446 been marked closed (see hg commit --close-branch).
446 been marked closed (see hg commit --close-branch).
447
447
448 If -a/--active is specified, only show active branches. A branch
448 If -a/--active is specified, only show active branches. A branch
449 is considered active if it contains repository heads.
449 is considered active if it contains repository heads.
450
450
451 Use the command 'hg update' to switch to an existing branch.
451 Use the command 'hg update' to switch to an existing branch.
452 """
452 """
453
453
454 hexfunc = ui.debugflag and hex or short
454 hexfunc = ui.debugflag and hex or short
455 activebranches = [repo[n].branch() for n in repo.heads()]
455 activebranches = [repo[n].branch() for n in repo.heads()]
456 def testactive(tag, node):
456 def testactive(tag, node):
457 realhead = tag in activebranches
457 realhead = tag in activebranches
458 open = node in repo.branchheads(tag, closed=False)
458 open = node in repo.branchheads(tag, closed=False)
459 return realhead and open
459 return realhead and open
460 branches = sorted([(testactive(tag, node), repo.changelog.rev(node), tag)
460 branches = sorted([(testactive(tag, node), repo.changelog.rev(node), tag)
461 for tag, node in repo.branchtags().items()],
461 for tag, node in repo.branchtags().items()],
462 reverse=True)
462 reverse=True)
463
463
464 for isactive, node, tag in branches:
464 for isactive, node, tag in branches:
465 if (not active) or isactive:
465 if (not active) or isactive:
466 encodedtag = encoding.tolocal(tag)
466 encodedtag = encoding.tolocal(tag)
467 if ui.quiet:
467 if ui.quiet:
468 ui.write("%s\n" % encodedtag)
468 ui.write("%s\n" % encodedtag)
469 else:
469 else:
470 hn = repo.lookup(node)
470 hn = repo.lookup(node)
471 if isactive:
471 if isactive:
472 notice = ''
472 notice = ''
473 elif hn not in repo.branchheads(tag, closed=False):
473 elif hn not in repo.branchheads(tag, closed=False):
474 if not closed:
474 if not closed:
475 continue
475 continue
476 notice = _(' (closed)')
476 notice = _(' (closed)')
477 else:
477 else:
478 notice = _(' (inactive)')
478 notice = _(' (inactive)')
479 rev = str(node).rjust(31 - encoding.colwidth(encodedtag))
479 rev = str(node).rjust(31 - encoding.colwidth(encodedtag))
480 data = encodedtag, rev, hexfunc(hn), notice
480 data = encodedtag, rev, hexfunc(hn), notice
481 ui.write("%s %s:%s%s\n" % data)
481 ui.write("%s %s:%s%s\n" % data)
482
482
483 def bundle(ui, repo, fname, dest=None, **opts):
483 def bundle(ui, repo, fname, dest=None, **opts):
484 """create a changegroup file
484 """create a changegroup file
485
485
486 Generate a compressed changegroup file collecting changesets not
486 Generate a compressed changegroup file collecting changesets not
487 known to be in another repository.
487 known to be in another repository.
488
488
489 If no destination repository is specified the destination is
489 If no destination repository is specified the destination is
490 assumed to have all the nodes specified by one or more --base
490 assumed to have all the nodes specified by one or more --base
491 parameters. To create a bundle containing all changesets, use
491 parameters. To create a bundle containing all changesets, use
492 -a/--all (or --base null).
492 -a/--all (or --base null).
493
493
494 You can change compression method with the -t/--type option.
494 You can change compression method with the -t/--type option.
495 The available compression methods are: none, bzip2, and
495 The available compression methods are: none, bzip2, and
496 gzip (by default, bundles are compressed using bzip2).
496 gzip (by default, bundles are compressed using bzip2).
497
497
498 The bundle file can then be transferred using conventional means
498 The bundle file can then be transferred using conventional means
499 and applied to another repository with the unbundle or pull
499 and applied to another repository with the unbundle or pull
500 command. This is useful when direct push and pull are not
500 command. This is useful when direct push and pull are not
501 available or when exporting an entire repository is undesirable.
501 available or when exporting an entire repository is undesirable.
502
502
503 Applying bundles preserves all changeset contents including
503 Applying bundles preserves all changeset contents including
504 permissions, copy/rename information, and revision history.
504 permissions, copy/rename information, and revision history.
505 """
505 """
506 revs = opts.get('rev') or None
506 revs = opts.get('rev') or None
507 if revs:
507 if revs:
508 revs = [repo.lookup(rev) for rev in revs]
508 revs = [repo.lookup(rev) for rev in revs]
509 if opts.get('all'):
509 if opts.get('all'):
510 base = ['null']
510 base = ['null']
511 else:
511 else:
512 base = opts.get('base')
512 base = opts.get('base')
513 if base:
513 if base:
514 if dest:
514 if dest:
515 raise util.Abort(_("--base is incompatible with specifying "
515 raise util.Abort(_("--base is incompatible with specifying "
516 "a destination"))
516 "a destination"))
517 base = [repo.lookup(rev) for rev in base]
517 base = [repo.lookup(rev) for rev in base]
518 # create the right base
518 # create the right base
519 # XXX: nodesbetween / changegroup* should be "fixed" instead
519 # XXX: nodesbetween / changegroup* should be "fixed" instead
520 o = []
520 o = []
521 has = set((nullid,))
521 has = set((nullid,))
522 for n in base:
522 for n in base:
523 has.update(repo.changelog.reachable(n))
523 has.update(repo.changelog.reachable(n))
524 if revs:
524 if revs:
525 visit = list(revs)
525 visit = list(revs)
526 else:
526 else:
527 visit = repo.changelog.heads()
527 visit = repo.changelog.heads()
528 seen = {}
528 seen = {}
529 while visit:
529 while visit:
530 n = visit.pop(0)
530 n = visit.pop(0)
531 parents = [p for p in repo.changelog.parents(n) if p not in has]
531 parents = [p for p in repo.changelog.parents(n) if p not in has]
532 if len(parents) == 0:
532 if len(parents) == 0:
533 o.insert(0, n)
533 o.insert(0, n)
534 else:
534 else:
535 for p in parents:
535 for p in parents:
536 if p not in seen:
536 if p not in seen:
537 seen[p] = 1
537 seen[p] = 1
538 visit.append(p)
538 visit.append(p)
539 else:
539 else:
540 dest = ui.expandpath(dest or 'default-push', dest or 'default')
540 dest = ui.expandpath(dest or 'default-push', dest or 'default')
541 dest, branches = hg.parseurl(dest)
541 dest, branches = hg.parseurl(dest)
542 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
542 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
543 revs, checkout = hg.addbranchrevs(repo, other, branches, revs)
543 revs, checkout = hg.addbranchrevs(repo, other, branches, revs)
544 o = repo.findoutgoing(other, force=opts.get('force'))
544 o = repo.findoutgoing(other, force=opts.get('force'))
545
545
546 if revs:
546 if revs:
547 cg = repo.changegroupsubset(o, revs, 'bundle')
547 cg = repo.changegroupsubset(o, revs, 'bundle')
548 else:
548 else:
549 cg = repo.changegroup(o, 'bundle')
549 cg = repo.changegroup(o, 'bundle')
550
550
551 bundletype = opts.get('type', 'bzip2').lower()
551 bundletype = opts.get('type', 'bzip2').lower()
552 btypes = {'none': 'HG10UN', 'bzip2': 'HG10BZ', 'gzip': 'HG10GZ'}
552 btypes = {'none': 'HG10UN', 'bzip2': 'HG10BZ', 'gzip': 'HG10GZ'}
553 bundletype = btypes.get(bundletype)
553 bundletype = btypes.get(bundletype)
554 if bundletype not in changegroup.bundletypes:
554 if bundletype not in changegroup.bundletypes:
555 raise util.Abort(_('unknown bundle type specified with --type'))
555 raise util.Abort(_('unknown bundle type specified with --type'))
556
556
557 changegroup.writebundle(cg, fname, bundletype)
557 changegroup.writebundle(cg, fname, bundletype)
558
558
559 def cat(ui, repo, file1, *pats, **opts):
559 def cat(ui, repo, file1, *pats, **opts):
560 """output the current or given revision of files
560 """output the current or given revision of files
561
561
562 Print the specified files as they were at the given revision. If
562 Print the specified files as they were at the given revision. If
563 no revision is given, the parent of the working directory is used,
563 no revision is given, the parent of the working directory is used,
564 or tip if no revision is checked out.
564 or tip if no revision is checked out.
565
565
566 Output may be to a file, in which case the name of the file is
566 Output may be to a file, in which case the name of the file is
567 given using a format string. The formatting rules are the same as
567 given using a format string. The formatting rules are the same as
568 for the export command, with the following additions:
568 for the export command, with the following additions:
569
569
570 :``%s``: basename of file being printed
570 :``%s``: basename of file being printed
571 :``%d``: dirname of file being printed, or '.' if in repository root
571 :``%d``: dirname of file being printed, or '.' if in repository root
572 :``%p``: root-relative path name of file being printed
572 :``%p``: root-relative path name of file being printed
573 """
573 """
574 ctx = repo[opts.get('rev')]
574 ctx = repo[opts.get('rev')]
575 err = 1
575 err = 1
576 m = cmdutil.match(repo, (file1,) + pats, opts)
576 m = cmdutil.match(repo, (file1,) + pats, opts)
577 for abs in ctx.walk(m):
577 for abs in ctx.walk(m):
578 fp = cmdutil.make_file(repo, opts.get('output'), ctx.node(), pathname=abs)
578 fp = cmdutil.make_file(repo, opts.get('output'), ctx.node(), pathname=abs)
579 data = ctx[abs].data()
579 data = ctx[abs].data()
580 if opts.get('decode'):
580 if opts.get('decode'):
581 data = repo.wwritedata(abs, data)
581 data = repo.wwritedata(abs, data)
582 fp.write(data)
582 fp.write(data)
583 err = 0
583 err = 0
584 return err
584 return err
585
585
586 def clone(ui, source, dest=None, **opts):
586 def clone(ui, source, dest=None, **opts):
587 """make a copy of an existing repository
587 """make a copy of an existing repository
588
588
589 Create a copy of an existing repository in a new directory.
589 Create a copy of an existing repository in a new directory.
590
590
591 If no destination directory name is specified, it defaults to the
591 If no destination directory name is specified, it defaults to the
592 basename of the source.
592 basename of the source.
593
593
594 The location of the source is added to the new repository's
594 The location of the source is added to the new repository's
595 .hg/hgrc file, as the default to be used for future pulls.
595 .hg/hgrc file, as the default to be used for future pulls.
596
596
597 See 'hg help urls' for valid source format details.
597 See 'hg help urls' for valid source format details.
598
598
599 It is possible to specify an ``ssh://`` URL as the destination, but no
599 It is possible to specify an ``ssh://`` URL as the destination, but no
600 .hg/hgrc and working directory will be created on the remote side.
600 .hg/hgrc and working directory will be created on the remote side.
601 Please see 'hg help urls' for important details about ``ssh://`` URLs.
601 Please see 'hg help urls' for important details about ``ssh://`` URLs.
602
602
603 If the -U/--noupdate option is specified, the new clone will contain
603 If the -U/--noupdate option is specified, the new clone will contain
604 only a repository (.hg) and no working copy (the working copy parent
604 only a repository (.hg) and no working copy (the working copy parent
605 will be the null changeset). Otherwise, clone will initially check
605 will be the null changeset). Otherwise, clone will initially check
606 out (in order of precedence):
606 out (in order of precedence):
607
607
608 a) the changeset, tag or branch specified with -u/--updaterev
608 a) the changeset, tag or branch specified with -u/--updaterev
609 b) the changeset, tag or branch given with the first -r/--rev
609 b) the changeset, tag or branch given with the first -r/--rev
610 c) the branch given with the url#branch source syntax
610 c) the branch given with the url#branch source syntax
611 d) the head of the default branch
611 d) the head of the default branch
612
612
613 Use 'hg clone -u . src dst' to checkout the source repository's
613 Use 'hg clone -u . src dst' to checkout the source repository's
614 parent changeset (applicable for local source repositories only).
614 parent changeset (applicable for local source repositories only).
615
615
616 A set of changesets (tags, or branch names) to pull may be specified
616 A set of changesets (tags, or branch names) to pull may be specified
617 by listing each changeset (tag, or branch name) with -r/--rev.
617 by listing each changeset (tag, or branch name) with -r/--rev.
618 If -r/--rev is used, the cloned repository will contain only a subset
618 If -r/--rev is used, the cloned repository will contain only a subset
619 of the changesets of the source repository. Only the set of changesets
619 of the changesets of the source repository. Only the set of changesets
620 defined by all -r/--rev options (including all their ancestors)
620 defined by all -r/--rev options (including all their ancestors)
621 will be pulled into the destination repository.
621 will be pulled into the destination repository.
622 No subsequent changesets (including subsequent tags) will be present
622 No subsequent changesets (including subsequent tags) will be present
623 in the destination.
623 in the destination.
624
624
625 Using -r/--rev (or 'clone src#rev dest') implies --pull, even for
625 Using -r/--rev (or 'clone src#rev dest') implies --pull, even for
626 local source repositories.
626 local source repositories.
627
627
628 For efficiency, hardlinks are used for cloning whenever the source
628 For efficiency, hardlinks are used for cloning whenever the source
629 and destination are on the same filesystem (note this applies only
629 and destination are on the same filesystem (note this applies only
630 to the repository data, not to the checked out files). Some
630 to the repository data, not to the checked out files). Some
631 filesystems, such as AFS, implement hardlinking incorrectly, but
631 filesystems, such as AFS, implement hardlinking incorrectly, but
632 do not report errors. In these cases, use the --pull option to
632 do not report errors. In these cases, use the --pull option to
633 avoid hardlinking.
633 avoid hardlinking.
634
634
635 In some cases, you can clone repositories and checked out files
635 In some cases, you can clone repositories and checked out files
636 using full hardlinks with ::
636 using full hardlinks with ::
637
637
638 $ cp -al REPO REPOCLONE
638 $ cp -al REPO REPOCLONE
639
639
640 This is the fastest way to clone, but it is not always safe. The
640 This is the fastest way to clone, but it is not always safe. The
641 operation is not atomic (making sure REPO is not modified during
641 operation is not atomic (making sure REPO is not modified during
642 the operation is up to you) and you have to make sure your editor
642 the operation is up to you) and you have to make sure your editor
643 breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,
643 breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,
644 this is not compatible with certain extensions that place their
644 this is not compatible with certain extensions that place their
645 metadata under the .hg directory, such as mq.
645 metadata under the .hg directory, such as mq.
646 """
646 """
647 if opts.get('noupdate') and opts.get('updaterev'):
647 if opts.get('noupdate') and opts.get('updaterev'):
648 raise util.Abort(_("cannot specify both --noupdate and --updaterev"))
648 raise util.Abort(_("cannot specify both --noupdate and --updaterev"))
649
649
650 hg.clone(cmdutil.remoteui(ui, opts), source, dest,
650 hg.clone(cmdutil.remoteui(ui, opts), source, dest,
651 pull=opts.get('pull'),
651 pull=opts.get('pull'),
652 stream=opts.get('uncompressed'),
652 stream=opts.get('uncompressed'),
653 rev=opts.get('rev'),
653 rev=opts.get('rev'),
654 update=opts.get('updaterev') or not opts.get('noupdate'))
654 update=opts.get('updaterev') or not opts.get('noupdate'))
655
655
656 def commit(ui, repo, *pats, **opts):
656 def commit(ui, repo, *pats, **opts):
657 """commit the specified files or all outstanding changes
657 """commit the specified files or all outstanding changes
658
658
659 Commit changes to the given files into the repository. Unlike a
659 Commit changes to the given files into the repository. Unlike a
660 centralized RCS, this operation is a local operation. See hg push
660 centralized RCS, this operation is a local operation. See hg push
661 for a way to actively distribute your changes.
661 for a way to actively distribute your changes.
662
662
663 If a list of files is omitted, all changes reported by "hg status"
663 If a list of files is omitted, all changes reported by "hg status"
664 will be committed.
664 will be committed.
665
665
666 If you are committing the result of a merge, do not provide any
666 If you are committing the result of a merge, do not provide any
667 filenames or -I/-X filters.
667 filenames or -I/-X filters.
668
668
669 If no commit message is specified, the configured editor is
669 If no commit message is specified, the configured editor is
670 started to prompt you for a message.
670 started to prompt you for a message.
671
671
672 See 'hg help dates' for a list of formats valid for -d/--date.
672 See 'hg help dates' for a list of formats valid for -d/--date.
673 """
673 """
674 extra = {}
674 extra = {}
675 if opts.get('close_branch'):
675 if opts.get('close_branch'):
676 extra['close'] = 1
676 extra['close'] = 1
677 e = cmdutil.commiteditor
677 e = cmdutil.commiteditor
678 if opts.get('force_editor'):
678 if opts.get('force_editor'):
679 e = cmdutil.commitforceeditor
679 e = cmdutil.commitforceeditor
680
680
681 def commitfunc(ui, repo, message, match, opts):
681 def commitfunc(ui, repo, message, match, opts):
682 return repo.commit(message, opts.get('user'), opts.get('date'), match,
682 return repo.commit(message, opts.get('user'), opts.get('date'), match,
683 editor=e, extra=extra)
683 editor=e, extra=extra)
684
684
685 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
685 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
686 if not node:
686 if not node:
687 ui.status(_("nothing changed\n"))
687 ui.status(_("nothing changed\n"))
688 return
688 return
689 cl = repo.changelog
689 cl = repo.changelog
690 rev = cl.rev(node)
690 rev = cl.rev(node)
691 parents = cl.parentrevs(rev)
691 parents = cl.parentrevs(rev)
692 if rev - 1 in parents:
692 if rev - 1 in parents:
693 # one of the parents was the old tip
693 # one of the parents was the old tip
694 pass
694 pass
695 elif (parents == (nullrev, nullrev) or
695 elif (parents == (nullrev, nullrev) or
696 len(cl.heads(cl.node(parents[0]))) > 1 and
696 len(cl.heads(cl.node(parents[0]))) > 1 and
697 (parents[1] == nullrev or len(cl.heads(cl.node(parents[1]))) > 1)):
697 (parents[1] == nullrev or len(cl.heads(cl.node(parents[1]))) > 1)):
698 ui.status(_('created new head\n'))
698 ui.status(_('created new head\n'))
699
699
700 if ui.debugflag:
700 if ui.debugflag:
701 ui.write(_('committed changeset %d:%s\n') % (rev, hex(node)))
701 ui.write(_('committed changeset %d:%s\n') % (rev, hex(node)))
702 elif ui.verbose:
702 elif ui.verbose:
703 ui.write(_('committed changeset %d:%s\n') % (rev, short(node)))
703 ui.write(_('committed changeset %d:%s\n') % (rev, short(node)))
704
704
705 def copy(ui, repo, *pats, **opts):
705 def copy(ui, repo, *pats, **opts):
706 """mark files as copied for the next commit
706 """mark files as copied for the next commit
707
707
708 Mark dest as having copies of source files. If dest is a
708 Mark dest as having copies of source files. If dest is a
709 directory, copies are put in that directory. If dest is a file,
709 directory, copies are put in that directory. If dest is a file,
710 the source must be a single file.
710 the source must be a single file.
711
711
712 By default, this command copies the contents of files as they
712 By default, this command copies the contents of files as they
713 exist in the working directory. If invoked with -A/--after, the
713 exist in the working directory. If invoked with -A/--after, the
714 operation is recorded, but no copying is performed.
714 operation is recorded, but no copying is performed.
715
715
716 This command takes effect with the next commit. To undo a copy
716 This command takes effect with the next commit. To undo a copy
717 before that, see hg revert.
717 before that, see hg revert.
718 """
718 """
719 wlock = repo.wlock(False)
719 wlock = repo.wlock(False)
720 try:
720 try:
721 return cmdutil.copy(ui, repo, pats, opts)
721 return cmdutil.copy(ui, repo, pats, opts)
722 finally:
722 finally:
723 wlock.release()
723 wlock.release()
724
724
725 def debugancestor(ui, repo, *args):
725 def debugancestor(ui, repo, *args):
726 """find the ancestor revision of two revisions in a given index"""
726 """find the ancestor revision of two revisions in a given index"""
727 if len(args) == 3:
727 if len(args) == 3:
728 index, rev1, rev2 = args
728 index, rev1, rev2 = args
729 r = revlog.revlog(util.opener(os.getcwd(), audit=False), index)
729 r = revlog.revlog(util.opener(os.getcwd(), audit=False), index)
730 lookup = r.lookup
730 lookup = r.lookup
731 elif len(args) == 2:
731 elif len(args) == 2:
732 if not repo:
732 if not repo:
733 raise util.Abort(_("There is no Mercurial repository here "
733 raise util.Abort(_("There is no Mercurial repository here "
734 "(.hg not found)"))
734 "(.hg not found)"))
735 rev1, rev2 = args
735 rev1, rev2 = args
736 r = repo.changelog
736 r = repo.changelog
737 lookup = repo.lookup
737 lookup = repo.lookup
738 else:
738 else:
739 raise util.Abort(_('either two or three arguments required'))
739 raise util.Abort(_('either two or three arguments required'))
740 a = r.ancestor(lookup(rev1), lookup(rev2))
740 a = r.ancestor(lookup(rev1), lookup(rev2))
741 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
741 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
742
742
743 def debugcommands(ui, cmd='', *args):
743 def debugcommands(ui, cmd='', *args):
744 for cmd, vals in sorted(table.iteritems()):
744 for cmd, vals in sorted(table.iteritems()):
745 cmd = cmd.split('|')[0].strip('^')
745 cmd = cmd.split('|')[0].strip('^')
746 opts = ', '.join([i[1] for i in vals[1]])
746 opts = ', '.join([i[1] for i in vals[1]])
747 ui.write('%s: %s\n' % (cmd, opts))
747 ui.write('%s: %s\n' % (cmd, opts))
748
748
749 def debugcomplete(ui, cmd='', **opts):
749 def debugcomplete(ui, cmd='', **opts):
750 """returns the completion list associated with the given command"""
750 """returns the completion list associated with the given command"""
751
751
752 if opts.get('options'):
752 if opts.get('options'):
753 options = []
753 options = []
754 otables = [globalopts]
754 otables = [globalopts]
755 if cmd:
755 if cmd:
756 aliases, entry = cmdutil.findcmd(cmd, table, False)
756 aliases, entry = cmdutil.findcmd(cmd, table, False)
757 otables.append(entry[1])
757 otables.append(entry[1])
758 for t in otables:
758 for t in otables:
759 for o in t:
759 for o in t:
760 if o[0]:
760 if o[0]:
761 options.append('-%s' % o[0])
761 options.append('-%s' % o[0])
762 options.append('--%s' % o[1])
762 options.append('--%s' % o[1])
763 ui.write("%s\n" % "\n".join(options))
763 ui.write("%s\n" % "\n".join(options))
764 return
764 return
765
765
766 cmdlist = cmdutil.findpossible(cmd, table)
766 cmdlist = cmdutil.findpossible(cmd, table)
767 if ui.verbose:
767 if ui.verbose:
768 cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
768 cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
769 ui.write("%s\n" % "\n".join(sorted(cmdlist)))
769 ui.write("%s\n" % "\n".join(sorted(cmdlist)))
770
770
771 def debugfsinfo(ui, path = "."):
771 def debugfsinfo(ui, path = "."):
772 open('.debugfsinfo', 'w').write('')
772 open('.debugfsinfo', 'w').write('')
773 ui.write('exec: %s\n' % (util.checkexec(path) and 'yes' or 'no'))
773 ui.write('exec: %s\n' % (util.checkexec(path) and 'yes' or 'no'))
774 ui.write('symlink: %s\n' % (util.checklink(path) and 'yes' or 'no'))
774 ui.write('symlink: %s\n' % (util.checklink(path) and 'yes' or 'no'))
775 ui.write('case-sensitive: %s\n' % (util.checkcase('.debugfsinfo')
775 ui.write('case-sensitive: %s\n' % (util.checkcase('.debugfsinfo')
776 and 'yes' or 'no'))
776 and 'yes' or 'no'))
777 os.unlink('.debugfsinfo')
777 os.unlink('.debugfsinfo')
778
778
779 def debugrebuildstate(ui, repo, rev="tip"):
779 def debugrebuildstate(ui, repo, rev="tip"):
780 """rebuild the dirstate as it would look like for the given revision"""
780 """rebuild the dirstate as it would look like for the given revision"""
781 ctx = repo[rev]
781 ctx = repo[rev]
782 wlock = repo.wlock()
782 wlock = repo.wlock()
783 try:
783 try:
784 repo.dirstate.rebuild(ctx.node(), ctx.manifest())
784 repo.dirstate.rebuild(ctx.node(), ctx.manifest())
785 finally:
785 finally:
786 wlock.release()
786 wlock.release()
787
787
788 def debugcheckstate(ui, repo):
788 def debugcheckstate(ui, repo):
789 """validate the correctness of the current dirstate"""
789 """validate the correctness of the current dirstate"""
790 parent1, parent2 = repo.dirstate.parents()
790 parent1, parent2 = repo.dirstate.parents()
791 m1 = repo[parent1].manifest()
791 m1 = repo[parent1].manifest()
792 m2 = repo[parent2].manifest()
792 m2 = repo[parent2].manifest()
793 errors = 0
793 errors = 0
794 for f in repo.dirstate:
794 for f in repo.dirstate:
795 state = repo.dirstate[f]
795 state = repo.dirstate[f]
796 if state in "nr" and f not in m1:
796 if state in "nr" and f not in m1:
797 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
797 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
798 errors += 1
798 errors += 1
799 if state in "a" and f in m1:
799 if state in "a" and f in m1:
800 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
800 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
801 errors += 1
801 errors += 1
802 if state in "m" and f not in m1 and f not in m2:
802 if state in "m" and f not in m1 and f not in m2:
803 ui.warn(_("%s in state %s, but not in either manifest\n") %
803 ui.warn(_("%s in state %s, but not in either manifest\n") %
804 (f, state))
804 (f, state))
805 errors += 1
805 errors += 1
806 for f in m1:
806 for f in m1:
807 state = repo.dirstate[f]
807 state = repo.dirstate[f]
808 if state not in "nrm":
808 if state not in "nrm":
809 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
809 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
810 errors += 1
810 errors += 1
811 if errors:
811 if errors:
812 error = _(".hg/dirstate inconsistent with current parent's manifest")
812 error = _(".hg/dirstate inconsistent with current parent's manifest")
813 raise util.Abort(error)
813 raise util.Abort(error)
814
814
815 def showconfig(ui, repo, *values, **opts):
815 def showconfig(ui, repo, *values, **opts):
816 """show combined config settings from all hgrc files
816 """show combined config settings from all hgrc files
817
817
818 With no arguments, print names and values of all config items.
818 With no arguments, print names and values of all config items.
819
819
820 With one argument of the form section.name, print just the value
820 With one argument of the form section.name, print just the value
821 of that config item.
821 of that config item.
822
822
823 With multiple arguments, print names and values of all config
823 With multiple arguments, print names and values of all config
824 items with matching section names.
824 items with matching section names.
825
825
826 With --debug, the source (filename and line number) is printed
826 With --debug, the source (filename and line number) is printed
827 for each config item.
827 for each config item.
828 """
828 """
829
829
830 untrusted = bool(opts.get('untrusted'))
830 untrusted = bool(opts.get('untrusted'))
831 if values:
831 if values:
832 if len([v for v in values if '.' in v]) > 1:
832 if len([v for v in values if '.' in v]) > 1:
833 raise util.Abort(_('only one config item permitted'))
833 raise util.Abort(_('only one config item permitted'))
834 for section, name, value in ui.walkconfig(untrusted=untrusted):
834 for section, name, value in ui.walkconfig(untrusted=untrusted):
835 sectname = section + '.' + name
835 sectname = section + '.' + name
836 if values:
836 if values:
837 for v in values:
837 for v in values:
838 if v == section:
838 if v == section:
839 ui.debug('%s: ' %
839 ui.debug('%s: ' %
840 ui.configsource(section, name, untrusted))
840 ui.configsource(section, name, untrusted))
841 ui.write('%s=%s\n' % (sectname, value))
841 ui.write('%s=%s\n' % (sectname, value))
842 elif v == sectname:
842 elif v == sectname:
843 ui.debug('%s: ' %
843 ui.debug('%s: ' %
844 ui.configsource(section, name, untrusted))
844 ui.configsource(section, name, untrusted))
845 ui.write(value, '\n')
845 ui.write(value, '\n')
846 else:
846 else:
847 ui.debug('%s: ' %
847 ui.debug('%s: ' %
848 ui.configsource(section, name, untrusted))
848 ui.configsource(section, name, untrusted))
849 ui.write('%s=%s\n' % (sectname, value))
849 ui.write('%s=%s\n' % (sectname, value))
850
850
851 def debugsetparents(ui, repo, rev1, rev2=None):
851 def debugsetparents(ui, repo, rev1, rev2=None):
852 """manually set the parents of the current working directory
852 """manually set the parents of the current working directory
853
853
854 This is useful for writing repository conversion tools, but should
854 This is useful for writing repository conversion tools, but should
855 be used with care.
855 be used with care.
856 """
856 """
857
857
858 if not rev2:
858 if not rev2:
859 rev2 = hex(nullid)
859 rev2 = hex(nullid)
860
860
861 wlock = repo.wlock()
861 wlock = repo.wlock()
862 try:
862 try:
863 repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2))
863 repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2))
864 finally:
864 finally:
865 wlock.release()
865 wlock.release()
866
866
867 def debugstate(ui, repo, nodates=None):
867 def debugstate(ui, repo, nodates=None):
868 """show the contents of the current dirstate"""
868 """show the contents of the current dirstate"""
869 timestr = ""
869 timestr = ""
870 showdate = not nodates
870 showdate = not nodates
871 for file_, ent in sorted(repo.dirstate._map.iteritems()):
871 for file_, ent in sorted(repo.dirstate._map.iteritems()):
872 if showdate:
872 if showdate:
873 if ent[3] == -1:
873 if ent[3] == -1:
874 # Pad or slice to locale representation
874 # Pad or slice to locale representation
875 locale_len = len(time.strftime("%Y-%m-%d %H:%M:%S ",
875 locale_len = len(time.strftime("%Y-%m-%d %H:%M:%S ",
876 time.localtime(0)))
876 time.localtime(0)))
877 timestr = 'unset'
877 timestr = 'unset'
878 timestr = (timestr[:locale_len] +
878 timestr = (timestr[:locale_len] +
879 ' ' * (locale_len - len(timestr)))
879 ' ' * (locale_len - len(timestr)))
880 else:
880 else:
881 timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
881 timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
882 time.localtime(ent[3]))
882 time.localtime(ent[3]))
883 if ent[1] & 020000:
883 if ent[1] & 020000:
884 mode = 'lnk'
884 mode = 'lnk'
885 else:
885 else:
886 mode = '%3o' % (ent[1] & 0777)
886 mode = '%3o' % (ent[1] & 0777)
887 ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
887 ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
888 for f in repo.dirstate.copies():
888 for f in repo.dirstate.copies():
889 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
889 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
890
890
891 def debugsub(ui, repo, rev=None):
891 def debugsub(ui, repo, rev=None):
892 if rev == '':
892 if rev == '':
893 rev = None
893 rev = None
894 for k, v in sorted(repo[rev].substate.items()):
894 for k, v in sorted(repo[rev].substate.items()):
895 ui.write('path %s\n' % k)
895 ui.write('path %s\n' % k)
896 ui.write(' source %s\n' % v[0])
896 ui.write(' source %s\n' % v[0])
897 ui.write(' revision %s\n' % v[1])
897 ui.write(' revision %s\n' % v[1])
898
898
899 def debugdata(ui, file_, rev):
899 def debugdata(ui, file_, rev):
900 """dump the contents of a data file revision"""
900 """dump the contents of a data file revision"""
901 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_[:-2] + ".i")
901 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_[:-2] + ".i")
902 try:
902 try:
903 ui.write(r.revision(r.lookup(rev)))
903 ui.write(r.revision(r.lookup(rev)))
904 except KeyError:
904 except KeyError:
905 raise util.Abort(_('invalid revision identifier %s') % rev)
905 raise util.Abort(_('invalid revision identifier %s') % rev)
906
906
907 def debugdate(ui, date, range=None, **opts):
907 def debugdate(ui, date, range=None, **opts):
908 """parse and display a date"""
908 """parse and display a date"""
909 if opts["extended"]:
909 if opts["extended"]:
910 d = util.parsedate(date, util.extendeddateformats)
910 d = util.parsedate(date, util.extendeddateformats)
911 else:
911 else:
912 d = util.parsedate(date)
912 d = util.parsedate(date)
913 ui.write("internal: %s %s\n" % d)
913 ui.write("internal: %s %s\n" % d)
914 ui.write("standard: %s\n" % util.datestr(d))
914 ui.write("standard: %s\n" % util.datestr(d))
915 if range:
915 if range:
916 m = util.matchdate(range)
916 m = util.matchdate(range)
917 ui.write("match: %s\n" % m(d[0]))
917 ui.write("match: %s\n" % m(d[0]))
918
918
919 def debugindex(ui, file_):
919 def debugindex(ui, file_):
920 """dump the contents of an index file"""
920 """dump the contents of an index file"""
921 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
921 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
922 ui.write(" rev offset length base linkrev"
922 ui.write(" rev offset length base linkrev"
923 " nodeid p1 p2\n")
923 " nodeid p1 p2\n")
924 for i in r:
924 for i in r:
925 node = r.node(i)
925 node = r.node(i)
926 try:
926 try:
927 pp = r.parents(node)
927 pp = r.parents(node)
928 except:
928 except:
929 pp = [nullid, nullid]
929 pp = [nullid, nullid]
930 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
930 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
931 i, r.start(i), r.length(i), r.base(i), r.linkrev(i),
931 i, r.start(i), r.length(i), r.base(i), r.linkrev(i),
932 short(node), short(pp[0]), short(pp[1])))
932 short(node), short(pp[0]), short(pp[1])))
933
933
934 def debugindexdot(ui, file_):
934 def debugindexdot(ui, file_):
935 """dump an index DAG as a graphviz dot file"""
935 """dump an index DAG as a graphviz dot file"""
936 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
936 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
937 ui.write("digraph G {\n")
937 ui.write("digraph G {\n")
938 for i in r:
938 for i in r:
939 node = r.node(i)
939 node = r.node(i)
940 pp = r.parents(node)
940 pp = r.parents(node)
941 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
941 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
942 if pp[1] != nullid:
942 if pp[1] != nullid:
943 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
943 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
944 ui.write("}\n")
944 ui.write("}\n")
945
945
946 def debuginstall(ui):
946 def debuginstall(ui):
947 '''test Mercurial installation'''
947 '''test Mercurial installation'''
948
948
949 def writetemp(contents):
949 def writetemp(contents):
950 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
950 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
951 f = os.fdopen(fd, "wb")
951 f = os.fdopen(fd, "wb")
952 f.write(contents)
952 f.write(contents)
953 f.close()
953 f.close()
954 return name
954 return name
955
955
956 problems = 0
956 problems = 0
957
957
958 # encoding
958 # encoding
959 ui.status(_("Checking encoding (%s)...\n") % encoding.encoding)
959 ui.status(_("Checking encoding (%s)...\n") % encoding.encoding)
960 try:
960 try:
961 encoding.fromlocal("test")
961 encoding.fromlocal("test")
962 except util.Abort, inst:
962 except util.Abort, inst:
963 ui.write(" %s\n" % inst)
963 ui.write(" %s\n" % inst)
964 ui.write(_(" (check that your locale is properly set)\n"))
964 ui.write(_(" (check that your locale is properly set)\n"))
965 problems += 1
965 problems += 1
966
966
967 # compiled modules
967 # compiled modules
968 ui.status(_("Checking extensions...\n"))
968 ui.status(_("Checking extensions...\n"))
969 try:
969 try:
970 import bdiff, mpatch, base85
970 import bdiff, mpatch, base85
971 except Exception, inst:
971 except Exception, inst:
972 ui.write(" %s\n" % inst)
972 ui.write(" %s\n" % inst)
973 ui.write(_(" One or more extensions could not be found"))
973 ui.write(_(" One or more extensions could not be found"))
974 ui.write(_(" (check that you compiled the extensions)\n"))
974 ui.write(_(" (check that you compiled the extensions)\n"))
975 problems += 1
975 problems += 1
976
976
977 # templates
977 # templates
978 ui.status(_("Checking templates...\n"))
978 ui.status(_("Checking templates...\n"))
979 try:
979 try:
980 import templater
980 import templater
981 templater.templater(templater.templatepath("map-cmdline.default"))
981 templater.templater(templater.templatepath("map-cmdline.default"))
982 except Exception, inst:
982 except Exception, inst:
983 ui.write(" %s\n" % inst)
983 ui.write(" %s\n" % inst)
984 ui.write(_(" (templates seem to have been installed incorrectly)\n"))
984 ui.write(_(" (templates seem to have been installed incorrectly)\n"))
985 problems += 1
985 problems += 1
986
986
987 # patch
987 # patch
988 ui.status(_("Checking patch...\n"))
988 ui.status(_("Checking patch...\n"))
989 patchproblems = 0
989 patchproblems = 0
990 a = "1\n2\n3\n4\n"
990 a = "1\n2\n3\n4\n"
991 b = "1\n2\n3\ninsert\n4\n"
991 b = "1\n2\n3\ninsert\n4\n"
992 fa = writetemp(a)
992 fa = writetemp(a)
993 d = mdiff.unidiff(a, None, b, None, os.path.basename(fa),
993 d = mdiff.unidiff(a, None, b, None, os.path.basename(fa),
994 os.path.basename(fa))
994 os.path.basename(fa))
995 fd = writetemp(d)
995 fd = writetemp(d)
996
996
997 files = {}
997 files = {}
998 try:
998 try:
999 patch.patch(fd, ui, cwd=os.path.dirname(fa), files=files)
999 patch.patch(fd, ui, cwd=os.path.dirname(fa), files=files)
1000 except util.Abort, e:
1000 except util.Abort, e:
1001 ui.write(_(" patch call failed:\n"))
1001 ui.write(_(" patch call failed:\n"))
1002 ui.write(" " + str(e) + "\n")
1002 ui.write(" " + str(e) + "\n")
1003 patchproblems += 1
1003 patchproblems += 1
1004 else:
1004 else:
1005 if list(files) != [os.path.basename(fa)]:
1005 if list(files) != [os.path.basename(fa)]:
1006 ui.write(_(" unexpected patch output!\n"))
1006 ui.write(_(" unexpected patch output!\n"))
1007 patchproblems += 1
1007 patchproblems += 1
1008 a = open(fa).read()
1008 a = open(fa).read()
1009 if a != b:
1009 if a != b:
1010 ui.write(_(" patch test failed!\n"))
1010 ui.write(_(" patch test failed!\n"))
1011 patchproblems += 1
1011 patchproblems += 1
1012
1012
1013 if patchproblems:
1013 if patchproblems:
1014 if ui.config('ui', 'patch'):
1014 if ui.config('ui', 'patch'):
1015 ui.write(_(" (Current patch tool may be incompatible with patch,"
1015 ui.write(_(" (Current patch tool may be incompatible with patch,"
1016 " or misconfigured. Please check your .hgrc file)\n"))
1016 " or misconfigured. Please check your .hgrc file)\n"))
1017 else:
1017 else:
1018 ui.write(_(" Internal patcher failure, please report this error"
1018 ui.write(_(" Internal patcher failure, please report this error"
1019 " to http://mercurial.selenic.com/bts/\n"))
1019 " to http://mercurial.selenic.com/bts/\n"))
1020 problems += patchproblems
1020 problems += patchproblems
1021
1021
1022 os.unlink(fa)
1022 os.unlink(fa)
1023 os.unlink(fd)
1023 os.unlink(fd)
1024
1024
1025 # editor
1025 # editor
1026 ui.status(_("Checking commit editor...\n"))
1026 ui.status(_("Checking commit editor...\n"))
1027 editor = ui.geteditor()
1027 editor = ui.geteditor()
1028 cmdpath = util.find_exe(editor) or util.find_exe(editor.split()[0])
1028 cmdpath = util.find_exe(editor) or util.find_exe(editor.split()[0])
1029 if not cmdpath:
1029 if not cmdpath:
1030 if editor == 'vi':
1030 if editor == 'vi':
1031 ui.write(_(" No commit editor set and can't find vi in PATH\n"))
1031 ui.write(_(" No commit editor set and can't find vi in PATH\n"))
1032 ui.write(_(" (specify a commit editor in your .hgrc file)\n"))
1032 ui.write(_(" (specify a commit editor in your .hgrc file)\n"))
1033 else:
1033 else:
1034 ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
1034 ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
1035 ui.write(_(" (specify a commit editor in your .hgrc file)\n"))
1035 ui.write(_(" (specify a commit editor in your .hgrc file)\n"))
1036 problems += 1
1036 problems += 1
1037
1037
1038 # check username
1038 # check username
1039 ui.status(_("Checking username...\n"))
1039 ui.status(_("Checking username...\n"))
1040 try:
1040 try:
1041 user = ui.username()
1041 user = ui.username()
1042 except util.Abort, e:
1042 except util.Abort, e:
1043 ui.write(" %s\n" % e)
1043 ui.write(" %s\n" % e)
1044 ui.write(_(" (specify a username in your .hgrc file)\n"))
1044 ui.write(_(" (specify a username in your .hgrc file)\n"))
1045 problems += 1
1045 problems += 1
1046
1046
1047 if not problems:
1047 if not problems:
1048 ui.status(_("No problems detected\n"))
1048 ui.status(_("No problems detected\n"))
1049 else:
1049 else:
1050 ui.write(_("%s problems detected,"
1050 ui.write(_("%s problems detected,"
1051 " please check your install!\n") % problems)
1051 " please check your install!\n") % problems)
1052
1052
1053 return problems
1053 return problems
1054
1054
1055 def debugrename(ui, repo, file1, *pats, **opts):
1055 def debugrename(ui, repo, file1, *pats, **opts):
1056 """dump rename information"""
1056 """dump rename information"""
1057
1057
1058 ctx = repo[opts.get('rev')]
1058 ctx = repo[opts.get('rev')]
1059 m = cmdutil.match(repo, (file1,) + pats, opts)
1059 m = cmdutil.match(repo, (file1,) + pats, opts)
1060 for abs in ctx.walk(m):
1060 for abs in ctx.walk(m):
1061 fctx = ctx[abs]
1061 fctx = ctx[abs]
1062 o = fctx.filelog().renamed(fctx.filenode())
1062 o = fctx.filelog().renamed(fctx.filenode())
1063 rel = m.rel(abs)
1063 rel = m.rel(abs)
1064 if o:
1064 if o:
1065 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
1065 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
1066 else:
1066 else:
1067 ui.write(_("%s not renamed\n") % rel)
1067 ui.write(_("%s not renamed\n") % rel)
1068
1068
1069 def debugwalk(ui, repo, *pats, **opts):
1069 def debugwalk(ui, repo, *pats, **opts):
1070 """show how files match on given patterns"""
1070 """show how files match on given patterns"""
1071 m = cmdutil.match(repo, pats, opts)
1071 m = cmdutil.match(repo, pats, opts)
1072 items = list(repo.walk(m))
1072 items = list(repo.walk(m))
1073 if not items:
1073 if not items:
1074 return
1074 return
1075 fmt = 'f %%-%ds %%-%ds %%s' % (
1075 fmt = 'f %%-%ds %%-%ds %%s' % (
1076 max([len(abs) for abs in items]),
1076 max([len(abs) for abs in items]),
1077 max([len(m.rel(abs)) for abs in items]))
1077 max([len(m.rel(abs)) for abs in items]))
1078 for abs in items:
1078 for abs in items:
1079 line = fmt % (abs, m.rel(abs), m.exact(abs) and 'exact' or '')
1079 line = fmt % (abs, m.rel(abs), m.exact(abs) and 'exact' or '')
1080 ui.write("%s\n" % line.rstrip())
1080 ui.write("%s\n" % line.rstrip())
1081
1081
1082 def diff(ui, repo, *pats, **opts):
1082 def diff(ui, repo, *pats, **opts):
1083 """diff repository (or selected files)
1083 """diff repository (or selected files)
1084
1084
1085 Show differences between revisions for the specified files.
1085 Show differences between revisions for the specified files.
1086
1086
1087 Differences between files are shown using the unified diff format.
1087 Differences between files are shown using the unified diff format.
1088
1088
1089 NOTE: diff may generate unexpected results for merges, as it will
1089 NOTE: diff may generate unexpected results for merges, as it will
1090 default to comparing against the working directory's first parent
1090 default to comparing against the working directory's first parent
1091 changeset if no revisions are specified.
1091 changeset if no revisions are specified.
1092
1092
1093 When two revision arguments are given, then changes are shown
1093 When two revision arguments are given, then changes are shown
1094 between those revisions. If only one revision is specified then
1094 between those revisions. If only one revision is specified then
1095 that revision is compared to the working directory, and, when no
1095 that revision is compared to the working directory, and, when no
1096 revisions are specified, the working directory files are compared
1096 revisions are specified, the working directory files are compared
1097 to its parent.
1097 to its parent.
1098
1098
1099 Without the -a/--text option, diff will avoid generating diffs of
1099 Without the -a/--text option, diff will avoid generating diffs of
1100 files it detects as binary. With -a, diff will generate a diff
1100 files it detects as binary. With -a, diff will generate a diff
1101 anyway, probably with undesirable results.
1101 anyway, probably with undesirable results.
1102
1102
1103 Use the -g/--git option to generate diffs in the git extended diff
1103 Use the -g/--git option to generate diffs in the git extended diff
1104 format. For more information, read 'hg help diffs'.
1104 format. For more information, read 'hg help diffs'.
1105 """
1105 """
1106
1106
1107 revs = opts.get('rev')
1107 revs = opts.get('rev')
1108 change = opts.get('change')
1108 change = opts.get('change')
1109 stat = opts.get('stat')
1109 stat = opts.get('stat')
1110 reverse = opts.get('reverse')
1110 reverse = opts.get('reverse')
1111
1111
1112 if revs and change:
1112 if revs and change:
1113 msg = _('cannot specify --rev and --change at the same time')
1113 msg = _('cannot specify --rev and --change at the same time')
1114 raise util.Abort(msg)
1114 raise util.Abort(msg)
1115 elif change:
1115 elif change:
1116 node2 = repo.lookup(change)
1116 node2 = repo.lookup(change)
1117 node1 = repo[node2].parents()[0].node()
1117 node1 = repo[node2].parents()[0].node()
1118 else:
1118 else:
1119 node1, node2 = cmdutil.revpair(repo, revs)
1119 node1, node2 = cmdutil.revpair(repo, revs)
1120
1120
1121 if reverse:
1121 if reverse:
1122 node1, node2 = node2, node1
1122 node1, node2 = node2, node1
1123
1123
1124 if stat:
1124 if stat:
1125 opts['unified'] = '0'
1125 opts['unified'] = '0'
1126 diffopts = patch.diffopts(ui, opts)
1126 diffopts = patch.diffopts(ui, opts)
1127
1127
1128 m = cmdutil.match(repo, pats, opts)
1128 m = cmdutil.match(repo, pats, opts)
1129 it = patch.diff(repo, node1, node2, match=m, opts=diffopts)
1129 it = patch.diff(repo, node1, node2, match=m, opts=diffopts)
1130 if stat:
1130 if stat:
1131 width = ui.interactive() and util.termwidth() or 80
1131 width = ui.interactive() and util.termwidth() or 80
1132 ui.write(patch.diffstat(util.iterlines(it), width=width,
1132 ui.write(patch.diffstat(util.iterlines(it), width=width,
1133 git=diffopts.git))
1133 git=diffopts.git))
1134 else:
1134 else:
1135 for chunk in it:
1135 for chunk in it:
1136 ui.write(chunk)
1136 ui.write(chunk)
1137
1137
1138 def export(ui, repo, *changesets, **opts):
1138 def export(ui, repo, *changesets, **opts):
1139 """dump the header and diffs for one or more changesets
1139 """dump the header and diffs for one or more changesets
1140
1140
1141 Print the changeset header and diffs for one or more revisions.
1141 Print the changeset header and diffs for one or more revisions.
1142
1142
1143 The information shown in the changeset header is: author, date,
1143 The information shown in the changeset header is: author, date,
1144 branch name (if non-default), changeset hash, parent(s) and commit
1144 branch name (if non-default), changeset hash, parent(s) and commit
1145 comment.
1145 comment.
1146
1146
1147 NOTE: export may generate unexpected diff output for merge
1147 NOTE: export may generate unexpected diff output for merge
1148 changesets, as it will compare the merge changeset against its
1148 changesets, as it will compare the merge changeset against its
1149 first parent only.
1149 first parent only.
1150
1150
1151 Output may be to a file, in which case the name of the file is
1151 Output may be to a file, in which case the name of the file is
1152 given using a format string. The formatting rules are as follows:
1152 given using a format string. The formatting rules are as follows:
1153
1153
1154 :``%%``: literal "%" character
1154 :``%%``: literal "%" character
1155 :``%H``: changeset hash (40 bytes of hexadecimal)
1155 :``%H``: changeset hash (40 bytes of hexadecimal)
1156 :``%N``: number of patches being generated
1156 :``%N``: number of patches being generated
1157 :``%R``: changeset revision number
1157 :``%R``: changeset revision number
1158 :``%b``: basename of the exporting repository
1158 :``%b``: basename of the exporting repository
1159 :``%h``: short-form changeset hash (12 bytes of hexadecimal)
1159 :``%h``: short-form changeset hash (12 bytes of hexadecimal)
1160 :``%n``: zero-padded sequence number, starting at 1
1160 :``%n``: zero-padded sequence number, starting at 1
1161 :``%r``: zero-padded changeset revision number
1161 :``%r``: zero-padded changeset revision number
1162
1162
1163 Without the -a/--text option, export will avoid generating diffs
1163 Without the -a/--text option, export will avoid generating diffs
1164 of files it detects as binary. With -a, export will generate a
1164 of files it detects as binary. With -a, export will generate a
1165 diff anyway, probably with undesirable results.
1165 diff anyway, probably with undesirable results.
1166
1166
1167 Use the -g/--git option to generate diffs in the git extended diff
1167 Use the -g/--git option to generate diffs in the git extended diff
1168 format. See 'hg help diffs' for more information.
1168 format. See 'hg help diffs' for more information.
1169
1169
1170 With the --switch-parent option, the diff will be against the
1170 With the --switch-parent option, the diff will be against the
1171 second parent. It can be useful to review a merge.
1171 second parent. It can be useful to review a merge.
1172 """
1172 """
1173 changesets += tuple(opts.get('rev', []))
1173 changesets += tuple(opts.get('rev', []))
1174 if not changesets:
1174 if not changesets:
1175 raise util.Abort(_("export requires at least one changeset"))
1175 raise util.Abort(_("export requires at least one changeset"))
1176 revs = cmdutil.revrange(repo, changesets)
1176 revs = cmdutil.revrange(repo, changesets)
1177 if len(revs) > 1:
1177 if len(revs) > 1:
1178 ui.note(_('exporting patches:\n'))
1178 ui.note(_('exporting patches:\n'))
1179 else:
1179 else:
1180 ui.note(_('exporting patch:\n'))
1180 ui.note(_('exporting patch:\n'))
1181 patch.export(repo, revs, template=opts.get('output'),
1181 patch.export(repo, revs, template=opts.get('output'),
1182 switch_parent=opts.get('switch_parent'),
1182 switch_parent=opts.get('switch_parent'),
1183 opts=patch.diffopts(ui, opts))
1183 opts=patch.diffopts(ui, opts))
1184
1184
1185 def forget(ui, repo, *pats, **opts):
1185 def forget(ui, repo, *pats, **opts):
1186 """forget the specified files on the next commit
1186 """forget the specified files on the next commit
1187
1187
1188 Mark the specified files so they will no longer be tracked
1188 Mark the specified files so they will no longer be tracked
1189 after the next commit.
1189 after the next commit.
1190
1190
1191 This only removes files from the current branch, not from the
1191 This only removes files from the current branch, not from the
1192 entire project history, and it does not delete them from the
1192 entire project history, and it does not delete them from the
1193 working directory.
1193 working directory.
1194
1194
1195 To undo a forget before the next commit, see hg add.
1195 To undo a forget before the next commit, see hg add.
1196 """
1196 """
1197
1197
1198 if not pats:
1198 if not pats:
1199 raise util.Abort(_('no files specified'))
1199 raise util.Abort(_('no files specified'))
1200
1200
1201 m = cmdutil.match(repo, pats, opts)
1201 m = cmdutil.match(repo, pats, opts)
1202 s = repo.status(match=m, clean=True)
1202 s = repo.status(match=m, clean=True)
1203 forget = sorted(s[0] + s[1] + s[3] + s[6])
1203 forget = sorted(s[0] + s[1] + s[3] + s[6])
1204
1204
1205 for f in m.files():
1205 for f in m.files():
1206 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
1206 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
1207 ui.warn(_('not removing %s: file is already untracked\n')
1207 ui.warn(_('not removing %s: file is already untracked\n')
1208 % m.rel(f))
1208 % m.rel(f))
1209
1209
1210 for f in forget:
1210 for f in forget:
1211 if ui.verbose or not m.exact(f):
1211 if ui.verbose or not m.exact(f):
1212 ui.status(_('removing %s\n') % m.rel(f))
1212 ui.status(_('removing %s\n') % m.rel(f))
1213
1213
1214 repo.remove(forget, unlink=False)
1214 repo.remove(forget, unlink=False)
1215
1215
1216 def grep(ui, repo, pattern, *pats, **opts):
1216 def grep(ui, repo, pattern, *pats, **opts):
1217 """search for a pattern in specified files and revisions
1217 """search for a pattern in specified files and revisions
1218
1218
1219 Search revisions of files for a regular expression.
1219 Search revisions of files for a regular expression.
1220
1220
1221 This command behaves differently than Unix grep. It only accepts
1221 This command behaves differently than Unix grep. It only accepts
1222 Python/Perl regexps. It searches repository history, not the
1222 Python/Perl regexps. It searches repository history, not the
1223 working directory. It always prints the revision number in which a
1223 working directory. It always prints the revision number in which a
1224 match appears.
1224 match appears.
1225
1225
1226 By default, grep only prints output for the first revision of a
1226 By default, grep only prints output for the first revision of a
1227 file in which it finds a match. To get it to print every revision
1227 file in which it finds a match. To get it to print every revision
1228 that contains a change in match status ("-" for a match that
1228 that contains a change in match status ("-" for a match that
1229 becomes a non-match, or "+" for a non-match that becomes a match),
1229 becomes a non-match, or "+" for a non-match that becomes a match),
1230 use the --all flag.
1230 use the --all flag.
1231 """
1231 """
1232 reflags = 0
1232 reflags = 0
1233 if opts.get('ignore_case'):
1233 if opts.get('ignore_case'):
1234 reflags |= re.I
1234 reflags |= re.I
1235 try:
1235 try:
1236 regexp = re.compile(pattern, reflags)
1236 regexp = re.compile(pattern, reflags)
1237 except Exception, inst:
1237 except Exception, inst:
1238 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
1238 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
1239 return None
1239 return None
1240 sep, eol = ':', '\n'
1240 sep, eol = ':', '\n'
1241 if opts.get('print0'):
1241 if opts.get('print0'):
1242 sep = eol = '\0'
1242 sep = eol = '\0'
1243
1243
1244 getfile = util.lrucachefunc(repo.file)
1244 getfile = util.lrucachefunc(repo.file)
1245
1245
1246 def matchlines(body):
1246 def matchlines(body):
1247 begin = 0
1247 begin = 0
1248 linenum = 0
1248 linenum = 0
1249 while True:
1249 while True:
1250 match = regexp.search(body, begin)
1250 match = regexp.search(body, begin)
1251 if not match:
1251 if not match:
1252 break
1252 break
1253 mstart, mend = match.span()
1253 mstart, mend = match.span()
1254 linenum += body.count('\n', begin, mstart) + 1
1254 linenum += body.count('\n', begin, mstart) + 1
1255 lstart = body.rfind('\n', begin, mstart) + 1 or begin
1255 lstart = body.rfind('\n', begin, mstart) + 1 or begin
1256 begin = body.find('\n', mend) + 1 or len(body)
1256 begin = body.find('\n', mend) + 1 or len(body)
1257 lend = begin - 1
1257 lend = begin - 1
1258 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
1258 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
1259
1259
1260 class linestate(object):
1260 class linestate(object):
1261 def __init__(self, line, linenum, colstart, colend):
1261 def __init__(self, line, linenum, colstart, colend):
1262 self.line = line
1262 self.line = line
1263 self.linenum = linenum
1263 self.linenum = linenum
1264 self.colstart = colstart
1264 self.colstart = colstart
1265 self.colend = colend
1265 self.colend = colend
1266
1266
1267 def __hash__(self):
1267 def __hash__(self):
1268 return hash((self.linenum, self.line))
1268 return hash((self.linenum, self.line))
1269
1269
1270 def __eq__(self, other):
1270 def __eq__(self, other):
1271 return self.line == other.line
1271 return self.line == other.line
1272
1272
1273 matches = {}
1273 matches = {}
1274 copies = {}
1274 copies = {}
1275 def grepbody(fn, rev, body):
1275 def grepbody(fn, rev, body):
1276 matches[rev].setdefault(fn, [])
1276 matches[rev].setdefault(fn, [])
1277 m = matches[rev][fn]
1277 m = matches[rev][fn]
1278 for lnum, cstart, cend, line in matchlines(body):
1278 for lnum, cstart, cend, line in matchlines(body):
1279 s = linestate(line, lnum, cstart, cend)
1279 s = linestate(line, lnum, cstart, cend)
1280 m.append(s)
1280 m.append(s)
1281
1281
1282 def difflinestates(a, b):
1282 def difflinestates(a, b):
1283 sm = difflib.SequenceMatcher(None, a, b)
1283 sm = difflib.SequenceMatcher(None, a, b)
1284 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
1284 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
1285 if tag == 'insert':
1285 if tag == 'insert':
1286 for i in xrange(blo, bhi):
1286 for i in xrange(blo, bhi):
1287 yield ('+', b[i])
1287 yield ('+', b[i])
1288 elif tag == 'delete':
1288 elif tag == 'delete':
1289 for i in xrange(alo, ahi):
1289 for i in xrange(alo, ahi):
1290 yield ('-', a[i])
1290 yield ('-', a[i])
1291 elif tag == 'replace':
1291 elif tag == 'replace':
1292 for i in xrange(alo, ahi):
1292 for i in xrange(alo, ahi):
1293 yield ('-', a[i])
1293 yield ('-', a[i])
1294 for i in xrange(blo, bhi):
1294 for i in xrange(blo, bhi):
1295 yield ('+', b[i])
1295 yield ('+', b[i])
1296
1296
1297 def display(fn, ctx, pstates, states):
1297 def display(fn, ctx, pstates, states):
1298 rev = ctx.rev()
1298 rev = ctx.rev()
1299 datefunc = ui.quiet and util.shortdate or util.datestr
1299 datefunc = ui.quiet and util.shortdate or util.datestr
1300 found = False
1300 found = False
1301 filerevmatches = {}
1301 filerevmatches = {}
1302 if opts.get('all'):
1302 if opts.get('all'):
1303 iter = difflinestates(pstates, states)
1303 iter = difflinestates(pstates, states)
1304 else:
1304 else:
1305 iter = [('', l) for l in states]
1305 iter = [('', l) for l in states]
1306 for change, l in iter:
1306 for change, l in iter:
1307 cols = [fn, str(rev)]
1307 cols = [fn, str(rev)]
1308 if opts.get('line_number'):
1308 if opts.get('line_number'):
1309 cols.append(str(l.linenum))
1309 cols.append(str(l.linenum))
1310 if opts.get('all'):
1310 if opts.get('all'):
1311 cols.append(change)
1311 cols.append(change)
1312 if opts.get('user'):
1312 if opts.get('user'):
1313 cols.append(ui.shortuser(ctx.user()))
1313 cols.append(ui.shortuser(ctx.user()))
1314 if opts.get('date'):
1314 if opts.get('date'):
1315 cols.append(datefunc(ctx.date()))
1315 cols.append(datefunc(ctx.date()))
1316 if opts.get('files_with_matches'):
1316 if opts.get('files_with_matches'):
1317 c = (fn, rev)
1317 c = (fn, rev)
1318 if c in filerevmatches:
1318 if c in filerevmatches:
1319 continue
1319 continue
1320 filerevmatches[c] = 1
1320 filerevmatches[c] = 1
1321 else:
1321 else:
1322 cols.append(l.line)
1322 cols.append(l.line)
1323 ui.write(sep.join(cols), eol)
1323 ui.write(sep.join(cols), eol)
1324 found = True
1324 found = True
1325 return found
1325 return found
1326
1326
1327 skip = {}
1327 skip = {}
1328 revfiles = {}
1328 revfiles = {}
1329 matchfn = cmdutil.match(repo, pats, opts)
1329 matchfn = cmdutil.match(repo, pats, opts)
1330 found = False
1330 found = False
1331 follow = opts.get('follow')
1331 follow = opts.get('follow')
1332
1332
1333 def prep(ctx, fns):
1333 def prep(ctx, fns):
1334 rev = ctx.rev()
1334 rev = ctx.rev()
1335 pctx = ctx.parents()[0]
1335 pctx = ctx.parents()[0]
1336 parent = pctx.rev()
1336 parent = pctx.rev()
1337 matches.setdefault(rev, {})
1337 matches.setdefault(rev, {})
1338 matches.setdefault(parent, {})
1338 matches.setdefault(parent, {})
1339 files = revfiles.setdefault(rev, [])
1339 files = revfiles.setdefault(rev, [])
1340 for fn in fns:
1340 for fn in fns:
1341 flog = getfile(fn)
1341 flog = getfile(fn)
1342 try:
1342 try:
1343 fnode = ctx.filenode(fn)
1343 fnode = ctx.filenode(fn)
1344 except error.LookupError:
1344 except error.LookupError:
1345 continue
1345 continue
1346
1346
1347 copied = flog.renamed(fnode)
1347 copied = flog.renamed(fnode)
1348 copy = follow and copied and copied[0]
1348 copy = follow and copied and copied[0]
1349 if copy:
1349 if copy:
1350 copies.setdefault(rev, {})[fn] = copy
1350 copies.setdefault(rev, {})[fn] = copy
1351 if fn in skip:
1351 if fn in skip:
1352 if copy:
1352 if copy:
1353 skip[copy] = True
1353 skip[copy] = True
1354 continue
1354 continue
1355 files.append(fn)
1355 files.append(fn)
1356
1356
1357 if fn not in matches[rev]:
1357 if fn not in matches[rev]:
1358 grepbody(fn, rev, flog.read(fnode))
1358 grepbody(fn, rev, flog.read(fnode))
1359
1359
1360 pfn = copy or fn
1360 pfn = copy or fn
1361 if pfn not in matches[parent]:
1361 if pfn not in matches[parent]:
1362 try:
1362 try:
1363 fnode = pctx.filenode(pfn)
1363 fnode = pctx.filenode(pfn)
1364 grepbody(pfn, parent, flog.read(fnode))
1364 grepbody(pfn, parent, flog.read(fnode))
1365 except error.LookupError:
1365 except error.LookupError:
1366 pass
1366 pass
1367
1367
1368 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
1368 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
1369 rev = ctx.rev()
1369 rev = ctx.rev()
1370 parent = ctx.parents()[0].rev()
1370 parent = ctx.parents()[0].rev()
1371 for fn in sorted(revfiles.get(rev, [])):
1371 for fn in sorted(revfiles.get(rev, [])):
1372 states = matches[rev][fn]
1372 states = matches[rev][fn]
1373 copy = copies.get(rev, {}).get(fn)
1373 copy = copies.get(rev, {}).get(fn)
1374 if fn in skip:
1374 if fn in skip:
1375 if copy:
1375 if copy:
1376 skip[copy] = True
1376 skip[copy] = True
1377 continue
1377 continue
1378 pstates = matches.get(parent, {}).get(copy or fn, [])
1378 pstates = matches.get(parent, {}).get(copy or fn, [])
1379 if pstates or states:
1379 if pstates or states:
1380 r = display(fn, ctx, pstates, states)
1380 r = display(fn, ctx, pstates, states)
1381 found = found or r
1381 found = found or r
1382 if r and not opts.get('all'):
1382 if r and not opts.get('all'):
1383 skip[fn] = True
1383 skip[fn] = True
1384 if copy:
1384 if copy:
1385 skip[copy] = True
1385 skip[copy] = True
1386 del matches[rev]
1386 del matches[rev]
1387 del revfiles[rev]
1387 del revfiles[rev]
1388
1388
1389 def heads(ui, repo, *branchrevs, **opts):
1389 def heads(ui, repo, *branchrevs, **opts):
1390 """show current repository heads or show branch heads
1390 """show current repository heads or show branch heads
1391
1391
1392 With no arguments, show all repository branch heads.
1392 With no arguments, show all repository branch heads.
1393
1393
1394 Repository "heads" are changesets with no child changesets. They are
1394 Repository "heads" are changesets with no child changesets. They are
1395 where development generally takes place and are the usual targets
1395 where development generally takes place and are the usual targets
1396 for update and merge operations. Branch heads are changesets that have
1396 for update and merge operations. Branch heads are changesets that have
1397 no child changeset on the same branch.
1397 no child changeset on the same branch.
1398
1398
1399 If one or more REVs are given, only branch heads on the branches
1399 If one or more REVs are given, only branch heads on the branches
1400 associated with the specified changesets are shown.
1400 associated with the specified changesets are shown.
1401
1401
1402 If -c/--closed is specified, also show branch heads marked closed
1402 If -c/--closed is specified, also show branch heads marked closed
1403 (see hg commit --close-branch).
1403 (see hg commit --close-branch).
1404
1404
1405 If STARTREV is specified, only those heads that are descendants of
1405 If STARTREV is specified, only those heads that are descendants of
1406 STARTREV will be displayed.
1406 STARTREV will be displayed.
1407
1407
1408 If -t/--topo is specified, named branch mechanics will be ignored and only
1408 If -t/--topo is specified, named branch mechanics will be ignored and only
1409 changesets without children will be shown.
1409 changesets without children will be shown.
1410 """
1410 """
1411
1411
1412 if opts.get('rev'):
1412 if opts.get('rev'):
1413 start = repo.lookup(opts['rev'])
1413 start = repo.lookup(opts['rev'])
1414 else:
1414 else:
1415 start = None
1415 start = None
1416
1416
1417 if opts.get('topo'):
1417 if opts.get('topo'):
1418 heads = [repo[h] for h in repo.heads(start)]
1418 heads = [repo[h] for h in repo.heads(start)]
1419 else:
1419 else:
1420 heads = []
1420 heads = []
1421 for b, ls in repo.branchmap().iteritems():
1421 for b, ls in repo.branchmap().iteritems():
1422 if start is None:
1422 if start is None:
1423 heads += [repo[h] for h in ls]
1423 heads += [repo[h] for h in ls]
1424 continue
1424 continue
1425 startrev = repo.changelog.rev(start)
1425 startrev = repo.changelog.rev(start)
1426 descendants = set(repo.changelog.descendants(startrev))
1426 descendants = set(repo.changelog.descendants(startrev))
1427 descendants.add(startrev)
1427 descendants.add(startrev)
1428 rev = repo.changelog.rev
1428 rev = repo.changelog.rev
1429 heads += [repo[h] for h in ls if rev(h) in descendants]
1429 heads += [repo[h] for h in ls if rev(h) in descendants]
1430
1430
1431 if branchrevs:
1431 if branchrevs:
1432 decode, encode = encoding.fromlocal, encoding.tolocal
1432 decode, encode = encoding.fromlocal, encoding.tolocal
1433 branches = set(repo[decode(br)].branch() for br in branchrevs)
1433 branches = set(repo[decode(br)].branch() for br in branchrevs)
1434 heads = [h for h in heads if h.branch() in branches]
1434 heads = [h for h in heads if h.branch() in branches]
1435
1435
1436 if not opts.get('closed'):
1436 if not opts.get('closed'):
1437 heads = [h for h in heads if not h.extra().get('close')]
1437 heads = [h for h in heads if not h.extra().get('close')]
1438
1438
1439 if opts.get('active') and branchrevs:
1439 if opts.get('active') and branchrevs:
1440 dagheads = repo.heads(start)
1440 dagheads = repo.heads(start)
1441 heads = [h for h in heads if h.node() in dagheads]
1441 heads = [h for h in heads if h.node() in dagheads]
1442
1442
1443 if branchrevs:
1443 if branchrevs:
1444 haveheads = set(h.branch() for h in heads)
1444 haveheads = set(h.branch() for h in heads)
1445 if branches - haveheads:
1445 if branches - haveheads:
1446 headless = ', '.join(encode(b) for b in branches - haveheads)
1446 headless = ', '.join(encode(b) for b in branches - haveheads)
1447 msg = _('no open branch heads found on branches %s')
1447 msg = _('no open branch heads found on branches %s')
1448 if opts.get('rev'):
1448 if opts.get('rev'):
1449 msg += _(' (started at %s)' % opts['rev'])
1449 msg += _(' (started at %s)' % opts['rev'])
1450 ui.warn((msg + '\n') % headless)
1450 ui.warn((msg + '\n') % headless)
1451
1451
1452 if not heads:
1452 if not heads:
1453 return 1
1453 return 1
1454
1454
1455 heads = sorted(heads, key=lambda x: -x.rev())
1455 heads = sorted(heads, key=lambda x: -x.rev())
1456 displayer = cmdutil.show_changeset(ui, repo, opts)
1456 displayer = cmdutil.show_changeset(ui, repo, opts)
1457 for ctx in heads:
1457 for ctx in heads:
1458 displayer.show(ctx)
1458 displayer.show(ctx)
1459 displayer.close()
1459 displayer.close()
1460
1460
1461 def help_(ui, name=None, with_version=False, unknowncmd=False):
1461 def help_(ui, name=None, with_version=False, unknowncmd=False):
1462 """show help for a given topic or a help overview
1462 """show help for a given topic or a help overview
1463
1463
1464 With no arguments, print a list of commands with short help messages.
1464 With no arguments, print a list of commands with short help messages.
1465
1465
1466 Given a topic, extension, or command name, print help for that
1466 Given a topic, extension, or command name, print help for that
1467 topic."""
1467 topic."""
1468 option_lists = []
1468 option_lists = []
1469 textwidth = util.termwidth() - 2
1469 textwidth = util.termwidth() - 2
1470
1470
1471 def addglobalopts(aliases):
1471 def addglobalopts(aliases):
1472 if ui.verbose:
1472 if ui.verbose:
1473 option_lists.append((_("global options:"), globalopts))
1473 option_lists.append((_("global options:"), globalopts))
1474 if name == 'shortlist':
1474 if name == 'shortlist':
1475 option_lists.append((_('use "hg help" for the full list '
1475 option_lists.append((_('use "hg help" for the full list '
1476 'of commands'), ()))
1476 'of commands'), ()))
1477 else:
1477 else:
1478 if name == 'shortlist':
1478 if name == 'shortlist':
1479 msg = _('use "hg help" for the full list of commands '
1479 msg = _('use "hg help" for the full list of commands '
1480 'or "hg -v" for details')
1480 'or "hg -v" for details')
1481 elif aliases:
1481 elif aliases:
1482 msg = _('use "hg -v help%s" to show aliases and '
1482 msg = _('use "hg -v help%s" to show aliases and '
1483 'global options') % (name and " " + name or "")
1483 'global options') % (name and " " + name or "")
1484 else:
1484 else:
1485 msg = _('use "hg -v help %s" to show global options') % name
1485 msg = _('use "hg -v help %s" to show global options') % name
1486 option_lists.append((msg, ()))
1486 option_lists.append((msg, ()))
1487
1487
1488 def helpcmd(name):
1488 def helpcmd(name):
1489 if with_version:
1489 if with_version:
1490 version_(ui)
1490 version_(ui)
1491 ui.write('\n')
1491 ui.write('\n')
1492
1492
1493 try:
1493 try:
1494 aliases, entry = cmdutil.findcmd(name, table, strict=unknowncmd)
1494 aliases, entry = cmdutil.findcmd(name, table, strict=unknowncmd)
1495 except error.AmbiguousCommand, inst:
1495 except error.AmbiguousCommand, inst:
1496 # py3k fix: except vars can't be used outside the scope of the
1496 # py3k fix: except vars can't be used outside the scope of the
1497 # except block, nor can be used inside a lambda. python issue4617
1497 # except block, nor can be used inside a lambda. python issue4617
1498 prefix = inst.args[0]
1498 prefix = inst.args[0]
1499 select = lambda c: c.lstrip('^').startswith(prefix)
1499 select = lambda c: c.lstrip('^').startswith(prefix)
1500 helplist(_('list of commands:\n\n'), select)
1500 helplist(_('list of commands:\n\n'), select)
1501 return
1501 return
1502
1502
1503 # check if it's an invalid alias and display its error if it is
1503 # check if it's an invalid alias and display its error if it is
1504 if getattr(entry[0], 'badalias', False):
1504 if getattr(entry[0], 'badalias', False):
1505 if not unknowncmd:
1505 if not unknowncmd:
1506 entry[0](ui)
1506 entry[0](ui)
1507 return
1507 return
1508
1508
1509 # synopsis
1509 # synopsis
1510 if len(entry) > 2:
1510 if len(entry) > 2:
1511 if entry[2].startswith('hg'):
1511 if entry[2].startswith('hg'):
1512 ui.write("%s\n" % entry[2])
1512 ui.write("%s\n" % entry[2])
1513 else:
1513 else:
1514 ui.write('hg %s %s\n' % (aliases[0], entry[2]))
1514 ui.write('hg %s %s\n' % (aliases[0], entry[2]))
1515 else:
1515 else:
1516 ui.write('hg %s\n' % aliases[0])
1516 ui.write('hg %s\n' % aliases[0])
1517
1517
1518 # aliases
1518 # aliases
1519 if not ui.quiet and len(aliases) > 1:
1519 if not ui.quiet and len(aliases) > 1:
1520 ui.write(_("\naliases: %s\n") % ', '.join(aliases[1:]))
1520 ui.write(_("\naliases: %s\n") % ', '.join(aliases[1:]))
1521
1521
1522 # description
1522 # description
1523 doc = gettext(entry[0].__doc__)
1523 doc = gettext(entry[0].__doc__)
1524 if not doc:
1524 if not doc:
1525 doc = _("(no help text available)")
1525 doc = _("(no help text available)")
1526 if ui.quiet:
1526 if ui.quiet:
1527 doc = doc.splitlines()[0]
1527 doc = doc.splitlines()[0]
1528 ui.write("\n%s\n" % minirst.format(doc, textwidth))
1528 ui.write("\n%s\n" % minirst.format(doc, textwidth))
1529
1529
1530 if not ui.quiet:
1530 if not ui.quiet:
1531 # options
1531 # options
1532 if entry[1]:
1532 if entry[1]:
1533 option_lists.append((_("options:\n"), entry[1]))
1533 option_lists.append((_("options:\n"), entry[1]))
1534
1534
1535 addglobalopts(False)
1535 addglobalopts(False)
1536
1536
1537 def helplist(header, select=None):
1537 def helplist(header, select=None):
1538 h = {}
1538 h = {}
1539 cmds = {}
1539 cmds = {}
1540 for c, e in table.iteritems():
1540 for c, e in table.iteritems():
1541 f = c.split("|", 1)[0]
1541 f = c.split("|", 1)[0]
1542 if select and not select(f):
1542 if select and not select(f):
1543 continue
1543 continue
1544 if (not select and name != 'shortlist' and
1544 if (not select and name != 'shortlist' and
1545 e[0].__module__ != __name__):
1545 e[0].__module__ != __name__):
1546 continue
1546 continue
1547 if name == "shortlist" and not f.startswith("^"):
1547 if name == "shortlist" and not f.startswith("^"):
1548 continue
1548 continue
1549 f = f.lstrip("^")
1549 f = f.lstrip("^")
1550 if not ui.debugflag and f.startswith("debug"):
1550 if not ui.debugflag and f.startswith("debug"):
1551 continue
1551 continue
1552 doc = e[0].__doc__
1552 doc = e[0].__doc__
1553 if doc and 'DEPRECATED' in doc and not ui.verbose:
1553 if doc and 'DEPRECATED' in doc and not ui.verbose:
1554 continue
1554 continue
1555 doc = gettext(doc)
1555 doc = gettext(doc)
1556 if not doc:
1556 if not doc:
1557 doc = _("(no help text available)")
1557 doc = _("(no help text available)")
1558 h[f] = doc.splitlines()[0].rstrip()
1558 h[f] = doc.splitlines()[0].rstrip()
1559 cmds[f] = c.lstrip("^")
1559 cmds[f] = c.lstrip("^")
1560
1560
1561 if not h:
1561 if not h:
1562 ui.status(_('no commands defined\n'))
1562 ui.status(_('no commands defined\n'))
1563 return
1563 return
1564
1564
1565 ui.status(header)
1565 ui.status(header)
1566 fns = sorted(h)
1566 fns = sorted(h)
1567 m = max(map(len, fns))
1567 m = max(map(len, fns))
1568 for f in fns:
1568 for f in fns:
1569 if ui.verbose:
1569 if ui.verbose:
1570 commands = cmds[f].replace("|",", ")
1570 commands = cmds[f].replace("|",", ")
1571 ui.write(" %s:\n %s\n"%(commands, h[f]))
1571 ui.write(" %s:\n %s\n"%(commands, h[f]))
1572 else:
1572 else:
1573 ui.write(' %-*s %s\n' % (m, f, util.wrap(h[f], m + 4)))
1573 ui.write(' %-*s %s\n' % (m, f, util.wrap(h[f], m + 4)))
1574
1574
1575 if not ui.quiet:
1575 if not ui.quiet:
1576 addglobalopts(True)
1576 addglobalopts(True)
1577
1577
1578 def helptopic(name):
1578 def helptopic(name):
1579 for names, header, doc in help.helptable:
1579 for names, header, doc in help.helptable:
1580 if name in names:
1580 if name in names:
1581 break
1581 break
1582 else:
1582 else:
1583 raise error.UnknownCommand(name)
1583 raise error.UnknownCommand(name)
1584
1584
1585 # description
1585 # description
1586 if not doc:
1586 if not doc:
1587 doc = _("(no help text available)")
1587 doc = _("(no help text available)")
1588 if hasattr(doc, '__call__'):
1588 if hasattr(doc, '__call__'):
1589 doc = doc()
1589 doc = doc()
1590
1590
1591 ui.write("%s\n\n" % header)
1591 ui.write("%s\n\n" % header)
1592 ui.write("%s\n" % minirst.format(doc, textwidth, indent=4))
1592 ui.write("%s\n" % minirst.format(doc, textwidth, indent=4))
1593
1593
1594 def helpext(name):
1594 def helpext(name):
1595 try:
1595 try:
1596 mod = extensions.find(name)
1596 mod = extensions.find(name)
1597 doc = gettext(mod.__doc__) or _('no help text available')
1597 doc = gettext(mod.__doc__) or _('no help text available')
1598 except KeyError:
1598 except KeyError:
1599 mod = None
1599 mod = None
1600 doc = extensions.disabledext(name)
1600 doc = extensions.disabledext(name)
1601 if not doc:
1601 if not doc:
1602 raise error.UnknownCommand(name)
1602 raise error.UnknownCommand(name)
1603
1603
1604 if '\n' not in doc:
1604 if '\n' not in doc:
1605 head, tail = doc, ""
1605 head, tail = doc, ""
1606 else:
1606 else:
1607 head, tail = doc.split('\n', 1)
1607 head, tail = doc.split('\n', 1)
1608 ui.write(_('%s extension - %s\n\n') % (name.split('.')[-1], head))
1608 ui.write(_('%s extension - %s\n\n') % (name.split('.')[-1], head))
1609 if tail:
1609 if tail:
1610 ui.write(minirst.format(tail, textwidth))
1610 ui.write(minirst.format(tail, textwidth))
1611 ui.status('\n\n')
1611 ui.status('\n\n')
1612
1612
1613 if mod:
1613 if mod:
1614 try:
1614 try:
1615 ct = mod.cmdtable
1615 ct = mod.cmdtable
1616 except AttributeError:
1616 except AttributeError:
1617 ct = {}
1617 ct = {}
1618 modcmds = set([c.split('|', 1)[0] for c in ct])
1618 modcmds = set([c.split('|', 1)[0] for c in ct])
1619 helplist(_('list of commands:\n\n'), modcmds.__contains__)
1619 helplist(_('list of commands:\n\n'), modcmds.__contains__)
1620 else:
1620 else:
1621 ui.write(_('use "hg help extensions" for information on enabling '
1621 ui.write(_('use "hg help extensions" for information on enabling '
1622 'extensions\n'))
1622 'extensions\n'))
1623
1623
1624 def helpextcmd(name):
1624 def helpextcmd(name):
1625 cmd, ext, mod = extensions.disabledcmd(name, ui.config('ui', 'strict'))
1625 cmd, ext, mod = extensions.disabledcmd(name, ui.config('ui', 'strict'))
1626 doc = gettext(mod.__doc__).splitlines()[0]
1626 doc = gettext(mod.__doc__).splitlines()[0]
1627
1627
1628 msg = help.listexts(_("'%s' is provided by the following "
1628 msg = help.listexts(_("'%s' is provided by the following "
1629 "extension:") % cmd, {ext: doc}, len(ext),
1629 "extension:") % cmd, {ext: doc}, len(ext),
1630 indent=4)
1630 indent=4)
1631 ui.write(minirst.format(msg, textwidth))
1631 ui.write(minirst.format(msg, textwidth))
1632 ui.write('\n\n')
1632 ui.write('\n\n')
1633 ui.write(_('use "hg help extensions" for information on enabling '
1633 ui.write(_('use "hg help extensions" for information on enabling '
1634 'extensions\n'))
1634 'extensions\n'))
1635
1635
1636 if name and name != 'shortlist':
1636 if name and name != 'shortlist':
1637 i = None
1637 i = None
1638 if unknowncmd:
1638 if unknowncmd:
1639 queries = (helpextcmd,)
1639 queries = (helpextcmd,)
1640 else:
1640 else:
1641 queries = (helptopic, helpcmd, helpext, helpextcmd)
1641 queries = (helptopic, helpcmd, helpext, helpextcmd)
1642 for f in queries:
1642 for f in queries:
1643 try:
1643 try:
1644 f(name)
1644 f(name)
1645 i = None
1645 i = None
1646 break
1646 break
1647 except error.UnknownCommand, inst:
1647 except error.UnknownCommand, inst:
1648 i = inst
1648 i = inst
1649 if i:
1649 if i:
1650 raise i
1650 raise i
1651
1651
1652 else:
1652 else:
1653 # program name
1653 # program name
1654 if ui.verbose or with_version:
1654 if ui.verbose or with_version:
1655 version_(ui)
1655 version_(ui)
1656 else:
1656 else:
1657 ui.status(_("Mercurial Distributed SCM\n"))
1657 ui.status(_("Mercurial Distributed SCM\n"))
1658 ui.status('\n')
1658 ui.status('\n')
1659
1659
1660 # list of commands
1660 # list of commands
1661 if name == "shortlist":
1661 if name == "shortlist":
1662 header = _('basic commands:\n\n')
1662 header = _('basic commands:\n\n')
1663 else:
1663 else:
1664 header = _('list of commands:\n\n')
1664 header = _('list of commands:\n\n')
1665
1665
1666 helplist(header)
1666 helplist(header)
1667 if name != 'shortlist':
1667 if name != 'shortlist':
1668 exts, maxlength = extensions.enabled()
1668 exts, maxlength = extensions.enabled()
1669 text = help.listexts(_('enabled extensions:'), exts, maxlength)
1669 text = help.listexts(_('enabled extensions:'), exts, maxlength)
1670 if text:
1670 if text:
1671 ui.write("\n%s\n" % minirst.format(text, textwidth))
1671 ui.write("\n%s\n" % minirst.format(text, textwidth))
1672
1672
1673 # list all option lists
1673 # list all option lists
1674 opt_output = []
1674 opt_output = []
1675 for title, options in option_lists:
1675 for title, options in option_lists:
1676 opt_output.append(("\n%s" % title, None))
1676 opt_output.append(("\n%s" % title, None))
1677 for shortopt, longopt, default, desc in options:
1677 for shortopt, longopt, default, desc in options:
1678 if _("DEPRECATED") in desc and not ui.verbose:
1678 if _("DEPRECATED") in desc and not ui.verbose:
1679 continue
1679 continue
1680 opt_output.append(("%2s%s" % (shortopt and "-%s" % shortopt,
1680 opt_output.append(("%2s%s" % (shortopt and "-%s" % shortopt,
1681 longopt and " --%s" % longopt),
1681 longopt and " --%s" % longopt),
1682 "%s%s" % (desc,
1682 "%s%s" % (desc,
1683 default
1683 default
1684 and _(" (default: %s)") % default
1684 and _(" (default: %s)") % default
1685 or "")))
1685 or "")))
1686
1686
1687 if not name:
1687 if not name:
1688 ui.write(_("\nadditional help topics:\n\n"))
1688 ui.write(_("\nadditional help topics:\n\n"))
1689 topics = []
1689 topics = []
1690 for names, header, doc in help.helptable:
1690 for names, header, doc in help.helptable:
1691 topics.append((sorted(names, key=len, reverse=True)[0], header))
1691 topics.append((sorted(names, key=len, reverse=True)[0], header))
1692 topics_len = max([len(s[0]) for s in topics])
1692 topics_len = max([len(s[0]) for s in topics])
1693 for t, desc in topics:
1693 for t, desc in topics:
1694 ui.write(" %-*s %s\n" % (topics_len, t, desc))
1694 ui.write(" %-*s %s\n" % (topics_len, t, desc))
1695
1695
1696 if opt_output:
1696 if opt_output:
1697 opts_len = max([len(line[0]) for line in opt_output if line[1]] or [0])
1697 opts_len = max([len(line[0]) for line in opt_output if line[1]] or [0])
1698 for first, second in opt_output:
1698 for first, second in opt_output:
1699 if second:
1699 if second:
1700 second = util.wrap(second, opts_len + 3)
1700 second = util.wrap(second, opts_len + 3)
1701 ui.write(" %-*s %s\n" % (opts_len, first, second))
1701 ui.write(" %-*s %s\n" % (opts_len, first, second))
1702 else:
1702 else:
1703 ui.write("%s\n" % first)
1703 ui.write("%s\n" % first)
1704
1704
1705 def identify(ui, repo, source=None,
1705 def identify(ui, repo, source=None,
1706 rev=None, num=None, id=None, branch=None, tags=None):
1706 rev=None, num=None, id=None, branch=None, tags=None):
1707 """identify the working copy or specified revision
1707 """identify the working copy or specified revision
1708
1708
1709 With no revision, print a summary of the current state of the
1709 With no revision, print a summary of the current state of the
1710 repository.
1710 repository.
1711
1711
1712 Specifying a path to a repository root or Mercurial bundle will
1712 Specifying a path to a repository root or Mercurial bundle will
1713 cause lookup to operate on that repository/bundle.
1713 cause lookup to operate on that repository/bundle.
1714
1714
1715 This summary identifies the repository state using one or two
1715 This summary identifies the repository state using one or two
1716 parent hash identifiers, followed by a "+" if there are
1716 parent hash identifiers, followed by a "+" if there are
1717 uncommitted changes in the working directory, a list of tags for
1717 uncommitted changes in the working directory, a list of tags for
1718 this revision and a branch name for non-default branches.
1718 this revision and a branch name for non-default branches.
1719 """
1719 """
1720
1720
1721 if not repo and not source:
1721 if not repo and not source:
1722 raise util.Abort(_("There is no Mercurial repository here "
1722 raise util.Abort(_("There is no Mercurial repository here "
1723 "(.hg not found)"))
1723 "(.hg not found)"))
1724
1724
1725 hexfunc = ui.debugflag and hex or short
1725 hexfunc = ui.debugflag and hex or short
1726 default = not (num or id or branch or tags)
1726 default = not (num or id or branch or tags)
1727 output = []
1727 output = []
1728
1728
1729 revs = []
1729 revs = []
1730 if source:
1730 if source:
1731 source, branches = hg.parseurl(ui.expandpath(source))
1731 source, branches = hg.parseurl(ui.expandpath(source))
1732 repo = hg.repository(ui, source)
1732 repo = hg.repository(ui, source)
1733 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
1733 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
1734
1734
1735 if not repo.local():
1735 if not repo.local():
1736 if not rev and revs:
1736 if not rev and revs:
1737 rev = revs[0]
1737 rev = revs[0]
1738 if not rev:
1738 if not rev:
1739 rev = "tip"
1739 rev = "tip"
1740 if num or branch or tags:
1740 if num or branch or tags:
1741 raise util.Abort(
1741 raise util.Abort(
1742 "can't query remote revision number, branch, or tags")
1742 "can't query remote revision number, branch, or tags")
1743 output = [hexfunc(repo.lookup(rev))]
1743 output = [hexfunc(repo.lookup(rev))]
1744 elif not rev:
1744 elif not rev:
1745 ctx = repo[None]
1745 ctx = repo[None]
1746 parents = ctx.parents()
1746 parents = ctx.parents()
1747 changed = False
1747 changed = False
1748 if default or id or num:
1748 if default or id or num:
1749 changed = ctx.files() + ctx.deleted()
1749 changed = ctx.files() + ctx.deleted()
1750 if default or id:
1750 if default or id:
1751 output = ["%s%s" % ('+'.join([hexfunc(p.node()) for p in parents]),
1751 output = ["%s%s" % ('+'.join([hexfunc(p.node()) for p in parents]),
1752 (changed) and "+" or "")]
1752 (changed) and "+" or "")]
1753 if num:
1753 if num:
1754 output.append("%s%s" % ('+'.join([str(p.rev()) for p in parents]),
1754 output.append("%s%s" % ('+'.join([str(p.rev()) for p in parents]),
1755 (changed) and "+" or ""))
1755 (changed) and "+" or ""))
1756 else:
1756 else:
1757 ctx = repo[rev]
1757 ctx = repo[rev]
1758 if default or id:
1758 if default or id:
1759 output = [hexfunc(ctx.node())]
1759 output = [hexfunc(ctx.node())]
1760 if num:
1760 if num:
1761 output.append(str(ctx.rev()))
1761 output.append(str(ctx.rev()))
1762
1762
1763 if repo.local() and default and not ui.quiet:
1763 if repo.local() and default and not ui.quiet:
1764 b = encoding.tolocal(ctx.branch())
1764 b = encoding.tolocal(ctx.branch())
1765 if b != 'default':
1765 if b != 'default':
1766 output.append("(%s)" % b)
1766 output.append("(%s)" % b)
1767
1767
1768 # multiple tags for a single parent separated by '/'
1768 # multiple tags for a single parent separated by '/'
1769 t = "/".join(ctx.tags())
1769 t = "/".join(ctx.tags())
1770 if t:
1770 if t:
1771 output.append(t)
1771 output.append(t)
1772
1772
1773 if branch:
1773 if branch:
1774 output.append(encoding.tolocal(ctx.branch()))
1774 output.append(encoding.tolocal(ctx.branch()))
1775
1775
1776 if tags:
1776 if tags:
1777 output.extend(ctx.tags())
1777 output.extend(ctx.tags())
1778
1778
1779 ui.write("%s\n" % ' '.join(output))
1779 ui.write("%s\n" % ' '.join(output))
1780
1780
1781 def import_(ui, repo, patch1, *patches, **opts):
1781 def import_(ui, repo, patch1, *patches, **opts):
1782 """import an ordered set of patches
1782 """import an ordered set of patches
1783
1783
1784 Import a list of patches and commit them individually (unless
1784 Import a list of patches and commit them individually (unless
1785 --no-commit is specified).
1785 --no-commit is specified).
1786
1786
1787 If there are outstanding changes in the working directory, import
1787 If there are outstanding changes in the working directory, import
1788 will abort unless given the -f/--force flag.
1788 will abort unless given the -f/--force flag.
1789
1789
1790 You can import a patch straight from a mail message. Even patches
1790 You can import a patch straight from a mail message. Even patches
1791 as attachments work (to use the body part, it must have type
1791 as attachments work (to use the body part, it must have type
1792 text/plain or text/x-patch). From and Subject headers of email
1792 text/plain or text/x-patch). From and Subject headers of email
1793 message are used as default committer and commit message. All
1793 message are used as default committer and commit message. All
1794 text/plain body parts before first diff are added to commit
1794 text/plain body parts before first diff are added to commit
1795 message.
1795 message.
1796
1796
1797 If the imported patch was generated by hg export, user and
1797 If the imported patch was generated by hg export, user and
1798 description from patch override values from message headers and
1798 description from patch override values from message headers and
1799 body. Values given on command line with -m/--message and -u/--user
1799 body. Values given on command line with -m/--message and -u/--user
1800 override these.
1800 override these.
1801
1801
1802 If --exact is specified, import will set the working directory to
1802 If --exact is specified, import will set the working directory to
1803 the parent of each patch before applying it, and will abort if the
1803 the parent of each patch before applying it, and will abort if the
1804 resulting changeset has a different ID than the one recorded in
1804 resulting changeset has a different ID than the one recorded in
1805 the patch. This may happen due to character set problems or other
1805 the patch. This may happen due to character set problems or other
1806 deficiencies in the text patch format.
1806 deficiencies in the text patch format.
1807
1807
1808 With -s/--similarity, hg will attempt to discover renames and
1808 With -s/--similarity, hg will attempt to discover renames and
1809 copies in the patch in the same way as 'addremove'.
1809 copies in the patch in the same way as 'addremove'.
1810
1810
1811 To read a patch from standard input, use "-" as the patch name. If
1811 To read a patch from standard input, use "-" as the patch name. If
1812 a URL is specified, the patch will be downloaded from it.
1812 a URL is specified, the patch will be downloaded from it.
1813 See 'hg help dates' for a list of formats valid for -d/--date.
1813 See 'hg help dates' for a list of formats valid for -d/--date.
1814 """
1814 """
1815 patches = (patch1,) + patches
1815 patches = (patch1,) + patches
1816
1816
1817 date = opts.get('date')
1817 date = opts.get('date')
1818 if date:
1818 if date:
1819 opts['date'] = util.parsedate(date)
1819 opts['date'] = util.parsedate(date)
1820
1820
1821 try:
1821 try:
1822 sim = float(opts.get('similarity') or 0)
1822 sim = float(opts.get('similarity') or 0)
1823 except ValueError:
1823 except ValueError:
1824 raise util.Abort(_('similarity must be a number'))
1824 raise util.Abort(_('similarity must be a number'))
1825 if sim < 0 or sim > 100:
1825 if sim < 0 or sim > 100:
1826 raise util.Abort(_('similarity must be between 0 and 100'))
1826 raise util.Abort(_('similarity must be between 0 and 100'))
1827
1827
1828 if opts.get('exact') or not opts.get('force'):
1828 if opts.get('exact') or not opts.get('force'):
1829 cmdutil.bail_if_changed(repo)
1829 cmdutil.bail_if_changed(repo)
1830
1830
1831 d = opts["base"]
1831 d = opts["base"]
1832 strip = opts["strip"]
1832 strip = opts["strip"]
1833 wlock = lock = None
1833 wlock = lock = None
1834 try:
1834 try:
1835 wlock = repo.wlock()
1835 wlock = repo.wlock()
1836 lock = repo.lock()
1836 lock = repo.lock()
1837 for p in patches:
1837 for p in patches:
1838 pf = os.path.join(d, p)
1838 pf = os.path.join(d, p)
1839
1839
1840 if pf == '-':
1840 if pf == '-':
1841 ui.status(_("applying patch from stdin\n"))
1841 ui.status(_("applying patch from stdin\n"))
1842 pf = sys.stdin
1842 pf = sys.stdin
1843 else:
1843 else:
1844 ui.status(_("applying %s\n") % p)
1844 ui.status(_("applying %s\n") % p)
1845 pf = url.open(ui, pf)
1845 pf = url.open(ui, pf)
1846 data = patch.extract(ui, pf)
1846 data = patch.extract(ui, pf)
1847 tmpname, message, user, date, branch, nodeid, p1, p2 = data
1847 tmpname, message, user, date, branch, nodeid, p1, p2 = data
1848
1848
1849 if tmpname is None:
1849 if tmpname is None:
1850 raise util.Abort(_('no diffs found'))
1850 raise util.Abort(_('no diffs found'))
1851
1851
1852 try:
1852 try:
1853 cmdline_message = cmdutil.logmessage(opts)
1853 cmdline_message = cmdutil.logmessage(opts)
1854 if cmdline_message:
1854 if cmdline_message:
1855 # pickup the cmdline msg
1855 # pickup the cmdline msg
1856 message = cmdline_message
1856 message = cmdline_message
1857 elif message:
1857 elif message:
1858 # pickup the patch msg
1858 # pickup the patch msg
1859 message = message.strip()
1859 message = message.strip()
1860 else:
1860 else:
1861 # launch the editor
1861 # launch the editor
1862 message = None
1862 message = None
1863 ui.debug('message:\n%s\n' % message)
1863 ui.debug('message:\n%s\n' % message)
1864
1864
1865 wp = repo.parents()
1865 wp = repo.parents()
1866 if opts.get('exact'):
1866 if opts.get('exact'):
1867 if not nodeid or not p1:
1867 if not nodeid or not p1:
1868 raise util.Abort(_('not a Mercurial patch'))
1868 raise util.Abort(_('not a Mercurial patch'))
1869 p1 = repo.lookup(p1)
1869 p1 = repo.lookup(p1)
1870 p2 = repo.lookup(p2 or hex(nullid))
1870 p2 = repo.lookup(p2 or hex(nullid))
1871
1871
1872 if p1 != wp[0].node():
1872 if p1 != wp[0].node():
1873 hg.clean(repo, p1)
1873 hg.clean(repo, p1)
1874 repo.dirstate.setparents(p1, p2)
1874 repo.dirstate.setparents(p1, p2)
1875 elif p2:
1875 elif p2:
1876 try:
1876 try:
1877 p1 = repo.lookup(p1)
1877 p1 = repo.lookup(p1)
1878 p2 = repo.lookup(p2)
1878 p2 = repo.lookup(p2)
1879 if p1 == wp[0].node():
1879 if p1 == wp[0].node():
1880 repo.dirstate.setparents(p1, p2)
1880 repo.dirstate.setparents(p1, p2)
1881 except error.RepoError:
1881 except error.RepoError:
1882 pass
1882 pass
1883 if opts.get('exact') or opts.get('import_branch'):
1883 if opts.get('exact') or opts.get('import_branch'):
1884 repo.dirstate.setbranch(branch or 'default')
1884 repo.dirstate.setbranch(branch or 'default')
1885
1885
1886 files = {}
1886 files = {}
1887 try:
1887 try:
1888 patch.patch(tmpname, ui, strip=strip, cwd=repo.root,
1888 patch.patch(tmpname, ui, strip=strip, cwd=repo.root,
1889 files=files, eolmode=None)
1889 files=files, eolmode=None)
1890 finally:
1890 finally:
1891 files = patch.updatedir(ui, repo, files,
1891 files = patch.updatedir(ui, repo, files,
1892 similarity=sim / 100.0)
1892 similarity=sim / 100.0)
1893 if not opts.get('no_commit'):
1893 if not opts.get('no_commit'):
1894 m = cmdutil.matchfiles(repo, files or [])
1894 m = cmdutil.matchfiles(repo, files or [])
1895 n = repo.commit(message, opts.get('user') or user,
1895 n = repo.commit(message, opts.get('user') or user,
1896 opts.get('date') or date, match=m,
1896 opts.get('date') or date, match=m,
1897 editor=cmdutil.commiteditor)
1897 editor=cmdutil.commiteditor)
1898 if opts.get('exact'):
1898 if opts.get('exact'):
1899 if hex(n) != nodeid:
1899 if hex(n) != nodeid:
1900 repo.rollback()
1900 repo.rollback()
1901 raise util.Abort(_('patch is damaged'
1901 raise util.Abort(_('patch is damaged'
1902 ' or loses information'))
1902 ' or loses information'))
1903 # Force a dirstate write so that the next transaction
1903 # Force a dirstate write so that the next transaction
1904 # backups an up-do-date file.
1904 # backups an up-do-date file.
1905 repo.dirstate.write()
1905 repo.dirstate.write()
1906 finally:
1906 finally:
1907 os.unlink(tmpname)
1907 os.unlink(tmpname)
1908 finally:
1908 finally:
1909 release(lock, wlock)
1909 release(lock, wlock)
1910
1910
1911 def incoming(ui, repo, source="default", **opts):
1911 def incoming(ui, repo, source="default", **opts):
1912 """show new changesets found in source
1912 """show new changesets found in source
1913
1913
1914 Show new changesets found in the specified path/URL or the default
1914 Show new changesets found in the specified path/URL or the default
1915 pull location. These are the changesets that would have been pulled
1915 pull location. These are the changesets that would have been pulled
1916 if a pull at the time you issued this command.
1916 if a pull at the time you issued this command.
1917
1917
1918 For remote repository, using --bundle avoids downloading the
1918 For remote repository, using --bundle avoids downloading the
1919 changesets twice if the incoming is followed by a pull.
1919 changesets twice if the incoming is followed by a pull.
1920
1920
1921 See pull for valid source format details.
1921 See pull for valid source format details.
1922 """
1922 """
1923 limit = cmdutil.loglimit(opts)
1923 limit = cmdutil.loglimit(opts)
1924 source, branches = hg.parseurl(ui.expandpath(source))
1924 source, branches = hg.parseurl(ui.expandpath(source))
1925 other = hg.repository(cmdutil.remoteui(repo, opts), source)
1925 other = hg.repository(cmdutil.remoteui(repo, opts), source)
1926 ui.status(_('comparing with %s\n') % url.hidepassword(source))
1926 ui.status(_('comparing with %s\n') % url.hidepassword(source))
1927 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
1927 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
1928 if revs:
1928 if revs:
1929 revs = [other.lookup(rev) for rev in revs]
1929 revs = [other.lookup(rev) for rev in revs]
1930 common, incoming, rheads = repo.findcommonincoming(other, heads=revs,
1930 common, incoming, rheads = repo.findcommonincoming(other, heads=revs,
1931 force=opts["force"])
1931 force=opts["force"])
1932 if not incoming:
1932 if not incoming:
1933 try:
1933 try:
1934 os.unlink(opts["bundle"])
1934 os.unlink(opts["bundle"])
1935 except:
1935 except:
1936 pass
1936 pass
1937 ui.status(_("no changes found\n"))
1937 ui.status(_("no changes found\n"))
1938 return 1
1938 return 1
1939
1939
1940 cleanup = None
1940 cleanup = None
1941 try:
1941 try:
1942 fname = opts["bundle"]
1942 fname = opts["bundle"]
1943 if fname or not other.local():
1943 if fname or not other.local():
1944 # create a bundle (uncompressed if other repo is not local)
1944 # create a bundle (uncompressed if other repo is not local)
1945
1945
1946 if revs is None and other.capable('changegroupsubset'):
1946 if revs is None and other.capable('changegroupsubset'):
1947 revs = rheads
1947 revs = rheads
1948
1948
1949 if revs is None:
1949 if revs is None:
1950 cg = other.changegroup(incoming, "incoming")
1950 cg = other.changegroup(incoming, "incoming")
1951 else:
1951 else:
1952 cg = other.changegroupsubset(incoming, revs, 'incoming')
1952 cg = other.changegroupsubset(incoming, revs, 'incoming')
1953 bundletype = other.local() and "HG10BZ" or "HG10UN"
1953 bundletype = other.local() and "HG10BZ" or "HG10UN"
1954 fname = cleanup = changegroup.writebundle(cg, fname, bundletype)
1954 fname = cleanup = changegroup.writebundle(cg, fname, bundletype)
1955 # keep written bundle?
1955 # keep written bundle?
1956 if opts["bundle"]:
1956 if opts["bundle"]:
1957 cleanup = None
1957 cleanup = None
1958 if not other.local():
1958 if not other.local():
1959 # use the created uncompressed bundlerepo
1959 # use the created uncompressed bundlerepo
1960 other = bundlerepo.bundlerepository(ui, repo.root, fname)
1960 other = bundlerepo.bundlerepository(ui, repo.root, fname)
1961
1961
1962 o = other.changelog.nodesbetween(incoming, revs)[0]
1962 o = other.changelog.nodesbetween(incoming, revs)[0]
1963 if opts.get('newest_first'):
1963 if opts.get('newest_first'):
1964 o.reverse()
1964 o.reverse()
1965 displayer = cmdutil.show_changeset(ui, other, opts)
1965 displayer = cmdutil.show_changeset(ui, other, opts)
1966 count = 0
1966 count = 0
1967 for n in o:
1967 for n in o:
1968 if limit is not None and count >= limit:
1968 if limit is not None and count >= limit:
1969 break
1969 break
1970 parents = [p for p in other.changelog.parents(n) if p != nullid]
1970 parents = [p for p in other.changelog.parents(n) if p != nullid]
1971 if opts.get('no_merges') and len(parents) == 2:
1971 if opts.get('no_merges') and len(parents) == 2:
1972 continue
1972 continue
1973 count += 1
1973 count += 1
1974 displayer.show(other[n])
1974 displayer.show(other[n])
1975 displayer.close()
1975 displayer.close()
1976 finally:
1976 finally:
1977 if hasattr(other, 'close'):
1977 if hasattr(other, 'close'):
1978 other.close()
1978 other.close()
1979 if cleanup:
1979 if cleanup:
1980 os.unlink(cleanup)
1980 os.unlink(cleanup)
1981
1981
1982 def init(ui, dest=".", **opts):
1982 def init(ui, dest=".", **opts):
1983 """create a new repository in the given directory
1983 """create a new repository in the given directory
1984
1984
1985 Initialize a new repository in the given directory. If the given
1985 Initialize a new repository in the given directory. If the given
1986 directory does not exist, it will be created.
1986 directory does not exist, it will be created.
1987
1987
1988 If no directory is given, the current directory is used.
1988 If no directory is given, the current directory is used.
1989
1989
1990 It is possible to specify an ``ssh://`` URL as the destination.
1990 It is possible to specify an ``ssh://`` URL as the destination.
1991 See 'hg help urls' for more information.
1991 See 'hg help urls' for more information.
1992 """
1992 """
1993 hg.repository(cmdutil.remoteui(ui, opts), dest, create=1)
1993 hg.repository(cmdutil.remoteui(ui, opts), dest, create=1)
1994
1994
1995 def locate(ui, repo, *pats, **opts):
1995 def locate(ui, repo, *pats, **opts):
1996 """locate files matching specific patterns
1996 """locate files matching specific patterns
1997
1997
1998 Print files under Mercurial control in the working directory whose
1998 Print files under Mercurial control in the working directory whose
1999 names match the given patterns.
1999 names match the given patterns.
2000
2000
2001 By default, this command searches all directories in the working
2001 By default, this command searches all directories in the working
2002 directory. To search just the current directory and its
2002 directory. To search just the current directory and its
2003 subdirectories, use "--include .".
2003 subdirectories, use "--include .".
2004
2004
2005 If no patterns are given to match, this command prints the names
2005 If no patterns are given to match, this command prints the names
2006 of all files under Mercurial control in the working directory.
2006 of all files under Mercurial control in the working directory.
2007
2007
2008 If you want to feed the output of this command into the "xargs"
2008 If you want to feed the output of this command into the "xargs"
2009 command, use the -0 option to both this command and "xargs". This
2009 command, use the -0 option to both this command and "xargs". This
2010 will avoid the problem of "xargs" treating single filenames that
2010 will avoid the problem of "xargs" treating single filenames that
2011 contain whitespace as multiple filenames.
2011 contain whitespace as multiple filenames.
2012 """
2012 """
2013 end = opts.get('print0') and '\0' or '\n'
2013 end = opts.get('print0') and '\0' or '\n'
2014 rev = opts.get('rev') or None
2014 rev = opts.get('rev') or None
2015
2015
2016 ret = 1
2016 ret = 1
2017 m = cmdutil.match(repo, pats, opts, default='relglob')
2017 m = cmdutil.match(repo, pats, opts, default='relglob')
2018 m.bad = lambda x, y: False
2018 m.bad = lambda x, y: False
2019 for abs in repo[rev].walk(m):
2019 for abs in repo[rev].walk(m):
2020 if not rev and abs not in repo.dirstate:
2020 if not rev and abs not in repo.dirstate:
2021 continue
2021 continue
2022 if opts.get('fullpath'):
2022 if opts.get('fullpath'):
2023 ui.write(repo.wjoin(abs), end)
2023 ui.write(repo.wjoin(abs), end)
2024 else:
2024 else:
2025 ui.write(((pats and m.rel(abs)) or abs), end)
2025 ui.write(((pats and m.rel(abs)) or abs), end)
2026 ret = 0
2026 ret = 0
2027
2027
2028 return ret
2028 return ret
2029
2029
2030 def log(ui, repo, *pats, **opts):
2030 def log(ui, repo, *pats, **opts):
2031 """show revision history of entire repository or files
2031 """show revision history of entire repository or files
2032
2032
2033 Print the revision history of the specified files or the entire
2033 Print the revision history of the specified files or the entire
2034 project.
2034 project.
2035
2035
2036 File history is shown without following rename or copy history of
2036 File history is shown without following rename or copy history of
2037 files. Use -f/--follow with a filename to follow history across
2037 files. Use -f/--follow with a filename to follow history across
2038 renames and copies. --follow without a filename will only show
2038 renames and copies. --follow without a filename will only show
2039 ancestors or descendants of the starting revision. --follow-first
2039 ancestors or descendants of the starting revision. --follow-first
2040 only follows the first parent of merge revisions.
2040 only follows the first parent of merge revisions.
2041
2041
2042 If no revision range is specified, the default is tip:0 unless
2042 If no revision range is specified, the default is tip:0 unless
2043 --follow is set, in which case the working directory parent is
2043 --follow is set, in which case the working directory parent is
2044 used as the starting revision.
2044 used as the starting revision.
2045
2045
2046 See 'hg help dates' for a list of formats valid for -d/--date.
2046 See 'hg help dates' for a list of formats valid for -d/--date.
2047
2047
2048 By default this command prints revision number and changeset id,
2048 By default this command prints revision number and changeset id,
2049 tags, non-trivial parents, user, date and time, and a summary for
2049 tags, non-trivial parents, user, date and time, and a summary for
2050 each commit. When the -v/--verbose switch is used, the list of
2050 each commit. When the -v/--verbose switch is used, the list of
2051 changed files and full commit message are shown.
2051 changed files and full commit message are shown.
2052
2052
2053 NOTE: log -p/--patch may generate unexpected diff output for merge
2053 NOTE: log -p/--patch may generate unexpected diff output for merge
2054 changesets, as it will only compare the merge changeset against
2054 changesets, as it will only compare the merge changeset against
2055 its first parent. Also, only files different from BOTH parents
2055 its first parent. Also, only files different from BOTH parents
2056 will appear in files:.
2056 will appear in files:.
2057 """
2057 """
2058
2058
2059 matchfn = cmdutil.match(repo, pats, opts)
2059 matchfn = cmdutil.match(repo, pats, opts)
2060 limit = cmdutil.loglimit(opts)
2060 limit = cmdutil.loglimit(opts)
2061 count = 0
2061 count = 0
2062
2062
2063 endrev = None
2063 endrev = None
2064 if opts.get('copies') and opts.get('rev'):
2064 if opts.get('copies') and opts.get('rev'):
2065 endrev = max(cmdutil.revrange(repo, opts.get('rev'))) + 1
2065 endrev = max(cmdutil.revrange(repo, opts.get('rev'))) + 1
2066
2066
2067 df = False
2067 df = False
2068 if opts["date"]:
2068 if opts["date"]:
2069 df = util.matchdate(opts["date"])
2069 df = util.matchdate(opts["date"])
2070
2070
2071 displayer = cmdutil.show_changeset(ui, repo, opts, True, matchfn)
2071 displayer = cmdutil.show_changeset(ui, repo, opts, True, matchfn)
2072 def prep(ctx, fns):
2072 def prep(ctx, fns):
2073 rev = ctx.rev()
2073 rev = ctx.rev()
2074 parents = [p for p in repo.changelog.parentrevs(rev)
2074 parents = [p for p in repo.changelog.parentrevs(rev)
2075 if p != nullrev]
2075 if p != nullrev]
2076 if opts.get('no_merges') and len(parents) == 2:
2076 if opts.get('no_merges') and len(parents) == 2:
2077 return
2077 return
2078 if opts.get('only_merges') and len(parents) != 2:
2078 if opts.get('only_merges') and len(parents) != 2:
2079 return
2079 return
2080 if opts.get('only_branch') and ctx.branch() not in opts['only_branch']:
2080 if opts.get('only_branch') and ctx.branch() not in opts['only_branch']:
2081 return
2081 return
2082 if df and not df(ctx.date()[0]):
2082 if df and not df(ctx.date()[0]):
2083 return
2083 return
2084 if opts['user'] and not [k for k in opts['user'] if k in ctx.user()]:
2084 if opts['user'] and not [k for k in opts['user'] if k in ctx.user()]:
2085 return
2085 return
2086 if opts.get('keyword'):
2086 if opts.get('keyword'):
2087 for k in [kw.lower() for kw in opts['keyword']]:
2087 for k in [kw.lower() for kw in opts['keyword']]:
2088 if (k in ctx.user().lower() or
2088 if (k in ctx.user().lower() or
2089 k in ctx.description().lower() or
2089 k in ctx.description().lower() or
2090 k in " ".join(ctx.files()).lower()):
2090 k in " ".join(ctx.files()).lower()):
2091 break
2091 break
2092 else:
2092 else:
2093 return
2093 return
2094
2094
2095 copies = None
2095 copies = None
2096 if opts.get('copies') and rev:
2096 if opts.get('copies') and rev:
2097 copies = []
2097 copies = []
2098 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
2098 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
2099 for fn in ctx.files():
2099 for fn in ctx.files():
2100 rename = getrenamed(fn, rev)
2100 rename = getrenamed(fn, rev)
2101 if rename:
2101 if rename:
2102 copies.append((fn, rename[0]))
2102 copies.append((fn, rename[0]))
2103
2103
2104 displayer.show(ctx, copies=copies)
2104 displayer.show(ctx, copies=copies)
2105
2105
2106 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
2106 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
2107 if count == limit:
2107 if count == limit:
2108 break
2108 break
2109 if displayer.flush(ctx.rev()):
2109 if displayer.flush(ctx.rev()):
2110 count += 1
2110 count += 1
2111 displayer.close()
2111 displayer.close()
2112
2112
2113 def manifest(ui, repo, node=None, rev=None):
2113 def manifest(ui, repo, node=None, rev=None):
2114 """output the current or given revision of the project manifest
2114 """output the current or given revision of the project manifest
2115
2115
2116 Print a list of version controlled files for the given revision.
2116 Print a list of version controlled files for the given revision.
2117 If no revision is given, the first parent of the working directory
2117 If no revision is given, the first parent of the working directory
2118 is used, or the null revision if no revision is checked out.
2118 is used, or the null revision if no revision is checked out.
2119
2119
2120 With -v, print file permissions, symlink and executable bits.
2120 With -v, print file permissions, symlink and executable bits.
2121 With --debug, print file revision hashes.
2121 With --debug, print file revision hashes.
2122 """
2122 """
2123
2123
2124 if rev and node:
2124 if rev and node:
2125 raise util.Abort(_("please specify just one revision"))
2125 raise util.Abort(_("please specify just one revision"))
2126
2126
2127 if not node:
2127 if not node:
2128 node = rev
2128 node = rev
2129
2129
2130 decor = {'l':'644 @ ', 'x':'755 * ', '':'644 '}
2130 decor = {'l':'644 @ ', 'x':'755 * ', '':'644 '}
2131 ctx = repo[node]
2131 ctx = repo[node]
2132 for f in ctx:
2132 for f in ctx:
2133 if ui.debugflag:
2133 if ui.debugflag:
2134 ui.write("%40s " % hex(ctx.manifest()[f]))
2134 ui.write("%40s " % hex(ctx.manifest()[f]))
2135 if ui.verbose:
2135 if ui.verbose:
2136 ui.write(decor[ctx.flags(f)])
2136 ui.write(decor[ctx.flags(f)])
2137 ui.write("%s\n" % f)
2137 ui.write("%s\n" % f)
2138
2138
2139 def merge(ui, repo, node=None, **opts):
2139 def merge(ui, repo, node=None, **opts):
2140 """merge working directory with another revision
2140 """merge working directory with another revision
2141
2141
2142 The current working directory is updated with all changes made in
2142 The current working directory is updated with all changes made in
2143 the requested revision since the last common predecessor revision.
2143 the requested revision since the last common predecessor revision.
2144
2144
2145 Files that changed between either parent are marked as changed for
2145 Files that changed between either parent are marked as changed for
2146 the next commit and a commit must be performed before any further
2146 the next commit and a commit must be performed before any further
2147 updates to the repository are allowed. The next commit will have
2147 updates to the repository are allowed. The next commit will have
2148 two parents.
2148 two parents.
2149
2149
2150 If no revision is specified, the working directory's parent is a
2150 If no revision is specified, the working directory's parent is a
2151 head revision, and the current branch contains exactly one other
2151 head revision, and the current branch contains exactly one other
2152 head, the other head is merged with by default. Otherwise, an
2152 head, the other head is merged with by default. Otherwise, an
2153 explicit revision with which to merge with must be provided.
2153 explicit revision with which to merge with must be provided.
2154 """
2154 """
2155
2155
2156 if opts.get('rev') and node:
2156 if opts.get('rev') and node:
2157 raise util.Abort(_("please specify just one revision"))
2157 raise util.Abort(_("please specify just one revision"))
2158 if not node:
2158 if not node:
2159 node = opts.get('rev')
2159 node = opts.get('rev')
2160
2160
2161 if not node:
2161 if not node:
2162 branch = repo.changectx(None).branch()
2162 branch = repo.changectx(None).branch()
2163 bheads = repo.branchheads(branch)
2163 bheads = repo.branchheads(branch)
2164 if len(bheads) > 2:
2164 if len(bheads) > 2:
2165 ui.warn(_("abort: branch '%s' has %d heads - "
2165 ui.warn(_("abort: branch '%s' has %d heads - "
2166 "please merge with an explicit rev\n")
2166 "please merge with an explicit rev\n")
2167 % (branch, len(bheads)))
2167 % (branch, len(bheads)))
2168 ui.status(_("(run 'hg heads .' to see heads)\n"))
2168 ui.status(_("(run 'hg heads .' to see heads)\n"))
2169 return False
2169 return False
2170
2170
2171 parent = repo.dirstate.parents()[0]
2171 parent = repo.dirstate.parents()[0]
2172 if len(bheads) == 1:
2172 if len(bheads) == 1:
2173 if len(repo.heads()) > 1:
2173 if len(repo.heads()) > 1:
2174 ui.warn(_("abort: branch '%s' has one head - "
2174 ui.warn(_("abort: branch '%s' has one head - "
2175 "please merge with an explicit rev\n" % branch))
2175 "please merge with an explicit rev\n" % branch))
2176 ui.status(_("(run 'hg heads' to see all heads)\n"))
2176 ui.status(_("(run 'hg heads' to see all heads)\n"))
2177 return False
2177 return False
2178 msg = _('there is nothing to merge')
2178 msg = _('there is nothing to merge')
2179 if parent != repo.lookup(repo[None].branch()):
2179 if parent != repo.lookup(repo[None].branch()):
2180 msg = _('%s - use "hg update" instead') % msg
2180 msg = _('%s - use "hg update" instead') % msg
2181 raise util.Abort(msg)
2181 raise util.Abort(msg)
2182
2182
2183 if parent not in bheads:
2183 if parent not in bheads:
2184 raise util.Abort(_('working dir not at a head rev - '
2184 raise util.Abort(_('working dir not at a head rev - '
2185 'use "hg update" or merge with an explicit rev'))
2185 'use "hg update" or merge with an explicit rev'))
2186 node = parent == bheads[0] and bheads[-1] or bheads[0]
2186 node = parent == bheads[0] and bheads[-1] or bheads[0]
2187
2187
2188 if opts.get('preview'):
2188 if opts.get('preview'):
2189 p1 = repo['.']
2189 p1 = repo['.']
2190 p2 = repo[node]
2190 p2 = repo[node]
2191 common = p1.ancestor(p2)
2191 common = p1.ancestor(p2)
2192 roots, heads = [common.node()], [p2.node()]
2192 roots, heads = [common.node()], [p2.node()]
2193 displayer = cmdutil.show_changeset(ui, repo, opts)
2193 displayer = cmdutil.show_changeset(ui, repo, opts)
2194 for node in repo.changelog.nodesbetween(roots=roots, heads=heads)[0]:
2194 for node in repo.changelog.nodesbetween(roots=roots, heads=heads)[0]:
2195 if node not in roots:
2195 if node not in roots:
2196 displayer.show(repo[node])
2196 displayer.show(repo[node])
2197 displayer.close()
2197 displayer.close()
2198 return 0
2198 return 0
2199
2199
2200 return hg.merge(repo, node, force=opts.get('force'))
2200 return hg.merge(repo, node, force=opts.get('force'))
2201
2201
2202 def outgoing(ui, repo, dest=None, **opts):
2202 def outgoing(ui, repo, dest=None, **opts):
2203 """show changesets not found in destination
2203 """show changesets not found in destination
2204
2204
2205 Show changesets not found in the specified destination repository
2205 Show changesets not found in the specified destination repository
2206 or the default push location. These are the changesets that would
2206 or the default push location. These are the changesets that would
2207 be pushed if a push was requested.
2207 be pushed if a push was requested.
2208
2208
2209 See pull for valid destination format details.
2209 See pull for valid destination format details.
2210 """
2210 """
2211 limit = cmdutil.loglimit(opts)
2211 limit = cmdutil.loglimit(opts)
2212 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2212 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2213 dest, branches = hg.parseurl(dest)
2213 dest, branches = hg.parseurl(dest)
2214 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2214 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2215 if revs:
2215 if revs:
2216 revs = [repo.lookup(rev) for rev in revs]
2216 revs = [repo.lookup(rev) for rev in revs]
2217
2217
2218 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2218 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2219 ui.status(_('comparing with %s\n') % url.hidepassword(dest))
2219 ui.status(_('comparing with %s\n') % url.hidepassword(dest))
2220 o = repo.findoutgoing(other, force=opts.get('force'))
2220 o = repo.findoutgoing(other, force=opts.get('force'))
2221 if not o:
2221 if not o:
2222 ui.status(_("no changes found\n"))
2222 ui.status(_("no changes found\n"))
2223 return 1
2223 return 1
2224 o = repo.changelog.nodesbetween(o, revs)[0]
2224 o = repo.changelog.nodesbetween(o, revs)[0]
2225 if opts.get('newest_first'):
2225 if opts.get('newest_first'):
2226 o.reverse()
2226 o.reverse()
2227 displayer = cmdutil.show_changeset(ui, repo, opts)
2227 displayer = cmdutil.show_changeset(ui, repo, opts)
2228 count = 0
2228 count = 0
2229 for n in o:
2229 for n in o:
2230 if limit is not None and count >= limit:
2230 if limit is not None and count >= limit:
2231 break
2231 break
2232 parents = [p for p in repo.changelog.parents(n) if p != nullid]
2232 parents = [p for p in repo.changelog.parents(n) if p != nullid]
2233 if opts.get('no_merges') and len(parents) == 2:
2233 if opts.get('no_merges') and len(parents) == 2:
2234 continue
2234 continue
2235 count += 1
2235 count += 1
2236 displayer.show(repo[n])
2236 displayer.show(repo[n])
2237 displayer.close()
2237 displayer.close()
2238
2238
2239 def parents(ui, repo, file_=None, **opts):
2239 def parents(ui, repo, file_=None, **opts):
2240 """show the parents of the working directory or revision
2240 """show the parents of the working directory or revision
2241
2241
2242 Print the working directory's parent revisions. If a revision is
2242 Print the working directory's parent revisions. If a revision is
2243 given via -r/--rev, the parent of that revision will be printed.
2243 given via -r/--rev, the parent of that revision will be printed.
2244 If a file argument is given, the revision in which the file was
2244 If a file argument is given, the revision in which the file was
2245 last changed (before the working directory revision or the
2245 last changed (before the working directory revision or the
2246 argument to --rev if given) is printed.
2246 argument to --rev if given) is printed.
2247 """
2247 """
2248 rev = opts.get('rev')
2248 rev = opts.get('rev')
2249 if rev:
2249 if rev:
2250 ctx = repo[rev]
2250 ctx = repo[rev]
2251 else:
2251 else:
2252 ctx = repo[None]
2252 ctx = repo[None]
2253
2253
2254 if file_:
2254 if file_:
2255 m = cmdutil.match(repo, (file_,), opts)
2255 m = cmdutil.match(repo, (file_,), opts)
2256 if m.anypats() or len(m.files()) != 1:
2256 if m.anypats() or len(m.files()) != 1:
2257 raise util.Abort(_('can only specify an explicit filename'))
2257 raise util.Abort(_('can only specify an explicit filename'))
2258 file_ = m.files()[0]
2258 file_ = m.files()[0]
2259 filenodes = []
2259 filenodes = []
2260 for cp in ctx.parents():
2260 for cp in ctx.parents():
2261 if not cp:
2261 if not cp:
2262 continue
2262 continue
2263 try:
2263 try:
2264 filenodes.append(cp.filenode(file_))
2264 filenodes.append(cp.filenode(file_))
2265 except error.LookupError:
2265 except error.LookupError:
2266 pass
2266 pass
2267 if not filenodes:
2267 if not filenodes:
2268 raise util.Abort(_("'%s' not found in manifest!") % file_)
2268 raise util.Abort(_("'%s' not found in manifest!") % file_)
2269 fl = repo.file(file_)
2269 fl = repo.file(file_)
2270 p = [repo.lookup(fl.linkrev(fl.rev(fn))) for fn in filenodes]
2270 p = [repo.lookup(fl.linkrev(fl.rev(fn))) for fn in filenodes]
2271 else:
2271 else:
2272 p = [cp.node() for cp in ctx.parents()]
2272 p = [cp.node() for cp in ctx.parents()]
2273
2273
2274 displayer = cmdutil.show_changeset(ui, repo, opts)
2274 displayer = cmdutil.show_changeset(ui, repo, opts)
2275 for n in p:
2275 for n in p:
2276 if n != nullid:
2276 if n != nullid:
2277 displayer.show(repo[n])
2277 displayer.show(repo[n])
2278 displayer.close()
2278 displayer.close()
2279
2279
2280 def paths(ui, repo, search=None):
2280 def paths(ui, repo, search=None):
2281 """show aliases for remote repositories
2281 """show aliases for remote repositories
2282
2282
2283 Show definition of symbolic path name NAME. If no name is given,
2283 Show definition of symbolic path name NAME. If no name is given,
2284 show definition of all available names.
2284 show definition of all available names.
2285
2285
2286 Path names are defined in the [paths] section of /etc/mercurial/hgrc
2286 Path names are defined in the [paths] section of /etc/mercurial/hgrc
2287 and $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too.
2287 and $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too.
2288
2288
2289 See 'hg help urls' for more information.
2289 See 'hg help urls' for more information.
2290 """
2290 """
2291 if search:
2291 if search:
2292 for name, path in ui.configitems("paths"):
2292 for name, path in ui.configitems("paths"):
2293 if name == search:
2293 if name == search:
2294 ui.write("%s\n" % url.hidepassword(path))
2294 ui.write("%s\n" % url.hidepassword(path))
2295 return
2295 return
2296 ui.warn(_("not found!\n"))
2296 ui.warn(_("not found!\n"))
2297 return 1
2297 return 1
2298 else:
2298 else:
2299 for name, path in ui.configitems("paths"):
2299 for name, path in ui.configitems("paths"):
2300 ui.write("%s = %s\n" % (name, url.hidepassword(path)))
2300 ui.write("%s = %s\n" % (name, url.hidepassword(path)))
2301
2301
2302 def postincoming(ui, repo, modheads, optupdate, checkout):
2302 def postincoming(ui, repo, modheads, optupdate, checkout):
2303 if modheads == 0:
2303 if modheads == 0:
2304 return
2304 return
2305 if optupdate:
2305 if optupdate:
2306 if (modheads <= 1 or len(repo.branchheads()) == 1) or checkout:
2306 if (modheads <= 1 or len(repo.branchheads()) == 1) or checkout:
2307 return hg.update(repo, checkout)
2307 return hg.update(repo, checkout)
2308 else:
2308 else:
2309 ui.status(_("not updating, since new heads added\n"))
2309 ui.status(_("not updating, since new heads added\n"))
2310 if modheads > 1:
2310 if modheads > 1:
2311 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
2311 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
2312 else:
2312 else:
2313 ui.status(_("(run 'hg update' to get a working copy)\n"))
2313 ui.status(_("(run 'hg update' to get a working copy)\n"))
2314
2314
2315 def pull(ui, repo, source="default", **opts):
2315 def pull(ui, repo, source="default", **opts):
2316 """pull changes from the specified source
2316 """pull changes from the specified source
2317
2317
2318 Pull changes from a remote repository to a local one.
2318 Pull changes from a remote repository to a local one.
2319
2319
2320 This finds all changes from the repository at the specified path
2320 This finds all changes from the repository at the specified path
2321 or URL and adds them to a local repository (the current one unless
2321 or URL and adds them to a local repository (the current one unless
2322 -R is specified). By default, this does not update the copy of the
2322 -R is specified). By default, this does not update the copy of the
2323 project in the working directory.
2323 project in the working directory.
2324
2324
2325 Use hg incoming if you want to see what would have been added by a
2325 Use hg incoming if you want to see what would have been added by a
2326 pull at the time you issued this command. If you then decide to
2326 pull at the time you issued this command. If you then decide to
2327 added those changes to the repository, you should use pull -r X
2327 added those changes to the repository, you should use pull -r X
2328 where X is the last changeset listed by hg incoming.
2328 where X is the last changeset listed by hg incoming.
2329
2329
2330 If SOURCE is omitted, the 'default' path will be used.
2330 If SOURCE is omitted, the 'default' path will be used.
2331 See 'hg help urls' for more information.
2331 See 'hg help urls' for more information.
2332 """
2332 """
2333 source, branches = hg.parseurl(ui.expandpath(source))
2333 source, branches = hg.parseurl(ui.expandpath(source))
2334 other = hg.repository(cmdutil.remoteui(repo, opts), source)
2334 other = hg.repository(cmdutil.remoteui(repo, opts), source)
2335 ui.status(_('pulling from %s\n') % url.hidepassword(source))
2335 ui.status(_('pulling from %s\n') % url.hidepassword(source))
2336 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
2336 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
2337 if revs:
2337 if revs:
2338 try:
2338 try:
2339 revs = [other.lookup(rev) for rev in revs]
2339 revs = [other.lookup(rev) for rev in revs]
2340 except error.CapabilityError:
2340 except error.CapabilityError:
2341 err = _("Other repository doesn't support revision lookup, "
2341 err = _("Other repository doesn't support revision lookup, "
2342 "so a rev cannot be specified.")
2342 "so a rev cannot be specified.")
2343 raise util.Abort(err)
2343 raise util.Abort(err)
2344
2344
2345 modheads = repo.pull(other, heads=revs, force=opts.get('force'))
2345 modheads = repo.pull(other, heads=revs, force=opts.get('force'))
2346 if checkout:
2346 if checkout:
2347 checkout = str(repo.changelog.rev(other.lookup(checkout)))
2347 checkout = str(repo.changelog.rev(other.lookup(checkout)))
2348 return postincoming(ui, repo, modheads, opts.get('update'), checkout)
2348 return postincoming(ui, repo, modheads, opts.get('update'), checkout)
2349
2349
2350 def push(ui, repo, dest=None, **opts):
2350 def push(ui, repo, dest=None, **opts):
2351 """push changes to the specified destination
2351 """push changes to the specified destination
2352
2352
2353 Push changes from the local repository to the given destination.
2353 Push changes from the local repository to the given destination.
2354
2354
2355 This is the symmetrical operation for pull. It moves changes from
2355 This is the symmetrical operation for pull. It moves changes from
2356 the current repository to a different one. If the destination is
2356 the current repository to a different one. If the destination is
2357 local this is identical to a pull in that directory from the
2357 local this is identical to a pull in that directory from the
2358 current one.
2358 current one.
2359
2359
2360 By default, push will refuse to run if it detects the result would
2360 By default, push will refuse to run if it detects the result would
2361 increase the number of remote heads. This generally indicates the
2361 increase the number of remote heads. This generally indicates the
2362 user forgot to pull and merge before pushing.
2362 user forgot to pull and merge before pushing.
2363
2363
2364 If -r/--rev is used, the named revision and all its ancestors will
2364 If -r/--rev is used, the named revision and all its ancestors will
2365 be pushed to the remote repository.
2365 be pushed to the remote repository.
2366
2366
2367 Please see 'hg help urls' for important details about ``ssh://``
2367 Please see 'hg help urls' for important details about ``ssh://``
2368 URLs. If DESTINATION is omitted, a default path will be used.
2368 URLs. If DESTINATION is omitted, a default path will be used.
2369 """
2369 """
2370 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2370 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2371 dest, branches = hg.parseurl(dest)
2371 dest, branches = hg.parseurl(dest)
2372 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2372 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2373 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2373 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2374 ui.status(_('pushing to %s\n') % url.hidepassword(dest))
2374 ui.status(_('pushing to %s\n') % url.hidepassword(dest))
2375 if revs:
2375 if revs:
2376 revs = [repo.lookup(rev) for rev in revs]
2376 revs = [repo.lookup(rev) for rev in revs]
2377
2377
2378 # push subrepos depth-first for coherent ordering
2378 # push subrepos depth-first for coherent ordering
2379 c = repo['']
2379 c = repo['']
2380 subs = c.substate # only repos that are committed
2380 subs = c.substate # only repos that are committed
2381 for s in sorted(subs):
2381 for s in sorted(subs):
2382 c.sub(s).push(opts.get('force'))
2382 c.sub(s).push(opts.get('force'))
2383
2383
2384 r = repo.push(other, opts.get('force'), revs=revs)
2384 r = repo.push(other, opts.get('force'), revs=revs)
2385 return r == 0
2385 return r == 0
2386
2386
2387 def recover(ui, repo):
2387 def recover(ui, repo):
2388 """roll back an interrupted transaction
2388 """roll back an interrupted transaction
2389
2389
2390 Recover from an interrupted commit or pull.
2390 Recover from an interrupted commit or pull.
2391
2391
2392 This command tries to fix the repository status after an
2392 This command tries to fix the repository status after an
2393 interrupted operation. It should only be necessary when Mercurial
2393 interrupted operation. It should only be necessary when Mercurial
2394 suggests it.
2394 suggests it.
2395 """
2395 """
2396 if repo.recover():
2396 if repo.recover():
2397 return hg.verify(repo)
2397 return hg.verify(repo)
2398 return 1
2398 return 1
2399
2399
2400 def remove(ui, repo, *pats, **opts):
2400 def remove(ui, repo, *pats, **opts):
2401 """remove the specified files on the next commit
2401 """remove the specified files on the next commit
2402
2402
2403 Schedule the indicated files for removal from the repository.
2403 Schedule the indicated files for removal from the repository.
2404
2404
2405 This only removes files from the current branch, not from the
2405 This only removes files from the current branch, not from the
2406 entire project history. -A/--after can be used to remove only
2406 entire project history. -A/--after can be used to remove only
2407 files that have already been deleted, -f/--force can be used to
2407 files that have already been deleted, -f/--force can be used to
2408 force deletion, and -Af can be used to remove files from the next
2408 force deletion, and -Af can be used to remove files from the next
2409 revision without deleting them from the working directory.
2409 revision without deleting them from the working directory.
2410
2410
2411 The following table details the behavior of remove for different
2411 The following table details the behavior of remove for different
2412 file states (columns) and option combinations (rows). The file
2412 file states (columns) and option combinations (rows). The file
2413 states are Added [A], Clean [C], Modified [M] and Missing [!] (as
2413 states are Added [A], Clean [C], Modified [M] and Missing [!] (as
2414 reported by hg status). The actions are Warn, Remove (from branch)
2414 reported by hg status). The actions are Warn, Remove (from branch)
2415 and Delete (from disk)::
2415 and Delete (from disk)::
2416
2416
2417 A C M !
2417 A C M !
2418 none W RD W R
2418 none W RD W R
2419 -f R RD RD R
2419 -f R RD RD R
2420 -A W W W R
2420 -A W W W R
2421 -Af R R R R
2421 -Af R R R R
2422
2422
2423 This command schedules the files to be removed at the next commit.
2423 This command schedules the files to be removed at the next commit.
2424 To undo a remove before that, see hg revert.
2424 To undo a remove before that, see hg revert.
2425 """
2425 """
2426
2426
2427 after, force = opts.get('after'), opts.get('force')
2427 after, force = opts.get('after'), opts.get('force')
2428 if not pats and not after:
2428 if not pats and not after:
2429 raise util.Abort(_('no files specified'))
2429 raise util.Abort(_('no files specified'))
2430
2430
2431 m = cmdutil.match(repo, pats, opts)
2431 m = cmdutil.match(repo, pats, opts)
2432 s = repo.status(match=m, clean=True)
2432 s = repo.status(match=m, clean=True)
2433 modified, added, deleted, clean = s[0], s[1], s[3], s[6]
2433 modified, added, deleted, clean = s[0], s[1], s[3], s[6]
2434
2434
2435 for f in m.files():
2435 for f in m.files():
2436 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
2436 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
2437 ui.warn(_('not removing %s: file is untracked\n') % m.rel(f))
2437 ui.warn(_('not removing %s: file is untracked\n') % m.rel(f))
2438
2438
2439 def warn(files, reason):
2439 def warn(files, reason):
2440 for f in files:
2440 for f in files:
2441 ui.warn(_('not removing %s: file %s (use -f to force removal)\n')
2441 ui.warn(_('not removing %s: file %s (use -f to force removal)\n')
2442 % (m.rel(f), reason))
2442 % (m.rel(f), reason))
2443
2443
2444 if force:
2444 if force:
2445 remove, forget = modified + deleted + clean, added
2445 remove, forget = modified + deleted + clean, added
2446 elif after:
2446 elif after:
2447 remove, forget = deleted, []
2447 remove, forget = deleted, []
2448 warn(modified + added + clean, _('still exists'))
2448 warn(modified + added + clean, _('still exists'))
2449 else:
2449 else:
2450 remove, forget = deleted + clean, []
2450 remove, forget = deleted + clean, []
2451 warn(modified, _('is modified'))
2451 warn(modified, _('is modified'))
2452 warn(added, _('has been marked for add'))
2452 warn(added, _('has been marked for add'))
2453
2453
2454 for f in sorted(remove + forget):
2454 for f in sorted(remove + forget):
2455 if ui.verbose or not m.exact(f):
2455 if ui.verbose or not m.exact(f):
2456 ui.status(_('removing %s\n') % m.rel(f))
2456 ui.status(_('removing %s\n') % m.rel(f))
2457
2457
2458 repo.forget(forget)
2458 repo.forget(forget)
2459 repo.remove(remove, unlink=not after)
2459 repo.remove(remove, unlink=not after)
2460
2460
2461 def rename(ui, repo, *pats, **opts):
2461 def rename(ui, repo, *pats, **opts):
2462 """rename files; equivalent of copy + remove
2462 """rename files; equivalent of copy + remove
2463
2463
2464 Mark dest as copies of sources; mark sources for deletion. If dest
2464 Mark dest as copies of sources; mark sources for deletion. If dest
2465 is a directory, copies are put in that directory. If dest is a
2465 is a directory, copies are put in that directory. If dest is a
2466 file, there can only be one source.
2466 file, there can only be one source.
2467
2467
2468 By default, this command copies the contents of files as they
2468 By default, this command copies the contents of files as they
2469 exist in the working directory. If invoked with -A/--after, the
2469 exist in the working directory. If invoked with -A/--after, the
2470 operation is recorded, but no copying is performed.
2470 operation is recorded, but no copying is performed.
2471
2471
2472 This command takes effect at the next commit. To undo a rename
2472 This command takes effect at the next commit. To undo a rename
2473 before that, see hg revert.
2473 before that, see hg revert.
2474 """
2474 """
2475 wlock = repo.wlock(False)
2475 wlock = repo.wlock(False)
2476 try:
2476 try:
2477 return cmdutil.copy(ui, repo, pats, opts, rename=True)
2477 return cmdutil.copy(ui, repo, pats, opts, rename=True)
2478 finally:
2478 finally:
2479 wlock.release()
2479 wlock.release()
2480
2480
2481 def resolve(ui, repo, *pats, **opts):
2481 def resolve(ui, repo, *pats, **opts):
2482 """retry file merges from a merge or update
2482 """retry file merges from a merge or update
2483
2483
2484 This command can cleanly retry unresolved file merges using file
2484 This command can cleanly retry unresolved file merges using file
2485 revisions preserved from the last update or merge.
2485 revisions preserved from the last update or merge.
2486
2486
2487 If a conflict is resolved manually, please note that the changes
2487 If a conflict is resolved manually, please note that the changes
2488 will be overwritten if the merge is retried with resolve. The
2488 will be overwritten if the merge is retried with resolve. The
2489 -m/--mark switch should be used to mark the file as resolved.
2489 -m/--mark switch should be used to mark the file as resolved.
2490
2490
2491 You can specify a set of files to operate on, or use the -a/--all
2491 You can specify a set of files to operate on, or use the -a/--all
2492 switch to select all unresolved files.
2492 switch to select all unresolved files.
2493
2493
2494 This command also allows listing resolved files and manually
2494 This command also allows listing resolved files and manually
2495 indicating whether or not files are resolved. All files must be
2495 indicating whether or not files are resolved. All files must be
2496 marked as resolved before a commit is permitted.
2496 marked as resolved before a commit is permitted.
2497
2497
2498 The codes used to show the status of files are::
2498 The codes used to show the status of files are::
2499
2499
2500 U = unresolved
2500 U = unresolved
2501 R = resolved
2501 R = resolved
2502 """
2502 """
2503
2503
2504 all, mark, unmark, show, nostatus = \
2504 all, mark, unmark, show, nostatus = \
2505 [opts.get(o) for o in 'all mark unmark list no_status'.split()]
2505 [opts.get(o) for o in 'all mark unmark list no_status'.split()]
2506
2506
2507 if (show and (mark or unmark)) or (mark and unmark):
2507 if (show and (mark or unmark)) or (mark and unmark):
2508 raise util.Abort(_("too many options specified"))
2508 raise util.Abort(_("too many options specified"))
2509 if pats and all:
2509 if pats and all:
2510 raise util.Abort(_("can't specify --all and patterns"))
2510 raise util.Abort(_("can't specify --all and patterns"))
2511 if not (all or pats or show or mark or unmark):
2511 if not (all or pats or show or mark or unmark):
2512 raise util.Abort(_('no files or directories specified; '
2512 raise util.Abort(_('no files or directories specified; '
2513 'use --all to remerge all files'))
2513 'use --all to remerge all files'))
2514
2514
2515 ms = merge_.mergestate(repo)
2515 ms = merge_.mergestate(repo)
2516 m = cmdutil.match(repo, pats, opts)
2516 m = cmdutil.match(repo, pats, opts)
2517
2517
2518 for f in ms:
2518 for f in ms:
2519 if m(f):
2519 if m(f):
2520 if show:
2520 if show:
2521 if nostatus:
2521 if nostatus:
2522 ui.write("%s\n" % f)
2522 ui.write("%s\n" % f)
2523 else:
2523 else:
2524 ui.write("%s %s\n" % (ms[f].upper(), f))
2524 ui.write("%s %s\n" % (ms[f].upper(), f))
2525 elif mark:
2525 elif mark:
2526 ms.mark(f, "r")
2526 ms.mark(f, "r")
2527 elif unmark:
2527 elif unmark:
2528 ms.mark(f, "u")
2528 ms.mark(f, "u")
2529 else:
2529 else:
2530 wctx = repo[None]
2530 wctx = repo[None]
2531 mctx = wctx.parents()[-1]
2531 mctx = wctx.parents()[-1]
2532
2532
2533 # backup pre-resolve (merge uses .orig for its own purposes)
2533 # backup pre-resolve (merge uses .orig for its own purposes)
2534 a = repo.wjoin(f)
2534 a = repo.wjoin(f)
2535 util.copyfile(a, a + ".resolve")
2535 util.copyfile(a, a + ".resolve")
2536
2536
2537 # resolve file
2537 # resolve file
2538 ms.resolve(f, wctx, mctx)
2538 ms.resolve(f, wctx, mctx)
2539
2539
2540 # replace filemerge's .orig file with our resolve file
2540 # replace filemerge's .orig file with our resolve file
2541 util.rename(a + ".resolve", a + ".orig")
2541 util.rename(a + ".resolve", a + ".orig")
2542
2542
2543 def revert(ui, repo, *pats, **opts):
2543 def revert(ui, repo, *pats, **opts):
2544 """restore individual files or directories to an earlier state
2544 """restore individual files or directories to an earlier state
2545
2545
2546 (Use update -r to check out earlier revisions, revert does not
2546 (Use update -r to check out earlier revisions, revert does not
2547 change the working directory parents.)
2547 change the working directory parents.)
2548
2548
2549 With no revision specified, revert the named files or directories
2549 With no revision specified, revert the named files or directories
2550 to the contents they had in the parent of the working directory.
2550 to the contents they had in the parent of the working directory.
2551 This restores the contents of the affected files to an unmodified
2551 This restores the contents of the affected files to an unmodified
2552 state and unschedules adds, removes, copies, and renames. If the
2552 state and unschedules adds, removes, copies, and renames. If the
2553 working directory has two parents, you must explicitly specify the
2553 working directory has two parents, you must explicitly specify the
2554 revision to revert to.
2554 revision to revert to.
2555
2555
2556 Using the -r/--rev option, revert the given files or directories
2556 Using the -r/--rev option, revert the given files or directories
2557 to their contents as of a specific revision. This can be helpful
2557 to their contents as of a specific revision. This can be helpful
2558 to "roll back" some or all of an earlier change. See 'hg help
2558 to "roll back" some or all of an earlier change. See 'hg help
2559 dates' for a list of formats valid for -d/--date.
2559 dates' for a list of formats valid for -d/--date.
2560
2560
2561 Revert modifies the working directory. It does not commit any
2561 Revert modifies the working directory. It does not commit any
2562 changes, or change the parent of the working directory. If you
2562 changes, or change the parent of the working directory. If you
2563 revert to a revision other than the parent of the working
2563 revert to a revision other than the parent of the working
2564 directory, the reverted files will thus appear modified
2564 directory, the reverted files will thus appear modified
2565 afterwards.
2565 afterwards.
2566
2566
2567 If a file has been deleted, it is restored. If the executable mode
2567 If a file has been deleted, it is restored. If the executable mode
2568 of a file was changed, it is reset.
2568 of a file was changed, it is reset.
2569
2569
2570 If names are given, all files matching the names are reverted.
2570 If names are given, all files matching the names are reverted.
2571 If no arguments are given, no files are reverted.
2571 If no arguments are given, no files are reverted.
2572
2572
2573 Modified files are saved with a .orig suffix before reverting.
2573 Modified files are saved with a .orig suffix before reverting.
2574 To disable these backups, use --no-backup.
2574 To disable these backups, use --no-backup.
2575 """
2575 """
2576
2576
2577 if opts["date"]:
2577 if opts["date"]:
2578 if opts["rev"]:
2578 if opts["rev"]:
2579 raise util.Abort(_("you can't specify a revision and a date"))
2579 raise util.Abort(_("you can't specify a revision and a date"))
2580 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
2580 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
2581
2581
2582 if not pats and not opts.get('all'):
2582 if not pats and not opts.get('all'):
2583 raise util.Abort(_('no files or directories specified; '
2583 raise util.Abort(_('no files or directories specified; '
2584 'use --all to revert the whole repo'))
2584 'use --all to revert the whole repo'))
2585
2585
2586 parent, p2 = repo.dirstate.parents()
2586 parent, p2 = repo.dirstate.parents()
2587 if not opts.get('rev') and p2 != nullid:
2587 if not opts.get('rev') and p2 != nullid:
2588 raise util.Abort(_('uncommitted merge - please provide a '
2588 raise util.Abort(_('uncommitted merge - please provide a '
2589 'specific revision'))
2589 'specific revision'))
2590 ctx = repo[opts.get('rev')]
2590 ctx = repo[opts.get('rev')]
2591 node = ctx.node()
2591 node = ctx.node()
2592 mf = ctx.manifest()
2592 mf = ctx.manifest()
2593 if node == parent:
2593 if node == parent:
2594 pmf = mf
2594 pmf = mf
2595 else:
2595 else:
2596 pmf = None
2596 pmf = None
2597
2597
2598 # need all matching names in dirstate and manifest of target rev,
2598 # need all matching names in dirstate and manifest of target rev,
2599 # so have to walk both. do not print errors if files exist in one
2599 # so have to walk both. do not print errors if files exist in one
2600 # but not other.
2600 # but not other.
2601
2601
2602 names = {}
2602 names = {}
2603
2603
2604 wlock = repo.wlock()
2604 wlock = repo.wlock()
2605 try:
2605 try:
2606 # walk dirstate.
2606 # walk dirstate.
2607
2607
2608 m = cmdutil.match(repo, pats, opts)
2608 m = cmdutil.match(repo, pats, opts)
2609 m.bad = lambda x, y: False
2609 m.bad = lambda x, y: False
2610 for abs in repo.walk(m):
2610 for abs in repo.walk(m):
2611 names[abs] = m.rel(abs), m.exact(abs)
2611 names[abs] = m.rel(abs), m.exact(abs)
2612
2612
2613 # walk target manifest.
2613 # walk target manifest.
2614
2614
2615 def badfn(path, msg):
2615 def badfn(path, msg):
2616 if path in names:
2616 if path in names:
2617 return
2617 return
2618 path_ = path + '/'
2618 path_ = path + '/'
2619 for f in names:
2619 for f in names:
2620 if f.startswith(path_):
2620 if f.startswith(path_):
2621 return
2621 return
2622 ui.warn("%s: %s\n" % (m.rel(path), msg))
2622 ui.warn("%s: %s\n" % (m.rel(path), msg))
2623
2623
2624 m = cmdutil.match(repo, pats, opts)
2624 m = cmdutil.match(repo, pats, opts)
2625 m.bad = badfn
2625 m.bad = badfn
2626 for abs in repo[node].walk(m):
2626 for abs in repo[node].walk(m):
2627 if abs not in names:
2627 if abs not in names:
2628 names[abs] = m.rel(abs), m.exact(abs)
2628 names[abs] = m.rel(abs), m.exact(abs)
2629
2629
2630 m = cmdutil.matchfiles(repo, names)
2630 m = cmdutil.matchfiles(repo, names)
2631 changes = repo.status(match=m)[:4]
2631 changes = repo.status(match=m)[:4]
2632 modified, added, removed, deleted = map(set, changes)
2632 modified, added, removed, deleted = map(set, changes)
2633
2633
2634 # if f is a rename, also revert the source
2634 # if f is a rename, also revert the source
2635 cwd = repo.getcwd()
2635 cwd = repo.getcwd()
2636 for f in added:
2636 for f in added:
2637 src = repo.dirstate.copied(f)
2637 src = repo.dirstate.copied(f)
2638 if src and src not in names and repo.dirstate[src] == 'r':
2638 if src and src not in names and repo.dirstate[src] == 'r':
2639 removed.add(src)
2639 removed.add(src)
2640 names[src] = (repo.pathto(src, cwd), True)
2640 names[src] = (repo.pathto(src, cwd), True)
2641
2641
2642 def removeforget(abs):
2642 def removeforget(abs):
2643 if repo.dirstate[abs] == 'a':
2643 if repo.dirstate[abs] == 'a':
2644 return _('forgetting %s\n')
2644 return _('forgetting %s\n')
2645 return _('removing %s\n')
2645 return _('removing %s\n')
2646
2646
2647 revert = ([], _('reverting %s\n'))
2647 revert = ([], _('reverting %s\n'))
2648 add = ([], _('adding %s\n'))
2648 add = ([], _('adding %s\n'))
2649 remove = ([], removeforget)
2649 remove = ([], removeforget)
2650 undelete = ([], _('undeleting %s\n'))
2650 undelete = ([], _('undeleting %s\n'))
2651
2651
2652 disptable = (
2652 disptable = (
2653 # dispatch table:
2653 # dispatch table:
2654 # file state
2654 # file state
2655 # action if in target manifest
2655 # action if in target manifest
2656 # action if not in target manifest
2656 # action if not in target manifest
2657 # make backup if in target manifest
2657 # make backup if in target manifest
2658 # make backup if not in target manifest
2658 # make backup if not in target manifest
2659 (modified, revert, remove, True, True),
2659 (modified, revert, remove, True, True),
2660 (added, revert, remove, True, False),
2660 (added, revert, remove, True, False),
2661 (removed, undelete, None, False, False),
2661 (removed, undelete, None, False, False),
2662 (deleted, revert, remove, False, False),
2662 (deleted, revert, remove, False, False),
2663 )
2663 )
2664
2664
2665 for abs, (rel, exact) in sorted(names.items()):
2665 for abs, (rel, exact) in sorted(names.items()):
2666 mfentry = mf.get(abs)
2666 mfentry = mf.get(abs)
2667 target = repo.wjoin(abs)
2667 target = repo.wjoin(abs)
2668 def handle(xlist, dobackup):
2668 def handle(xlist, dobackup):
2669 xlist[0].append(abs)
2669 xlist[0].append(abs)
2670 if dobackup and not opts.get('no_backup') and util.lexists(target):
2670 if dobackup and not opts.get('no_backup') and util.lexists(target):
2671 bakname = "%s.orig" % rel
2671 bakname = "%s.orig" % rel
2672 ui.note(_('saving current version of %s as %s\n') %
2672 ui.note(_('saving current version of %s as %s\n') %
2673 (rel, bakname))
2673 (rel, bakname))
2674 if not opts.get('dry_run'):
2674 if not opts.get('dry_run'):
2675 util.copyfile(target, bakname)
2675 util.copyfile(target, bakname)
2676 if ui.verbose or not exact:
2676 if ui.verbose or not exact:
2677 msg = xlist[1]
2677 msg = xlist[1]
2678 if not isinstance(msg, basestring):
2678 if not isinstance(msg, basestring):
2679 msg = msg(abs)
2679 msg = msg(abs)
2680 ui.status(msg % rel)
2680 ui.status(msg % rel)
2681 for table, hitlist, misslist, backuphit, backupmiss in disptable:
2681 for table, hitlist, misslist, backuphit, backupmiss in disptable:
2682 if abs not in table:
2682 if abs not in table:
2683 continue
2683 continue
2684 # file has changed in dirstate
2684 # file has changed in dirstate
2685 if mfentry:
2685 if mfentry:
2686 handle(hitlist, backuphit)
2686 handle(hitlist, backuphit)
2687 elif misslist is not None:
2687 elif misslist is not None:
2688 handle(misslist, backupmiss)
2688 handle(misslist, backupmiss)
2689 break
2689 break
2690 else:
2690 else:
2691 if abs not in repo.dirstate:
2691 if abs not in repo.dirstate:
2692 if mfentry:
2692 if mfentry:
2693 handle(add, True)
2693 handle(add, True)
2694 elif exact:
2694 elif exact:
2695 ui.warn(_('file not managed: %s\n') % rel)
2695 ui.warn(_('file not managed: %s\n') % rel)
2696 continue
2696 continue
2697 # file has not changed in dirstate
2697 # file has not changed in dirstate
2698 if node == parent:
2698 if node == parent:
2699 if exact:
2699 if exact:
2700 ui.warn(_('no changes needed to %s\n') % rel)
2700 ui.warn(_('no changes needed to %s\n') % rel)
2701 continue
2701 continue
2702 if pmf is None:
2702 if pmf is None:
2703 # only need parent manifest in this unlikely case,
2703 # only need parent manifest in this unlikely case,
2704 # so do not read by default
2704 # so do not read by default
2705 pmf = repo[parent].manifest()
2705 pmf = repo[parent].manifest()
2706 if abs in pmf:
2706 if abs in pmf:
2707 if mfentry:
2707 if mfentry:
2708 # if version of file is same in parent and target
2708 # if version of file is same in parent and target
2709 # manifests, do nothing
2709 # manifests, do nothing
2710 if (pmf[abs] != mfentry or
2710 if (pmf[abs] != mfentry or
2711 pmf.flags(abs) != mf.flags(abs)):
2711 pmf.flags(abs) != mf.flags(abs)):
2712 handle(revert, False)
2712 handle(revert, False)
2713 else:
2713 else:
2714 handle(remove, False)
2714 handle(remove, False)
2715
2715
2716 if not opts.get('dry_run'):
2716 if not opts.get('dry_run'):
2717 def checkout(f):
2717 def checkout(f):
2718 fc = ctx[f]
2718 fc = ctx[f]
2719 repo.wwrite(f, fc.data(), fc.flags())
2719 repo.wwrite(f, fc.data(), fc.flags())
2720
2720
2721 audit_path = util.path_auditor(repo.root)
2721 audit_path = util.path_auditor(repo.root)
2722 for f in remove[0]:
2722 for f in remove[0]:
2723 if repo.dirstate[f] == 'a':
2723 if repo.dirstate[f] == 'a':
2724 repo.dirstate.forget(f)
2724 repo.dirstate.forget(f)
2725 continue
2725 continue
2726 audit_path(f)
2726 audit_path(f)
2727 try:
2727 try:
2728 util.unlink(repo.wjoin(f))
2728 util.unlink(repo.wjoin(f))
2729 except OSError:
2729 except OSError:
2730 pass
2730 pass
2731 repo.dirstate.remove(f)
2731 repo.dirstate.remove(f)
2732
2732
2733 normal = None
2733 normal = None
2734 if node == parent:
2734 if node == parent:
2735 # We're reverting to our parent. If possible, we'd like status
2735 # We're reverting to our parent. If possible, we'd like status
2736 # to report the file as clean. We have to use normallookup for
2736 # to report the file as clean. We have to use normallookup for
2737 # merges to avoid losing information about merged/dirty files.
2737 # merges to avoid losing information about merged/dirty files.
2738 if p2 != nullid:
2738 if p2 != nullid:
2739 normal = repo.dirstate.normallookup
2739 normal = repo.dirstate.normallookup
2740 else:
2740 else:
2741 normal = repo.dirstate.normal
2741 normal = repo.dirstate.normal
2742 for f in revert[0]:
2742 for f in revert[0]:
2743 checkout(f)
2743 checkout(f)
2744 if normal:
2744 if normal:
2745 normal(f)
2745 normal(f)
2746
2746
2747 for f in add[0]:
2747 for f in add[0]:
2748 checkout(f)
2748 checkout(f)
2749 repo.dirstate.add(f)
2749 repo.dirstate.add(f)
2750
2750
2751 normal = repo.dirstate.normallookup
2751 normal = repo.dirstate.normallookup
2752 if node == parent and p2 == nullid:
2752 if node == parent and p2 == nullid:
2753 normal = repo.dirstate.normal
2753 normal = repo.dirstate.normal
2754 for f in undelete[0]:
2754 for f in undelete[0]:
2755 checkout(f)
2755 checkout(f)
2756 normal(f)
2756 normal(f)
2757
2757
2758 finally:
2758 finally:
2759 wlock.release()
2759 wlock.release()
2760
2760
2761 def rollback(ui, repo):
2761 def rollback(ui, repo):
2762 """roll back the last transaction
2762 """roll back the last transaction
2763
2763
2764 This command should be used with care. There is only one level of
2764 This command should be used with care. There is only one level of
2765 rollback, and there is no way to undo a rollback. It will also
2765 rollback, and there is no way to undo a rollback. It will also
2766 restore the dirstate at the time of the last transaction, losing
2766 restore the dirstate at the time of the last transaction, losing
2767 any dirstate changes since that time. This command does not alter
2767 any dirstate changes since that time. This command does not alter
2768 the working directory.
2768 the working directory.
2769
2769
2770 Transactions are used to encapsulate the effects of all commands
2770 Transactions are used to encapsulate the effects of all commands
2771 that create new changesets or propagate existing changesets into a
2771 that create new changesets or propagate existing changesets into a
2772 repository. For example, the following commands are transactional,
2772 repository. For example, the following commands are transactional,
2773 and their effects can be rolled back:
2773 and their effects can be rolled back:
2774
2774
2775 - commit
2775 - commit
2776 - import
2776 - import
2777 - pull
2777 - pull
2778 - push (with this repository as destination)
2778 - push (with this repository as destination)
2779 - unbundle
2779 - unbundle
2780
2780
2781 This command is not intended for use on public repositories. Once
2781 This command is not intended for use on public repositories. Once
2782 changes are visible for pull by other users, rolling a transaction
2782 changes are visible for pull by other users, rolling a transaction
2783 back locally is ineffective (someone else may already have pulled
2783 back locally is ineffective (someone else may already have pulled
2784 the changes). Furthermore, a race is possible with readers of the
2784 the changes). Furthermore, a race is possible with readers of the
2785 repository; for example an in-progress pull from the repository
2785 repository; for example an in-progress pull from the repository
2786 may fail if a rollback is performed.
2786 may fail if a rollback is performed.
2787 """
2787 """
2788 repo.rollback()
2788 repo.rollback()
2789
2789
2790 def root(ui, repo):
2790 def root(ui, repo):
2791 """print the root (top) of the current working directory
2791 """print the root (top) of the current working directory
2792
2792
2793 Print the root directory of the current repository.
2793 Print the root directory of the current repository.
2794 """
2794 """
2795 ui.write(repo.root + "\n")
2795 ui.write(repo.root + "\n")
2796
2796
2797 def serve(ui, repo, **opts):
2797 def serve(ui, repo, **opts):
2798 """export the repository via HTTP
2798 """export the repository via HTTP
2799
2799
2800 Start a local HTTP repository browser and pull server.
2800 Start a local HTTP repository browser and pull server.
2801
2801
2802 By default, the server logs accesses to stdout and errors to
2802 By default, the server logs accesses to stdout and errors to
2803 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
2803 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
2804 files.
2804 files.
2805 """
2805 """
2806
2806
2807 if opts["stdio"]:
2807 if opts["stdio"]:
2808 if repo is None:
2808 if repo is None:
2809 raise error.RepoError(_("There is no Mercurial repository here"
2809 raise error.RepoError(_("There is no Mercurial repository here"
2810 " (.hg not found)"))
2810 " (.hg not found)"))
2811 s = sshserver.sshserver(ui, repo)
2811 s = sshserver.sshserver(ui, repo)
2812 s.serve_forever()
2812 s.serve_forever()
2813
2813
2814 baseui = repo and repo.baseui or ui
2814 baseui = repo and repo.baseui or ui
2815 optlist = ("name templates style address port prefix ipv6"
2815 optlist = ("name templates style address port prefix ipv6"
2816 " accesslog errorlog webdir_conf certificate encoding")
2816 " accesslog errorlog webdir_conf certificate encoding")
2817 for o in optlist.split():
2817 for o in optlist.split():
2818 if opts.get(o, None):
2818 if opts.get(o, None):
2819 baseui.setconfig("web", o, str(opts[o]))
2819 baseui.setconfig("web", o, str(opts[o]))
2820 if (repo is not None) and (repo.ui != baseui):
2820 if (repo is not None) and (repo.ui != baseui):
2821 repo.ui.setconfig("web", o, str(opts[o]))
2821 repo.ui.setconfig("web", o, str(opts[o]))
2822
2822
2823 if repo is None and not ui.config("web", "webdir_conf"):
2823 if repo is None and not ui.config("web", "webdir_conf"):
2824 raise error.RepoError(_("There is no Mercurial repository here"
2824 raise error.RepoError(_("There is no Mercurial repository here"
2825 " (.hg not found)"))
2825 " (.hg not found)"))
2826
2826
2827 class service(object):
2827 class service(object):
2828 def init(self):
2828 def init(self):
2829 util.set_signal_handler()
2829 util.set_signal_handler()
2830 self.httpd = server.create_server(baseui, repo)
2830 self.httpd = server.create_server(baseui, repo)
2831
2831
2832 if not ui.verbose:
2832 if not ui.verbose:
2833 return
2833 return
2834
2834
2835 if self.httpd.prefix:
2835 if self.httpd.prefix:
2836 prefix = self.httpd.prefix.strip('/') + '/'
2836 prefix = self.httpd.prefix.strip('/') + '/'
2837 else:
2837 else:
2838 prefix = ''
2838 prefix = ''
2839
2839
2840 port = ':%d' % self.httpd.port
2840 port = ':%d' % self.httpd.port
2841 if port == ':80':
2841 if port == ':80':
2842 port = ''
2842 port = ''
2843
2843
2844 bindaddr = self.httpd.addr
2844 bindaddr = self.httpd.addr
2845 if bindaddr == '0.0.0.0':
2845 if bindaddr == '0.0.0.0':
2846 bindaddr = '*'
2846 bindaddr = '*'
2847 elif ':' in bindaddr: # IPv6
2847 elif ':' in bindaddr: # IPv6
2848 bindaddr = '[%s]' % bindaddr
2848 bindaddr = '[%s]' % bindaddr
2849
2849
2850 fqaddr = self.httpd.fqaddr
2850 fqaddr = self.httpd.fqaddr
2851 if ':' in fqaddr:
2851 if ':' in fqaddr:
2852 fqaddr = '[%s]' % fqaddr
2852 fqaddr = '[%s]' % fqaddr
2853 ui.status(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
2853 ui.status(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
2854 (fqaddr, port, prefix, bindaddr, self.httpd.port))
2854 (fqaddr, port, prefix, bindaddr, self.httpd.port))
2855
2855
2856 def run(self):
2856 def run(self):
2857 self.httpd.serve_forever()
2857 self.httpd.serve_forever()
2858
2858
2859 service = service()
2859 service = service()
2860
2860
2861 cmdutil.service(opts, initfn=service.init, runfn=service.run)
2861 cmdutil.service(opts, initfn=service.init, runfn=service.run)
2862
2862
2863 def status(ui, repo, *pats, **opts):
2863 def status(ui, repo, *pats, **opts):
2864 """show changed files in the working directory
2864 """show changed files in the working directory
2865
2865
2866 Show status of files in the repository. If names are given, only
2866 Show status of files in the repository. If names are given, only
2867 files that match are shown. Files that are clean or ignored or
2867 files that match are shown. Files that are clean or ignored or
2868 the source of a copy/move operation, are not listed unless
2868 the source of a copy/move operation, are not listed unless
2869 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
2869 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
2870 Unless options described with "show only ..." are given, the
2870 Unless options described with "show only ..." are given, the
2871 options -mardu are used.
2871 options -mardu are used.
2872
2872
2873 Option -q/--quiet hides untracked (unknown and ignored) files
2873 Option -q/--quiet hides untracked (unknown and ignored) files
2874 unless explicitly requested with -u/--unknown or -i/--ignored.
2874 unless explicitly requested with -u/--unknown or -i/--ignored.
2875
2875
2876 NOTE: status may appear to disagree with diff if permissions have
2876 NOTE: status may appear to disagree with diff if permissions have
2877 changed or a merge has occurred. The standard diff format does not
2877 changed or a merge has occurred. The standard diff format does not
2878 report permission changes and diff only reports changes relative
2878 report permission changes and diff only reports changes relative
2879 to one merge parent.
2879 to one merge parent.
2880
2880
2881 If one revision is given, it is used as the base revision.
2881 If one revision is given, it is used as the base revision.
2882 If two revisions are given, the differences between them are
2882 If two revisions are given, the differences between them are
2883 shown. The --change option can also be used as a shortcut to list
2883 shown. The --change option can also be used as a shortcut to list
2884 the changed files of a revision from its first parent.
2884 the changed files of a revision from its first parent.
2885
2885
2886 The codes used to show the status of files are::
2886 The codes used to show the status of files are::
2887
2887
2888 M = modified
2888 M = modified
2889 A = added
2889 A = added
2890 R = removed
2890 R = removed
2891 C = clean
2891 C = clean
2892 ! = missing (deleted by non-hg command, but still tracked)
2892 ! = missing (deleted by non-hg command, but still tracked)
2893 ? = not tracked
2893 ? = not tracked
2894 I = ignored
2894 I = ignored
2895 = origin of the previous file listed as A (added)
2895 = origin of the previous file listed as A (added)
2896 """
2896 """
2897
2897
2898 revs = opts.get('rev')
2898 revs = opts.get('rev')
2899 change = opts.get('change')
2899 change = opts.get('change')
2900
2900
2901 if revs and change:
2901 if revs and change:
2902 msg = _('cannot specify --rev and --change at the same time')
2902 msg = _('cannot specify --rev and --change at the same time')
2903 raise util.Abort(msg)
2903 raise util.Abort(msg)
2904 elif change:
2904 elif change:
2905 node2 = repo.lookup(change)
2905 node2 = repo.lookup(change)
2906 node1 = repo[node2].parents()[0].node()
2906 node1 = repo[node2].parents()[0].node()
2907 else:
2907 else:
2908 node1, node2 = cmdutil.revpair(repo, revs)
2908 node1, node2 = cmdutil.revpair(repo, revs)
2909
2909
2910 cwd = (pats and repo.getcwd()) or ''
2910 cwd = (pats and repo.getcwd()) or ''
2911 end = opts.get('print0') and '\0' or '\n'
2911 end = opts.get('print0') and '\0' or '\n'
2912 copy = {}
2912 copy = {}
2913 states = 'modified added removed deleted unknown ignored clean'.split()
2913 states = 'modified added removed deleted unknown ignored clean'.split()
2914 show = [k for k in states if opts.get(k)]
2914 show = [k for k in states if opts.get(k)]
2915 if opts.get('all'):
2915 if opts.get('all'):
2916 show += ui.quiet and (states[:4] + ['clean']) or states
2916 show += ui.quiet and (states[:4] + ['clean']) or states
2917 if not show:
2917 if not show:
2918 show = ui.quiet and states[:4] or states[:5]
2918 show = ui.quiet and states[:4] or states[:5]
2919
2919
2920 stat = repo.status(node1, node2, cmdutil.match(repo, pats, opts),
2920 stat = repo.status(node1, node2, cmdutil.match(repo, pats, opts),
2921 'ignored' in show, 'clean' in show, 'unknown' in show)
2921 'ignored' in show, 'clean' in show, 'unknown' in show)
2922 changestates = zip(states, 'MAR!?IC', stat)
2922 changestates = zip(states, 'MAR!?IC', stat)
2923
2923
2924 if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'):
2924 if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'):
2925 ctxn = repo[nullid]
2925 ctxn = repo[nullid]
2926 ctx1 = repo[node1]
2926 ctx1 = repo[node1]
2927 ctx2 = repo[node2]
2927 ctx2 = repo[node2]
2928 added = stat[1]
2928 added = stat[1]
2929 if node2 is None:
2929 if node2 is None:
2930 added = stat[0] + stat[1] # merged?
2930 added = stat[0] + stat[1] # merged?
2931
2931
2932 for k, v in copies.copies(repo, ctx1, ctx2, ctxn)[0].iteritems():
2932 for k, v in copies.copies(repo, ctx1, ctx2, ctxn)[0].iteritems():
2933 if k in added:
2933 if k in added:
2934 copy[k] = v
2934 copy[k] = v
2935 elif v in added:
2935 elif v in added:
2936 copy[v] = k
2936 copy[v] = k
2937
2937
2938 for state, char, files in changestates:
2938 for state, char, files in changestates:
2939 if state in show:
2939 if state in show:
2940 format = "%s %%s%s" % (char, end)
2940 format = "%s %%s%s" % (char, end)
2941 if opts.get('no_status'):
2941 if opts.get('no_status'):
2942 format = "%%s%s" % end
2942 format = "%%s%s" % end
2943
2943
2944 for f in files:
2944 for f in files:
2945 ui.write(format % repo.pathto(f, cwd))
2945 ui.write(format % repo.pathto(f, cwd))
2946 if f in copy:
2946 if f in copy:
2947 ui.write(' %s%s' % (repo.pathto(copy[f], cwd), end))
2947 ui.write(' %s%s' % (repo.pathto(copy[f], cwd), end))
2948
2948
2949 def summary(ui, repo, **opts):
2949 def summary(ui, repo, **opts):
2950 """summarize working directory state
2950 """summarize working directory state
2951
2951
2952 This generates a brief summary of the working directory state,
2952 This generates a brief summary of the working directory state,
2953 including parents, branch, commit status, and available updates.
2953 including parents, branch, commit status, and available updates.
2954
2954
2955 With the --remote option, this will check the default paths for
2955 With the --remote option, this will check the default paths for
2956 incoming and outgoing changes. This can be time-consuming.
2956 incoming and outgoing changes. This can be time-consuming.
2957 """
2957 """
2958
2958
2959 ctx = repo[None]
2959 ctx = repo[None]
2960 parents = ctx.parents()
2960 parents = ctx.parents()
2961 pnode = parents[0].node()
2961 pnode = parents[0].node()
2962 tags = repo.tags()
2962 tags = repo.tags()
2963
2963
2964 for p in parents:
2964 for p in parents:
2965 t = ' '.join([t for t in tags if tags[t] == p.node()])
2965 t = ' '.join([t for t in tags if tags[t] == p.node()])
2966 if p.rev() == -1:
2966 if p.rev() == -1:
2967 if not len(repo):
2967 if not len(repo):
2968 t += _(' (empty repository)')
2968 t += _(' (empty repository)')
2969 else:
2969 else:
2970 t += _(' (no revision checked out)')
2970 t += _(' (no revision checked out)')
2971 ui.write(_('parent: %d:%s %s\n') % (p.rev(), str(p), t))
2971 ui.write(_('parent: %d:%s %s\n') % (p.rev(), str(p), t))
2972 if p.description():
2972 if p.description():
2973 ui.status(' ' + p.description().splitlines()[0].strip() + '\n')
2973 ui.status(' ' + p.description().splitlines()[0].strip() + '\n')
2974
2974
2975 branch = ctx.branch()
2975 branch = ctx.branch()
2976 bheads = repo.branchheads(branch)
2976 bheads = repo.branchheads(branch)
2977 m = _('branch: %s\n') % branch
2977 m = _('branch: %s\n') % branch
2978 if branch != 'default':
2978 if branch != 'default':
2979 ui.write(m)
2979 ui.write(m)
2980 else:
2980 else:
2981 ui.status(m)
2981 ui.status(m)
2982
2982
2983 st = list(repo.status(unknown=True))[:7]
2983 st = list(repo.status(unknown=True))[:7]
2984 ms = merge_.mergestate(repo)
2984 ms = merge_.mergestate(repo)
2985 st.append([f for f in ms if f == 'u'])
2985 st.append([f for f in ms if f == 'u'])
2986 labels = [_('%d modified'), _('%d added'), _('%d removed'),
2986 labels = [_('%d modified'), _('%d added'), _('%d removed'),
2987 _('%d deleted'), _('%d unknown'), _('%d ignored'),
2987 _('%d deleted'), _('%d unknown'), _('%d ignored'),
2988 _('%d unresolved')]
2988 _('%d unresolved')]
2989 t = []
2989 t = []
2990 for s, l in zip(st, labels):
2990 for s, l in zip(st, labels):
2991 if s:
2991 if s:
2992 t.append(l % len(s))
2992 t.append(l % len(s))
2993
2993
2994 t = ', '.join(t)
2994 t = ', '.join(t)
2995 cleanworkdir = False
2995 cleanworkdir = False
2996
2996
2997 if len(parents) > 1:
2997 if len(parents) > 1:
2998 t += _(' (merge)')
2998 t += _(' (merge)')
2999 elif branch != parents[0].branch():
2999 elif branch != parents[0].branch():
3000 t += _(' (new branch)')
3000 t += _(' (new branch)')
3001 elif (not st[0] and not st[1] and not st[2]):
3001 elif (not st[0] and not st[1] and not st[2]):
3002 t += _(' (clean)')
3002 t += _(' (clean)')
3003 cleanworkdir = True
3003 cleanworkdir = True
3004 elif pnode not in bheads:
3004 elif pnode not in bheads:
3005 t += _(' (new branch head)')
3005 t += _(' (new branch head)')
3006
3006
3007 if cleanworkdir:
3007 if cleanworkdir:
3008 ui.status(_('commit: %s\n') % t.strip())
3008 ui.status(_('commit: %s\n') % t.strip())
3009 else:
3009 else:
3010 ui.write(_('commit: %s\n') % t.strip())
3010 ui.write(_('commit: %s\n') % t.strip())
3011
3011
3012 # all ancestors of branch heads - all ancestors of parent = new csets
3012 # all ancestors of branch heads - all ancestors of parent = new csets
3013 new = [0] * len(repo)
3013 new = [0] * len(repo)
3014 cl = repo.changelog
3014 cl = repo.changelog
3015 for a in cl.ancestors(*[cl.rev(n) for n in bheads]):
3015 for a in cl.ancestors(*[cl.rev(n) for n in bheads]):
3016 new[a] = 1
3016 new[a] = 1
3017 for a in cl.ancestors(*[p.rev() for p in parents]):
3017 for a in cl.ancestors(*[p.rev() for p in parents]):
3018 new[a] = 0
3018 new[a] = 0
3019 new = sum(new)
3019 new = sum(new)
3020
3020
3021 if new == 0:
3021 if new == 0:
3022 ui.status(_('update: (current)\n'))
3022 ui.status(_('update: (current)\n'))
3023 elif pnode not in bheads:
3023 elif pnode not in bheads:
3024 ui.write(_('update: %d new changesets (update)\n') % new)
3024 ui.write(_('update: %d new changesets (update)\n') % new)
3025 else:
3025 else:
3026 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
3026 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
3027 (new, len(bheads)))
3027 (new, len(bheads)))
3028
3028
3029 if opts.get('remote'):
3029 if opts.get('remote'):
3030 t = []
3030 t = []
3031 source, revs, checkout = hg.parseurl(ui.expandpath('default'),
3031 source, revs, checkout = hg.parseurl(ui.expandpath('default'),
3032 opts.get('rev'))
3032 opts.get('rev'))
3033 other = hg.repository(cmdutil.remoteui(repo, {}), source)
3033 other = hg.repository(cmdutil.remoteui(repo, {}), source)
3034 ui.debug('comparing with %s\n' % url.hidepassword(source))
3034 ui.debug('comparing with %s\n' % url.hidepassword(source))
3035 repo.ui.pushbuffer()
3035 repo.ui.pushbuffer()
3036 common, incoming, rheads = repo.findcommonincoming(other)
3036 common, incoming, rheads = repo.findcommonincoming(other)
3037 repo.ui.popbuffer()
3037 repo.ui.popbuffer()
3038 if incoming:
3038 if incoming:
3039 t.append(_('1 or more incoming'))
3039 t.append(_('1 or more incoming'))
3040
3040
3041 dest, revs, checkout = hg.parseurl(
3041 dest, revs, checkout = hg.parseurl(
3042 ui.expandpath('default-push', 'default'))
3042 ui.expandpath('default-push', 'default'))
3043 other = hg.repository(cmdutil.remoteui(repo, {}), dest)
3043 other = hg.repository(cmdutil.remoteui(repo, {}), dest)
3044 ui.debug('comparing with %s\n' % url.hidepassword(dest))
3044 ui.debug('comparing with %s\n' % url.hidepassword(dest))
3045 repo.ui.pushbuffer()
3045 repo.ui.pushbuffer()
3046 o = repo.findoutgoing(other)
3046 o = repo.findoutgoing(other)
3047 repo.ui.popbuffer()
3047 repo.ui.popbuffer()
3048 o = repo.changelog.nodesbetween(o, revs)[0]
3048 o = repo.changelog.nodesbetween(o, revs)[0]
3049 if o:
3049 if o:
3050 t.append(_('%d outgoing') % len(o))
3050 t.append(_('%d outgoing') % len(o))
3051
3051
3052 if t:
3052 if t:
3053 ui.write(_('remote: %s\n') % (', '.join(t)))
3053 ui.write(_('remote: %s\n') % (', '.join(t)))
3054 else:
3054 else:
3055 ui.status(_('remote: (synced)\n'))
3055 ui.status(_('remote: (synced)\n'))
3056
3056
3057 def tag(ui, repo, name1, *names, **opts):
3057 def tag(ui, repo, name1, *names, **opts):
3058 """add one or more tags for the current or given revision
3058 """add one or more tags for the current or given revision
3059
3059
3060 Name a particular revision using <name>.
3060 Name a particular revision using <name>.
3061
3061
3062 Tags are used to name particular revisions of the repository and are
3062 Tags are used to name particular revisions of the repository and are
3063 very useful to compare different revisions, to go back to significant
3063 very useful to compare different revisions, to go back to significant
3064 earlier versions or to mark branch points as releases, etc.
3064 earlier versions or to mark branch points as releases, etc.
3065
3065
3066 If no revision is given, the parent of the working directory is
3066 If no revision is given, the parent of the working directory is
3067 used, or tip if no revision is checked out.
3067 used, or tip if no revision is checked out.
3068
3068
3069 To facilitate version control, distribution, and merging of tags,
3069 To facilitate version control, distribution, and merging of tags,
3070 they are stored as a file named ".hgtags" which is managed
3070 they are stored as a file named ".hgtags" which is managed
3071 similarly to other project files and can be hand-edited if
3071 similarly to other project files and can be hand-edited if
3072 necessary. The file '.hg/localtags' is used for local tags (not
3072 necessary. The file '.hg/localtags' is used for local tags (not
3073 shared among repositories).
3073 shared among repositories).
3074
3074
3075 See 'hg help dates' for a list of formats valid for -d/--date.
3075 See 'hg help dates' for a list of formats valid for -d/--date.
3076 """
3076 """
3077
3077
3078 rev_ = "."
3078 rev_ = "."
3079 names = (name1,) + names
3079 names = (name1,) + names
3080 if len(names) != len(set(names)):
3080 if len(names) != len(set(names)):
3081 raise util.Abort(_('tag names must be unique'))
3081 raise util.Abort(_('tag names must be unique'))
3082 for n in names:
3082 for n in names:
3083 if n in ['tip', '.', 'null']:
3083 if n in ['tip', '.', 'null']:
3084 raise util.Abort(_('the name \'%s\' is reserved') % n)
3084 raise util.Abort(_('the name \'%s\' is reserved') % n)
3085 if opts.get('rev') and opts.get('remove'):
3085 if opts.get('rev') and opts.get('remove'):
3086 raise util.Abort(_("--rev and --remove are incompatible"))
3086 raise util.Abort(_("--rev and --remove are incompatible"))
3087 if opts.get('rev'):
3087 if opts.get('rev'):
3088 rev_ = opts['rev']
3088 rev_ = opts['rev']
3089 message = opts.get('message')
3089 message = opts.get('message')
3090 if opts.get('remove'):
3090 if opts.get('remove'):
3091 expectedtype = opts.get('local') and 'local' or 'global'
3091 expectedtype = opts.get('local') and 'local' or 'global'
3092 for n in names:
3092 for n in names:
3093 if not repo.tagtype(n):
3093 if not repo.tagtype(n):
3094 raise util.Abort(_('tag \'%s\' does not exist') % n)
3094 raise util.Abort(_('tag \'%s\' does not exist') % n)
3095 if repo.tagtype(n) != expectedtype:
3095 if repo.tagtype(n) != expectedtype:
3096 if expectedtype == 'global':
3096 if expectedtype == 'global':
3097 raise util.Abort(_('tag \'%s\' is not a global tag') % n)
3097 raise util.Abort(_('tag \'%s\' is not a global tag') % n)
3098 else:
3098 else:
3099 raise util.Abort(_('tag \'%s\' is not a local tag') % n)
3099 raise util.Abort(_('tag \'%s\' is not a local tag') % n)
3100 rev_ = nullid
3100 rev_ = nullid
3101 if not message:
3101 if not message:
3102 # we don't translate commit messages
3102 # we don't translate commit messages
3103 message = 'Removed tag %s' % ', '.join(names)
3103 message = 'Removed tag %s' % ', '.join(names)
3104 elif not opts.get('force'):
3104 elif not opts.get('force'):
3105 for n in names:
3105 for n in names:
3106 if n in repo.tags():
3106 if n in repo.tags():
3107 raise util.Abort(_('tag \'%s\' already exists '
3107 raise util.Abort(_('tag \'%s\' already exists '
3108 '(use -f to force)') % n)
3108 '(use -f to force)') % n)
3109 if not rev_ and repo.dirstate.parents()[1] != nullid:
3109 if not rev_ and repo.dirstate.parents()[1] != nullid:
3110 raise util.Abort(_('uncommitted merge - please provide a '
3110 raise util.Abort(_('uncommitted merge - please provide a '
3111 'specific revision'))
3111 'specific revision'))
3112 r = repo[rev_].node()
3112 r = repo[rev_].node()
3113
3113
3114 if not message:
3114 if not message:
3115 # we don't translate commit messages
3115 # we don't translate commit messages
3116 message = ('Added tag %s for changeset %s' %
3116 message = ('Added tag %s for changeset %s' %
3117 (', '.join(names), short(r)))
3117 (', '.join(names), short(r)))
3118
3118
3119 date = opts.get('date')
3119 date = opts.get('date')
3120 if date:
3120 if date:
3121 date = util.parsedate(date)
3121 date = util.parsedate(date)
3122
3122
3123 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date)
3123 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date)
3124
3124
3125 def tags(ui, repo):
3125 def tags(ui, repo):
3126 """list repository tags
3126 """list repository tags
3127
3127
3128 This lists both regular and local tags. When the -v/--verbose
3128 This lists both regular and local tags. When the -v/--verbose
3129 switch is used, a third column "local" is printed for local tags.
3129 switch is used, a third column "local" is printed for local tags.
3130 """
3130 """
3131
3131
3132 hexfunc = ui.debugflag and hex or short
3132 hexfunc = ui.debugflag and hex or short
3133 tagtype = ""
3133 tagtype = ""
3134
3134
3135 for t, n in reversed(repo.tagslist()):
3135 for t, n in reversed(repo.tagslist()):
3136 if ui.quiet:
3136 if ui.quiet:
3137 ui.write("%s\n" % t)
3137 ui.write("%s\n" % t)
3138 continue
3138 continue
3139
3139
3140 try:
3140 try:
3141 hn = hexfunc(n)
3141 hn = hexfunc(n)
3142 r = "%5d:%s" % (repo.changelog.rev(n), hn)
3142 r = "%5d:%s" % (repo.changelog.rev(n), hn)
3143 except error.LookupError:
3143 except error.LookupError:
3144 r = " ?:%s" % hn
3144 r = " ?:%s" % hn
3145 else:
3145 else:
3146 spaces = " " * (30 - encoding.colwidth(t))
3146 spaces = " " * (30 - encoding.colwidth(t))
3147 if ui.verbose:
3147 if ui.verbose:
3148 if repo.tagtype(t) == 'local':
3148 if repo.tagtype(t) == 'local':
3149 tagtype = " local"
3149 tagtype = " local"
3150 else:
3150 else:
3151 tagtype = ""
3151 tagtype = ""
3152 ui.write("%s%s %s%s\n" % (t, spaces, r, tagtype))
3152 ui.write("%s%s %s%s\n" % (t, spaces, r, tagtype))
3153
3153
3154 def tip(ui, repo, **opts):
3154 def tip(ui, repo, **opts):
3155 """show the tip revision
3155 """show the tip revision
3156
3156
3157 The tip revision (usually just called the tip) is the changeset
3157 The tip revision (usually just called the tip) is the changeset
3158 most recently added to the repository (and therefore the most
3158 most recently added to the repository (and therefore the most
3159 recently changed head).
3159 recently changed head).
3160
3160
3161 If you have just made a commit, that commit will be the tip. If
3161 If you have just made a commit, that commit will be the tip. If
3162 you have just pulled changes from another repository, the tip of
3162 you have just pulled changes from another repository, the tip of
3163 that repository becomes the current tip. The "tip" tag is special
3163 that repository becomes the current tip. The "tip" tag is special
3164 and cannot be renamed or assigned to a different changeset.
3164 and cannot be renamed or assigned to a different changeset.
3165 """
3165 """
3166 displayer = cmdutil.show_changeset(ui, repo, opts)
3166 displayer = cmdutil.show_changeset(ui, repo, opts)
3167 displayer.show(repo[len(repo) - 1])
3167 displayer.show(repo[len(repo) - 1])
3168 displayer.close()
3168 displayer.close()
3169
3169
3170 def unbundle(ui, repo, fname1, *fnames, **opts):
3170 def unbundle(ui, repo, fname1, *fnames, **opts):
3171 """apply one or more changegroup files
3171 """apply one or more changegroup files
3172
3172
3173 Apply one or more compressed changegroup files generated by the
3173 Apply one or more compressed changegroup files generated by the
3174 bundle command.
3174 bundle command.
3175 """
3175 """
3176 fnames = (fname1,) + fnames
3176 fnames = (fname1,) + fnames
3177
3177
3178 lock = repo.lock()
3178 lock = repo.lock()
3179 try:
3179 try:
3180 for fname in fnames:
3180 for fname in fnames:
3181 f = url.open(ui, fname)
3181 f = url.open(ui, fname)
3182 gen = changegroup.readbundle(f, fname)
3182 gen = changegroup.readbundle(f, fname)
3183 modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname)
3183 modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname)
3184 finally:
3184 finally:
3185 lock.release()
3185 lock.release()
3186
3186
3187 return postincoming(ui, repo, modheads, opts.get('update'), None)
3187 return postincoming(ui, repo, modheads, opts.get('update'), None)
3188
3188
3189 def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False):
3189 def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False):
3190 """update working directory
3190 """update working directory
3191
3191
3192 Update the repository's working directory to the specified
3192 Update the repository's working directory to the specified
3193 changeset.
3193 changeset.
3194
3194
3195 If no changeset is specified, attempt to update to the head of the
3195 If no changeset is specified, attempt to update to the head of the
3196 current branch. If this head is a descendant of the working
3196 current branch. If this head is a descendant of the working
3197 directory's parent, update to it, otherwise abort.
3197 directory's parent, update to it, otherwise abort.
3198
3198
3199 The following rules apply when the working directory contains
3199 The following rules apply when the working directory contains
3200 uncommitted changes:
3200 uncommitted changes:
3201
3201
3202 1. If neither -c/--check nor -C/--clean is specified, and if
3202 1. If neither -c/--check nor -C/--clean is specified, and if
3203 the requested changeset is an ancestor or descendant of
3203 the requested changeset is an ancestor or descendant of
3204 the working directory's parent, the uncommitted changes
3204 the working directory's parent, the uncommitted changes
3205 are merged into the requested changeset and the merged
3205 are merged into the requested changeset and the merged
3206 result is left uncommitted. If the requested changeset is
3206 result is left uncommitted. If the requested changeset is
3207 not an ancestor or descendant (that is, it is on another
3207 not an ancestor or descendant (that is, it is on another
3208 branch), the update is aborted and the uncommitted changes
3208 branch), the update is aborted and the uncommitted changes
3209 are preserved.
3209 are preserved.
3210
3210
3211 2. With the -c/--check option, the update is aborted and the
3211 2. With the -c/--check option, the update is aborted and the
3212 uncommitted changes are preserved.
3212 uncommitted changes are preserved.
3213
3213
3214 3. With the -C/--clean option, uncommitted changes are discarded and
3214 3. With the -C/--clean option, uncommitted changes are discarded and
3215 the working directory is updated to the requested changeset.
3215 the working directory is updated to the requested changeset.
3216
3216
3217 Use null as the changeset to remove the working directory (like 'hg
3217 Use null as the changeset to remove the working directory (like 'hg
3218 clone -U').
3218 clone -U').
3219
3219
3220 If you want to update just one file to an older changeset, use 'hg revert'.
3220 If you want to update just one file to an older changeset, use 'hg revert'.
3221
3221
3222 See 'hg help dates' for a list of formats valid for -d/--date.
3222 See 'hg help dates' for a list of formats valid for -d/--date.
3223 """
3223 """
3224 if rev and node:
3224 if rev and node:
3225 raise util.Abort(_("please specify just one revision"))
3225 raise util.Abort(_("please specify just one revision"))
3226
3226
3227 if not rev:
3227 if not rev:
3228 rev = node
3228 rev = node
3229
3229
3230 if check and clean:
3230 if check and clean:
3231 raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
3231 raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
3232
3232
3233 if check:
3233 if check:
3234 # we could use dirty() but we can ignore merge and branch trivia
3234 # we could use dirty() but we can ignore merge and branch trivia
3235 c = repo[None]
3235 c = repo[None]
3236 if c.modified() or c.added() or c.removed():
3236 if c.modified() or c.added() or c.removed():
3237 raise util.Abort(_("uncommitted local changes"))
3237 raise util.Abort(_("uncommitted local changes"))
3238
3238
3239 if date:
3239 if date:
3240 if rev:
3240 if rev:
3241 raise util.Abort(_("you can't specify a revision and a date"))
3241 raise util.Abort(_("you can't specify a revision and a date"))
3242 rev = cmdutil.finddate(ui, repo, date)
3242 rev = cmdutil.finddate(ui, repo, date)
3243
3243
3244 if clean or check:
3244 if clean or check:
3245 return hg.clean(repo, rev)
3245 return hg.clean(repo, rev)
3246 else:
3246 else:
3247 return hg.update(repo, rev)
3247 return hg.update(repo, rev)
3248
3248
3249 def verify(ui, repo):
3249 def verify(ui, repo):
3250 """verify the integrity of the repository
3250 """verify the integrity of the repository
3251
3251
3252 Verify the integrity of the current repository.
3252 Verify the integrity of the current repository.
3253
3253
3254 This will perform an extensive check of the repository's
3254 This will perform an extensive check of the repository's
3255 integrity, validating the hashes and checksums of each entry in
3255 integrity, validating the hashes and checksums of each entry in
3256 the changelog, manifest, and tracked files, as well as the
3256 the changelog, manifest, and tracked files, as well as the
3257 integrity of their crosslinks and indices.
3257 integrity of their crosslinks and indices.
3258 """
3258 """
3259 return hg.verify(repo)
3259 return hg.verify(repo)
3260
3260
3261 def version_(ui):
3261 def version_(ui):
3262 """output version and copyright information"""
3262 """output version and copyright information"""
3263 ui.write(_("Mercurial Distributed SCM (version %s)\n")
3263 ui.write(_("Mercurial Distributed SCM (version %s)\n")
3264 % util.version())
3264 % util.version())
3265 ui.status(_(
3265 ui.status(_(
3266 "\nCopyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others\n"
3266 "\nCopyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others\n"
3267 "This is free software; see the source for copying conditions. "
3267 "This is free software; see the source for copying conditions. "
3268 "There is NO\nwarranty; "
3268 "There is NO\nwarranty; "
3269 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
3269 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
3270 ))
3270 ))
3271
3271
3272 # Command options and aliases are listed here, alphabetically
3272 # Command options and aliases are listed here, alphabetically
3273
3273
3274 globalopts = [
3274 globalopts = [
3275 ('R', 'repository', '',
3275 ('R', 'repository', '',
3276 _('repository root directory or name of overlay bundle file')),
3276 _('repository root directory or name of overlay bundle file')),
3277 ('', 'cwd', '', _('change working directory')),
3277 ('', 'cwd', '', _('change working directory')),
3278 ('y', 'noninteractive', None,
3278 ('y', 'noninteractive', None,
3279 _('do not prompt, assume \'yes\' for any required answers')),
3279 _('do not prompt, assume \'yes\' for any required answers')),
3280 ('q', 'quiet', None, _('suppress output')),
3280 ('q', 'quiet', None, _('suppress output')),
3281 ('v', 'verbose', None, _('enable additional output')),
3281 ('v', 'verbose', None, _('enable additional output')),
3282 ('', 'config', [], _('set/override config option')),
3282 ('', 'config', [], _('set/override config option')),
3283 ('', 'debug', None, _('enable debugging output')),
3283 ('', 'debug', None, _('enable debugging output')),
3284 ('', 'debugger', None, _('start debugger')),
3284 ('', 'debugger', None, _('start debugger')),
3285 ('', 'encoding', encoding.encoding, _('set the charset encoding')),
3285 ('', 'encoding', encoding.encoding, _('set the charset encoding')),
3286 ('', 'encodingmode', encoding.encodingmode,
3286 ('', 'encodingmode', encoding.encodingmode,
3287 _('set the charset encoding mode')),
3287 _('set the charset encoding mode')),
3288 ('', 'traceback', None, _('always print a traceback on exception')),
3288 ('', 'traceback', None, _('always print a traceback on exception')),
3289 ('', 'time', None, _('time how long the command takes')),
3289 ('', 'time', None, _('time how long the command takes')),
3290 ('', 'profile', None, _('print command execution profile')),
3290 ('', 'profile', None, _('print command execution profile')),
3291 ('', 'version', None, _('output version information and exit')),
3291 ('', 'version', None, _('output version information and exit')),
3292 ('h', 'help', None, _('display help and exit')),
3292 ('h', 'help', None, _('display help and exit')),
3293 ]
3293 ]
3294
3294
3295 dryrunopts = [('n', 'dry-run', None,
3295 dryrunopts = [('n', 'dry-run', None,
3296 _('do not perform actions, just print output'))]
3296 _('do not perform actions, just print output'))]
3297
3297
3298 remoteopts = [
3298 remoteopts = [
3299 ('e', 'ssh', '', _('specify ssh command to use')),
3299 ('e', 'ssh', '', _('specify ssh command to use')),
3300 ('', 'remotecmd', '', _('specify hg command to run on the remote side')),
3300 ('', 'remotecmd', '', _('specify hg command to run on the remote side')),
3301 ]
3301 ]
3302
3302
3303 walkopts = [
3303 walkopts = [
3304 ('I', 'include', [], _('include names matching the given patterns')),
3304 ('I', 'include', [], _('include names matching the given patterns')),
3305 ('X', 'exclude', [], _('exclude names matching the given patterns')),
3305 ('X', 'exclude', [], _('exclude names matching the given patterns')),
3306 ]
3306 ]
3307
3307
3308 commitopts = [
3308 commitopts = [
3309 ('m', 'message', '', _('use <text> as commit message')),
3309 ('m', 'message', '', _('use <text> as commit message')),
3310 ('l', 'logfile', '', _('read commit message from <file>')),
3310 ('l', 'logfile', '', _('read commit message from <file>')),
3311 ]
3311 ]
3312
3312
3313 commitopts2 = [
3313 commitopts2 = [
3314 ('d', 'date', '', _('record datecode as commit date')),
3314 ('d', 'date', '', _('record datecode as commit date')),
3315 ('u', 'user', '', _('record the specified user as committer')),
3315 ('u', 'user', '', _('record the specified user as committer')),
3316 ]
3316 ]
3317
3317
3318 templateopts = [
3318 templateopts = [
3319 ('', 'style', '', _('display using template map file')),
3319 ('', 'style', '', _('display using template map file')),
3320 ('', 'template', '', _('display with template')),
3320 ('', 'template', '', _('display with template')),
3321 ]
3321 ]
3322
3322
3323 logopts = [
3323 logopts = [
3324 ('p', 'patch', None, _('show patch')),
3324 ('p', 'patch', None, _('show patch')),
3325 ('g', 'git', None, _('use git extended diff format')),
3325 ('g', 'git', None, _('use git extended diff format')),
3326 ('l', 'limit', '', _('limit number of changes displayed')),
3326 ('l', 'limit', '', _('limit number of changes displayed')),
3327 ('M', 'no-merges', None, _('do not show merges')),
3327 ('M', 'no-merges', None, _('do not show merges')),
3328 ] + templateopts
3328 ] + templateopts
3329
3329
3330 diffopts = [
3330 diffopts = [
3331 ('a', 'text', None, _('treat all files as text')),
3331 ('a', 'text', None, _('treat all files as text')),
3332 ('g', 'git', None, _('use git extended diff format')),
3332 ('g', 'git', None, _('use git extended diff format')),
3333 ('', 'nodates', None, _("don't include dates in diff headers"))
3333 ('', 'nodates', None, _('omit dates from diff headers'))
3334 ]
3334 ]
3335
3335
3336 diffopts2 = [
3336 diffopts2 = [
3337 ('p', 'show-function', None, _('show which function each change is in')),
3337 ('p', 'show-function', None, _('show which function each change is in')),
3338 ('', 'reverse', None, _('produce a diff that undoes the changes')),
3338 ('', 'reverse', None, _('produce a diff that undoes the changes')),
3339 ('w', 'ignore-all-space', None,
3339 ('w', 'ignore-all-space', None,
3340 _('ignore white space when comparing lines')),
3340 _('ignore white space when comparing lines')),
3341 ('b', 'ignore-space-change', None,
3341 ('b', 'ignore-space-change', None,
3342 _('ignore changes in the amount of white space')),
3342 _('ignore changes in the amount of white space')),
3343 ('B', 'ignore-blank-lines', None,
3343 ('B', 'ignore-blank-lines', None,
3344 _('ignore changes whose lines are all blank')),
3344 _('ignore changes whose lines are all blank')),
3345 ('U', 'unified', '', _('number of lines of context to show')),
3345 ('U', 'unified', '', _('number of lines of context to show')),
3346 ('', 'stat', None, _('output diffstat-style summary of changes')),
3346 ('', 'stat', None, _('output diffstat-style summary of changes')),
3347 ]
3347 ]
3348
3348
3349 similarityopts = [
3349 similarityopts = [
3350 ('s', 'similarity', '',
3350 ('s', 'similarity', '',
3351 _('guess renamed files by similarity (0<=s<=100)'))
3351 _('guess renamed files by similarity (0<=s<=100)'))
3352 ]
3352 ]
3353
3353
3354 table = {
3354 table = {
3355 "^add": (add, walkopts + dryrunopts, _('[OPTION]... [FILE]...')),
3355 "^add": (add, walkopts + dryrunopts, _('[OPTION]... [FILE]...')),
3356 "addremove":
3356 "addremove":
3357 (addremove, similarityopts + walkopts + dryrunopts,
3357 (addremove, similarityopts + walkopts + dryrunopts,
3358 _('[OPTION]... [FILE]...')),
3358 _('[OPTION]... [FILE]...')),
3359 "^annotate|blame":
3359 "^annotate|blame":
3360 (annotate,
3360 (annotate,
3361 [('r', 'rev', '', _('annotate the specified revision')),
3361 [('r', 'rev', '', _('annotate the specified revision')),
3362 ('', 'follow', None, _('follow copies and renames (DEPRECATED)')),
3362 ('', 'follow', None, _('follow copies and renames (DEPRECATED)')),
3363 ('', 'no-follow', None, _("don't follow copies and renames")),
3363 ('', 'no-follow', None, _("don't follow copies and renames")),
3364 ('a', 'text', None, _('treat all files as text')),
3364 ('a', 'text', None, _('treat all files as text')),
3365 ('u', 'user', None, _('list the author (long with -v)')),
3365 ('u', 'user', None, _('list the author (long with -v)')),
3366 ('f', 'file', None, _('list the filename')),
3366 ('f', 'file', None, _('list the filename')),
3367 ('d', 'date', None, _('list the date (short with -q)')),
3367 ('d', 'date', None, _('list the date (short with -q)')),
3368 ('n', 'number', None, _('list the revision number (default)')),
3368 ('n', 'number', None, _('list the revision number (default)')),
3369 ('c', 'changeset', None, _('list the changeset')),
3369 ('c', 'changeset', None, _('list the changeset')),
3370 ('l', 'line-number', None,
3370 ('l', 'line-number', None,
3371 _('show line number at the first appearance'))
3371 _('show line number at the first appearance'))
3372 ] + walkopts,
3372 ] + walkopts,
3373 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...')),
3373 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...')),
3374 "archive":
3374 "archive":
3375 (archive,
3375 (archive,
3376 [('', 'no-decode', None, _('do not pass files through decoders')),
3376 [('', 'no-decode', None, _('do not pass files through decoders')),
3377 ('p', 'prefix', '', _('directory prefix for files in archive')),
3377 ('p', 'prefix', '', _('directory prefix for files in archive')),
3378 ('r', 'rev', '', _('revision to distribute')),
3378 ('r', 'rev', '', _('revision to distribute')),
3379 ('t', 'type', '', _('type of distribution to create')),
3379 ('t', 'type', '', _('type of distribution to create')),
3380 ] + walkopts,
3380 ] + walkopts,
3381 _('[OPTION]... DEST')),
3381 _('[OPTION]... DEST')),
3382 "backout":
3382 "backout":
3383 (backout,
3383 (backout,
3384 [('', 'merge', None,
3384 [('', 'merge', None,
3385 _('merge with old dirstate parent after backout')),
3385 _('merge with old dirstate parent after backout')),
3386 ('', 'parent', '', _('parent to choose when backing out merge')),
3386 ('', 'parent', '', _('parent to choose when backing out merge')),
3387 ('r', 'rev', '', _('revision to backout')),
3387 ('r', 'rev', '', _('revision to backout')),
3388 ] + walkopts + commitopts + commitopts2,
3388 ] + walkopts + commitopts + commitopts2,
3389 _('[OPTION]... [-r] REV')),
3389 _('[OPTION]... [-r] REV')),
3390 "bisect":
3390 "bisect":
3391 (bisect,
3391 (bisect,
3392 [('r', 'reset', False, _('reset bisect state')),
3392 [('r', 'reset', False, _('reset bisect state')),
3393 ('g', 'good', False, _('mark changeset good')),
3393 ('g', 'good', False, _('mark changeset good')),
3394 ('b', 'bad', False, _('mark changeset bad')),
3394 ('b', 'bad', False, _('mark changeset bad')),
3395 ('s', 'skip', False, _('skip testing changeset')),
3395 ('s', 'skip', False, _('skip testing changeset')),
3396 ('c', 'command', '', _('use command to check changeset state')),
3396 ('c', 'command', '', _('use command to check changeset state')),
3397 ('U', 'noupdate', False, _('do not update to target'))],
3397 ('U', 'noupdate', False, _('do not update to target'))],
3398 _("[-gbsr] [-U] [-c CMD] [REV]")),
3398 _("[-gbsr] [-U] [-c CMD] [REV]")),
3399 "branch":
3399 "branch":
3400 (branch,
3400 (branch,
3401 [('f', 'force', None,
3401 [('f', 'force', None,
3402 _('set branch name even if it shadows an existing branch')),
3402 _('set branch name even if it shadows an existing branch')),
3403 ('C', 'clean', None, _('reset branch name to parent branch name'))],
3403 ('C', 'clean', None, _('reset branch name to parent branch name'))],
3404 _('[-fC] [NAME]')),
3404 _('[-fC] [NAME]')),
3405 "branches":
3405 "branches":
3406 (branches,
3406 (branches,
3407 [('a', 'active', False,
3407 [('a', 'active', False,
3408 _('show only branches that have unmerged heads')),
3408 _('show only branches that have unmerged heads')),
3409 ('c', 'closed', False,
3409 ('c', 'closed', False,
3410 _('show normal and closed branches'))],
3410 _('show normal and closed branches'))],
3411 _('[-ac]')),
3411 _('[-ac]')),
3412 "bundle":
3412 "bundle":
3413 (bundle,
3413 (bundle,
3414 [('f', 'force', None,
3414 [('f', 'force', None,
3415 _('run even when remote repository is unrelated')),
3415 _('run even when the destination is unrelated')),
3416 ('r', 'rev', [],
3416 ('r', 'rev', [],
3417 _('a changeset up to which you would like to bundle')),
3417 _('a changeset intended to be added to the destination')),
3418 ('', 'base', [],
3418 ('', 'base', [],
3419 _('a base changeset to specify instead of a destination')),
3419 _('a base changeset assumed to be available at the destination')),
3420 ('a', 'all', None, _('bundle all changesets in the repository')),
3420 ('a', 'all', None, _('bundle all changesets in the repository')),
3421 ('t', 'type', 'bzip2', _('bundle compression type to use')),
3421 ('t', 'type', 'bzip2', _('bundle compression type to use')),
3422 ] + remoteopts,
3422 ] + remoteopts,
3423 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]')),
3423 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]')),
3424 "cat":
3424 "cat":
3425 (cat,
3425 (cat,
3426 [('o', 'output', '', _('print output to file with formatted name')),
3426 [('o', 'output', '', _('print output to file with formatted name')),
3427 ('r', 'rev', '', _('print the given revision')),
3427 ('r', 'rev', '', _('print the given revision')),
3428 ('', 'decode', None, _('apply any matching decode filter')),
3428 ('', 'decode', None, _('apply any matching decode filter')),
3429 ] + walkopts,
3429 ] + walkopts,
3430 _('[OPTION]... FILE...')),
3430 _('[OPTION]... FILE...')),
3431 "^clone":
3431 "^clone":
3432 (clone,
3432 (clone,
3433 [('U', 'noupdate', None,
3433 [('U', 'noupdate', None,
3434 _('the clone will only contain a repository (no working copy)')),
3434 _('the clone will include an empty working copy (only a repository)')),
3435 ('u', 'updaterev', '',
3435 ('u', 'updaterev', '',
3436 _('revision, tag or branch to check out')),
3436 _('revision, tag or branch to check out')),
3437 ('r', 'rev', [],
3437 ('r', 'rev', [],
3438 _('clone only the specified revisions and ancestors')),
3438 _('include the specified changeset')),
3439 ('', 'pull', None, _('use pull protocol to copy metadata')),
3439 ('', 'pull', None, _('use pull protocol to copy metadata')),
3440 ('', 'uncompressed', None,
3440 ('', 'uncompressed', None,
3441 _('use uncompressed transfer (fast over LAN)')),
3441 _('use uncompressed transfer (fast over LAN)')),
3442 ] + remoteopts,
3442 ] + remoteopts,
3443 _('[OPTION]... SOURCE [DEST]')),
3443 _('[OPTION]... SOURCE [DEST]')),
3444 "^commit|ci":
3444 "^commit|ci":
3445 (commit,
3445 (commit,
3446 [('A', 'addremove', None,
3446 [('A', 'addremove', None,
3447 _('mark new/missing files as added/removed before committing')),
3447 _('mark new/missing files as added/removed before committing')),
3448 ('', 'close-branch', None,
3448 ('', 'close-branch', None,
3449 _('mark a branch as closed, hiding it from the branch list')),
3449 _('mark a branch as closed, hiding it from the branch list')),
3450 ] + walkopts + commitopts + commitopts2,
3450 ] + walkopts + commitopts + commitopts2,
3451 _('[OPTION]... [FILE]...')),
3451 _('[OPTION]... [FILE]...')),
3452 "copy|cp":
3452 "copy|cp":
3453 (copy,
3453 (copy,
3454 [('A', 'after', None, _('record a copy that has already occurred')),
3454 [('A', 'after', None, _('record a copy that has already occurred')),
3455 ('f', 'force', None,
3455 ('f', 'force', None,
3456 _('forcibly copy over an existing managed file')),
3456 _('forcibly copy over an existing managed file')),
3457 ] + walkopts + dryrunopts,
3457 ] + walkopts + dryrunopts,
3458 _('[OPTION]... [SOURCE]... DEST')),
3458 _('[OPTION]... [SOURCE]... DEST')),
3459 "debugancestor": (debugancestor, [], _('[INDEX] REV1 REV2')),
3459 "debugancestor": (debugancestor, [], _('[INDEX] REV1 REV2')),
3460 "debugcheckstate": (debugcheckstate, [], ''),
3460 "debugcheckstate": (debugcheckstate, [], ''),
3461 "debugcommands": (debugcommands, [], _('[COMMAND]')),
3461 "debugcommands": (debugcommands, [], _('[COMMAND]')),
3462 "debugcomplete":
3462 "debugcomplete":
3463 (debugcomplete,
3463 (debugcomplete,
3464 [('o', 'options', None, _('show the command options'))],
3464 [('o', 'options', None, _('show the command options'))],
3465 _('[-o] CMD')),
3465 _('[-o] CMD')),
3466 "debugdate":
3466 "debugdate":
3467 (debugdate,
3467 (debugdate,
3468 [('e', 'extended', None, _('try extended date formats'))],
3468 [('e', 'extended', None, _('try extended date formats'))],
3469 _('[-e] DATE [RANGE]')),
3469 _('[-e] DATE [RANGE]')),
3470 "debugdata": (debugdata, [], _('FILE REV')),
3470 "debugdata": (debugdata, [], _('FILE REV')),
3471 "debugfsinfo": (debugfsinfo, [], _('[PATH]')),
3471 "debugfsinfo": (debugfsinfo, [], _('[PATH]')),
3472 "debugindex": (debugindex, [], _('FILE')),
3472 "debugindex": (debugindex, [], _('FILE')),
3473 "debugindexdot": (debugindexdot, [], _('FILE')),
3473 "debugindexdot": (debugindexdot, [], _('FILE')),
3474 "debuginstall": (debuginstall, [], ''),
3474 "debuginstall": (debuginstall, [], ''),
3475 "debugrebuildstate":
3475 "debugrebuildstate":
3476 (debugrebuildstate,
3476 (debugrebuildstate,
3477 [('r', 'rev', '', _('revision to rebuild to'))],
3477 [('r', 'rev', '', _('revision to rebuild to'))],
3478 _('[-r REV] [REV]')),
3478 _('[-r REV] [REV]')),
3479 "debugrename":
3479 "debugrename":
3480 (debugrename,
3480 (debugrename,
3481 [('r', 'rev', '', _('revision to debug'))],
3481 [('r', 'rev', '', _('revision to debug'))],
3482 _('[-r REV] FILE')),
3482 _('[-r REV] FILE')),
3483 "debugsetparents":
3483 "debugsetparents":
3484 (debugsetparents, [], _('REV1 [REV2]')),
3484 (debugsetparents, [], _('REV1 [REV2]')),
3485 "debugstate":
3485 "debugstate":
3486 (debugstate,
3486 (debugstate,
3487 [('', 'nodates', None, _('do not display the saved mtime'))],
3487 [('', 'nodates', None, _('do not display the saved mtime'))],
3488 _('[OPTION]...')),
3488 _('[OPTION]...')),
3489 "debugsub":
3489 "debugsub":
3490 (debugsub,
3490 (debugsub,
3491 [('r', 'rev', '', _('revision to check'))],
3491 [('r', 'rev', '', _('revision to check'))],
3492 _('[-r REV] [REV]')),
3492 _('[-r REV] [REV]')),
3493 "debugwalk": (debugwalk, walkopts, _('[OPTION]... [FILE]...')),
3493 "debugwalk": (debugwalk, walkopts, _('[OPTION]... [FILE]...')),
3494 "^diff":
3494 "^diff":
3495 (diff,
3495 (diff,
3496 [('r', 'rev', [], _('revision')),
3496 [('r', 'rev', [], _('revision')),
3497 ('c', 'change', '', _('change made by revision'))
3497 ('c', 'change', '', _('change made by revision'))
3498 ] + diffopts + diffopts2 + walkopts,
3498 ] + diffopts + diffopts2 + walkopts,
3499 _('[OPTION]... [-r REV1 [-r REV2]] [FILE]...')),
3499 _('[OPTION]... [-r REV1 [-r REV2]] [FILE]...')),
3500 "^export":
3500 "^export":
3501 (export,
3501 (export,
3502 [('o', 'output', '', _('print output to file with formatted name')),
3502 [('o', 'output', '', _('print output to file with formatted name')),
3503 ('', 'switch-parent', None, _('diff against the second parent')),
3503 ('', 'switch-parent', None, _('diff against the second parent')),
3504 ('r', 'rev', [], _('revisions to export')),
3504 ('r', 'rev', [], _('revisions to export')),
3505 ] + diffopts,
3505 ] + diffopts,
3506 _('[OPTION]... [-o OUTFILESPEC] REV...')),
3506 _('[OPTION]... [-o OUTFILESPEC] REV...')),
3507 "^forget":
3507 "^forget":
3508 (forget,
3508 (forget,
3509 [] + walkopts,
3509 [] + walkopts,
3510 _('[OPTION]... FILE...')),
3510 _('[OPTION]... FILE...')),
3511 "grep":
3511 "grep":
3512 (grep,
3512 (grep,
3513 [('0', 'print0', None, _('end fields with NUL')),
3513 [('0', 'print0', None, _('end fields with NUL')),
3514 ('', 'all', None, _('print all revisions that match')),
3514 ('', 'all', None, _('print all revisions that match')),
3515 ('f', 'follow', None,
3515 ('f', 'follow', None,
3516 _('follow changeset history,'
3516 _('follow changeset history,'
3517 ' or file history across copies and renames')),
3517 ' or file history across copies and renames')),
3518 ('i', 'ignore-case', None, _('ignore case when matching')),
3518 ('i', 'ignore-case', None, _('ignore case when matching')),
3519 ('l', 'files-with-matches', None,
3519 ('l', 'files-with-matches', None,
3520 _('print only filenames and revisions that match')),
3520 _('print only filenames and revisions that match')),
3521 ('n', 'line-number', None, _('print matching line numbers')),
3521 ('n', 'line-number', None, _('print matching line numbers')),
3522 ('r', 'rev', [], _('search in given revision range')),
3522 ('r', 'rev', [], _('search in given revision range')),
3523 ('u', 'user', None, _('list the author (long with -v)')),
3523 ('u', 'user', None, _('list the author (long with -v)')),
3524 ('d', 'date', None, _('list the date (short with -q)')),
3524 ('d', 'date', None, _('list the date (short with -q)')),
3525 ] + walkopts,
3525 ] + walkopts,
3526 _('[OPTION]... PATTERN [FILE]...')),
3526 _('[OPTION]... PATTERN [FILE]...')),
3527 "heads":
3527 "heads":
3528 (heads,
3528 (heads,
3529 [('r', 'rev', '', _('show only heads which are descendants of REV')),
3529 [('r', 'rev', '', _('show only heads which are descendants of REV')),
3530 ('t', 'topo', False, _('show topological heads only')),
3530 ('t', 'topo', False, _('show topological heads only')),
3531 ('a', 'active', False,
3531 ('a', 'active', False,
3532 _('show active branchheads only [DEPRECATED]')),
3532 _('show active branchheads only [DEPRECATED]')),
3533 ('c', 'closed', False,
3533 ('c', 'closed', False,
3534 _('show normal and closed branch heads')),
3534 _('show normal and closed branch heads')),
3535 ] + templateopts,
3535 ] + templateopts,
3536 _('[-ac] [-r STARTREV] [REV]...')),
3536 _('[-ac] [-r STARTREV] [REV]...')),
3537 "help": (help_, [], _('[TOPIC]')),
3537 "help": (help_, [], _('[TOPIC]')),
3538 "identify|id":
3538 "identify|id":
3539 (identify,
3539 (identify,
3540 [('r', 'rev', '', _('identify the specified revision')),
3540 [('r', 'rev', '', _('identify the specified revision')),
3541 ('n', 'num', None, _('show local revision number')),
3541 ('n', 'num', None, _('show local revision number')),
3542 ('i', 'id', None, _('show global revision id')),
3542 ('i', 'id', None, _('show global revision id')),
3543 ('b', 'branch', None, _('show branch')),
3543 ('b', 'branch', None, _('show branch')),
3544 ('t', 'tags', None, _('show tags'))],
3544 ('t', 'tags', None, _('show tags'))],
3545 _('[-nibt] [-r REV] [SOURCE]')),
3545 _('[-nibt] [-r REV] [SOURCE]')),
3546 "import|patch":
3546 "import|patch":
3547 (import_,
3547 (import_,
3548 [('p', 'strip', 1,
3548 [('p', 'strip', 1,
3549 _('directory strip option for patch. This has the same '
3549 _('directory strip option for patch. This has the same '
3550 'meaning as the corresponding patch option')),
3550 'meaning as the corresponding patch option')),
3551 ('b', 'base', '', _('base path')),
3551 ('b', 'base', '', _('base path')),
3552 ('f', 'force', None,
3552 ('f', 'force', None,
3553 _('skip check for outstanding uncommitted changes')),
3553 _('skip check for outstanding uncommitted changes')),
3554 ('', 'no-commit', None,
3554 ('', 'no-commit', None,
3555 _("don't commit, just update the working directory")),
3555 _("don't commit, just update the working directory")),
3556 ('', 'exact', None,
3556 ('', 'exact', None,
3557 _('apply patch to the nodes from which it was generated')),
3557 _('apply patch to the nodes from which it was generated')),
3558 ('', 'import-branch', None,
3558 ('', 'import-branch', None,
3559 _('use any branch information in patch (implied by --exact)'))] +
3559 _('use any branch information in patch (implied by --exact)'))] +
3560 commitopts + commitopts2 + similarityopts,
3560 commitopts + commitopts2 + similarityopts,
3561 _('[OPTION]... PATCH...')),
3561 _('[OPTION]... PATCH...')),
3562 "incoming|in":
3562 "incoming|in":
3563 (incoming,
3563 (incoming,
3564 [('f', 'force', None,
3564 [('f', 'force', None,
3565 _('run even when remote repository is unrelated')),
3565 _('run even if remote repository is unrelated')),
3566 ('n', 'newest-first', None, _('show newest record first')),
3566 ('n', 'newest-first', None, _('show newest record first')),
3567 ('', 'bundle', '', _('file to store the bundles into')),
3567 ('', 'bundle', '', _('file to store the bundles into')),
3568 ('r', 'rev', [],
3568 ('r', 'rev', [],
3569 _('a specific remote revision up to which you would like to pull')),
3569 _('a remote changeset intended to be added')),
3570 ] + logopts + remoteopts,
3570 ] + logopts + remoteopts,
3571 _('[-p] [-n] [-M] [-f] [-r REV]...'
3571 _('[-p] [-n] [-M] [-f] [-r REV]...'
3572 ' [--bundle FILENAME] [SOURCE]')),
3572 ' [--bundle FILENAME] [SOURCE]')),
3573 "^init":
3573 "^init":
3574 (init,
3574 (init,
3575 remoteopts,
3575 remoteopts,
3576 _('[-e CMD] [--remotecmd CMD] [DEST]')),
3576 _('[-e CMD] [--remotecmd CMD] [DEST]')),
3577 "locate":
3577 "locate":
3578 (locate,
3578 (locate,
3579 [('r', 'rev', '', _('search the repository as it stood at REV')),
3579 [('r', 'rev', '', _('search the repository as it is in REV')),
3580 ('0', 'print0', None,
3580 ('0', 'print0', None,
3581 _('end filenames with NUL, for use with xargs')),
3581 _('end filenames with NUL, for use with xargs')),
3582 ('f', 'fullpath', None,
3582 ('f', 'fullpath', None,
3583 _('print complete paths from the filesystem root')),
3583 _('print complete paths from the filesystem root')),
3584 ] + walkopts,
3584 ] + walkopts,
3585 _('[OPTION]... [PATTERN]...')),
3585 _('[OPTION]... [PATTERN]...')),
3586 "^log|history":
3586 "^log|history":
3587 (log,
3587 (log,
3588 [('f', 'follow', None,
3588 [('f', 'follow', None,
3589 _('follow changeset history,'
3589 _('follow changeset history,'
3590 ' or file history across copies and renames')),
3590 ' or file history across copies and renames')),
3591 ('', 'follow-first', None,
3591 ('', 'follow-first', None,
3592 _('only follow the first parent of merge changesets')),
3592 _('only follow the first parent of merge changesets')),
3593 ('d', 'date', '', _('show revisions matching date spec')),
3593 ('d', 'date', '', _('show revisions matching date spec')),
3594 ('C', 'copies', None, _('show copied files')),
3594 ('C', 'copies', None, _('show copied files')),
3595 ('k', 'keyword', [], _('do case-insensitive search for a keyword')),
3595 ('k', 'keyword', [], _('do case-insensitive search for a keyword')),
3596 ('r', 'rev', [], _('show the specified revision or range')),
3596 ('r', 'rev', [], _('show the specified revision or range')),
3597 ('', 'removed', None, _('include revisions where files were removed')),
3597 ('', 'removed', None, _('include revisions where files were removed')),
3598 ('m', 'only-merges', None, _('show only merges')),
3598 ('m', 'only-merges', None, _('show only merges')),
3599 ('u', 'user', [], _('revisions committed by user')),
3599 ('u', 'user', [], _('revisions committed by user')),
3600 ('b', 'only-branch', [],
3600 ('b', 'only-branch', [],
3601 _('show only changesets within the given named branch')),
3601 _('show only changesets within the given named branch')),
3602 ('P', 'prune', [],
3602 ('P', 'prune', [],
3603 _('do not display revision or any of its ancestors')),
3603 _('do not display revision or any of its ancestors')),
3604 ] + logopts + walkopts,
3604 ] + logopts + walkopts,
3605 _('[OPTION]... [FILE]')),
3605 _('[OPTION]... [FILE]')),
3606 "manifest":
3606 "manifest":
3607 (manifest,
3607 (manifest,
3608 [('r', 'rev', '', _('revision to display'))],
3608 [('r', 'rev', '', _('revision to display'))],
3609 _('[-r REV]')),
3609 _('[-r REV]')),
3610 "^merge":
3610 "^merge":
3611 (merge,
3611 (merge,
3612 [('f', 'force', None, _('force a merge with outstanding changes')),
3612 [('f', 'force', None, _('force a merge with outstanding changes')),
3613 ('r', 'rev', '', _('revision to merge')),
3613 ('r', 'rev', '', _('revision to merge')),
3614 ('P', 'preview', None,
3614 ('P', 'preview', None,
3615 _('review revisions to merge (no merge is performed)'))],
3615 _('review revisions to merge (no merge is performed)'))],
3616 _('[-P] [-f] [[-r] REV]')),
3616 _('[-P] [-f] [[-r] REV]')),
3617 "outgoing|out":
3617 "outgoing|out":
3618 (outgoing,
3618 (outgoing,
3619 [('f', 'force', None,
3619 [('f', 'force', None,
3620 _('run even when remote repository is unrelated')),
3620 _('run even when the destination is unrelated')),
3621 ('r', 'rev', [],
3621 ('r', 'rev', [],
3622 _('a specific revision up to which you would like to push')),
3622 _('a changeset intended to be included in the destination')),
3623 ('n', 'newest-first', None, _('show newest record first')),
3623 ('n', 'newest-first', None, _('show newest record first')),
3624 ] + logopts + remoteopts,
3624 ] + logopts + remoteopts,
3625 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]')),
3625 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]')),
3626 "parents":
3626 "parents":
3627 (parents,
3627 (parents,
3628 [('r', 'rev', '', _('show parents from the specified revision')),
3628 [('r', 'rev', '', _('show parents of the specified revision')),
3629 ] + templateopts,
3629 ] + templateopts,
3630 _('[-r REV] [FILE]')),
3630 _('[-r REV] [FILE]')),
3631 "paths": (paths, [], _('[NAME]')),
3631 "paths": (paths, [], _('[NAME]')),
3632 "^pull":
3632 "^pull":
3633 (pull,
3633 (pull,
3634 [('u', 'update', None,
3634 [('u', 'update', None,
3635 _('update to new branch head if changesets were pulled')),
3635 _('update to new branch head if changesets were pulled')),
3636 ('f', 'force', None,
3636 ('f', 'force', None,
3637 _('run even when remote repository is unrelated')),
3637 _('run even when remote repository is unrelated')),
3638 ('r', 'rev', [],
3638 ('r', 'rev', [],
3639 _('a specific remote revision up to which you would like to pull')),
3639 _('a remote changeset intended to be added')),
3640 ] + remoteopts,
3640 ] + remoteopts,
3641 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]')),
3641 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]')),
3642 "^push":
3642 "^push":
3643 (push,
3643 (push,
3644 [('f', 'force', None, _('force push')),
3644 [('f', 'force', None, _('force push')),
3645 ('r', 'rev', [],
3645 ('r', 'rev', [],
3646 _('a specific revision up to which you would like to push')),
3646 _('a changeset intended to be included in the destination')),
3647 ] + remoteopts,
3647 ] + remoteopts,
3648 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]')),
3648 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]')),
3649 "recover": (recover, []),
3649 "recover": (recover, []),
3650 "^remove|rm":
3650 "^remove|rm":
3651 (remove,
3651 (remove,
3652 [('A', 'after', None, _('record delete for missing files')),
3652 [('A', 'after', None, _('record delete for missing files')),
3653 ('f', 'force', None,
3653 ('f', 'force', None,
3654 _('remove (and delete) file even if added or modified')),
3654 _('remove (and delete) file even if added or modified')),
3655 ] + walkopts,
3655 ] + walkopts,
3656 _('[OPTION]... FILE...')),
3656 _('[OPTION]... FILE...')),
3657 "rename|mv":
3657 "rename|mv":
3658 (rename,
3658 (rename,
3659 [('A', 'after', None, _('record a rename that has already occurred')),
3659 [('A', 'after', None, _('record a rename that has already occurred')),
3660 ('f', 'force', None,
3660 ('f', 'force', None,
3661 _('forcibly copy over an existing managed file')),
3661 _('forcibly copy over an existing managed file')),
3662 ] + walkopts + dryrunopts,
3662 ] + walkopts + dryrunopts,
3663 _('[OPTION]... SOURCE... DEST')),
3663 _('[OPTION]... SOURCE... DEST')),
3664 "resolve":
3664 "resolve":
3665 (resolve,
3665 (resolve,
3666 [('a', 'all', None, _('select all unresolved files')),
3666 [('a', 'all', None, _('select all unresolved files')),
3667 ('l', 'list', None, _('list state of files needing merge')),
3667 ('l', 'list', None, _('list state of files needing merge')),
3668 ('m', 'mark', None, _('mark files as resolved')),
3668 ('m', 'mark', None, _('mark files as resolved')),
3669 ('u', 'unmark', None, _('unmark files as resolved')),
3669 ('u', 'unmark', None, _('unmark files as resolved')),
3670 ('n', 'no-status', None, _('hide status prefix'))]
3670 ('n', 'no-status', None, _('hide status prefix'))]
3671 + walkopts,
3671 + walkopts,
3672 _('[OPTION]... [FILE]...')),
3672 _('[OPTION]... [FILE]...')),
3673 "revert":
3673 "revert":
3674 (revert,
3674 (revert,
3675 [('a', 'all', None, _('revert all changes when no arguments given')),
3675 [('a', 'all', None, _('revert all changes when no arguments given')),
3676 ('d', 'date', '', _('tipmost revision matching date')),
3676 ('d', 'date', '', _('tipmost revision matching date')),
3677 ('r', 'rev', '', _('revision to revert to')),
3677 ('r', 'rev', '', _('revert to the specified revision')),
3678 ('', 'no-backup', None, _('do not save backup copies of files')),
3678 ('', 'no-backup', None, _('do not save backup copies of files')),
3679 ] + walkopts + dryrunopts,
3679 ] + walkopts + dryrunopts,
3680 _('[OPTION]... [-r REV] [NAME]...')),
3680 _('[OPTION]... [-r REV] [NAME]...')),
3681 "rollback": (rollback, []),
3681 "rollback": (rollback, []),
3682 "root": (root, []),
3682 "root": (root, []),
3683 "^serve":
3683 "^serve":
3684 (serve,
3684 (serve,
3685 [('A', 'accesslog', '', _('name of access log file to write to')),
3685 [('A', 'accesslog', '', _('name of access log file to write to')),
3686 ('d', 'daemon', None, _('run server in background')),
3686 ('d', 'daemon', None, _('run server in background')),
3687 ('', 'daemon-pipefds', '', _('used internally by daemon mode')),
3687 ('', 'daemon-pipefds', '', _('used internally by daemon mode')),
3688 ('E', 'errorlog', '', _('name of error log file to write to')),
3688 ('E', 'errorlog', '', _('name of error log file to write to')),
3689 ('p', 'port', 0, _('port to listen on (default: 8000)')),
3689 ('p', 'port', 0, _('port to listen on (default: 8000)')),
3690 ('a', 'address', '',
3690 ('a', 'address', '',
3691 _('address to listen on (default: all interfaces)')),
3691 _('address to listen on (default: all interfaces)')),
3692 ('', 'prefix', '',
3692 ('', 'prefix', '',
3693 _('prefix path to serve from (default: server root)')),
3693 _('prefix path to serve from (default: server root)')),
3694 ('n', 'name', '',
3694 ('n', 'name', '',
3695 _('name to show in web pages (default: working directory)')),
3695 _('name to show in web pages (default: working directory)')),
3696 ('', 'webdir-conf', '', _('name of the webdir config file'
3696 ('', 'webdir-conf', '', _('name of the webdir config file'
3697 ' (serve more than one repository)')),
3697 ' (serve more than one repository)')),
3698 ('', 'pid-file', '', _('name of file to write process ID to')),
3698 ('', 'pid-file', '', _('name of file to write process ID to')),
3699 ('', 'stdio', None, _('for remote clients')),
3699 ('', 'stdio', None, _('for remote clients')),
3700 ('t', 'templates', '', _('web templates to use')),
3700 ('t', 'templates', '', _('web templates to use')),
3701 ('', 'style', '', _('template style to use')),
3701 ('', 'style', '', _('template style to use')),
3702 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
3702 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
3703 ('', 'certificate', '', _('SSL certificate file'))],
3703 ('', 'certificate', '', _('SSL certificate file'))],
3704 _('[OPTION]...')),
3704 _('[OPTION]...')),
3705 "showconfig|debugconfig":
3705 "showconfig|debugconfig":
3706 (showconfig,
3706 (showconfig,
3707 [('u', 'untrusted', None, _('show untrusted configuration options'))],
3707 [('u', 'untrusted', None, _('show untrusted configuration options'))],
3708 _('[-u] [NAME]...')),
3708 _('[-u] [NAME]...')),
3709 "^summary|sum":
3709 "^summary|sum":
3710 (summary,
3710 (summary,
3711 [('', 'remote', None, _('check for push and pull'))], '[--remote]'),
3711 [('', 'remote', None, _('check for push and pull'))], '[--remote]'),
3712 "^status|st":
3712 "^status|st":
3713 (status,
3713 (status,
3714 [('A', 'all', None, _('show status of all files')),
3714 [('A', 'all', None, _('show status of all files')),
3715 ('m', 'modified', None, _('show only modified files')),
3715 ('m', 'modified', None, _('show only modified files')),
3716 ('a', 'added', None, _('show only added files')),
3716 ('a', 'added', None, _('show only added files')),
3717 ('r', 'removed', None, _('show only removed files')),
3717 ('r', 'removed', None, _('show only removed files')),
3718 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
3718 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
3719 ('c', 'clean', None, _('show only files without changes')),
3719 ('c', 'clean', None, _('show only files without changes')),
3720 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
3720 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
3721 ('i', 'ignored', None, _('show only ignored files')),
3721 ('i', 'ignored', None, _('show only ignored files')),
3722 ('n', 'no-status', None, _('hide status prefix')),
3722 ('n', 'no-status', None, _('hide status prefix')),
3723 ('C', 'copies', None, _('show source of copied files')),
3723 ('C', 'copies', None, _('show source of copied files')),
3724 ('0', 'print0', None,
3724 ('0', 'print0', None,
3725 _('end filenames with NUL, for use with xargs')),
3725 _('end filenames with NUL, for use with xargs')),
3726 ('', 'rev', [], _('show difference from revision')),
3726 ('', 'rev', [], _('show difference from revision')),
3727 ('', 'change', '', _('list the changed files of a revision')),
3727 ('', 'change', '', _('list the changed files of a revision')),
3728 ] + walkopts,
3728 ] + walkopts,
3729 _('[OPTION]... [FILE]...')),
3729 _('[OPTION]... [FILE]...')),
3730 "tag":
3730 "tag":
3731 (tag,
3731 (tag,
3732 [('f', 'force', None, _('replace existing tag')),
3732 [('f', 'force', None, _('replace existing tag')),
3733 ('l', 'local', None, _('make the tag local')),
3733 ('l', 'local', None, _('make the tag local')),
3734 ('r', 'rev', '', _('revision to tag')),
3734 ('r', 'rev', '', _('revision to tag')),
3735 ('', 'remove', None, _('remove a tag')),
3735 ('', 'remove', None, _('remove a tag')),
3736 # -l/--local is already there, commitopts cannot be used
3736 # -l/--local is already there, commitopts cannot be used
3737 ('m', 'message', '', _('use <text> as commit message')),
3737 ('m', 'message', '', _('use <text> as commit message')),
3738 ] + commitopts2,
3738 ] + commitopts2,
3739 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...')),
3739 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...')),
3740 "tags": (tags, [], ''),
3740 "tags": (tags, [], ''),
3741 "tip":
3741 "tip":
3742 (tip,
3742 (tip,
3743 [('p', 'patch', None, _('show patch')),
3743 [('p', 'patch', None, _('show patch')),
3744 ('g', 'git', None, _('use git extended diff format')),
3744 ('g', 'git', None, _('use git extended diff format')),
3745 ] + templateopts,
3745 ] + templateopts,
3746 _('[-p] [-g]')),
3746 _('[-p] [-g]')),
3747 "unbundle":
3747 "unbundle":
3748 (unbundle,
3748 (unbundle,
3749 [('u', 'update', None,
3749 [('u', 'update', None,
3750 _('update to new branch head if changesets were unbundled'))],
3750 _('update to new branch head if changesets were unbundled'))],
3751 _('[-u] FILE...')),
3751 _('[-u] FILE...')),
3752 "^update|up|checkout|co":
3752 "^update|up|checkout|co":
3753 (update,
3753 (update,
3754 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
3754 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
3755 ('c', 'check', None, _('check for uncommitted changes')),
3755 ('c', 'check', None, _('check for uncommitted changes')),
3756 ('d', 'date', '', _('tipmost revision matching date')),
3756 ('d', 'date', '', _('tipmost revision matching date')),
3757 ('r', 'rev', '', _('revision'))],
3757 ('r', 'rev', '', _('revision'))],
3758 _('[-c] [-C] [-d DATE] [[-r] REV]')),
3758 _('[-c] [-C] [-d DATE] [[-r] REV]')),
3759 "verify": (verify, []),
3759 "verify": (verify, []),
3760 "version": (version_, []),
3760 "version": (version_, []),
3761 }
3761 }
3762
3762
3763 norepo = ("clone init version help debugcommands debugcomplete debugdata"
3763 norepo = ("clone init version help debugcommands debugcomplete debugdata"
3764 " debugindex debugindexdot debugdate debuginstall debugfsinfo")
3764 " debugindex debugindexdot debugdate debuginstall debugfsinfo")
3765 optionalrepo = ("identify paths serve showconfig debugancestor")
3765 optionalrepo = ("identify paths serve showconfig debugancestor")
@@ -1,582 +1,582
1 Mercurial Distributed SCM
1 Mercurial Distributed SCM
2
2
3 basic commands:
3 basic commands:
4
4
5 add add the specified files on the next commit
5 add add the specified files on the next commit
6 annotate show changeset information by line for each file
6 annotate show changeset information by line for each file
7 clone make a copy of an existing repository
7 clone make a copy of an existing repository
8 commit commit the specified files or all outstanding changes
8 commit commit the specified files or all outstanding changes
9 diff diff repository (or selected files)
9 diff diff repository (or selected files)
10 export dump the header and diffs for one or more changesets
10 export dump the header and diffs for one or more changesets
11 forget forget the specified files on the next commit
11 forget forget the specified files on the next commit
12 init create a new repository in the given directory
12 init create a new repository in the given directory
13 log show revision history of entire repository or files
13 log show revision history of entire repository or files
14 merge merge working directory with another revision
14 merge merge working directory with another revision
15 pull pull changes from the specified source
15 pull pull changes from the specified source
16 push push changes to the specified destination
16 push push changes to the specified destination
17 remove remove the specified files on the next commit
17 remove remove the specified files on the next commit
18 serve export the repository via HTTP
18 serve export the repository via HTTP
19 status show changed files in the working directory
19 status show changed files in the working directory
20 summary summarize working directory state
20 summary summarize working directory state
21 update update working directory
21 update update working directory
22
22
23 use "hg help" for the full list of commands or "hg -v" for details
23 use "hg help" for the full list of commands or "hg -v" for details
24 add add the specified files on the next commit
24 add add the specified files on the next commit
25 annotate show changeset information by line for each file
25 annotate show changeset information by line for each file
26 clone make a copy of an existing repository
26 clone make a copy of an existing repository
27 commit commit the specified files or all outstanding changes
27 commit commit the specified files or all outstanding changes
28 diff diff repository (or selected files)
28 diff diff repository (or selected files)
29 export dump the header and diffs for one or more changesets
29 export dump the header and diffs for one or more changesets
30 forget forget the specified files on the next commit
30 forget forget the specified files on the next commit
31 init create a new repository in the given directory
31 init create a new repository in the given directory
32 log show revision history of entire repository or files
32 log show revision history of entire repository or files
33 merge merge working directory with another revision
33 merge merge working directory with another revision
34 pull pull changes from the specified source
34 pull pull changes from the specified source
35 push push changes to the specified destination
35 push push changes to the specified destination
36 remove remove the specified files on the next commit
36 remove remove the specified files on the next commit
37 serve export the repository via HTTP
37 serve export the repository via HTTP
38 status show changed files in the working directory
38 status show changed files in the working directory
39 summary summarize working directory state
39 summary summarize working directory state
40 update update working directory
40 update update working directory
41 Mercurial Distributed SCM
41 Mercurial Distributed SCM
42
42
43 list of commands:
43 list of commands:
44
44
45 add add the specified files on the next commit
45 add add the specified files on the next commit
46 addremove add all new files, delete all missing files
46 addremove add all new files, delete all missing files
47 annotate show changeset information by line for each file
47 annotate show changeset information by line for each file
48 archive create an unversioned archive of a repository revision
48 archive create an unversioned archive of a repository revision
49 backout reverse effect of earlier changeset
49 backout reverse effect of earlier changeset
50 bisect subdivision search of changesets
50 bisect subdivision search of changesets
51 branch set or show the current branch name
51 branch set or show the current branch name
52 branches list repository named branches
52 branches list repository named branches
53 bundle create a changegroup file
53 bundle create a changegroup file
54 cat output the current or given revision of files
54 cat output the current or given revision of files
55 clone make a copy of an existing repository
55 clone make a copy of an existing repository
56 commit commit the specified files or all outstanding changes
56 commit commit the specified files or all outstanding changes
57 copy mark files as copied for the next commit
57 copy mark files as copied for the next commit
58 diff diff repository (or selected files)
58 diff diff repository (or selected files)
59 export dump the header and diffs for one or more changesets
59 export dump the header and diffs for one or more changesets
60 forget forget the specified files on the next commit
60 forget forget the specified files on the next commit
61 grep search for a pattern in specified files and revisions
61 grep search for a pattern in specified files and revisions
62 heads show current repository heads or show branch heads
62 heads show current repository heads or show branch heads
63 help show help for a given topic or a help overview
63 help show help for a given topic or a help overview
64 identify identify the working copy or specified revision
64 identify identify the working copy or specified revision
65 import import an ordered set of patches
65 import import an ordered set of patches
66 incoming show new changesets found in source
66 incoming show new changesets found in source
67 init create a new repository in the given directory
67 init create a new repository in the given directory
68 locate locate files matching specific patterns
68 locate locate files matching specific patterns
69 log show revision history of entire repository or files
69 log show revision history of entire repository or files
70 manifest output the current or given revision of the project manifest
70 manifest output the current or given revision of the project manifest
71 merge merge working directory with another revision
71 merge merge working directory with another revision
72 outgoing show changesets not found in destination
72 outgoing show changesets not found in destination
73 parents show the parents of the working directory or revision
73 parents show the parents of the working directory or revision
74 paths show aliases for remote repositories
74 paths show aliases for remote repositories
75 pull pull changes from the specified source
75 pull pull changes from the specified source
76 push push changes to the specified destination
76 push push changes to the specified destination
77 recover roll back an interrupted transaction
77 recover roll back an interrupted transaction
78 remove remove the specified files on the next commit
78 remove remove the specified files on the next commit
79 rename rename files; equivalent of copy + remove
79 rename rename files; equivalent of copy + remove
80 resolve retry file merges from a merge or update
80 resolve retry file merges from a merge or update
81 revert restore individual files or directories to an earlier state
81 revert restore individual files or directories to an earlier state
82 rollback roll back the last transaction
82 rollback roll back the last transaction
83 root print the root (top) of the current working directory
83 root print the root (top) of the current working directory
84 serve export the repository via HTTP
84 serve export the repository via HTTP
85 showconfig show combined config settings from all hgrc files
85 showconfig show combined config settings from all hgrc files
86 status show changed files in the working directory
86 status show changed files in the working directory
87 summary summarize working directory state
87 summary summarize working directory state
88 tag add one or more tags for the current or given revision
88 tag add one or more tags for the current or given revision
89 tags list repository tags
89 tags list repository tags
90 tip show the tip revision
90 tip show the tip revision
91 unbundle apply one or more changegroup files
91 unbundle apply one or more changegroup files
92 update update working directory
92 update update working directory
93 verify verify the integrity of the repository
93 verify verify the integrity of the repository
94 version output version and copyright information
94 version output version and copyright information
95
95
96 additional help topics:
96 additional help topics:
97
97
98 config Configuration Files
98 config Configuration Files
99 dates Date Formats
99 dates Date Formats
100 patterns File Name Patterns
100 patterns File Name Patterns
101 environment Environment Variables
101 environment Environment Variables
102 revisions Specifying Single Revisions
102 revisions Specifying Single Revisions
103 multirevs Specifying Multiple Revisions
103 multirevs Specifying Multiple Revisions
104 diffs Diff Formats
104 diffs Diff Formats
105 templating Template Usage
105 templating Template Usage
106 urls URL Paths
106 urls URL Paths
107 extensions Using additional features
107 extensions Using additional features
108
108
109 use "hg -v help" to show aliases and global options
109 use "hg -v help" to show aliases and global options
110 add add the specified files on the next commit
110 add add the specified files on the next commit
111 addremove add all new files, delete all missing files
111 addremove add all new files, delete all missing files
112 annotate show changeset information by line for each file
112 annotate show changeset information by line for each file
113 archive create an unversioned archive of a repository revision
113 archive create an unversioned archive of a repository revision
114 backout reverse effect of earlier changeset
114 backout reverse effect of earlier changeset
115 bisect subdivision search of changesets
115 bisect subdivision search of changesets
116 branch set or show the current branch name
116 branch set or show the current branch name
117 branches list repository named branches
117 branches list repository named branches
118 bundle create a changegroup file
118 bundle create a changegroup file
119 cat output the current or given revision of files
119 cat output the current or given revision of files
120 clone make a copy of an existing repository
120 clone make a copy of an existing repository
121 commit commit the specified files or all outstanding changes
121 commit commit the specified files or all outstanding changes
122 copy mark files as copied for the next commit
122 copy mark files as copied for the next commit
123 diff diff repository (or selected files)
123 diff diff repository (or selected files)
124 export dump the header and diffs for one or more changesets
124 export dump the header and diffs for one or more changesets
125 forget forget the specified files on the next commit
125 forget forget the specified files on the next commit
126 grep search for a pattern in specified files and revisions
126 grep search for a pattern in specified files and revisions
127 heads show current repository heads or show branch heads
127 heads show current repository heads or show branch heads
128 help show help for a given topic or a help overview
128 help show help for a given topic or a help overview
129 identify identify the working copy or specified revision
129 identify identify the working copy or specified revision
130 import import an ordered set of patches
130 import import an ordered set of patches
131 incoming show new changesets found in source
131 incoming show new changesets found in source
132 init create a new repository in the given directory
132 init create a new repository in the given directory
133 locate locate files matching specific patterns
133 locate locate files matching specific patterns
134 log show revision history of entire repository or files
134 log show revision history of entire repository or files
135 manifest output the current or given revision of the project manifest
135 manifest output the current or given revision of the project manifest
136 merge merge working directory with another revision
136 merge merge working directory with another revision
137 outgoing show changesets not found in destination
137 outgoing show changesets not found in destination
138 parents show the parents of the working directory or revision
138 parents show the parents of the working directory or revision
139 paths show aliases for remote repositories
139 paths show aliases for remote repositories
140 pull pull changes from the specified source
140 pull pull changes from the specified source
141 push push changes to the specified destination
141 push push changes to the specified destination
142 recover roll back an interrupted transaction
142 recover roll back an interrupted transaction
143 remove remove the specified files on the next commit
143 remove remove the specified files on the next commit
144 rename rename files; equivalent of copy + remove
144 rename rename files; equivalent of copy + remove
145 resolve retry file merges from a merge or update
145 resolve retry file merges from a merge or update
146 revert restore individual files or directories to an earlier state
146 revert restore individual files or directories to an earlier state
147 rollback roll back the last transaction
147 rollback roll back the last transaction
148 root print the root (top) of the current working directory
148 root print the root (top) of the current working directory
149 serve export the repository via HTTP
149 serve export the repository via HTTP
150 showconfig show combined config settings from all hgrc files
150 showconfig show combined config settings from all hgrc files
151 status show changed files in the working directory
151 status show changed files in the working directory
152 summary summarize working directory state
152 summary summarize working directory state
153 tag add one or more tags for the current or given revision
153 tag add one or more tags for the current or given revision
154 tags list repository tags
154 tags list repository tags
155 tip show the tip revision
155 tip show the tip revision
156 unbundle apply one or more changegroup files
156 unbundle apply one or more changegroup files
157 update update working directory
157 update update working directory
158 verify verify the integrity of the repository
158 verify verify the integrity of the repository
159 version output version and copyright information
159 version output version and copyright information
160
160
161 additional help topics:
161 additional help topics:
162
162
163 config Configuration Files
163 config Configuration Files
164 dates Date Formats
164 dates Date Formats
165 patterns File Name Patterns
165 patterns File Name Patterns
166 environment Environment Variables
166 environment Environment Variables
167 revisions Specifying Single Revisions
167 revisions Specifying Single Revisions
168 multirevs Specifying Multiple Revisions
168 multirevs Specifying Multiple Revisions
169 diffs Diff Formats
169 diffs Diff Formats
170 templating Template Usage
170 templating Template Usage
171 urls URL Paths
171 urls URL Paths
172 extensions Using additional features
172 extensions Using additional features
173 %% test short command list with verbose option
173 %% test short command list with verbose option
174 Mercurial Distributed SCM (version xxx)
174 Mercurial Distributed SCM (version xxx)
175
175
176 Copyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others
176 Copyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others
177 This is free software; see the source for copying conditions. There is NO
177 This is free software; see the source for copying conditions. There is NO
178 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
178 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
179
179
180 basic commands:
180 basic commands:
181
181
182 add:
182 add:
183 add the specified files on the next commit
183 add the specified files on the next commit
184 annotate, blame:
184 annotate, blame:
185 show changeset information by line for each file
185 show changeset information by line for each file
186 clone:
186 clone:
187 make a copy of an existing repository
187 make a copy of an existing repository
188 commit, ci:
188 commit, ci:
189 commit the specified files or all outstanding changes
189 commit the specified files or all outstanding changes
190 diff:
190 diff:
191 diff repository (or selected files)
191 diff repository (or selected files)
192 export:
192 export:
193 dump the header and diffs for one or more changesets
193 dump the header and diffs for one or more changesets
194 forget:
194 forget:
195 forget the specified files on the next commit
195 forget the specified files on the next commit
196 init:
196 init:
197 create a new repository in the given directory
197 create a new repository in the given directory
198 log, history:
198 log, history:
199 show revision history of entire repository or files
199 show revision history of entire repository or files
200 merge:
200 merge:
201 merge working directory with another revision
201 merge working directory with another revision
202 pull:
202 pull:
203 pull changes from the specified source
203 pull changes from the specified source
204 push:
204 push:
205 push changes to the specified destination
205 push changes to the specified destination
206 remove, rm:
206 remove, rm:
207 remove the specified files on the next commit
207 remove the specified files on the next commit
208 serve:
208 serve:
209 export the repository via HTTP
209 export the repository via HTTP
210 status, st:
210 status, st:
211 show changed files in the working directory
211 show changed files in the working directory
212 summary, sum:
212 summary, sum:
213 summarize working directory state
213 summarize working directory state
214 update, up, checkout, co:
214 update, up, checkout, co:
215 update working directory
215 update working directory
216
216
217 global options:
217 global options:
218 -R --repository repository root directory or name of overlay bundle file
218 -R --repository repository root directory or name of overlay bundle file
219 --cwd change working directory
219 --cwd change working directory
220 -y --noninteractive do not prompt, assume 'yes' for any required answers
220 -y --noninteractive do not prompt, assume 'yes' for any required answers
221 -q --quiet suppress output
221 -q --quiet suppress output
222 -v --verbose enable additional output
222 -v --verbose enable additional output
223 --config set/override config option
223 --config set/override config option
224 --debug enable debugging output
224 --debug enable debugging output
225 --debugger start debugger
225 --debugger start debugger
226 --encoding set the charset encoding (default: ascii)
226 --encoding set the charset encoding (default: ascii)
227 --encodingmode set the charset encoding mode (default: strict)
227 --encodingmode set the charset encoding mode (default: strict)
228 --traceback always print a traceback on exception
228 --traceback always print a traceback on exception
229 --time time how long the command takes
229 --time time how long the command takes
230 --profile print command execution profile
230 --profile print command execution profile
231 --version output version information and exit
231 --version output version information and exit
232 -h --help display help and exit
232 -h --help display help and exit
233
233
234 use "hg help" for the full list of commands
234 use "hg help" for the full list of commands
235 hg add [OPTION]... [FILE]...
235 hg add [OPTION]... [FILE]...
236
236
237 add the specified files on the next commit
237 add the specified files on the next commit
238
238
239 Schedule files to be version controlled and added to the repository.
239 Schedule files to be version controlled and added to the repository.
240
240
241 The files will be added to the repository at the next commit. To undo an
241 The files will be added to the repository at the next commit. To undo an
242 add before that, see hg forget.
242 add before that, see hg forget.
243
243
244 If no names are given, add all files to the repository.
244 If no names are given, add all files to the repository.
245
245
246 options:
246 options:
247
247
248 -I --include include names matching the given patterns
248 -I --include include names matching the given patterns
249 -X --exclude exclude names matching the given patterns
249 -X --exclude exclude names matching the given patterns
250 -n --dry-run do not perform actions, just print output
250 -n --dry-run do not perform actions, just print output
251
251
252 use "hg -v help add" to show global options
252 use "hg -v help add" to show global options
253 %% test help option with version option
253 %% test help option with version option
254 Mercurial Distributed SCM (version xxx)
254 Mercurial Distributed SCM (version xxx)
255
255
256 Copyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others
256 Copyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others
257 This is free software; see the source for copying conditions. There is NO
257 This is free software; see the source for copying conditions. There is NO
258 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
258 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
259
259
260 hg add [OPTION]... [FILE]...
260 hg add [OPTION]... [FILE]...
261
261
262 add the specified files on the next commit
262 add the specified files on the next commit
263
263
264 Schedule files to be version controlled and added to the repository.
264 Schedule files to be version controlled and added to the repository.
265
265
266 The files will be added to the repository at the next commit. To undo an
266 The files will be added to the repository at the next commit. To undo an
267 add before that, see hg forget.
267 add before that, see hg forget.
268
268
269 If no names are given, add all files to the repository.
269 If no names are given, add all files to the repository.
270
270
271 options:
271 options:
272
272
273 -I --include include names matching the given patterns
273 -I --include include names matching the given patterns
274 -X --exclude exclude names matching the given patterns
274 -X --exclude exclude names matching the given patterns
275 -n --dry-run do not perform actions, just print output
275 -n --dry-run do not perform actions, just print output
276
276
277 use "hg -v help add" to show global options
277 use "hg -v help add" to show global options
278 hg add: option --skjdfks not recognized
278 hg add: option --skjdfks not recognized
279 hg add [OPTION]... [FILE]...
279 hg add [OPTION]... [FILE]...
280
280
281 add the specified files on the next commit
281 add the specified files on the next commit
282
282
283 Schedule files to be version controlled and added to the repository.
283 Schedule files to be version controlled and added to the repository.
284
284
285 The files will be added to the repository at the next commit. To undo an
285 The files will be added to the repository at the next commit. To undo an
286 add before that, see hg forget.
286 add before that, see hg forget.
287
287
288 If no names are given, add all files to the repository.
288 If no names are given, add all files to the repository.
289
289
290 options:
290 options:
291
291
292 -I --include include names matching the given patterns
292 -I --include include names matching the given patterns
293 -X --exclude exclude names matching the given patterns
293 -X --exclude exclude names matching the given patterns
294 -n --dry-run do not perform actions, just print output
294 -n --dry-run do not perform actions, just print output
295
295
296 use "hg -v help add" to show global options
296 use "hg -v help add" to show global options
297 %% test ambiguous command help
297 %% test ambiguous command help
298 list of commands:
298 list of commands:
299
299
300 add add the specified files on the next commit
300 add add the specified files on the next commit
301 addremove add all new files, delete all missing files
301 addremove add all new files, delete all missing files
302
302
303 use "hg -v help ad" to show aliases and global options
303 use "hg -v help ad" to show aliases and global options
304 %% test command without options
304 %% test command without options
305 hg verify
305 hg verify
306
306
307 verify the integrity of the repository
307 verify the integrity of the repository
308
308
309 Verify the integrity of the current repository.
309 Verify the integrity of the current repository.
310
310
311 This will perform an extensive check of the repository's integrity,
311 This will perform an extensive check of the repository's integrity,
312 validating the hashes and checksums of each entry in the changelog,
312 validating the hashes and checksums of each entry in the changelog,
313 manifest, and tracked files, as well as the integrity of their crosslinks
313 manifest, and tracked files, as well as the integrity of their crosslinks
314 and indices.
314 and indices.
315
315
316 use "hg -v help verify" to show global options
316 use "hg -v help verify" to show global options
317 hg diff [OPTION]... [-r REV1 [-r REV2]] [FILE]...
317 hg diff [OPTION]... [-r REV1 [-r REV2]] [FILE]...
318
318
319 diff repository (or selected files)
319 diff repository (or selected files)
320
320
321 Show differences between revisions for the specified files.
321 Show differences between revisions for the specified files.
322
322
323 Differences between files are shown using the unified diff format.
323 Differences between files are shown using the unified diff format.
324
324
325 NOTE: diff may generate unexpected results for merges, as it will default
325 NOTE: diff may generate unexpected results for merges, as it will default
326 to comparing against the working directory's first parent changeset if no
326 to comparing against the working directory's first parent changeset if no
327 revisions are specified.
327 revisions are specified.
328
328
329 When two revision arguments are given, then changes are shown between
329 When two revision arguments are given, then changes are shown between
330 those revisions. If only one revision is specified then that revision is
330 those revisions. If only one revision is specified then that revision is
331 compared to the working directory, and, when no revisions are specified,
331 compared to the working directory, and, when no revisions are specified,
332 the working directory files are compared to its parent.
332 the working directory files are compared to its parent.
333
333
334 Without the -a/--text option, diff will avoid generating diffs of files it
334 Without the -a/--text option, diff will avoid generating diffs of files it
335 detects as binary. With -a, diff will generate a diff anyway, probably
335 detects as binary. With -a, diff will generate a diff anyway, probably
336 with undesirable results.
336 with undesirable results.
337
337
338 Use the -g/--git option to generate diffs in the git extended diff format.
338 Use the -g/--git option to generate diffs in the git extended diff format.
339 For more information, read 'hg help diffs'.
339 For more information, read 'hg help diffs'.
340
340
341 options:
341 options:
342
342
343 -r --rev revision
343 -r --rev revision
344 -c --change change made by revision
344 -c --change change made by revision
345 -a --text treat all files as text
345 -a --text treat all files as text
346 -g --git use git extended diff format
346 -g --git use git extended diff format
347 --nodates don't include dates in diff headers
347 --nodates omit dates from diff headers
348 -p --show-function show which function each change is in
348 -p --show-function show which function each change is in
349 --reverse produce a diff that undoes the changes
349 --reverse produce a diff that undoes the changes
350 -w --ignore-all-space ignore white space when comparing lines
350 -w --ignore-all-space ignore white space when comparing lines
351 -b --ignore-space-change ignore changes in the amount of white space
351 -b --ignore-space-change ignore changes in the amount of white space
352 -B --ignore-blank-lines ignore changes whose lines are all blank
352 -B --ignore-blank-lines ignore changes whose lines are all blank
353 -U --unified number of lines of context to show
353 -U --unified number of lines of context to show
354 --stat output diffstat-style summary of changes
354 --stat output diffstat-style summary of changes
355 -I --include include names matching the given patterns
355 -I --include include names matching the given patterns
356 -X --exclude exclude names matching the given patterns
356 -X --exclude exclude names matching the given patterns
357
357
358 use "hg -v help diff" to show global options
358 use "hg -v help diff" to show global options
359 hg status [OPTION]... [FILE]...
359 hg status [OPTION]... [FILE]...
360
360
361 aliases: st
361 aliases: st
362
362
363 show changed files in the working directory
363 show changed files in the working directory
364
364
365 Show status of files in the repository. If names are given, only files
365 Show status of files in the repository. If names are given, only files
366 that match are shown. Files that are clean or ignored or the source of a
366 that match are shown. Files that are clean or ignored or the source of a
367 copy/move operation, are not listed unless -c/--clean, -i/--ignored,
367 copy/move operation, are not listed unless -c/--clean, -i/--ignored,
368 -C/--copies or -A/--all are given. Unless options described with "show
368 -C/--copies or -A/--all are given. Unless options described with "show
369 only ..." are given, the options -mardu are used.
369 only ..." are given, the options -mardu are used.
370
370
371 Option -q/--quiet hides untracked (unknown and ignored) files unless
371 Option -q/--quiet hides untracked (unknown and ignored) files unless
372 explicitly requested with -u/--unknown or -i/--ignored.
372 explicitly requested with -u/--unknown or -i/--ignored.
373
373
374 NOTE: status may appear to disagree with diff if permissions have changed
374 NOTE: status may appear to disagree with diff if permissions have changed
375 or a merge has occurred. The standard diff format does not report
375 or a merge has occurred. The standard diff format does not report
376 permission changes and diff only reports changes relative to one merge
376 permission changes and diff only reports changes relative to one merge
377 parent.
377 parent.
378
378
379 If one revision is given, it is used as the base revision. If two
379 If one revision is given, it is used as the base revision. If two
380 revisions are given, the differences between them are shown. The --change
380 revisions are given, the differences between them are shown. The --change
381 option can also be used as a shortcut to list the changed files of a
381 option can also be used as a shortcut to list the changed files of a
382 revision from its first parent.
382 revision from its first parent.
383
383
384 The codes used to show the status of files are:
384 The codes used to show the status of files are:
385
385
386 M = modified
386 M = modified
387 A = added
387 A = added
388 R = removed
388 R = removed
389 C = clean
389 C = clean
390 ! = missing (deleted by non-hg command, but still tracked)
390 ! = missing (deleted by non-hg command, but still tracked)
391 ? = not tracked
391 ? = not tracked
392 I = ignored
392 I = ignored
393 = origin of the previous file listed as A (added)
393 = origin of the previous file listed as A (added)
394
394
395 options:
395 options:
396
396
397 -A --all show status of all files
397 -A --all show status of all files
398 -m --modified show only modified files
398 -m --modified show only modified files
399 -a --added show only added files
399 -a --added show only added files
400 -r --removed show only removed files
400 -r --removed show only removed files
401 -d --deleted show only deleted (but tracked) files
401 -d --deleted show only deleted (but tracked) files
402 -c --clean show only files without changes
402 -c --clean show only files without changes
403 -u --unknown show only unknown (not tracked) files
403 -u --unknown show only unknown (not tracked) files
404 -i --ignored show only ignored files
404 -i --ignored show only ignored files
405 -n --no-status hide status prefix
405 -n --no-status hide status prefix
406 -C --copies show source of copied files
406 -C --copies show source of copied files
407 -0 --print0 end filenames with NUL, for use with xargs
407 -0 --print0 end filenames with NUL, for use with xargs
408 --rev show difference from revision
408 --rev show difference from revision
409 --change list the changed files of a revision
409 --change list the changed files of a revision
410 -I --include include names matching the given patterns
410 -I --include include names matching the given patterns
411 -X --exclude exclude names matching the given patterns
411 -X --exclude exclude names matching the given patterns
412
412
413 use "hg -v help status" to show global options
413 use "hg -v help status" to show global options
414 hg status [OPTION]... [FILE]...
414 hg status [OPTION]... [FILE]...
415
415
416 show changed files in the working directory
416 show changed files in the working directory
417 hg: unknown command 'foo'
417 hg: unknown command 'foo'
418 Mercurial Distributed SCM
418 Mercurial Distributed SCM
419
419
420 basic commands:
420 basic commands:
421
421
422 add add the specified files on the next commit
422 add add the specified files on the next commit
423 annotate show changeset information by line for each file
423 annotate show changeset information by line for each file
424 clone make a copy of an existing repository
424 clone make a copy of an existing repository
425 commit commit the specified files or all outstanding changes
425 commit commit the specified files or all outstanding changes
426 diff diff repository (or selected files)
426 diff diff repository (or selected files)
427 export dump the header and diffs for one or more changesets
427 export dump the header and diffs for one or more changesets
428 forget forget the specified files on the next commit
428 forget forget the specified files on the next commit
429 init create a new repository in the given directory
429 init create a new repository in the given directory
430 log show revision history of entire repository or files
430 log show revision history of entire repository or files
431 merge merge working directory with another revision
431 merge merge working directory with another revision
432 pull pull changes from the specified source
432 pull pull changes from the specified source
433 push push changes to the specified destination
433 push push changes to the specified destination
434 remove remove the specified files on the next commit
434 remove remove the specified files on the next commit
435 serve export the repository via HTTP
435 serve export the repository via HTTP
436 status show changed files in the working directory
436 status show changed files in the working directory
437 summary summarize working directory state
437 summary summarize working directory state
438 update update working directory
438 update update working directory
439
439
440 use "hg help" for the full list of commands or "hg -v" for details
440 use "hg help" for the full list of commands or "hg -v" for details
441 hg: unknown command 'skjdfks'
441 hg: unknown command 'skjdfks'
442 Mercurial Distributed SCM
442 Mercurial Distributed SCM
443
443
444 basic commands:
444 basic commands:
445
445
446 add add the specified files on the next commit
446 add add the specified files on the next commit
447 annotate show changeset information by line for each file
447 annotate show changeset information by line for each file
448 clone make a copy of an existing repository
448 clone make a copy of an existing repository
449 commit commit the specified files or all outstanding changes
449 commit commit the specified files or all outstanding changes
450 diff diff repository (or selected files)
450 diff diff repository (or selected files)
451 export dump the header and diffs for one or more changesets
451 export dump the header and diffs for one or more changesets
452 forget forget the specified files on the next commit
452 forget forget the specified files on the next commit
453 init create a new repository in the given directory
453 init create a new repository in the given directory
454 log show revision history of entire repository or files
454 log show revision history of entire repository or files
455 merge merge working directory with another revision
455 merge merge working directory with another revision
456 pull pull changes from the specified source
456 pull pull changes from the specified source
457 push push changes to the specified destination
457 push push changes to the specified destination
458 remove remove the specified files on the next commit
458 remove remove the specified files on the next commit
459 serve export the repository via HTTP
459 serve export the repository via HTTP
460 status show changed files in the working directory
460 status show changed files in the working directory
461 summary summarize working directory state
461 summary summarize working directory state
462 update update working directory
462 update update working directory
463
463
464 use "hg help" for the full list of commands or "hg -v" for details
464 use "hg help" for the full list of commands or "hg -v" for details
465 %% test command with no help text
465 %% test command with no help text
466 hg nohelp
466 hg nohelp
467
467
468 (no help text available)
468 (no help text available)
469
469
470 use "hg -v help nohelp" to show global options
470 use "hg -v help nohelp" to show global options
471 %% test that default list of commands omits extension commands
471 %% test that default list of commands omits extension commands
472 Mercurial Distributed SCM
472 Mercurial Distributed SCM
473
473
474 list of commands:
474 list of commands:
475
475
476 add add the specified files on the next commit
476 add add the specified files on the next commit
477 addremove add all new files, delete all missing files
477 addremove add all new files, delete all missing files
478 annotate show changeset information by line for each file
478 annotate show changeset information by line for each file
479 archive create an unversioned archive of a repository revision
479 archive create an unversioned archive of a repository revision
480 backout reverse effect of earlier changeset
480 backout reverse effect of earlier changeset
481 bisect subdivision search of changesets
481 bisect subdivision search of changesets
482 branch set or show the current branch name
482 branch set or show the current branch name
483 branches list repository named branches
483 branches list repository named branches
484 bundle create a changegroup file
484 bundle create a changegroup file
485 cat output the current or given revision of files
485 cat output the current or given revision of files
486 clone make a copy of an existing repository
486 clone make a copy of an existing repository
487 commit commit the specified files or all outstanding changes
487 commit commit the specified files or all outstanding changes
488 copy mark files as copied for the next commit
488 copy mark files as copied for the next commit
489 diff diff repository (or selected files)
489 diff diff repository (or selected files)
490 export dump the header and diffs for one or more changesets
490 export dump the header and diffs for one or more changesets
491 forget forget the specified files on the next commit
491 forget forget the specified files on the next commit
492 grep search for a pattern in specified files and revisions
492 grep search for a pattern in specified files and revisions
493 heads show current repository heads or show branch heads
493 heads show current repository heads or show branch heads
494 help show help for a given topic or a help overview
494 help show help for a given topic or a help overview
495 identify identify the working copy or specified revision
495 identify identify the working copy or specified revision
496 import import an ordered set of patches
496 import import an ordered set of patches
497 incoming show new changesets found in source
497 incoming show new changesets found in source
498 init create a new repository in the given directory
498 init create a new repository in the given directory
499 locate locate files matching specific patterns
499 locate locate files matching specific patterns
500 log show revision history of entire repository or files
500 log show revision history of entire repository or files
501 manifest output the current or given revision of the project manifest
501 manifest output the current or given revision of the project manifest
502 merge merge working directory with another revision
502 merge merge working directory with another revision
503 outgoing show changesets not found in destination
503 outgoing show changesets not found in destination
504 parents show the parents of the working directory or revision
504 parents show the parents of the working directory or revision
505 paths show aliases for remote repositories
505 paths show aliases for remote repositories
506 pull pull changes from the specified source
506 pull pull changes from the specified source
507 push push changes to the specified destination
507 push push changes to the specified destination
508 recover roll back an interrupted transaction
508 recover roll back an interrupted transaction
509 remove remove the specified files on the next commit
509 remove remove the specified files on the next commit
510 rename rename files; equivalent of copy + remove
510 rename rename files; equivalent of copy + remove
511 resolve retry file merges from a merge or update
511 resolve retry file merges from a merge or update
512 revert restore individual files or directories to an earlier state
512 revert restore individual files or directories to an earlier state
513 rollback roll back the last transaction
513 rollback roll back the last transaction
514 root print the root (top) of the current working directory
514 root print the root (top) of the current working directory
515 serve export the repository via HTTP
515 serve export the repository via HTTP
516 showconfig show combined config settings from all hgrc files
516 showconfig show combined config settings from all hgrc files
517 status show changed files in the working directory
517 status show changed files in the working directory
518 summary summarize working directory state
518 summary summarize working directory state
519 tag add one or more tags for the current or given revision
519 tag add one or more tags for the current or given revision
520 tags list repository tags
520 tags list repository tags
521 tip show the tip revision
521 tip show the tip revision
522 unbundle apply one or more changegroup files
522 unbundle apply one or more changegroup files
523 update update working directory
523 update update working directory
524 verify verify the integrity of the repository
524 verify verify the integrity of the repository
525 version output version and copyright information
525 version output version and copyright information
526
526
527 enabled extensions:
527 enabled extensions:
528
528
529 helpext (no help text available)
529 helpext (no help text available)
530
530
531 additional help topics:
531 additional help topics:
532
532
533 config Configuration Files
533 config Configuration Files
534 dates Date Formats
534 dates Date Formats
535 patterns File Name Patterns
535 patterns File Name Patterns
536 environment Environment Variables
536 environment Environment Variables
537 revisions Specifying Single Revisions
537 revisions Specifying Single Revisions
538 multirevs Specifying Multiple Revisions
538 multirevs Specifying Multiple Revisions
539 diffs Diff Formats
539 diffs Diff Formats
540 templating Template Usage
540 templating Template Usage
541 urls URL Paths
541 urls URL Paths
542 extensions Using additional features
542 extensions Using additional features
543
543
544 use "hg -v help" to show aliases and global options
544 use "hg -v help" to show aliases and global options
545 %% test list of commands with command with no help text
545 %% test list of commands with command with no help text
546 helpext extension - no help text available
546 helpext extension - no help text available
547
547
548 list of commands:
548 list of commands:
549
549
550 nohelp (no help text available)
550 nohelp (no help text available)
551
551
552 use "hg -v help helpext" to show aliases and global options
552 use "hg -v help helpext" to show aliases and global options
553 %% test a help topic
553 %% test a help topic
554 Specifying Single Revisions
554 Specifying Single Revisions
555
555
556 Mercurial supports several ways to specify individual revisions.
556 Mercurial supports several ways to specify individual revisions.
557
557
558 A plain integer is treated as a revision number. Negative integers are
558 A plain integer is treated as a revision number. Negative integers are
559 treated as sequential offsets from the tip, with -1 denoting the tip, -2
559 treated as sequential offsets from the tip, with -1 denoting the tip, -2
560 denoting the revision prior to the tip, and so forth.
560 denoting the revision prior to the tip, and so forth.
561
561
562 A 40-digit hexadecimal string is treated as a unique revision identifier.
562 A 40-digit hexadecimal string is treated as a unique revision identifier.
563
563
564 A hexadecimal string less than 40 characters long is treated as a unique
564 A hexadecimal string less than 40 characters long is treated as a unique
565 revision identifier and is referred to as a short-form identifier. A
565 revision identifier and is referred to as a short-form identifier. A
566 short-form identifier is only valid if it is the prefix of exactly one
566 short-form identifier is only valid if it is the prefix of exactly one
567 full-length identifier.
567 full-length identifier.
568
568
569 Any other string is treated as a tag or branch name. A tag name is a
569 Any other string is treated as a tag or branch name. A tag name is a
570 symbolic name associated with a revision identifier. A branch name denotes
570 symbolic name associated with a revision identifier. A branch name denotes
571 the tipmost revision of that branch. Tag and branch names must not contain
571 the tipmost revision of that branch. Tag and branch names must not contain
572 the ":" character.
572 the ":" character.
573
573
574 The reserved name "tip" is a special tag that always identifies the most
574 The reserved name "tip" is a special tag that always identifies the most
575 recent revision.
575 recent revision.
576
576
577 The reserved name "null" indicates the null revision. This is the revision
577 The reserved name "null" indicates the null revision. This is the revision
578 of an empty repository, and the parent of revision 0.
578 of an empty repository, and the parent of revision 0.
579
579
580 The reserved name "." indicates the working directory parent. If no
580 The reserved name "." indicates the working directory parent. If no
581 working directory is checked out, it is equivalent to null. If an
581 working directory is checked out, it is equivalent to null. If an
582 uncommitted merge is in progress, "." is the revision of the first parent.
582 uncommitted merge is in progress, "." is the revision of the first parent.
General Comments 0
You need to be logged in to leave comments. Login now