##// 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 1 #compdef hg
2 2
3 3 # Zsh completion script for mercurial. Rename this file to _hg and copy
4 4 # it into your zsh function path (/usr/share/zsh/site-functions for
5 5 # instance)
6 6 #
7 7 # If you do not want to install it globally, you can copy it somewhere
8 8 # else and add that directory to $fpath. This must be done before
9 9 # compinit is called. If the file is copied to ~/.zsh.d, your ~/.zshrc
10 10 # file could look like this:
11 11 #
12 12 # fpath=("$HOME/.zsh.d" $fpath)
13 13 # autoload -U compinit
14 14 # compinit
15 15 #
16 16 # Copyright (C) 2005, 2006 Steve Borho <steve@borho.org>
17 17 # Copyright (C) 2006-9 Brendan Cully <brendan@kublai.com>
18 18 #
19 19 # Permission is hereby granted, without written agreement and without
20 20 # licence or royalty fees, to use, copy, modify, and distribute this
21 21 # software and to distribute modified versions of this software for any
22 22 # purpose, provided that the above copyright notice and the following
23 23 # two paragraphs appear in all copies of this software.
24 24 #
25 25 # In no event shall the authors be liable to any party for direct,
26 26 # indirect, special, incidental, or consequential damages arising out of
27 27 # the use of this software and its documentation, even if the authors
28 28 # have been advised of the possibility of such damage.
29 29 #
30 30 # The authors specifically disclaim any warranties, including, but not
31 31 # limited to, the implied warranties of merchantability and fitness for
32 32 # a particular purpose. The software provided hereunder is on an "as
33 33 # is" basis, and the authors have no obligation to provide maintenance,
34 34 # support, updates, enhancements, or modifications.
35 35
36 36 emulate -LR zsh
37 37 setopt extendedglob
38 38
39 39 local curcontext="$curcontext" state line
40 40 typeset -A _hg_cmd_globals
41 41
42 42 _hg() {
43 43 local cmd _hg_root
44 44 integer i=2
45 45 _hg_cmd_globals=()
46 46
47 47 while (( i < $#words ))
48 48 do
49 49 case "$words[$i]" in
50 50 -R|--repository)
51 51 eval _hg_root="$words[$i+1]"
52 52 _hg_cmd_globals+=("$words[$i]" "$_hg_root")
53 53 (( i += 2 ))
54 54 continue
55 55 ;;
56 56 -R*)
57 57 _hg_cmd_globals+="$words[$i]"
58 58 eval _hg_root="${words[$i]#-R}"
59 59 (( i++ ))
60 60 continue
61 61 ;;
62 62 --cwd|--config)
63 63 # pass along arguments to hg completer
64 64 _hg_cmd_globals+=("$words[$i]" "$words[$i+1]")
65 65 (( i += 2 ))
66 66 continue
67 67 ;;
68 68 -*)
69 69 # skip option
70 70 (( i++ ))
71 71 continue
72 72 ;;
73 73 esac
74 74 if [[ -z "$cmd" ]]
75 75 then
76 76 cmd="$words[$i]"
77 77 words[$i]=()
78 78 (( CURRENT-- ))
79 79 fi
80 80 (( i++ ))
81 81 done
82 82
83 83 if [[ -z "$cmd" ]]
84 84 then
85 85 _arguments -s -w : $_hg_global_opts \
86 86 ':mercurial command:_hg_commands'
87 87 return
88 88 fi
89 89
90 90 # resolve abbreviations and aliases
91 91 if ! (( $+functions[_hg_cmd_${cmd}] ))
92 92 then
93 93 local cmdexp
94 94 (( $#_hg_cmd_list )) || _hg_get_commands
95 95
96 96 cmdexp=$_hg_cmd_list[(r)${cmd}*]
97 97 if [[ $cmdexp == $_hg_cmd_list[(R)${cmd}*] ]]
98 98 then
99 99 # might be nice to rewrite the command line with the expansion
100 100 cmd="$cmdexp"
101 101 fi
102 102 if [[ -n $_hg_alias_list[$cmd] ]]
103 103 then
104 104 cmd=$_hg_alias_list[$cmd]
105 105 fi
106 106 fi
107 107
108 108 curcontext="${curcontext%:*:*}:hg-${cmd}:"
109 109
110 110 zstyle -s ":completion:$curcontext:" cache-policy update_policy
111 111
112 112 if [[ -z "$update_policy" ]]
113 113 then
114 114 zstyle ":completion:$curcontext:" cache-policy _hg_cache_policy
115 115 fi
116 116
117 117 if (( $+functions[_hg_cmd_${cmd}] ))
118 118 then
119 119 _hg_cmd_${cmd}
120 120 else
121 121 # complete unknown commands normally
122 122 _arguments -s -w : $_hg_global_opts \
123 123 '*:files:_hg_files'
124 124 fi
125 125 }
126 126
127 127 _hg_cache_policy() {
128 128 typeset -a old
129 129
130 130 # cache for a minute
131 131 old=( "$1"(mm+10) )
132 132 (( $#old )) && return 0
133 133
134 134 return 1
135 135 }
136 136
137 137 _hg_get_commands() {
138 138 typeset -ga _hg_cmd_list
139 139 typeset -gA _hg_alias_list
140 140 local hline cmd cmdalias
141 141
142 142 _call_program hg hg debugcomplete -v | while read -A hline
143 143 do
144 144 cmd=$hline[1]
145 145 _hg_cmd_list+=($cmd)
146 146
147 147 for cmdalias in $hline[2,-1]
148 148 do
149 149 _hg_cmd_list+=($cmdalias)
150 150 _hg_alias_list+=($cmdalias $cmd)
151 151 done
152 152 done
153 153 }
154 154
155 155 _hg_commands() {
156 156 (( $#_hg_cmd_list )) || _hg_get_commands
157 157 _describe -t commands 'mercurial command' _hg_cmd_list
158 158 }
159 159
160 160 _hg_revrange() {
161 161 compset -P 1 '*:'
162 162 _hg_tags "$@"
163 163 }
164 164
165 165 _hg_tags() {
166 166 typeset -a tags
167 167 local tag rev
168 168
169 169 _hg_cmd tags | while read tag
170 170 do
171 171 tags+=(${tag/ # [0-9]#:*})
172 172 done
173 173 (( $#tags )) && _describe -t tags 'tags' tags
174 174 }
175 175
176 176 # likely merge candidates
177 177 _hg_mergerevs() {
178 178 typeset -a heads
179 179 local myrev
180 180
181 181 heads=(${(f)"$(_hg_cmd heads --template '{rev}\\n')"})
182 182 # exclude own revision
183 183 myrev=$(_hg_cmd log -r . --template '{rev}\\n')
184 184 heads=(${heads:#$myrev})
185 185
186 186 (( $#heads )) && _describe -t heads 'heads' heads
187 187 }
188 188
189 189 _hg_files() {
190 190 if [[ -n "$_hg_root" ]]
191 191 then
192 192 [[ -d "$_hg_root/.hg" ]] || return
193 193 case "$_hg_root" in
194 194 /*)
195 195 _files -W $_hg_root
196 196 ;;
197 197 *)
198 198 _files -W $PWD/$_hg_root
199 199 ;;
200 200 esac
201 201 else
202 202 _files
203 203 fi
204 204 }
205 205
206 206 _hg_status() {
207 207 [[ -d $PREFIX ]] || PREFIX=$PREFIX:h
208 208 status_files=(${(ps:\0:)"$(_hg_cmd status -0n$1 ./$PREFIX)"})
209 209 }
210 210
211 211 _hg_unknown() {
212 212 typeset -a status_files
213 213 _hg_status u
214 214 _wanted files expl 'unknown files' _multi_parts / status_files
215 215 }
216 216
217 217 _hg_missing() {
218 218 typeset -a status_files
219 219 _hg_status d
220 220 _wanted files expl 'missing files' _multi_parts / status_files
221 221 }
222 222
223 223 _hg_modified() {
224 224 typeset -a status_files
225 225 _hg_status m
226 226 _wanted files expl 'modified files' _multi_parts / status_files
227 227 }
228 228
229 229 _hg_resolve() {
230 230 local rstate rpath
231 231
232 232 [[ -d $PREFIX ]] || PREFIX=$PREFIX:h
233 233
234 234 _hg_cmd resolve -l ./$PREFIX | while read rstate rpath
235 235 do
236 236 [[ $rstate == 'R' ]] && resolved_files+=($rpath)
237 237 [[ $rstate == 'U' ]] && unresolved_files+=($rpath)
238 238 done
239 239 }
240 240
241 241 _hg_resolved() {
242 242 typeset -a resolved_files unresolved_files
243 243 _hg_resolve
244 244 _wanted files expl 'resolved files' _multi_parts / resolved_files
245 245 }
246 246
247 247 _hg_unresolved() {
248 248 typeset -a resolved_files unresolved_files
249 249 _hg_resolve
250 250 _wanted files expl 'unresolved files' _multi_parts / unresolved_files
251 251 }
252 252
253 253 _hg_config() {
254 254 typeset -a items
255 255 items=(${${(%f)"$(_call_program hg hg showconfig)"}%%\=*})
256 256 (( $#items )) && _describe -t config 'config item' items
257 257 }
258 258
259 259 _hg_addremove() {
260 260 _alternative 'files:unknown files:_hg_unknown' \
261 261 'files:missing files:_hg_missing'
262 262 }
263 263
264 264 _hg_ssh_urls() {
265 265 if [[ -prefix */ ]]
266 266 then
267 267 if zstyle -T ":completion:${curcontext}:files" remote-access
268 268 then
269 269 local host=${PREFIX%%/*}
270 270 typeset -a remdirs
271 271 compset -p $(( $#host + 1 ))
272 272 local rempath=${(M)PREFIX##*/}
273 273 local cacheid="hg:${host}-${rempath//\//_}"
274 274 cacheid=${cacheid%[-_]}
275 275 compset -P '*/'
276 276 if _cache_invalid "$cacheid" || ! _retrieve_cache "$cacheid"
277 277 then
278 278 remdirs=(${${(M)${(f)"$(_call_program files ssh -a -x $host ls -1FL "${(q)rempath}")"}##*/}%/})
279 279 _store_cache "$cacheid" remdirs
280 280 fi
281 281 _describe -t directories 'remote directory' remdirs -S/
282 282 else
283 283 _message 'remote directory'
284 284 fi
285 285 else
286 286 if compset -P '*@'
287 287 then
288 288 _hosts -S/
289 289 else
290 290 _alternative 'hosts:remote host name:_hosts -S/' \
291 291 'users:user:_users -S@'
292 292 fi
293 293 fi
294 294 }
295 295
296 296 _hg_urls() {
297 297 if compset -P bundle://
298 298 then
299 299 _files
300 300 elif compset -P ssh://
301 301 then
302 302 _hg_ssh_urls
303 303 elif [[ -prefix *: ]]
304 304 then
305 305 _urls
306 306 else
307 307 local expl
308 308 compset -S '[^:]*'
309 309 _wanted url-schemas expl 'URL schema' compadd -S '' - \
310 310 http:// https:// ssh:// bundle://
311 311 fi
312 312 }
313 313
314 314 _hg_paths() {
315 315 typeset -a paths pnames
316 316 _hg_cmd paths | while read -A pnames
317 317 do
318 318 paths+=($pnames[1])
319 319 done
320 320 (( $#paths )) && _describe -t path-aliases 'repository alias' paths
321 321 }
322 322
323 323 _hg_remote() {
324 324 _alternative 'path-aliases:repository alias:_hg_paths' \
325 325 'directories:directory:_files -/' \
326 326 'urls:URL:_hg_urls'
327 327 }
328 328
329 329 _hg_clone_dest() {
330 330 _alternative 'directories:directory:_files -/' \
331 331 'urls:URL:_hg_urls'
332 332 }
333 333
334 334 # Common options
335 335 _hg_global_opts=(
336 336 '(--repository -R)'{-R+,--repository}'[repository root directory]:repository:_files -/'
337 337 '--cwd[change working directory]:new working directory:_files -/'
338 338 '(--noninteractive -y)'{-y,--noninteractive}'[do not prompt, assume yes for any required answers]'
339 339 '(--verbose -v)'{-v,--verbose}'[enable additional output]'
340 340 '*--config[set/override config option]:defined config items:_hg_config'
341 341 '(--quiet -q)'{-q,--quiet}'[suppress output]'
342 342 '(--help -h)'{-h,--help}'[display help and exit]'
343 343 '--debug[debug mode]'
344 344 '--debugger[start debugger]'
345 345 '--encoding[set the charset encoding (default: UTF8)]'
346 346 '--encodingmode[set the charset encoding mode (default: strict)]'
347 347 '--lsprof[print improved command execution profile]'
348 348 '--traceback[print traceback on exception]'
349 349 '--time[time how long the command takes]'
350 350 '--profile[profile]'
351 351 '--version[output version information and exit]'
352 352 )
353 353
354 354 _hg_pat_opts=(
355 355 '*'{-I+,--include}'[include names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/'
356 356 '*'{-X+,--exclude}'[exclude names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/')
357 357
358 358 _hg_diff_opts=(
359 359 '(--text -a)'{-a,--text}'[treat all files as text]'
360 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 363 _hg_dryrun_opts=(
364 364 '(--dry-run -n)'{-n,--dry-run}'[do not perform actions, just print output]')
365 365
366 366 _hg_style_opts=(
367 367 '--style[display using template map file]:'
368 368 '--template[display with template]:')
369 369
370 370 _hg_commit_opts=(
371 371 '(-m --message -l --logfile --edit -e)'{-e,--edit}'[edit commit message]'
372 372 '(-e --edit -l --logfile --message -m)'{-m+,--message}'[use <text> as commit message]:message:'
373 373 '(-e --edit -m --message --logfile -l)'{-l+,--logfile}'[read the commit message from <file>]:log file:_files')
374 374
375 375 _hg_remote_opts=(
376 376 '(--ssh -e)'{-e+,--ssh}'[specify ssh command to use]:'
377 377 '--remotecmd[specify hg command to run on the remote side]:')
378 378
379 379 _hg_cmd() {
380 380 _call_program hg hg --config ui.verbose=0 --config defaults."$1"= \
381 381 "$_hg_cmd_globals[@]" "$@" 2> /dev/null
382 382 }
383 383
384 384 _hg_cmd_add() {
385 385 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
386 386 '*:unknown files:_hg_unknown'
387 387 }
388 388
389 389 _hg_cmd_addremove() {
390 390 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
391 391 '(--similarity -s)'{-s+,--similarity}'[guess renamed files by similarity (0<=s<=100)]:' \
392 392 '*:unknown or missing files:_hg_addremove'
393 393 }
394 394
395 395 _hg_cmd_annotate() {
396 396 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
397 397 '(--rev -r)'{-r+,--rev}'[annotate the specified revision]:revision:_hg_tags' \
398 398 '(--follow -f)'{-f,--follow}'[follow file copies and renames]' \
399 399 '(--text -a)'{-a,--text}'[treat all files as text]' \
400 400 '(--user -u)'{-u,--user}'[list the author]' \
401 401 '(--date -d)'{-d,--date}'[list the date]' \
402 402 '(--number -n)'{-n,--number}'[list the revision number (default)]' \
403 403 '(--changeset -c)'{-c,--changeset}'[list the changeset]' \
404 404 '*:files:_hg_files'
405 405 }
406 406
407 407 _hg_cmd_archive() {
408 408 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
409 409 '--no-decode[do not pass files through decoders]' \
410 410 '(--prefix -p)'{-p+,--prefix}'[directory prefix for files in archive]:' \
411 411 '(--rev -r)'{-r+,--rev}'[revision to distribute]:revision:_hg_tags' \
412 412 '(--type -t)'{-t+,--type}'[type of distribution to create]:archive type:(files tar tbz2 tgz uzip zip)' \
413 413 '*:destination:_files'
414 414 }
415 415
416 416 _hg_cmd_backout() {
417 417 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
418 418 '--merge[merge with old dirstate parent after backout]' \
419 419 '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
420 420 '--parent[parent to choose when backing out merge]' \
421 421 '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
422 422 '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
423 423 '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
424 424 '(--logfile -l)'{-l+,--logfile}'[read commit message from <file>]:log file:_files -g \*.txt'
425 425 }
426 426
427 427 _hg_cmd_bisect() {
428 428 _arguments -s -w : $_hg_global_opts \
429 429 '(-)'{-r,--reset}'[reset bisect state]' \
430 430 '(--good -g --bad -b --skip -s --reset -r)'{-g,--good}'[mark changeset good]'::revision:_hg_tags \
431 431 '(--good -g --bad -b --skip -s --reset -r)'{-b,--bad}'[mark changeset bad]'::revision:_hg_tags \
432 432 '(--good -g --bad -b --skip -s --reset -r)'{-s,--skip}'[skip testing changeset]' \
433 433 '(--command -c --noupdate -U)'{-c+,--command}'[use command to check changeset state]':commands:_command_names \
434 434 '(--command -c --noupdate -U)'{-U,--noupdate}'[do not update to target]'
435 435 }
436 436
437 437 _hg_cmd_branch() {
438 438 _arguments -s -w : $_hg_global_opts \
439 439 '(--force -f)'{-f,--force}'[set branch name even if it shadows an existing branch]' \
440 440 '(--clean -C)'{-C,--clean}'[reset branch name to parent branch name]'
441 441 }
442 442
443 443 _hg_cmd_branches() {
444 444 _arguments -s -w : $_hg_global_opts \
445 445 '(--active -a)'{-a,--active}'[show only branches that have unmerge heads]'
446 446 }
447 447
448 448 _hg_cmd_bundle() {
449 449 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
450 450 '(--force -f)'{-f,--force}'[run even when remote repository is unrelated]' \
451 451 '(2)*--base[a base changeset to specify instead of a destination]:revision:_hg_tags' \
452 452 ':output file:_files' \
453 453 ':destination repository:_files -/'
454 454 }
455 455
456 456 _hg_cmd_cat() {
457 457 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
458 458 '(--output -o)'{-o+,--output}'[print output to file with formatted name]:filespec:' \
459 459 '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
460 460 '*:file:_hg_files'
461 461 }
462 462
463 463 _hg_cmd_clone() {
464 464 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
465 465 '(--noupdate -U)'{-U,--noupdate}'[do not update the new working directory]' \
466 466 '(--rev -r)'{-r+,--rev}'[a changeset you would like to have after cloning]:' \
467 467 '--uncompressed[use uncompressed transfer (fast over LAN)]' \
468 468 ':source repository:_hg_remote' \
469 469 ':destination:_hg_clone_dest'
470 470 }
471 471
472 472 _hg_cmd_commit() {
473 473 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
474 474 '(--addremove -A)'{-A,--addremove}'[mark new/missing files as added/removed before committing]' \
475 475 '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
476 476 '(--logfile -l)'{-l+,--logfile}'[read commit message from <file>]:log file:_files -g \*.txt' \
477 477 '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
478 478 '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
479 479 '*:file:_hg_files'
480 480 }
481 481
482 482 _hg_cmd_copy() {
483 483 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
484 484 '(--after -A)'{-A,--after}'[record a copy that has already occurred]' \
485 485 '(--force -f)'{-f,--force}'[forcibly copy over an existing managed file]' \
486 486 '*:file:_hg_files'
487 487 }
488 488
489 489 _hg_cmd_diff() {
490 490 typeset -A opt_args
491 491 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_diff_opts \
492 492 '*'{-r,--rev}'+[revision]:revision:_hg_revrange' \
493 493 '(--show-function -p)'{-p,--show-function}'[show which function each change is in]' \
494 494 '(--ignore-all-space -w)'{-w,--ignore-all-space}'[ignore white space when comparing lines]' \
495 495 '(--ignore-space-change -b)'{-b,--ignore-space-change}'[ignore changes in the amount of white space]' \
496 496 '(--ignore-blank-lines -B)'{-B,--ignore-blank-lines}'[ignore changes whose lines are all blank]' \
497 497 '*:file:->diff_files'
498 498
499 499 if [[ $state == 'diff_files' ]]
500 500 then
501 501 if [[ -n $opt_args[-r] ]]
502 502 then
503 503 _hg_files
504 504 else
505 505 _hg_modified
506 506 fi
507 507 fi
508 508 }
509 509
510 510 _hg_cmd_export() {
511 511 _arguments -s -w : $_hg_global_opts $_hg_diff_opts \
512 512 '(--outout -o)'{-o+,--output}'[print output to file with formatted name]:filespec:' \
513 513 '--switch-parent[diff against the second parent]' \
514 514 '*:revision:_hg_tags'
515 515 }
516 516
517 517 _hg_cmd_grep() {
518 518 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
519 519 '(--print0 -0)'{-0,--print0}'[end filenames with NUL]' \
520 520 '--all[print all revisions with matches]' \
521 521 '(--follow -f)'{-f,--follow}'[follow changeset or file history]' \
522 522 '(--ignore-case -i)'{-i,--ignore-case}'[ignore case when matching]' \
523 523 '(--files-with-matches -l)'{-l,--files-with-matches}'[print only filenames and revs that match]' \
524 524 '(--line-number -n)'{-n,--line-number}'[print matching line numbers]' \
525 525 '*'{-r+,--rev}'[search in given revision range]:revision:_hg_revrange' \
526 526 '(--user -u)'{-u,--user}'[print user who committed change]' \
527 527 '1:search pattern:' \
528 528 '*:files:_hg_files'
529 529 }
530 530
531 531 _hg_cmd_heads() {
532 532 _arguments -s -w : $_hg_global_opts $_hg_style_opts \
533 533 '(--rev -r)'{-r+,--rev}'[show only heads which are descendants of rev]:revision:_hg_tags'
534 534 }
535 535
536 536 _hg_cmd_help() {
537 537 _arguments -s -w : $_hg_global_opts \
538 538 '*:mercurial command:_hg_commands'
539 539 }
540 540
541 541 _hg_cmd_identify() {
542 542 _arguments -s -w : $_hg_global_opts \
543 543 '(--rev -r)'{-r+,--rev}'[identify the specified rev]:revision:_hg_tags' \
544 544 '(--num -n)'{-n+,--num}'[show local revision number]' \
545 545 '(--id -i)'{-i+,--id}'[show global revision id]' \
546 546 '(--branch -b)'{-b+,--branch}'[show branch]' \
547 547 '(--tags -t)'{-t+,--tags}'[show tags]'
548 548 }
549 549
550 550 _hg_cmd_import() {
551 551 _arguments -s -w : $_hg_global_opts \
552 552 '(--strip -p)'{-p+,--strip}'[directory strip option for patch (default: 1)]:count:' \
553 553 '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
554 554 '(--force -f)'{-f,--force}'[skip check for outstanding uncommitted changes]' \
555 555 '*:patch:_files'
556 556 }
557 557
558 558 _hg_cmd_incoming() {
559 559 _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
560 560 '(--no-merges -M)'{-M,--no-merges}'[do not show merge revisions]' \
561 561 '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
562 562 '(--patch -p)'{-p,--patch}'[show patch]' \
563 563 '(--rev -r)'{-r+,--rev}'[a specific revision up to which you would like to pull]:revision:_hg_tags' \
564 564 '(--newest-first -n)'{-n,--newest-first}'[show newest record first]' \
565 565 '--bundle[file to store the bundles into]:bundle file:_files' \
566 566 ':source:_hg_remote'
567 567 }
568 568
569 569 _hg_cmd_init() {
570 570 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
571 571 ':dir:_files -/'
572 572 }
573 573
574 574 _hg_cmd_locate() {
575 575 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
576 576 '(--rev -r)'{-r+,--rev}'[search repository as it stood at revision]:revision:_hg_tags' \
577 577 '(--print0 -0)'{-0,--print0}'[end filenames with NUL, for use with xargs]' \
578 578 '(--fullpath -f)'{-f,--fullpath}'[print complete paths]' \
579 579 '*:search pattern:_hg_files'
580 580 }
581 581
582 582 _hg_cmd_log() {
583 583 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_style_opts \
584 584 '(--follow --follow-first -f)'{-f,--follow}'[follow changeset or history]' \
585 585 '(-f --follow)--follow-first[only follow the first parent of merge changesets]' \
586 586 '(--copies -C)'{-C,--copies}'[show copied files]' \
587 587 '(--keyword -k)'{-k+,--keyword}'[search for a keyword]:' \
588 588 '(--limit -l)'{-l+,--limit}'[limit number of changes displayed]:' \
589 589 '*'{-r,--rev}'[show the specified revision or range]:revision:_hg_revrange' \
590 590 '(--no-merges -M)'{-M,--no-merges}'[do not show merges]' \
591 591 '(--only-merges -m)'{-m,--only-merges}'[show only merges]' \
592 592 '(--patch -p)'{-p,--patch}'[show patch]' \
593 593 '(--prune -P)'{-P+,--prune}'[do not display revision or any of its ancestors]:revision:_hg_tags' \
594 594 '*:files:_hg_files'
595 595 }
596 596
597 597 _hg_cmd_manifest() {
598 598 _arguments -s -w : $_hg_global_opts \
599 599 ':revision:_hg_tags'
600 600 }
601 601
602 602 _hg_cmd_merge() {
603 603 _arguments -s -w : $_hg_global_opts \
604 604 '(--force -f)'{-f,--force}'[force a merge with outstanding changes]' \
605 605 '(--rev -r 1)'{-r,--rev}'[revision to merge]:revision:_hg_mergerevs' \
606 606 '(--preview -P)'{-P,--preview}'[review revisions to merge (no merge is performed)]' \
607 607 ':revision:_hg_mergerevs'
608 608 }
609 609
610 610 _hg_cmd_outgoing() {
611 611 _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
612 612 '(--no-merges -M)'{-M,--no-merges}'[do not show merge revisions]' \
613 613 '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
614 614 '(--patch -p)'{-p,--patch}'[show patch]' \
615 615 '(--rev -r)'{-r+,--rev}'[a specific revision you would like to push]' \
616 616 '(--newest-first -n)'{-n,--newest-first}'[show newest record first]' \
617 617 ':destination:_hg_remote'
618 618 }
619 619
620 620 _hg_cmd_parents() {
621 621 _arguments -s -w : $_hg_global_opts $_hg_style_opts \
622 622 '(--rev -r)'{-r+,--rev}'[show parents of the specified rev]:revision:_hg_tags' \
623 623 ':last modified file:_hg_files'
624 624 }
625 625
626 626 _hg_cmd_paths() {
627 627 _arguments -s -w : $_hg_global_opts \
628 628 ':path:_hg_paths'
629 629 }
630 630
631 631 _hg_cmd_pull() {
632 632 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
633 633 '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
634 634 '(--update -u)'{-u,--update}'[update to new tip if changesets were pulled]' \
635 635 '(--rev -r)'{-r+,--rev}'[a specific revision up to which you would like to pull]:revision:' \
636 636 ':source:_hg_remote'
637 637 }
638 638
639 639 _hg_cmd_push() {
640 640 _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
641 641 '(--force -f)'{-f,--force}'[force push]' \
642 642 '(--rev -r)'{-r+,--rev}'[a specific revision you would like to push]:revision:_hg_tags' \
643 643 ':destination:_hg_remote'
644 644 }
645 645
646 646 _hg_cmd_remove() {
647 647 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
648 648 '(--after -A)'{-A,--after}'[record remove that has already occurred]' \
649 649 '(--force -f)'{-f,--force}'[remove file even if modified]' \
650 650 '*:file:_hg_files'
651 651 }
652 652
653 653 _hg_cmd_rename() {
654 654 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
655 655 '(--after -A)'{-A,--after}'[record a rename that has already occurred]' \
656 656 '(--force -f)'{-f,--force}'[forcibly copy over an existing managed file]' \
657 657 '*:file:_hg_files'
658 658 }
659 659
660 660 _hg_cmd_resolve() {
661 661 local context state line
662 662 typeset -A opt_args
663 663
664 664 _arguments -s -w : $_hg_global_opts \
665 665 '(--list -l --mark -m --unmark -u)'{-l,--list}'[list state of files needing merge]:*:merged files:->resolve_files' \
666 666 '(--mark -m --list -l --unmark -u)'{-m,--mark}'[mark files as resolved]:*:unresolved files:_hg_unresolved' \
667 667 '(--unmark -u --list -l --mark -m)'{-u,--unmark}'[unmark files as resolved]:*:resolved files:_hg_resolved' \
668 668 '*:file:_hg_unresolved'
669 669
670 670 if [[ $state == 'resolve_files' ]]
671 671 then
672 672 _alternative 'files:resolved files:_hg_resolved' \
673 673 'files:unresolved files:_hg_unresolved'
674 674 fi
675 675 }
676 676
677 677 _hg_cmd_revert() {
678 678 local context state line
679 679 typeset -A opt_args
680 680
681 681 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
682 682 '(--all -a :)'{-a,--all}'[revert all changes when no arguments given]' \
683 683 '(--rev -r)'{-r+,--rev}'[revision to revert to]:revision:_hg_tags' \
684 684 '--no-backup[do not save backup copies of files]' \
685 685 '*:file:->diff_files'
686 686
687 687 if [[ $state == 'diff_files' ]]
688 688 then
689 689 if [[ -n $opt_args[-r] ]]
690 690 then
691 691 _hg_files
692 692 else
693 693 typeset -a status_files
694 694 _hg_status mard
695 695 _wanted files expl 'modified, added, removed or deleted file' _multi_parts / status_files
696 696 fi
697 697 fi
698 698 }
699 699
700 700 _hg_cmd_serve() {
701 701 _arguments -s -w : $_hg_global_opts \
702 702 '(--accesslog -A)'{-A+,--accesslog}'[name of access log file]:log file:_files' \
703 703 '(--errorlog -E)'{-E+,--errorlog}'[name of error log file]:log file:_files' \
704 704 '(--daemon -d)'{-d,--daemon}'[run server in background]' \
705 705 '(--port -p)'{-p+,--port}'[listen port]:listen port:' \
706 706 '(--address -a)'{-a+,--address}'[interface address]:interface address:' \
707 707 '(--name -n)'{-n+,--name}'[name to show in web pages]:repository name:' \
708 708 '(--templates -t)'{-t,--templates}'[web template directory]:template dir:_files -/' \
709 709 '--style[web template style]:style' \
710 710 '--stdio[for remote clients]' \
711 711 '(--ipv6 -6)'{-6,--ipv6}'[use IPv6 in addition to IPv4]'
712 712 }
713 713
714 714 _hg_cmd_showconfig() {
715 715 _arguments -s -w : $_hg_global_opts \
716 716 '(--untrusted -u)'{-u+,--untrusted}'[show untrusted configuration options]' \
717 717 ':config item:_hg_config'
718 718 }
719 719
720 720 _hg_cmd_status() {
721 721 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
722 722 '(--all -A)'{-A,--all}'[show status of all files]' \
723 723 '(--modified -m)'{-m,--modified}'[show only modified files]' \
724 724 '(--added -a)'{-a,--added}'[show only added files]' \
725 725 '(--removed -r)'{-r,--removed}'[show only removed files]' \
726 726 '(--deleted -d)'{-d,--deleted}'[show only deleted (but tracked) files]' \
727 727 '(--clean -c)'{-c,--clean}'[show only files without changes]' \
728 728 '(--unknown -u)'{-u,--unknown}'[show only unknown files]' \
729 729 '(--ignored -i)'{-i,--ignored}'[show ignored files]' \
730 730 '(--no-status -n)'{-n,--no-status}'[hide status prefix]' \
731 731 '(--copies -C)'{-C,--copies}'[show source of copied files]' \
732 732 '(--print0 -0)'{-0,--print0}'[end filenames with NUL, for use with xargs]' \
733 733 '--rev[show difference from revision]:revision:_hg_tags' \
734 734 '*:files:_files'
735 735 }
736 736
737 737 _hg_cmd_summary() {
738 738 _arguments -s -w : $_hg_global_opts \
739 739 '--remote[check for push and pull]'
740 740 }
741 741
742 742 _hg_cmd_tag() {
743 743 _arguments -s -w : $_hg_global_opts \
744 744 '(--local -l)'{-l,--local}'[make the tag local]' \
745 745 '(--message -m)'{-m+,--message}'[message for tag commit log entry]:message:' \
746 746 '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
747 747 '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
748 748 '(--rev -r)'{-r+,--rev}'[revision to tag]:revision:_hg_tags' \
749 749 ':tag name:'
750 750 }
751 751
752 752 _hg_cmd_tip() {
753 753 _arguments -s -w : $_hg_global_opts $_hg_style_opts \
754 754 '(--patch -p)'{-p,--patch}'[show patch]'
755 755 }
756 756
757 757 _hg_cmd_unbundle() {
758 758 _arguments -s -w : $_hg_global_opts \
759 759 '(--update -u)'{-u,--update}'[update to new tip if changesets were unbundled]' \
760 760 ':files:_files'
761 761 }
762 762
763 763 _hg_cmd_update() {
764 764 _arguments -s -w : $_hg_global_opts \
765 765 '(--clean -C)'{-C,--clean}'[overwrite locally modified files]' \
766 766 '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
767 767 ':revision:_hg_tags'
768 768 }
769 769
770 770 # HGK
771 771 _hg_cmd_view() {
772 772 _arguments -s -w : $_hg_global_opts \
773 773 '(--limit -l)'{-l+,--limit}'[limit number of changes displayed]:' \
774 774 ':revision range:_hg_tags'
775 775 }
776 776
777 777 # MQ
778 778 _hg_qseries() {
779 779 typeset -a patches
780 780 patches=(${(f)"$(_hg_cmd qseries)"})
781 781 (( $#patches )) && _describe -t hg-patches 'patches' patches
782 782 }
783 783
784 784 _hg_qapplied() {
785 785 typeset -a patches
786 786 patches=(${(f)"$(_hg_cmd qapplied)"})
787 787 if (( $#patches ))
788 788 then
789 789 patches+=(qbase qtip)
790 790 _describe -t hg-applied-patches 'applied patches' patches
791 791 fi
792 792 }
793 793
794 794 _hg_qunapplied() {
795 795 typeset -a patches
796 796 patches=(${(f)"$(_hg_cmd qunapplied)"})
797 797 (( $#patches )) && _describe -t hg-unapplied-patches 'unapplied patches' patches
798 798 }
799 799
800 800 # unapplied, including guarded patches
801 801 _hg_qdeletable() {
802 802 typeset -a unapplied
803 803 unapplied=(${(f)"$(_hg_cmd qseries)"})
804 804 for p in $(_hg_cmd qapplied)
805 805 do
806 806 unapplied=(${unapplied:#$p})
807 807 done
808 808
809 809 (( $#unapplied )) && _describe -t hg-allunapplied-patches 'all unapplied patches' unapplied
810 810 }
811 811
812 812 _hg_qguards() {
813 813 typeset -a guards
814 814 local guard
815 815 compset -P "+|-"
816 816 _hg_cmd qselect -s | while read guard
817 817 do
818 818 guards+=(${guard#(+|-)})
819 819 done
820 820 (( $#guards )) && _describe -t hg-guards 'guards' guards
821 821 }
822 822
823 823 _hg_qseries_opts=(
824 824 '(--summary -s)'{-s,--summary}'[print first line of patch header]')
825 825
826 826 _hg_cmd_qapplied() {
827 827 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
828 828 }
829 829
830 830 _hg_cmd_qdelete() {
831 831 _arguments -s -w : $_hg_global_opts \
832 832 '(--keep -k)'{-k,--keep}'[keep patch file]' \
833 833 '*'{-r+,--rev}'[stop managing a revision]:applied patch:_hg_revrange' \
834 834 '*:unapplied patch:_hg_qdeletable'
835 835 }
836 836
837 837 _hg_cmd_qdiff() {
838 838 _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
839 839 '*:pattern:_hg_files'
840 840 }
841 841
842 842 _hg_cmd_qfold() {
843 843 _arguments -s -w : $_hg_global_opts $_h_commit_opts \
844 844 '(--keep,-k)'{-k,--keep}'[keep folded patch files]' \
845 845 '*:unapplied patch:_hg_qunapplied'
846 846 }
847 847
848 848 _hg_cmd_qgoto() {
849 849 _arguments -s -w : $_hg_global_opts \
850 850 '(--force -f)'{-f,--force}'[overwrite any local changes]' \
851 851 ':patch:_hg_qseries'
852 852 }
853 853
854 854 _hg_cmd_qguard() {
855 855 _arguments -s -w : $_hg_global_opts \
856 856 '(--list -l)'{-l,--list}'[list all patches and guards]' \
857 857 '(--none -n)'{-n,--none}'[drop all guards]' \
858 858 ':patch:_hg_qseries' \
859 859 '*:guards:_hg_qguards'
860 860 }
861 861
862 862 _hg_cmd_qheader() {
863 863 _arguments -s -w : $_hg_global_opts \
864 864 ':patch:_hg_qseries'
865 865 }
866 866
867 867 _hg_cmd_qimport() {
868 868 _arguments -s -w : $_hg_global_opts \
869 869 '(--existing -e)'{-e,--existing}'[import file in patch dir]' \
870 870 '(--name -n 2)'{-n+,--name}'[patch file name]:name:' \
871 871 '(--force -f)'{-f,--force}'[overwrite existing files]' \
872 872 '*'{-r+,--rev}'[place existing revisions under mq control]:revision:_hg_revrange' \
873 873 '*:patch:_files'
874 874 }
875 875
876 876 _hg_cmd_qnew() {
877 877 _arguments -s -w : $_hg_global_opts $_hg_commit_opts \
878 878 '(--force -f)'{-f,--force}'[import uncommitted changes into patch]' \
879 879 ':patch:'
880 880 }
881 881
882 882 _hg_cmd_qnext() {
883 883 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
884 884 }
885 885
886 886 _hg_cmd_qpop() {
887 887 _arguments -s -w : $_hg_global_opts \
888 888 '(--all -a :)'{-a,--all}'[pop all patches]' \
889 889 '(--name -n)'{-n+,--name}'[queue name to pop]:' \
890 890 '(--force -f)'{-f,--force}'[forget any local changes]' \
891 891 ':patch:_hg_qapplied'
892 892 }
893 893
894 894 _hg_cmd_qprev() {
895 895 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
896 896 }
897 897
898 898 _hg_cmd_qpush() {
899 899 _arguments -s -w : $_hg_global_opts \
900 900 '(--all -a :)'{-a,--all}'[apply all patches]' \
901 901 '(--list -l)'{-l,--list}'[list patch name in commit text]' \
902 902 '(--merge -m)'{-m+,--merge}'[merge from another queue]:' \
903 903 '(--name -n)'{-n+,--name}'[merge queue name]:' \
904 904 '(--force -f)'{-f,--force}'[apply if the patch has rejects]' \
905 905 ':patch:_hg_qunapplied'
906 906 }
907 907
908 908 _hg_cmd_qrefresh() {
909 909 _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_commit_opts \
910 910 '(--git -g)'{-g,--git}'[use git extended diff format]' \
911 911 '(--short -s)'{-s,--short}'[short refresh]' \
912 912 '*:files:_hg_files'
913 913 }
914 914
915 915 _hg_cmd_qrename() {
916 916 _arguments -s -w : $_hg_global_opts \
917 917 ':patch:_hg_qseries' \
918 918 ':destination:'
919 919 }
920 920
921 921 _hg_cmd_qselect() {
922 922 _arguments -s -w : $_hg_global_opts \
923 923 '(--none -n :)'{-n,--none}'[disable all guards]' \
924 924 '(--series -s :)'{-s,--series}'[list all guards in series file]' \
925 925 '--pop[pop to before first guarded applied patch]' \
926 926 '--reapply[pop and reapply patches]' \
927 927 '*:guards:_hg_qguards'
928 928 }
929 929
930 930 _hg_cmd_qseries() {
931 931 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts \
932 932 '(--missing -m)'{-m,--missing}'[print patches not in series]'
933 933 }
934 934
935 935 _hg_cmd_qunapplied() {
936 936 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
937 937 }
938 938
939 939 _hg_cmd_qtop() {
940 940 _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
941 941 }
942 942
943 943 _hg_cmd_strip() {
944 944 _arguments -s -w : $_hg_global_opts \
945 945 '(--force -f)'{-f,--force}'[force multi-head removal]' \
946 946 '(--backup -b)'{-b,--backup}'[bundle unrelated changesets]' \
947 947 '(--nobackup -n)'{-n,--nobackup}'[no backups]' \
948 948 ':revision:_hg_tags'
949 949 }
950 950
951 951 _hg "$@"
@@ -1,3765 +1,3765
1 1 # commands.py - command processing for mercurial
2 2 #
3 3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 from node import hex, nullid, nullrev, short
9 9 from lock import release
10 10 from i18n import _, gettext
11 11 import os, re, sys, difflib, time, tempfile
12 12 import hg, util, revlog, bundlerepo, extensions, copies, error
13 13 import patch, help, mdiff, url, encoding, templatekw
14 14 import archival, changegroup, cmdutil, sshserver, hbisect
15 15 from hgweb import server
16 16 import merge as merge_
17 17 import minirst
18 18
19 19 # Commands start here, listed alphabetically
20 20
21 21 def add(ui, repo, *pats, **opts):
22 22 """add the specified files on the next commit
23 23
24 24 Schedule files to be version controlled and added to the
25 25 repository.
26 26
27 27 The files will be added to the repository at the next commit. To
28 28 undo an add before that, see hg forget.
29 29
30 30 If no names are given, add all files to the repository.
31 31 """
32 32
33 33 bad = []
34 34 names = []
35 35 m = cmdutil.match(repo, pats, opts)
36 36 oldbad = m.bad
37 37 m.bad = lambda x, y: bad.append(x) or oldbad(x, y)
38 38
39 39 for f in repo.walk(m):
40 40 exact = m.exact(f)
41 41 if exact or f not in repo.dirstate:
42 42 names.append(f)
43 43 if ui.verbose or not exact:
44 44 ui.status(_('adding %s\n') % m.rel(f))
45 45 if not opts.get('dry_run'):
46 46 bad += [f for f in repo.add(names) if f in m.files()]
47 47 return bad and 1 or 0
48 48
49 49 def addremove(ui, repo, *pats, **opts):
50 50 """add all new files, delete all missing files
51 51
52 52 Add all new files and remove all missing files from the
53 53 repository.
54 54
55 55 New files are ignored if they match any of the patterns in
56 56 .hgignore. As with add, these changes take effect at the next
57 57 commit.
58 58
59 59 Use the -s/--similarity option to detect renamed files. With a
60 60 parameter greater than 0, this compares every removed file with
61 61 every added file and records those similar enough as renames. This
62 62 option takes a percentage between 0 (disabled) and 100 (files must
63 63 be identical) as its parameter. Detecting renamed files this way
64 64 can be expensive.
65 65 """
66 66 try:
67 67 sim = float(opts.get('similarity') or 0)
68 68 except ValueError:
69 69 raise util.Abort(_('similarity must be a number'))
70 70 if sim < 0 or sim > 100:
71 71 raise util.Abort(_('similarity must be between 0 and 100'))
72 72 return cmdutil.addremove(repo, pats, opts, similarity=sim / 100.0)
73 73
74 74 def annotate(ui, repo, *pats, **opts):
75 75 """show changeset information by line for each file
76 76
77 77 List changes in files, showing the revision id responsible for
78 78 each line
79 79
80 80 This command is useful for discovering when a change was made and
81 81 by whom.
82 82
83 83 Without the -a/--text option, annotate will avoid processing files
84 84 it detects as binary. With -a, annotate will annotate the file
85 85 anyway, although the results will probably be neither useful
86 86 nor desirable.
87 87 """
88 88 datefunc = ui.quiet and util.shortdate or util.datestr
89 89 getdate = util.cachefunc(lambda x: datefunc(x[0].date()))
90 90
91 91 if not pats:
92 92 raise util.Abort(_('at least one filename or pattern is required'))
93 93
94 94 opmap = [('user', lambda x: ui.shortuser(x[0].user())),
95 95 ('number', lambda x: str(x[0].rev())),
96 96 ('changeset', lambda x: short(x[0].node())),
97 97 ('date', getdate),
98 98 ('file', lambda x: x[0].path()),
99 99 ]
100 100
101 101 if (not opts.get('user') and not opts.get('changeset')
102 102 and not opts.get('date') and not opts.get('file')):
103 103 opts['number'] = 1
104 104
105 105 linenumber = opts.get('line_number') is not None
106 106 if (linenumber and (not opts.get('changeset')) and (not opts.get('number'))):
107 107 raise util.Abort(_('at least one of -n/-c is required for -l'))
108 108
109 109 funcmap = [func for op, func in opmap if opts.get(op)]
110 110 if linenumber:
111 111 lastfunc = funcmap[-1]
112 112 funcmap[-1] = lambda x: "%s:%s" % (lastfunc(x), x[1])
113 113
114 114 ctx = repo[opts.get('rev')]
115 115 m = cmdutil.match(repo, pats, opts)
116 116 follow = not opts.get('no_follow')
117 117 for abs in ctx.walk(m):
118 118 fctx = ctx[abs]
119 119 if not opts.get('text') and util.binary(fctx.data()):
120 120 ui.write(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
121 121 continue
122 122
123 123 lines = fctx.annotate(follow=follow, linenumber=linenumber)
124 124 pieces = []
125 125
126 126 for f in funcmap:
127 127 l = [f(n) for n, dummy in lines]
128 128 if l:
129 129 ml = max(map(len, l))
130 130 pieces.append(["%*s" % (ml, x) for x in l])
131 131
132 132 if pieces:
133 133 for p, l in zip(zip(*pieces), lines):
134 134 ui.write("%s: %s" % (" ".join(p), l[1]))
135 135
136 136 def archive(ui, repo, dest, **opts):
137 137 '''create an unversioned archive of a repository revision
138 138
139 139 By default, the revision used is the parent of the working
140 140 directory; use -r/--rev to specify a different revision.
141 141
142 142 To specify the type of archive to create, use -t/--type. Valid
143 143 types are:
144 144
145 145 :``files``: a directory full of files (default)
146 146 :``tar``: tar archive, uncompressed
147 147 :``tbz2``: tar archive, compressed using bzip2
148 148 :``tgz``: tar archive, compressed using gzip
149 149 :``uzip``: zip archive, uncompressed
150 150 :``zip``: zip archive, compressed using deflate
151 151
152 152 The exact name of the destination archive or directory is given
153 153 using a format string; see 'hg help export' for details.
154 154
155 155 Each member added to an archive file has a directory prefix
156 156 prepended. Use -p/--prefix to specify a format string for the
157 157 prefix. The default is the basename of the archive, with suffixes
158 158 removed.
159 159 '''
160 160
161 161 ctx = repo[opts.get('rev')]
162 162 if not ctx:
163 163 raise util.Abort(_('no working directory: please specify a revision'))
164 164 node = ctx.node()
165 165 dest = cmdutil.make_filename(repo, dest, node)
166 166 if os.path.realpath(dest) == repo.root:
167 167 raise util.Abort(_('repository root cannot be destination'))
168 168 matchfn = cmdutil.match(repo, [], opts)
169 169 kind = opts.get('type') or 'files'
170 170 prefix = opts.get('prefix')
171 171 if dest == '-':
172 172 if kind == 'files':
173 173 raise util.Abort(_('cannot archive plain files to stdout'))
174 174 dest = sys.stdout
175 175 if not prefix:
176 176 prefix = os.path.basename(repo.root) + '-%h'
177 177 prefix = cmdutil.make_filename(repo, prefix, node)
178 178 archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
179 179 matchfn, prefix)
180 180
181 181 def backout(ui, repo, node=None, rev=None, **opts):
182 182 '''reverse effect of earlier changeset
183 183
184 184 Commit the backed out changes as a new changeset. The new
185 185 changeset is a child of the backed out changeset.
186 186
187 187 If you backout a changeset other than the tip, a new head is
188 188 created. This head will be the new tip and you should merge this
189 189 backout changeset with another head.
190 190
191 191 The --merge option remembers the parent of the working directory
192 192 before starting the backout, then merges the new head with that
193 193 changeset afterwards. This saves you from doing the merge by hand.
194 194 The result of this merge is not committed, as with a normal merge.
195 195
196 196 See 'hg help dates' for a list of formats valid for -d/--date.
197 197 '''
198 198 if rev and node:
199 199 raise util.Abort(_("please specify just one revision"))
200 200
201 201 if not rev:
202 202 rev = node
203 203
204 204 if not rev:
205 205 raise util.Abort(_("please specify a revision to backout"))
206 206
207 207 date = opts.get('date')
208 208 if date:
209 209 opts['date'] = util.parsedate(date)
210 210
211 211 cmdutil.bail_if_changed(repo)
212 212 node = repo.lookup(rev)
213 213
214 214 op1, op2 = repo.dirstate.parents()
215 215 a = repo.changelog.ancestor(op1, node)
216 216 if a != node:
217 217 raise util.Abort(_('cannot backout change on a different branch'))
218 218
219 219 p1, p2 = repo.changelog.parents(node)
220 220 if p1 == nullid:
221 221 raise util.Abort(_('cannot backout a change with no parents'))
222 222 if p2 != nullid:
223 223 if not opts.get('parent'):
224 224 raise util.Abort(_('cannot backout a merge changeset without '
225 225 '--parent'))
226 226 p = repo.lookup(opts['parent'])
227 227 if p not in (p1, p2):
228 228 raise util.Abort(_('%s is not a parent of %s') %
229 229 (short(p), short(node)))
230 230 parent = p
231 231 else:
232 232 if opts.get('parent'):
233 233 raise util.Abort(_('cannot use --parent on non-merge changeset'))
234 234 parent = p1
235 235
236 236 # the backout should appear on the same branch
237 237 branch = repo.dirstate.branch()
238 238 hg.clean(repo, node, show_stats=False)
239 239 repo.dirstate.setbranch(branch)
240 240 revert_opts = opts.copy()
241 241 revert_opts['date'] = None
242 242 revert_opts['all'] = True
243 243 revert_opts['rev'] = hex(parent)
244 244 revert_opts['no_backup'] = None
245 245 revert(ui, repo, **revert_opts)
246 246 commit_opts = opts.copy()
247 247 commit_opts['addremove'] = False
248 248 if not commit_opts['message'] and not commit_opts['logfile']:
249 249 # we don't translate commit messages
250 250 commit_opts['message'] = "Backed out changeset %s" % short(node)
251 251 commit_opts['force_editor'] = True
252 252 commit(ui, repo, **commit_opts)
253 253 def nice(node):
254 254 return '%d:%s' % (repo.changelog.rev(node), short(node))
255 255 ui.status(_('changeset %s backs out changeset %s\n') %
256 256 (nice(repo.changelog.tip()), nice(node)))
257 257 if op1 != node:
258 258 hg.clean(repo, op1, show_stats=False)
259 259 if opts.get('merge'):
260 260 ui.status(_('merging with changeset %s\n')
261 261 % nice(repo.changelog.tip()))
262 262 hg.merge(repo, hex(repo.changelog.tip()))
263 263 else:
264 264 ui.status(_('the backout changeset is a new head - '
265 265 'do not forget to merge\n'))
266 266 ui.status(_('(use "backout --merge" '
267 267 'if you want to auto-merge)\n'))
268 268
269 269 def bisect(ui, repo, rev=None, extra=None, command=None,
270 270 reset=None, good=None, bad=None, skip=None, noupdate=None):
271 271 """subdivision search of changesets
272 272
273 273 This command helps to find changesets which introduce problems. To
274 274 use, mark the earliest changeset you know exhibits the problem as
275 275 bad, then mark the latest changeset which is free from the problem
276 276 as good. Bisect will update your working directory to a revision
277 277 for testing (unless the -U/--noupdate option is specified). Once
278 278 you have performed tests, mark the working directory as good or
279 279 bad, and bisect will either update to another candidate changeset
280 280 or announce that it has found the bad revision.
281 281
282 282 As a shortcut, you can also use the revision argument to mark a
283 283 revision as good or bad without checking it out first.
284 284
285 285 If you supply a command, it will be used for automatic bisection.
286 286 Its exit status will be used to mark revisions as good or bad:
287 287 status 0 means good, 125 means to skip the revision, 127
288 288 (command not found) will abort the bisection, and any other
289 289 non-zero exit status means the revision is bad.
290 290 """
291 291 def print_result(nodes, good):
292 292 displayer = cmdutil.show_changeset(ui, repo, {})
293 293 if len(nodes) == 1:
294 294 # narrowed it down to a single revision
295 295 if good:
296 296 ui.write(_("The first good revision is:\n"))
297 297 else:
298 298 ui.write(_("The first bad revision is:\n"))
299 299 displayer.show(repo[nodes[0]])
300 300 else:
301 301 # multiple possible revisions
302 302 if good:
303 303 ui.write(_("Due to skipped revisions, the first "
304 304 "good revision could be any of:\n"))
305 305 else:
306 306 ui.write(_("Due to skipped revisions, the first "
307 307 "bad revision could be any of:\n"))
308 308 for n in nodes:
309 309 displayer.show(repo[n])
310 310 displayer.close()
311 311
312 312 def check_state(state, interactive=True):
313 313 if not state['good'] or not state['bad']:
314 314 if (good or bad or skip or reset) and interactive:
315 315 return
316 316 if not state['good']:
317 317 raise util.Abort(_('cannot bisect (no known good revisions)'))
318 318 else:
319 319 raise util.Abort(_('cannot bisect (no known bad revisions)'))
320 320 return True
321 321
322 322 # backward compatibility
323 323 if rev in "good bad reset init".split():
324 324 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
325 325 cmd, rev, extra = rev, extra, None
326 326 if cmd == "good":
327 327 good = True
328 328 elif cmd == "bad":
329 329 bad = True
330 330 else:
331 331 reset = True
332 332 elif extra or good + bad + skip + reset + bool(command) > 1:
333 333 raise util.Abort(_('incompatible arguments'))
334 334
335 335 if reset:
336 336 p = repo.join("bisect.state")
337 337 if os.path.exists(p):
338 338 os.unlink(p)
339 339 return
340 340
341 341 state = hbisect.load_state(repo)
342 342
343 343 if command:
344 344 changesets = 1
345 345 try:
346 346 while changesets:
347 347 # update state
348 348 status = util.system(command)
349 349 if status == 125:
350 350 transition = "skip"
351 351 elif status == 0:
352 352 transition = "good"
353 353 # status < 0 means process was killed
354 354 elif status == 127:
355 355 raise util.Abort(_("failed to execute %s") % command)
356 356 elif status < 0:
357 357 raise util.Abort(_("%s killed") % command)
358 358 else:
359 359 transition = "bad"
360 360 ctx = repo[rev or '.']
361 361 state[transition].append(ctx.node())
362 362 ui.status(_('Changeset %d:%s: %s\n') % (ctx, ctx, transition))
363 363 check_state(state, interactive=False)
364 364 # bisect
365 365 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
366 366 # update to next check
367 367 cmdutil.bail_if_changed(repo)
368 368 hg.clean(repo, nodes[0], show_stats=False)
369 369 finally:
370 370 hbisect.save_state(repo, state)
371 371 return print_result(nodes, good)
372 372
373 373 # update state
374 374 node = repo.lookup(rev or '.')
375 375 if good or bad or skip:
376 376 if good:
377 377 state['good'].append(node)
378 378 elif bad:
379 379 state['bad'].append(node)
380 380 elif skip:
381 381 state['skip'].append(node)
382 382 hbisect.save_state(repo, state)
383 383
384 384 if not check_state(state):
385 385 return
386 386
387 387 # actually bisect
388 388 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
389 389 if changesets == 0:
390 390 print_result(nodes, good)
391 391 else:
392 392 assert len(nodes) == 1 # only a single node can be tested next
393 393 node = nodes[0]
394 394 # compute the approximate number of remaining tests
395 395 tests, size = 0, 2
396 396 while size <= changesets:
397 397 tests, size = tests + 1, size * 2
398 398 rev = repo.changelog.rev(node)
399 399 ui.write(_("Testing changeset %d:%s "
400 400 "(%d changesets remaining, ~%d tests)\n")
401 401 % (rev, short(node), changesets, tests))
402 402 if not noupdate:
403 403 cmdutil.bail_if_changed(repo)
404 404 return hg.clean(repo, node)
405 405
406 406 def branch(ui, repo, label=None, **opts):
407 407 """set or show the current branch name
408 408
409 409 With no argument, show the current branch name. With one argument,
410 410 set the working directory branch name (the branch will not exist
411 411 in the repository until the next commit). Standard practice
412 412 recommends that primary development take place on the 'default'
413 413 branch.
414 414
415 415 Unless -f/--force is specified, branch will not let you set a
416 416 branch name that already exists, even if it's inactive.
417 417
418 418 Use -C/--clean to reset the working directory branch to that of
419 419 the parent of the working directory, negating a previous branch
420 420 change.
421 421
422 422 Use the command 'hg update' to switch to an existing branch. Use
423 423 'hg commit --close-branch' to mark this branch as closed.
424 424 """
425 425
426 426 if opts.get('clean'):
427 427 label = repo[None].parents()[0].branch()
428 428 repo.dirstate.setbranch(label)
429 429 ui.status(_('reset working directory to branch %s\n') % label)
430 430 elif label:
431 431 utflabel = encoding.fromlocal(label)
432 432 if not opts.get('force') and utflabel in repo.branchtags():
433 433 if label not in [p.branch() for p in repo.parents()]:
434 434 raise util.Abort(_('a branch of the same name already exists'
435 435 ' (use --force to override)'))
436 436 repo.dirstate.setbranch(utflabel)
437 437 ui.status(_('marked working directory as branch %s\n') % label)
438 438 else:
439 439 ui.write("%s\n" % encoding.tolocal(repo.dirstate.branch()))
440 440
441 441 def branches(ui, repo, active=False, closed=False):
442 442 """list repository named branches
443 443
444 444 List the repository's named branches, indicating which ones are
445 445 inactive. If -c/--closed is specified, also list branches which have
446 446 been marked closed (see hg commit --close-branch).
447 447
448 448 If -a/--active is specified, only show active branches. A branch
449 449 is considered active if it contains repository heads.
450 450
451 451 Use the command 'hg update' to switch to an existing branch.
452 452 """
453 453
454 454 hexfunc = ui.debugflag and hex or short
455 455 activebranches = [repo[n].branch() for n in repo.heads()]
456 456 def testactive(tag, node):
457 457 realhead = tag in activebranches
458 458 open = node in repo.branchheads(tag, closed=False)
459 459 return realhead and open
460 460 branches = sorted([(testactive(tag, node), repo.changelog.rev(node), tag)
461 461 for tag, node in repo.branchtags().items()],
462 462 reverse=True)
463 463
464 464 for isactive, node, tag in branches:
465 465 if (not active) or isactive:
466 466 encodedtag = encoding.tolocal(tag)
467 467 if ui.quiet:
468 468 ui.write("%s\n" % encodedtag)
469 469 else:
470 470 hn = repo.lookup(node)
471 471 if isactive:
472 472 notice = ''
473 473 elif hn not in repo.branchheads(tag, closed=False):
474 474 if not closed:
475 475 continue
476 476 notice = _(' (closed)')
477 477 else:
478 478 notice = _(' (inactive)')
479 479 rev = str(node).rjust(31 - encoding.colwidth(encodedtag))
480 480 data = encodedtag, rev, hexfunc(hn), notice
481 481 ui.write("%s %s:%s%s\n" % data)
482 482
483 483 def bundle(ui, repo, fname, dest=None, **opts):
484 484 """create a changegroup file
485 485
486 486 Generate a compressed changegroup file collecting changesets not
487 487 known to be in another repository.
488 488
489 489 If no destination repository is specified the destination is
490 490 assumed to have all the nodes specified by one or more --base
491 491 parameters. To create a bundle containing all changesets, use
492 492 -a/--all (or --base null).
493 493
494 494 You can change compression method with the -t/--type option.
495 495 The available compression methods are: none, bzip2, and
496 496 gzip (by default, bundles are compressed using bzip2).
497 497
498 498 The bundle file can then be transferred using conventional means
499 499 and applied to another repository with the unbundle or pull
500 500 command. This is useful when direct push and pull are not
501 501 available or when exporting an entire repository is undesirable.
502 502
503 503 Applying bundles preserves all changeset contents including
504 504 permissions, copy/rename information, and revision history.
505 505 """
506 506 revs = opts.get('rev') or None
507 507 if revs:
508 508 revs = [repo.lookup(rev) for rev in revs]
509 509 if opts.get('all'):
510 510 base = ['null']
511 511 else:
512 512 base = opts.get('base')
513 513 if base:
514 514 if dest:
515 515 raise util.Abort(_("--base is incompatible with specifying "
516 516 "a destination"))
517 517 base = [repo.lookup(rev) for rev in base]
518 518 # create the right base
519 519 # XXX: nodesbetween / changegroup* should be "fixed" instead
520 520 o = []
521 521 has = set((nullid,))
522 522 for n in base:
523 523 has.update(repo.changelog.reachable(n))
524 524 if revs:
525 525 visit = list(revs)
526 526 else:
527 527 visit = repo.changelog.heads()
528 528 seen = {}
529 529 while visit:
530 530 n = visit.pop(0)
531 531 parents = [p for p in repo.changelog.parents(n) if p not in has]
532 532 if len(parents) == 0:
533 533 o.insert(0, n)
534 534 else:
535 535 for p in parents:
536 536 if p not in seen:
537 537 seen[p] = 1
538 538 visit.append(p)
539 539 else:
540 540 dest = ui.expandpath(dest or 'default-push', dest or 'default')
541 541 dest, branches = hg.parseurl(dest)
542 542 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
543 543 revs, checkout = hg.addbranchrevs(repo, other, branches, revs)
544 544 o = repo.findoutgoing(other, force=opts.get('force'))
545 545
546 546 if revs:
547 547 cg = repo.changegroupsubset(o, revs, 'bundle')
548 548 else:
549 549 cg = repo.changegroup(o, 'bundle')
550 550
551 551 bundletype = opts.get('type', 'bzip2').lower()
552 552 btypes = {'none': 'HG10UN', 'bzip2': 'HG10BZ', 'gzip': 'HG10GZ'}
553 553 bundletype = btypes.get(bundletype)
554 554 if bundletype not in changegroup.bundletypes:
555 555 raise util.Abort(_('unknown bundle type specified with --type'))
556 556
557 557 changegroup.writebundle(cg, fname, bundletype)
558 558
559 559 def cat(ui, repo, file1, *pats, **opts):
560 560 """output the current or given revision of files
561 561
562 562 Print the specified files as they were at the given revision. If
563 563 no revision is given, the parent of the working directory is used,
564 564 or tip if no revision is checked out.
565 565
566 566 Output may be to a file, in which case the name of the file is
567 567 given using a format string. The formatting rules are the same as
568 568 for the export command, with the following additions:
569 569
570 570 :``%s``: basename of file being printed
571 571 :``%d``: dirname of file being printed, or '.' if in repository root
572 572 :``%p``: root-relative path name of file being printed
573 573 """
574 574 ctx = repo[opts.get('rev')]
575 575 err = 1
576 576 m = cmdutil.match(repo, (file1,) + pats, opts)
577 577 for abs in ctx.walk(m):
578 578 fp = cmdutil.make_file(repo, opts.get('output'), ctx.node(), pathname=abs)
579 579 data = ctx[abs].data()
580 580 if opts.get('decode'):
581 581 data = repo.wwritedata(abs, data)
582 582 fp.write(data)
583 583 err = 0
584 584 return err
585 585
586 586 def clone(ui, source, dest=None, **opts):
587 587 """make a copy of an existing repository
588 588
589 589 Create a copy of an existing repository in a new directory.
590 590
591 591 If no destination directory name is specified, it defaults to the
592 592 basename of the source.
593 593
594 594 The location of the source is added to the new repository's
595 595 .hg/hgrc file, as the default to be used for future pulls.
596 596
597 597 See 'hg help urls' for valid source format details.
598 598
599 599 It is possible to specify an ``ssh://`` URL as the destination, but no
600 600 .hg/hgrc and working directory will be created on the remote side.
601 601 Please see 'hg help urls' for important details about ``ssh://`` URLs.
602 602
603 603 If the -U/--noupdate option is specified, the new clone will contain
604 604 only a repository (.hg) and no working copy (the working copy parent
605 605 will be the null changeset). Otherwise, clone will initially check
606 606 out (in order of precedence):
607 607
608 608 a) the changeset, tag or branch specified with -u/--updaterev
609 609 b) the changeset, tag or branch given with the first -r/--rev
610 610 c) the branch given with the url#branch source syntax
611 611 d) the head of the default branch
612 612
613 613 Use 'hg clone -u . src dst' to checkout the source repository's
614 614 parent changeset (applicable for local source repositories only).
615 615
616 616 A set of changesets (tags, or branch names) to pull may be specified
617 617 by listing each changeset (tag, or branch name) with -r/--rev.
618 618 If -r/--rev is used, the cloned repository will contain only a subset
619 619 of the changesets of the source repository. Only the set of changesets
620 620 defined by all -r/--rev options (including all their ancestors)
621 621 will be pulled into the destination repository.
622 622 No subsequent changesets (including subsequent tags) will be present
623 623 in the destination.
624 624
625 625 Using -r/--rev (or 'clone src#rev dest') implies --pull, even for
626 626 local source repositories.
627 627
628 628 For efficiency, hardlinks are used for cloning whenever the source
629 629 and destination are on the same filesystem (note this applies only
630 630 to the repository data, not to the checked out files). Some
631 631 filesystems, such as AFS, implement hardlinking incorrectly, but
632 632 do not report errors. In these cases, use the --pull option to
633 633 avoid hardlinking.
634 634
635 635 In some cases, you can clone repositories and checked out files
636 636 using full hardlinks with ::
637 637
638 638 $ cp -al REPO REPOCLONE
639 639
640 640 This is the fastest way to clone, but it is not always safe. The
641 641 operation is not atomic (making sure REPO is not modified during
642 642 the operation is up to you) and you have to make sure your editor
643 643 breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,
644 644 this is not compatible with certain extensions that place their
645 645 metadata under the .hg directory, such as mq.
646 646 """
647 647 if opts.get('noupdate') and opts.get('updaterev'):
648 648 raise util.Abort(_("cannot specify both --noupdate and --updaterev"))
649 649
650 650 hg.clone(cmdutil.remoteui(ui, opts), source, dest,
651 651 pull=opts.get('pull'),
652 652 stream=opts.get('uncompressed'),
653 653 rev=opts.get('rev'),
654 654 update=opts.get('updaterev') or not opts.get('noupdate'))
655 655
656 656 def commit(ui, repo, *pats, **opts):
657 657 """commit the specified files or all outstanding changes
658 658
659 659 Commit changes to the given files into the repository. Unlike a
660 660 centralized RCS, this operation is a local operation. See hg push
661 661 for a way to actively distribute your changes.
662 662
663 663 If a list of files is omitted, all changes reported by "hg status"
664 664 will be committed.
665 665
666 666 If you are committing the result of a merge, do not provide any
667 667 filenames or -I/-X filters.
668 668
669 669 If no commit message is specified, the configured editor is
670 670 started to prompt you for a message.
671 671
672 672 See 'hg help dates' for a list of formats valid for -d/--date.
673 673 """
674 674 extra = {}
675 675 if opts.get('close_branch'):
676 676 extra['close'] = 1
677 677 e = cmdutil.commiteditor
678 678 if opts.get('force_editor'):
679 679 e = cmdutil.commitforceeditor
680 680
681 681 def commitfunc(ui, repo, message, match, opts):
682 682 return repo.commit(message, opts.get('user'), opts.get('date'), match,
683 683 editor=e, extra=extra)
684 684
685 685 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
686 686 if not node:
687 687 ui.status(_("nothing changed\n"))
688 688 return
689 689 cl = repo.changelog
690 690 rev = cl.rev(node)
691 691 parents = cl.parentrevs(rev)
692 692 if rev - 1 in parents:
693 693 # one of the parents was the old tip
694 694 pass
695 695 elif (parents == (nullrev, nullrev) or
696 696 len(cl.heads(cl.node(parents[0]))) > 1 and
697 697 (parents[1] == nullrev or len(cl.heads(cl.node(parents[1]))) > 1)):
698 698 ui.status(_('created new head\n'))
699 699
700 700 if ui.debugflag:
701 701 ui.write(_('committed changeset %d:%s\n') % (rev, hex(node)))
702 702 elif ui.verbose:
703 703 ui.write(_('committed changeset %d:%s\n') % (rev, short(node)))
704 704
705 705 def copy(ui, repo, *pats, **opts):
706 706 """mark files as copied for the next commit
707 707
708 708 Mark dest as having copies of source files. If dest is a
709 709 directory, copies are put in that directory. If dest is a file,
710 710 the source must be a single file.
711 711
712 712 By default, this command copies the contents of files as they
713 713 exist in the working directory. If invoked with -A/--after, the
714 714 operation is recorded, but no copying is performed.
715 715
716 716 This command takes effect with the next commit. To undo a copy
717 717 before that, see hg revert.
718 718 """
719 719 wlock = repo.wlock(False)
720 720 try:
721 721 return cmdutil.copy(ui, repo, pats, opts)
722 722 finally:
723 723 wlock.release()
724 724
725 725 def debugancestor(ui, repo, *args):
726 726 """find the ancestor revision of two revisions in a given index"""
727 727 if len(args) == 3:
728 728 index, rev1, rev2 = args
729 729 r = revlog.revlog(util.opener(os.getcwd(), audit=False), index)
730 730 lookup = r.lookup
731 731 elif len(args) == 2:
732 732 if not repo:
733 733 raise util.Abort(_("There is no Mercurial repository here "
734 734 "(.hg not found)"))
735 735 rev1, rev2 = args
736 736 r = repo.changelog
737 737 lookup = repo.lookup
738 738 else:
739 739 raise util.Abort(_('either two or three arguments required'))
740 740 a = r.ancestor(lookup(rev1), lookup(rev2))
741 741 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
742 742
743 743 def debugcommands(ui, cmd='', *args):
744 744 for cmd, vals in sorted(table.iteritems()):
745 745 cmd = cmd.split('|')[0].strip('^')
746 746 opts = ', '.join([i[1] for i in vals[1]])
747 747 ui.write('%s: %s\n' % (cmd, opts))
748 748
749 749 def debugcomplete(ui, cmd='', **opts):
750 750 """returns the completion list associated with the given command"""
751 751
752 752 if opts.get('options'):
753 753 options = []
754 754 otables = [globalopts]
755 755 if cmd:
756 756 aliases, entry = cmdutil.findcmd(cmd, table, False)
757 757 otables.append(entry[1])
758 758 for t in otables:
759 759 for o in t:
760 760 if o[0]:
761 761 options.append('-%s' % o[0])
762 762 options.append('--%s' % o[1])
763 763 ui.write("%s\n" % "\n".join(options))
764 764 return
765 765
766 766 cmdlist = cmdutil.findpossible(cmd, table)
767 767 if ui.verbose:
768 768 cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
769 769 ui.write("%s\n" % "\n".join(sorted(cmdlist)))
770 770
771 771 def debugfsinfo(ui, path = "."):
772 772 open('.debugfsinfo', 'w').write('')
773 773 ui.write('exec: %s\n' % (util.checkexec(path) and 'yes' or 'no'))
774 774 ui.write('symlink: %s\n' % (util.checklink(path) and 'yes' or 'no'))
775 775 ui.write('case-sensitive: %s\n' % (util.checkcase('.debugfsinfo')
776 776 and 'yes' or 'no'))
777 777 os.unlink('.debugfsinfo')
778 778
779 779 def debugrebuildstate(ui, repo, rev="tip"):
780 780 """rebuild the dirstate as it would look like for the given revision"""
781 781 ctx = repo[rev]
782 782 wlock = repo.wlock()
783 783 try:
784 784 repo.dirstate.rebuild(ctx.node(), ctx.manifest())
785 785 finally:
786 786 wlock.release()
787 787
788 788 def debugcheckstate(ui, repo):
789 789 """validate the correctness of the current dirstate"""
790 790 parent1, parent2 = repo.dirstate.parents()
791 791 m1 = repo[parent1].manifest()
792 792 m2 = repo[parent2].manifest()
793 793 errors = 0
794 794 for f in repo.dirstate:
795 795 state = repo.dirstate[f]
796 796 if state in "nr" and f not in m1:
797 797 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
798 798 errors += 1
799 799 if state in "a" and f in m1:
800 800 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
801 801 errors += 1
802 802 if state in "m" and f not in m1 and f not in m2:
803 803 ui.warn(_("%s in state %s, but not in either manifest\n") %
804 804 (f, state))
805 805 errors += 1
806 806 for f in m1:
807 807 state = repo.dirstate[f]
808 808 if state not in "nrm":
809 809 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
810 810 errors += 1
811 811 if errors:
812 812 error = _(".hg/dirstate inconsistent with current parent's manifest")
813 813 raise util.Abort(error)
814 814
815 815 def showconfig(ui, repo, *values, **opts):
816 816 """show combined config settings from all hgrc files
817 817
818 818 With no arguments, print names and values of all config items.
819 819
820 820 With one argument of the form section.name, print just the value
821 821 of that config item.
822 822
823 823 With multiple arguments, print names and values of all config
824 824 items with matching section names.
825 825
826 826 With --debug, the source (filename and line number) is printed
827 827 for each config item.
828 828 """
829 829
830 830 untrusted = bool(opts.get('untrusted'))
831 831 if values:
832 832 if len([v for v in values if '.' in v]) > 1:
833 833 raise util.Abort(_('only one config item permitted'))
834 834 for section, name, value in ui.walkconfig(untrusted=untrusted):
835 835 sectname = section + '.' + name
836 836 if values:
837 837 for v in values:
838 838 if v == section:
839 839 ui.debug('%s: ' %
840 840 ui.configsource(section, name, untrusted))
841 841 ui.write('%s=%s\n' % (sectname, value))
842 842 elif v == sectname:
843 843 ui.debug('%s: ' %
844 844 ui.configsource(section, name, untrusted))
845 845 ui.write(value, '\n')
846 846 else:
847 847 ui.debug('%s: ' %
848 848 ui.configsource(section, name, untrusted))
849 849 ui.write('%s=%s\n' % (sectname, value))
850 850
851 851 def debugsetparents(ui, repo, rev1, rev2=None):
852 852 """manually set the parents of the current working directory
853 853
854 854 This is useful for writing repository conversion tools, but should
855 855 be used with care.
856 856 """
857 857
858 858 if not rev2:
859 859 rev2 = hex(nullid)
860 860
861 861 wlock = repo.wlock()
862 862 try:
863 863 repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2))
864 864 finally:
865 865 wlock.release()
866 866
867 867 def debugstate(ui, repo, nodates=None):
868 868 """show the contents of the current dirstate"""
869 869 timestr = ""
870 870 showdate = not nodates
871 871 for file_, ent in sorted(repo.dirstate._map.iteritems()):
872 872 if showdate:
873 873 if ent[3] == -1:
874 874 # Pad or slice to locale representation
875 875 locale_len = len(time.strftime("%Y-%m-%d %H:%M:%S ",
876 876 time.localtime(0)))
877 877 timestr = 'unset'
878 878 timestr = (timestr[:locale_len] +
879 879 ' ' * (locale_len - len(timestr)))
880 880 else:
881 881 timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
882 882 time.localtime(ent[3]))
883 883 if ent[1] & 020000:
884 884 mode = 'lnk'
885 885 else:
886 886 mode = '%3o' % (ent[1] & 0777)
887 887 ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
888 888 for f in repo.dirstate.copies():
889 889 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
890 890
891 891 def debugsub(ui, repo, rev=None):
892 892 if rev == '':
893 893 rev = None
894 894 for k, v in sorted(repo[rev].substate.items()):
895 895 ui.write('path %s\n' % k)
896 896 ui.write(' source %s\n' % v[0])
897 897 ui.write(' revision %s\n' % v[1])
898 898
899 899 def debugdata(ui, file_, rev):
900 900 """dump the contents of a data file revision"""
901 901 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_[:-2] + ".i")
902 902 try:
903 903 ui.write(r.revision(r.lookup(rev)))
904 904 except KeyError:
905 905 raise util.Abort(_('invalid revision identifier %s') % rev)
906 906
907 907 def debugdate(ui, date, range=None, **opts):
908 908 """parse and display a date"""
909 909 if opts["extended"]:
910 910 d = util.parsedate(date, util.extendeddateformats)
911 911 else:
912 912 d = util.parsedate(date)
913 913 ui.write("internal: %s %s\n" % d)
914 914 ui.write("standard: %s\n" % util.datestr(d))
915 915 if range:
916 916 m = util.matchdate(range)
917 917 ui.write("match: %s\n" % m(d[0]))
918 918
919 919 def debugindex(ui, file_):
920 920 """dump the contents of an index file"""
921 921 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
922 922 ui.write(" rev offset length base linkrev"
923 923 " nodeid p1 p2\n")
924 924 for i in r:
925 925 node = r.node(i)
926 926 try:
927 927 pp = r.parents(node)
928 928 except:
929 929 pp = [nullid, nullid]
930 930 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
931 931 i, r.start(i), r.length(i), r.base(i), r.linkrev(i),
932 932 short(node), short(pp[0]), short(pp[1])))
933 933
934 934 def debugindexdot(ui, file_):
935 935 """dump an index DAG as a graphviz dot file"""
936 936 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
937 937 ui.write("digraph G {\n")
938 938 for i in r:
939 939 node = r.node(i)
940 940 pp = r.parents(node)
941 941 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
942 942 if pp[1] != nullid:
943 943 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
944 944 ui.write("}\n")
945 945
946 946 def debuginstall(ui):
947 947 '''test Mercurial installation'''
948 948
949 949 def writetemp(contents):
950 950 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
951 951 f = os.fdopen(fd, "wb")
952 952 f.write(contents)
953 953 f.close()
954 954 return name
955 955
956 956 problems = 0
957 957
958 958 # encoding
959 959 ui.status(_("Checking encoding (%s)...\n") % encoding.encoding)
960 960 try:
961 961 encoding.fromlocal("test")
962 962 except util.Abort, inst:
963 963 ui.write(" %s\n" % inst)
964 964 ui.write(_(" (check that your locale is properly set)\n"))
965 965 problems += 1
966 966
967 967 # compiled modules
968 968 ui.status(_("Checking extensions...\n"))
969 969 try:
970 970 import bdiff, mpatch, base85
971 971 except Exception, inst:
972 972 ui.write(" %s\n" % inst)
973 973 ui.write(_(" One or more extensions could not be found"))
974 974 ui.write(_(" (check that you compiled the extensions)\n"))
975 975 problems += 1
976 976
977 977 # templates
978 978 ui.status(_("Checking templates...\n"))
979 979 try:
980 980 import templater
981 981 templater.templater(templater.templatepath("map-cmdline.default"))
982 982 except Exception, inst:
983 983 ui.write(" %s\n" % inst)
984 984 ui.write(_(" (templates seem to have been installed incorrectly)\n"))
985 985 problems += 1
986 986
987 987 # patch
988 988 ui.status(_("Checking patch...\n"))
989 989 patchproblems = 0
990 990 a = "1\n2\n3\n4\n"
991 991 b = "1\n2\n3\ninsert\n4\n"
992 992 fa = writetemp(a)
993 993 d = mdiff.unidiff(a, None, b, None, os.path.basename(fa),
994 994 os.path.basename(fa))
995 995 fd = writetemp(d)
996 996
997 997 files = {}
998 998 try:
999 999 patch.patch(fd, ui, cwd=os.path.dirname(fa), files=files)
1000 1000 except util.Abort, e:
1001 1001 ui.write(_(" patch call failed:\n"))
1002 1002 ui.write(" " + str(e) + "\n")
1003 1003 patchproblems += 1
1004 1004 else:
1005 1005 if list(files) != [os.path.basename(fa)]:
1006 1006 ui.write(_(" unexpected patch output!\n"))
1007 1007 patchproblems += 1
1008 1008 a = open(fa).read()
1009 1009 if a != b:
1010 1010 ui.write(_(" patch test failed!\n"))
1011 1011 patchproblems += 1
1012 1012
1013 1013 if patchproblems:
1014 1014 if ui.config('ui', 'patch'):
1015 1015 ui.write(_(" (Current patch tool may be incompatible with patch,"
1016 1016 " or misconfigured. Please check your .hgrc file)\n"))
1017 1017 else:
1018 1018 ui.write(_(" Internal patcher failure, please report this error"
1019 1019 " to http://mercurial.selenic.com/bts/\n"))
1020 1020 problems += patchproblems
1021 1021
1022 1022 os.unlink(fa)
1023 1023 os.unlink(fd)
1024 1024
1025 1025 # editor
1026 1026 ui.status(_("Checking commit editor...\n"))
1027 1027 editor = ui.geteditor()
1028 1028 cmdpath = util.find_exe(editor) or util.find_exe(editor.split()[0])
1029 1029 if not cmdpath:
1030 1030 if editor == 'vi':
1031 1031 ui.write(_(" No commit editor set and can't find vi in PATH\n"))
1032 1032 ui.write(_(" (specify a commit editor in your .hgrc file)\n"))
1033 1033 else:
1034 1034 ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
1035 1035 ui.write(_(" (specify a commit editor in your .hgrc file)\n"))
1036 1036 problems += 1
1037 1037
1038 1038 # check username
1039 1039 ui.status(_("Checking username...\n"))
1040 1040 try:
1041 1041 user = ui.username()
1042 1042 except util.Abort, e:
1043 1043 ui.write(" %s\n" % e)
1044 1044 ui.write(_(" (specify a username in your .hgrc file)\n"))
1045 1045 problems += 1
1046 1046
1047 1047 if not problems:
1048 1048 ui.status(_("No problems detected\n"))
1049 1049 else:
1050 1050 ui.write(_("%s problems detected,"
1051 1051 " please check your install!\n") % problems)
1052 1052
1053 1053 return problems
1054 1054
1055 1055 def debugrename(ui, repo, file1, *pats, **opts):
1056 1056 """dump rename information"""
1057 1057
1058 1058 ctx = repo[opts.get('rev')]
1059 1059 m = cmdutil.match(repo, (file1,) + pats, opts)
1060 1060 for abs in ctx.walk(m):
1061 1061 fctx = ctx[abs]
1062 1062 o = fctx.filelog().renamed(fctx.filenode())
1063 1063 rel = m.rel(abs)
1064 1064 if o:
1065 1065 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
1066 1066 else:
1067 1067 ui.write(_("%s not renamed\n") % rel)
1068 1068
1069 1069 def debugwalk(ui, repo, *pats, **opts):
1070 1070 """show how files match on given patterns"""
1071 1071 m = cmdutil.match(repo, pats, opts)
1072 1072 items = list(repo.walk(m))
1073 1073 if not items:
1074 1074 return
1075 1075 fmt = 'f %%-%ds %%-%ds %%s' % (
1076 1076 max([len(abs) for abs in items]),
1077 1077 max([len(m.rel(abs)) for abs in items]))
1078 1078 for abs in items:
1079 1079 line = fmt % (abs, m.rel(abs), m.exact(abs) and 'exact' or '')
1080 1080 ui.write("%s\n" % line.rstrip())
1081 1081
1082 1082 def diff(ui, repo, *pats, **opts):
1083 1083 """diff repository (or selected files)
1084 1084
1085 1085 Show differences between revisions for the specified files.
1086 1086
1087 1087 Differences between files are shown using the unified diff format.
1088 1088
1089 1089 NOTE: diff may generate unexpected results for merges, as it will
1090 1090 default to comparing against the working directory's first parent
1091 1091 changeset if no revisions are specified.
1092 1092
1093 1093 When two revision arguments are given, then changes are shown
1094 1094 between those revisions. If only one revision is specified then
1095 1095 that revision is compared to the working directory, and, when no
1096 1096 revisions are specified, the working directory files are compared
1097 1097 to its parent.
1098 1098
1099 1099 Without the -a/--text option, diff will avoid generating diffs of
1100 1100 files it detects as binary. With -a, diff will generate a diff
1101 1101 anyway, probably with undesirable results.
1102 1102
1103 1103 Use the -g/--git option to generate diffs in the git extended diff
1104 1104 format. For more information, read 'hg help diffs'.
1105 1105 """
1106 1106
1107 1107 revs = opts.get('rev')
1108 1108 change = opts.get('change')
1109 1109 stat = opts.get('stat')
1110 1110 reverse = opts.get('reverse')
1111 1111
1112 1112 if revs and change:
1113 1113 msg = _('cannot specify --rev and --change at the same time')
1114 1114 raise util.Abort(msg)
1115 1115 elif change:
1116 1116 node2 = repo.lookup(change)
1117 1117 node1 = repo[node2].parents()[0].node()
1118 1118 else:
1119 1119 node1, node2 = cmdutil.revpair(repo, revs)
1120 1120
1121 1121 if reverse:
1122 1122 node1, node2 = node2, node1
1123 1123
1124 1124 if stat:
1125 1125 opts['unified'] = '0'
1126 1126 diffopts = patch.diffopts(ui, opts)
1127 1127
1128 1128 m = cmdutil.match(repo, pats, opts)
1129 1129 it = patch.diff(repo, node1, node2, match=m, opts=diffopts)
1130 1130 if stat:
1131 1131 width = ui.interactive() and util.termwidth() or 80
1132 1132 ui.write(patch.diffstat(util.iterlines(it), width=width,
1133 1133 git=diffopts.git))
1134 1134 else:
1135 1135 for chunk in it:
1136 1136 ui.write(chunk)
1137 1137
1138 1138 def export(ui, repo, *changesets, **opts):
1139 1139 """dump the header and diffs for one or more changesets
1140 1140
1141 1141 Print the changeset header and diffs for one or more revisions.
1142 1142
1143 1143 The information shown in the changeset header is: author, date,
1144 1144 branch name (if non-default), changeset hash, parent(s) and commit
1145 1145 comment.
1146 1146
1147 1147 NOTE: export may generate unexpected diff output for merge
1148 1148 changesets, as it will compare the merge changeset against its
1149 1149 first parent only.
1150 1150
1151 1151 Output may be to a file, in which case the name of the file is
1152 1152 given using a format string. The formatting rules are as follows:
1153 1153
1154 1154 :``%%``: literal "%" character
1155 1155 :``%H``: changeset hash (40 bytes of hexadecimal)
1156 1156 :``%N``: number of patches being generated
1157 1157 :``%R``: changeset revision number
1158 1158 :``%b``: basename of the exporting repository
1159 1159 :``%h``: short-form changeset hash (12 bytes of hexadecimal)
1160 1160 :``%n``: zero-padded sequence number, starting at 1
1161 1161 :``%r``: zero-padded changeset revision number
1162 1162
1163 1163 Without the -a/--text option, export will avoid generating diffs
1164 1164 of files it detects as binary. With -a, export will generate a
1165 1165 diff anyway, probably with undesirable results.
1166 1166
1167 1167 Use the -g/--git option to generate diffs in the git extended diff
1168 1168 format. See 'hg help diffs' for more information.
1169 1169
1170 1170 With the --switch-parent option, the diff will be against the
1171 1171 second parent. It can be useful to review a merge.
1172 1172 """
1173 1173 changesets += tuple(opts.get('rev', []))
1174 1174 if not changesets:
1175 1175 raise util.Abort(_("export requires at least one changeset"))
1176 1176 revs = cmdutil.revrange(repo, changesets)
1177 1177 if len(revs) > 1:
1178 1178 ui.note(_('exporting patches:\n'))
1179 1179 else:
1180 1180 ui.note(_('exporting patch:\n'))
1181 1181 patch.export(repo, revs, template=opts.get('output'),
1182 1182 switch_parent=opts.get('switch_parent'),
1183 1183 opts=patch.diffopts(ui, opts))
1184 1184
1185 1185 def forget(ui, repo, *pats, **opts):
1186 1186 """forget the specified files on the next commit
1187 1187
1188 1188 Mark the specified files so they will no longer be tracked
1189 1189 after the next commit.
1190 1190
1191 1191 This only removes files from the current branch, not from the
1192 1192 entire project history, and it does not delete them from the
1193 1193 working directory.
1194 1194
1195 1195 To undo a forget before the next commit, see hg add.
1196 1196 """
1197 1197
1198 1198 if not pats:
1199 1199 raise util.Abort(_('no files specified'))
1200 1200
1201 1201 m = cmdutil.match(repo, pats, opts)
1202 1202 s = repo.status(match=m, clean=True)
1203 1203 forget = sorted(s[0] + s[1] + s[3] + s[6])
1204 1204
1205 1205 for f in m.files():
1206 1206 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
1207 1207 ui.warn(_('not removing %s: file is already untracked\n')
1208 1208 % m.rel(f))
1209 1209
1210 1210 for f in forget:
1211 1211 if ui.verbose or not m.exact(f):
1212 1212 ui.status(_('removing %s\n') % m.rel(f))
1213 1213
1214 1214 repo.remove(forget, unlink=False)
1215 1215
1216 1216 def grep(ui, repo, pattern, *pats, **opts):
1217 1217 """search for a pattern in specified files and revisions
1218 1218
1219 1219 Search revisions of files for a regular expression.
1220 1220
1221 1221 This command behaves differently than Unix grep. It only accepts
1222 1222 Python/Perl regexps. It searches repository history, not the
1223 1223 working directory. It always prints the revision number in which a
1224 1224 match appears.
1225 1225
1226 1226 By default, grep only prints output for the first revision of a
1227 1227 file in which it finds a match. To get it to print every revision
1228 1228 that contains a change in match status ("-" for a match that
1229 1229 becomes a non-match, or "+" for a non-match that becomes a match),
1230 1230 use the --all flag.
1231 1231 """
1232 1232 reflags = 0
1233 1233 if opts.get('ignore_case'):
1234 1234 reflags |= re.I
1235 1235 try:
1236 1236 regexp = re.compile(pattern, reflags)
1237 1237 except Exception, inst:
1238 1238 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
1239 1239 return None
1240 1240 sep, eol = ':', '\n'
1241 1241 if opts.get('print0'):
1242 1242 sep = eol = '\0'
1243 1243
1244 1244 getfile = util.lrucachefunc(repo.file)
1245 1245
1246 1246 def matchlines(body):
1247 1247 begin = 0
1248 1248 linenum = 0
1249 1249 while True:
1250 1250 match = regexp.search(body, begin)
1251 1251 if not match:
1252 1252 break
1253 1253 mstart, mend = match.span()
1254 1254 linenum += body.count('\n', begin, mstart) + 1
1255 1255 lstart = body.rfind('\n', begin, mstart) + 1 or begin
1256 1256 begin = body.find('\n', mend) + 1 or len(body)
1257 1257 lend = begin - 1
1258 1258 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
1259 1259
1260 1260 class linestate(object):
1261 1261 def __init__(self, line, linenum, colstart, colend):
1262 1262 self.line = line
1263 1263 self.linenum = linenum
1264 1264 self.colstart = colstart
1265 1265 self.colend = colend
1266 1266
1267 1267 def __hash__(self):
1268 1268 return hash((self.linenum, self.line))
1269 1269
1270 1270 def __eq__(self, other):
1271 1271 return self.line == other.line
1272 1272
1273 1273 matches = {}
1274 1274 copies = {}
1275 1275 def grepbody(fn, rev, body):
1276 1276 matches[rev].setdefault(fn, [])
1277 1277 m = matches[rev][fn]
1278 1278 for lnum, cstart, cend, line in matchlines(body):
1279 1279 s = linestate(line, lnum, cstart, cend)
1280 1280 m.append(s)
1281 1281
1282 1282 def difflinestates(a, b):
1283 1283 sm = difflib.SequenceMatcher(None, a, b)
1284 1284 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
1285 1285 if tag == 'insert':
1286 1286 for i in xrange(blo, bhi):
1287 1287 yield ('+', b[i])
1288 1288 elif tag == 'delete':
1289 1289 for i in xrange(alo, ahi):
1290 1290 yield ('-', a[i])
1291 1291 elif tag == 'replace':
1292 1292 for i in xrange(alo, ahi):
1293 1293 yield ('-', a[i])
1294 1294 for i in xrange(blo, bhi):
1295 1295 yield ('+', b[i])
1296 1296
1297 1297 def display(fn, ctx, pstates, states):
1298 1298 rev = ctx.rev()
1299 1299 datefunc = ui.quiet and util.shortdate or util.datestr
1300 1300 found = False
1301 1301 filerevmatches = {}
1302 1302 if opts.get('all'):
1303 1303 iter = difflinestates(pstates, states)
1304 1304 else:
1305 1305 iter = [('', l) for l in states]
1306 1306 for change, l in iter:
1307 1307 cols = [fn, str(rev)]
1308 1308 if opts.get('line_number'):
1309 1309 cols.append(str(l.linenum))
1310 1310 if opts.get('all'):
1311 1311 cols.append(change)
1312 1312 if opts.get('user'):
1313 1313 cols.append(ui.shortuser(ctx.user()))
1314 1314 if opts.get('date'):
1315 1315 cols.append(datefunc(ctx.date()))
1316 1316 if opts.get('files_with_matches'):
1317 1317 c = (fn, rev)
1318 1318 if c in filerevmatches:
1319 1319 continue
1320 1320 filerevmatches[c] = 1
1321 1321 else:
1322 1322 cols.append(l.line)
1323 1323 ui.write(sep.join(cols), eol)
1324 1324 found = True
1325 1325 return found
1326 1326
1327 1327 skip = {}
1328 1328 revfiles = {}
1329 1329 matchfn = cmdutil.match(repo, pats, opts)
1330 1330 found = False
1331 1331 follow = opts.get('follow')
1332 1332
1333 1333 def prep(ctx, fns):
1334 1334 rev = ctx.rev()
1335 1335 pctx = ctx.parents()[0]
1336 1336 parent = pctx.rev()
1337 1337 matches.setdefault(rev, {})
1338 1338 matches.setdefault(parent, {})
1339 1339 files = revfiles.setdefault(rev, [])
1340 1340 for fn in fns:
1341 1341 flog = getfile(fn)
1342 1342 try:
1343 1343 fnode = ctx.filenode(fn)
1344 1344 except error.LookupError:
1345 1345 continue
1346 1346
1347 1347 copied = flog.renamed(fnode)
1348 1348 copy = follow and copied and copied[0]
1349 1349 if copy:
1350 1350 copies.setdefault(rev, {})[fn] = copy
1351 1351 if fn in skip:
1352 1352 if copy:
1353 1353 skip[copy] = True
1354 1354 continue
1355 1355 files.append(fn)
1356 1356
1357 1357 if fn not in matches[rev]:
1358 1358 grepbody(fn, rev, flog.read(fnode))
1359 1359
1360 1360 pfn = copy or fn
1361 1361 if pfn not in matches[parent]:
1362 1362 try:
1363 1363 fnode = pctx.filenode(pfn)
1364 1364 grepbody(pfn, parent, flog.read(fnode))
1365 1365 except error.LookupError:
1366 1366 pass
1367 1367
1368 1368 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
1369 1369 rev = ctx.rev()
1370 1370 parent = ctx.parents()[0].rev()
1371 1371 for fn in sorted(revfiles.get(rev, [])):
1372 1372 states = matches[rev][fn]
1373 1373 copy = copies.get(rev, {}).get(fn)
1374 1374 if fn in skip:
1375 1375 if copy:
1376 1376 skip[copy] = True
1377 1377 continue
1378 1378 pstates = matches.get(parent, {}).get(copy or fn, [])
1379 1379 if pstates or states:
1380 1380 r = display(fn, ctx, pstates, states)
1381 1381 found = found or r
1382 1382 if r and not opts.get('all'):
1383 1383 skip[fn] = True
1384 1384 if copy:
1385 1385 skip[copy] = True
1386 1386 del matches[rev]
1387 1387 del revfiles[rev]
1388 1388
1389 1389 def heads(ui, repo, *branchrevs, **opts):
1390 1390 """show current repository heads or show branch heads
1391 1391
1392 1392 With no arguments, show all repository branch heads.
1393 1393
1394 1394 Repository "heads" are changesets with no child changesets. They are
1395 1395 where development generally takes place and are the usual targets
1396 1396 for update and merge operations. Branch heads are changesets that have
1397 1397 no child changeset on the same branch.
1398 1398
1399 1399 If one or more REVs are given, only branch heads on the branches
1400 1400 associated with the specified changesets are shown.
1401 1401
1402 1402 If -c/--closed is specified, also show branch heads marked closed
1403 1403 (see hg commit --close-branch).
1404 1404
1405 1405 If STARTREV is specified, only those heads that are descendants of
1406 1406 STARTREV will be displayed.
1407 1407
1408 1408 If -t/--topo is specified, named branch mechanics will be ignored and only
1409 1409 changesets without children will be shown.
1410 1410 """
1411 1411
1412 1412 if opts.get('rev'):
1413 1413 start = repo.lookup(opts['rev'])
1414 1414 else:
1415 1415 start = None
1416 1416
1417 1417 if opts.get('topo'):
1418 1418 heads = [repo[h] for h in repo.heads(start)]
1419 1419 else:
1420 1420 heads = []
1421 1421 for b, ls in repo.branchmap().iteritems():
1422 1422 if start is None:
1423 1423 heads += [repo[h] for h in ls]
1424 1424 continue
1425 1425 startrev = repo.changelog.rev(start)
1426 1426 descendants = set(repo.changelog.descendants(startrev))
1427 1427 descendants.add(startrev)
1428 1428 rev = repo.changelog.rev
1429 1429 heads += [repo[h] for h in ls if rev(h) in descendants]
1430 1430
1431 1431 if branchrevs:
1432 1432 decode, encode = encoding.fromlocal, encoding.tolocal
1433 1433 branches = set(repo[decode(br)].branch() for br in branchrevs)
1434 1434 heads = [h for h in heads if h.branch() in branches]
1435 1435
1436 1436 if not opts.get('closed'):
1437 1437 heads = [h for h in heads if not h.extra().get('close')]
1438 1438
1439 1439 if opts.get('active') and branchrevs:
1440 1440 dagheads = repo.heads(start)
1441 1441 heads = [h for h in heads if h.node() in dagheads]
1442 1442
1443 1443 if branchrevs:
1444 1444 haveheads = set(h.branch() for h in heads)
1445 1445 if branches - haveheads:
1446 1446 headless = ', '.join(encode(b) for b in branches - haveheads)
1447 1447 msg = _('no open branch heads found on branches %s')
1448 1448 if opts.get('rev'):
1449 1449 msg += _(' (started at %s)' % opts['rev'])
1450 1450 ui.warn((msg + '\n') % headless)
1451 1451
1452 1452 if not heads:
1453 1453 return 1
1454 1454
1455 1455 heads = sorted(heads, key=lambda x: -x.rev())
1456 1456 displayer = cmdutil.show_changeset(ui, repo, opts)
1457 1457 for ctx in heads:
1458 1458 displayer.show(ctx)
1459 1459 displayer.close()
1460 1460
1461 1461 def help_(ui, name=None, with_version=False, unknowncmd=False):
1462 1462 """show help for a given topic or a help overview
1463 1463
1464 1464 With no arguments, print a list of commands with short help messages.
1465 1465
1466 1466 Given a topic, extension, or command name, print help for that
1467 1467 topic."""
1468 1468 option_lists = []
1469 1469 textwidth = util.termwidth() - 2
1470 1470
1471 1471 def addglobalopts(aliases):
1472 1472 if ui.verbose:
1473 1473 option_lists.append((_("global options:"), globalopts))
1474 1474 if name == 'shortlist':
1475 1475 option_lists.append((_('use "hg help" for the full list '
1476 1476 'of commands'), ()))
1477 1477 else:
1478 1478 if name == 'shortlist':
1479 1479 msg = _('use "hg help" for the full list of commands '
1480 1480 'or "hg -v" for details')
1481 1481 elif aliases:
1482 1482 msg = _('use "hg -v help%s" to show aliases and '
1483 1483 'global options') % (name and " " + name or "")
1484 1484 else:
1485 1485 msg = _('use "hg -v help %s" to show global options') % name
1486 1486 option_lists.append((msg, ()))
1487 1487
1488 1488 def helpcmd(name):
1489 1489 if with_version:
1490 1490 version_(ui)
1491 1491 ui.write('\n')
1492 1492
1493 1493 try:
1494 1494 aliases, entry = cmdutil.findcmd(name, table, strict=unknowncmd)
1495 1495 except error.AmbiguousCommand, inst:
1496 1496 # py3k fix: except vars can't be used outside the scope of the
1497 1497 # except block, nor can be used inside a lambda. python issue4617
1498 1498 prefix = inst.args[0]
1499 1499 select = lambda c: c.lstrip('^').startswith(prefix)
1500 1500 helplist(_('list of commands:\n\n'), select)
1501 1501 return
1502 1502
1503 1503 # check if it's an invalid alias and display its error if it is
1504 1504 if getattr(entry[0], 'badalias', False):
1505 1505 if not unknowncmd:
1506 1506 entry[0](ui)
1507 1507 return
1508 1508
1509 1509 # synopsis
1510 1510 if len(entry) > 2:
1511 1511 if entry[2].startswith('hg'):
1512 1512 ui.write("%s\n" % entry[2])
1513 1513 else:
1514 1514 ui.write('hg %s %s\n' % (aliases[0], entry[2]))
1515 1515 else:
1516 1516 ui.write('hg %s\n' % aliases[0])
1517 1517
1518 1518 # aliases
1519 1519 if not ui.quiet and len(aliases) > 1:
1520 1520 ui.write(_("\naliases: %s\n") % ', '.join(aliases[1:]))
1521 1521
1522 1522 # description
1523 1523 doc = gettext(entry[0].__doc__)
1524 1524 if not doc:
1525 1525 doc = _("(no help text available)")
1526 1526 if ui.quiet:
1527 1527 doc = doc.splitlines()[0]
1528 1528 ui.write("\n%s\n" % minirst.format(doc, textwidth))
1529 1529
1530 1530 if not ui.quiet:
1531 1531 # options
1532 1532 if entry[1]:
1533 1533 option_lists.append((_("options:\n"), entry[1]))
1534 1534
1535 1535 addglobalopts(False)
1536 1536
1537 1537 def helplist(header, select=None):
1538 1538 h = {}
1539 1539 cmds = {}
1540 1540 for c, e in table.iteritems():
1541 1541 f = c.split("|", 1)[0]
1542 1542 if select and not select(f):
1543 1543 continue
1544 1544 if (not select and name != 'shortlist' and
1545 1545 e[0].__module__ != __name__):
1546 1546 continue
1547 1547 if name == "shortlist" and not f.startswith("^"):
1548 1548 continue
1549 1549 f = f.lstrip("^")
1550 1550 if not ui.debugflag and f.startswith("debug"):
1551 1551 continue
1552 1552 doc = e[0].__doc__
1553 1553 if doc and 'DEPRECATED' in doc and not ui.verbose:
1554 1554 continue
1555 1555 doc = gettext(doc)
1556 1556 if not doc:
1557 1557 doc = _("(no help text available)")
1558 1558 h[f] = doc.splitlines()[0].rstrip()
1559 1559 cmds[f] = c.lstrip("^")
1560 1560
1561 1561 if not h:
1562 1562 ui.status(_('no commands defined\n'))
1563 1563 return
1564 1564
1565 1565 ui.status(header)
1566 1566 fns = sorted(h)
1567 1567 m = max(map(len, fns))
1568 1568 for f in fns:
1569 1569 if ui.verbose:
1570 1570 commands = cmds[f].replace("|",", ")
1571 1571 ui.write(" %s:\n %s\n"%(commands, h[f]))
1572 1572 else:
1573 1573 ui.write(' %-*s %s\n' % (m, f, util.wrap(h[f], m + 4)))
1574 1574
1575 1575 if not ui.quiet:
1576 1576 addglobalopts(True)
1577 1577
1578 1578 def helptopic(name):
1579 1579 for names, header, doc in help.helptable:
1580 1580 if name in names:
1581 1581 break
1582 1582 else:
1583 1583 raise error.UnknownCommand(name)
1584 1584
1585 1585 # description
1586 1586 if not doc:
1587 1587 doc = _("(no help text available)")
1588 1588 if hasattr(doc, '__call__'):
1589 1589 doc = doc()
1590 1590
1591 1591 ui.write("%s\n\n" % header)
1592 1592 ui.write("%s\n" % minirst.format(doc, textwidth, indent=4))
1593 1593
1594 1594 def helpext(name):
1595 1595 try:
1596 1596 mod = extensions.find(name)
1597 1597 doc = gettext(mod.__doc__) or _('no help text available')
1598 1598 except KeyError:
1599 1599 mod = None
1600 1600 doc = extensions.disabledext(name)
1601 1601 if not doc:
1602 1602 raise error.UnknownCommand(name)
1603 1603
1604 1604 if '\n' not in doc:
1605 1605 head, tail = doc, ""
1606 1606 else:
1607 1607 head, tail = doc.split('\n', 1)
1608 1608 ui.write(_('%s extension - %s\n\n') % (name.split('.')[-1], head))
1609 1609 if tail:
1610 1610 ui.write(minirst.format(tail, textwidth))
1611 1611 ui.status('\n\n')
1612 1612
1613 1613 if mod:
1614 1614 try:
1615 1615 ct = mod.cmdtable
1616 1616 except AttributeError:
1617 1617 ct = {}
1618 1618 modcmds = set([c.split('|', 1)[0] for c in ct])
1619 1619 helplist(_('list of commands:\n\n'), modcmds.__contains__)
1620 1620 else:
1621 1621 ui.write(_('use "hg help extensions" for information on enabling '
1622 1622 'extensions\n'))
1623 1623
1624 1624 def helpextcmd(name):
1625 1625 cmd, ext, mod = extensions.disabledcmd(name, ui.config('ui', 'strict'))
1626 1626 doc = gettext(mod.__doc__).splitlines()[0]
1627 1627
1628 1628 msg = help.listexts(_("'%s' is provided by the following "
1629 1629 "extension:") % cmd, {ext: doc}, len(ext),
1630 1630 indent=4)
1631 1631 ui.write(minirst.format(msg, textwidth))
1632 1632 ui.write('\n\n')
1633 1633 ui.write(_('use "hg help extensions" for information on enabling '
1634 1634 'extensions\n'))
1635 1635
1636 1636 if name and name != 'shortlist':
1637 1637 i = None
1638 1638 if unknowncmd:
1639 1639 queries = (helpextcmd,)
1640 1640 else:
1641 1641 queries = (helptopic, helpcmd, helpext, helpextcmd)
1642 1642 for f in queries:
1643 1643 try:
1644 1644 f(name)
1645 1645 i = None
1646 1646 break
1647 1647 except error.UnknownCommand, inst:
1648 1648 i = inst
1649 1649 if i:
1650 1650 raise i
1651 1651
1652 1652 else:
1653 1653 # program name
1654 1654 if ui.verbose or with_version:
1655 1655 version_(ui)
1656 1656 else:
1657 1657 ui.status(_("Mercurial Distributed SCM\n"))
1658 1658 ui.status('\n')
1659 1659
1660 1660 # list of commands
1661 1661 if name == "shortlist":
1662 1662 header = _('basic commands:\n\n')
1663 1663 else:
1664 1664 header = _('list of commands:\n\n')
1665 1665
1666 1666 helplist(header)
1667 1667 if name != 'shortlist':
1668 1668 exts, maxlength = extensions.enabled()
1669 1669 text = help.listexts(_('enabled extensions:'), exts, maxlength)
1670 1670 if text:
1671 1671 ui.write("\n%s\n" % minirst.format(text, textwidth))
1672 1672
1673 1673 # list all option lists
1674 1674 opt_output = []
1675 1675 for title, options in option_lists:
1676 1676 opt_output.append(("\n%s" % title, None))
1677 1677 for shortopt, longopt, default, desc in options:
1678 1678 if _("DEPRECATED") in desc and not ui.verbose:
1679 1679 continue
1680 1680 opt_output.append(("%2s%s" % (shortopt and "-%s" % shortopt,
1681 1681 longopt and " --%s" % longopt),
1682 1682 "%s%s" % (desc,
1683 1683 default
1684 1684 and _(" (default: %s)") % default
1685 1685 or "")))
1686 1686
1687 1687 if not name:
1688 1688 ui.write(_("\nadditional help topics:\n\n"))
1689 1689 topics = []
1690 1690 for names, header, doc in help.helptable:
1691 1691 topics.append((sorted(names, key=len, reverse=True)[0], header))
1692 1692 topics_len = max([len(s[0]) for s in topics])
1693 1693 for t, desc in topics:
1694 1694 ui.write(" %-*s %s\n" % (topics_len, t, desc))
1695 1695
1696 1696 if opt_output:
1697 1697 opts_len = max([len(line[0]) for line in opt_output if line[1]] or [0])
1698 1698 for first, second in opt_output:
1699 1699 if second:
1700 1700 second = util.wrap(second, opts_len + 3)
1701 1701 ui.write(" %-*s %s\n" % (opts_len, first, second))
1702 1702 else:
1703 1703 ui.write("%s\n" % first)
1704 1704
1705 1705 def identify(ui, repo, source=None,
1706 1706 rev=None, num=None, id=None, branch=None, tags=None):
1707 1707 """identify the working copy or specified revision
1708 1708
1709 1709 With no revision, print a summary of the current state of the
1710 1710 repository.
1711 1711
1712 1712 Specifying a path to a repository root or Mercurial bundle will
1713 1713 cause lookup to operate on that repository/bundle.
1714 1714
1715 1715 This summary identifies the repository state using one or two
1716 1716 parent hash identifiers, followed by a "+" if there are
1717 1717 uncommitted changes in the working directory, a list of tags for
1718 1718 this revision and a branch name for non-default branches.
1719 1719 """
1720 1720
1721 1721 if not repo and not source:
1722 1722 raise util.Abort(_("There is no Mercurial repository here "
1723 1723 "(.hg not found)"))
1724 1724
1725 1725 hexfunc = ui.debugflag and hex or short
1726 1726 default = not (num or id or branch or tags)
1727 1727 output = []
1728 1728
1729 1729 revs = []
1730 1730 if source:
1731 1731 source, branches = hg.parseurl(ui.expandpath(source))
1732 1732 repo = hg.repository(ui, source)
1733 1733 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
1734 1734
1735 1735 if not repo.local():
1736 1736 if not rev and revs:
1737 1737 rev = revs[0]
1738 1738 if not rev:
1739 1739 rev = "tip"
1740 1740 if num or branch or tags:
1741 1741 raise util.Abort(
1742 1742 "can't query remote revision number, branch, or tags")
1743 1743 output = [hexfunc(repo.lookup(rev))]
1744 1744 elif not rev:
1745 1745 ctx = repo[None]
1746 1746 parents = ctx.parents()
1747 1747 changed = False
1748 1748 if default or id or num:
1749 1749 changed = ctx.files() + ctx.deleted()
1750 1750 if default or id:
1751 1751 output = ["%s%s" % ('+'.join([hexfunc(p.node()) for p in parents]),
1752 1752 (changed) and "+" or "")]
1753 1753 if num:
1754 1754 output.append("%s%s" % ('+'.join([str(p.rev()) for p in parents]),
1755 1755 (changed) and "+" or ""))
1756 1756 else:
1757 1757 ctx = repo[rev]
1758 1758 if default or id:
1759 1759 output = [hexfunc(ctx.node())]
1760 1760 if num:
1761 1761 output.append(str(ctx.rev()))
1762 1762
1763 1763 if repo.local() and default and not ui.quiet:
1764 1764 b = encoding.tolocal(ctx.branch())
1765 1765 if b != 'default':
1766 1766 output.append("(%s)" % b)
1767 1767
1768 1768 # multiple tags for a single parent separated by '/'
1769 1769 t = "/".join(ctx.tags())
1770 1770 if t:
1771 1771 output.append(t)
1772 1772
1773 1773 if branch:
1774 1774 output.append(encoding.tolocal(ctx.branch()))
1775 1775
1776 1776 if tags:
1777 1777 output.extend(ctx.tags())
1778 1778
1779 1779 ui.write("%s\n" % ' '.join(output))
1780 1780
1781 1781 def import_(ui, repo, patch1, *patches, **opts):
1782 1782 """import an ordered set of patches
1783 1783
1784 1784 Import a list of patches and commit them individually (unless
1785 1785 --no-commit is specified).
1786 1786
1787 1787 If there are outstanding changes in the working directory, import
1788 1788 will abort unless given the -f/--force flag.
1789 1789
1790 1790 You can import a patch straight from a mail message. Even patches
1791 1791 as attachments work (to use the body part, it must have type
1792 1792 text/plain or text/x-patch). From and Subject headers of email
1793 1793 message are used as default committer and commit message. All
1794 1794 text/plain body parts before first diff are added to commit
1795 1795 message.
1796 1796
1797 1797 If the imported patch was generated by hg export, user and
1798 1798 description from patch override values from message headers and
1799 1799 body. Values given on command line with -m/--message and -u/--user
1800 1800 override these.
1801 1801
1802 1802 If --exact is specified, import will set the working directory to
1803 1803 the parent of each patch before applying it, and will abort if the
1804 1804 resulting changeset has a different ID than the one recorded in
1805 1805 the patch. This may happen due to character set problems or other
1806 1806 deficiencies in the text patch format.
1807 1807
1808 1808 With -s/--similarity, hg will attempt to discover renames and
1809 1809 copies in the patch in the same way as 'addremove'.
1810 1810
1811 1811 To read a patch from standard input, use "-" as the patch name. If
1812 1812 a URL is specified, the patch will be downloaded from it.
1813 1813 See 'hg help dates' for a list of formats valid for -d/--date.
1814 1814 """
1815 1815 patches = (patch1,) + patches
1816 1816
1817 1817 date = opts.get('date')
1818 1818 if date:
1819 1819 opts['date'] = util.parsedate(date)
1820 1820
1821 1821 try:
1822 1822 sim = float(opts.get('similarity') or 0)
1823 1823 except ValueError:
1824 1824 raise util.Abort(_('similarity must be a number'))
1825 1825 if sim < 0 or sim > 100:
1826 1826 raise util.Abort(_('similarity must be between 0 and 100'))
1827 1827
1828 1828 if opts.get('exact') or not opts.get('force'):
1829 1829 cmdutil.bail_if_changed(repo)
1830 1830
1831 1831 d = opts["base"]
1832 1832 strip = opts["strip"]
1833 1833 wlock = lock = None
1834 1834 try:
1835 1835 wlock = repo.wlock()
1836 1836 lock = repo.lock()
1837 1837 for p in patches:
1838 1838 pf = os.path.join(d, p)
1839 1839
1840 1840 if pf == '-':
1841 1841 ui.status(_("applying patch from stdin\n"))
1842 1842 pf = sys.stdin
1843 1843 else:
1844 1844 ui.status(_("applying %s\n") % p)
1845 1845 pf = url.open(ui, pf)
1846 1846 data = patch.extract(ui, pf)
1847 1847 tmpname, message, user, date, branch, nodeid, p1, p2 = data
1848 1848
1849 1849 if tmpname is None:
1850 1850 raise util.Abort(_('no diffs found'))
1851 1851
1852 1852 try:
1853 1853 cmdline_message = cmdutil.logmessage(opts)
1854 1854 if cmdline_message:
1855 1855 # pickup the cmdline msg
1856 1856 message = cmdline_message
1857 1857 elif message:
1858 1858 # pickup the patch msg
1859 1859 message = message.strip()
1860 1860 else:
1861 1861 # launch the editor
1862 1862 message = None
1863 1863 ui.debug('message:\n%s\n' % message)
1864 1864
1865 1865 wp = repo.parents()
1866 1866 if opts.get('exact'):
1867 1867 if not nodeid or not p1:
1868 1868 raise util.Abort(_('not a Mercurial patch'))
1869 1869 p1 = repo.lookup(p1)
1870 1870 p2 = repo.lookup(p2 or hex(nullid))
1871 1871
1872 1872 if p1 != wp[0].node():
1873 1873 hg.clean(repo, p1)
1874 1874 repo.dirstate.setparents(p1, p2)
1875 1875 elif p2:
1876 1876 try:
1877 1877 p1 = repo.lookup(p1)
1878 1878 p2 = repo.lookup(p2)
1879 1879 if p1 == wp[0].node():
1880 1880 repo.dirstate.setparents(p1, p2)
1881 1881 except error.RepoError:
1882 1882 pass
1883 1883 if opts.get('exact') or opts.get('import_branch'):
1884 1884 repo.dirstate.setbranch(branch or 'default')
1885 1885
1886 1886 files = {}
1887 1887 try:
1888 1888 patch.patch(tmpname, ui, strip=strip, cwd=repo.root,
1889 1889 files=files, eolmode=None)
1890 1890 finally:
1891 1891 files = patch.updatedir(ui, repo, files,
1892 1892 similarity=sim / 100.0)
1893 1893 if not opts.get('no_commit'):
1894 1894 m = cmdutil.matchfiles(repo, files or [])
1895 1895 n = repo.commit(message, opts.get('user') or user,
1896 1896 opts.get('date') or date, match=m,
1897 1897 editor=cmdutil.commiteditor)
1898 1898 if opts.get('exact'):
1899 1899 if hex(n) != nodeid:
1900 1900 repo.rollback()
1901 1901 raise util.Abort(_('patch is damaged'
1902 1902 ' or loses information'))
1903 1903 # Force a dirstate write so that the next transaction
1904 1904 # backups an up-do-date file.
1905 1905 repo.dirstate.write()
1906 1906 finally:
1907 1907 os.unlink(tmpname)
1908 1908 finally:
1909 1909 release(lock, wlock)
1910 1910
1911 1911 def incoming(ui, repo, source="default", **opts):
1912 1912 """show new changesets found in source
1913 1913
1914 1914 Show new changesets found in the specified path/URL or the default
1915 1915 pull location. These are the changesets that would have been pulled
1916 1916 if a pull at the time you issued this command.
1917 1917
1918 1918 For remote repository, using --bundle avoids downloading the
1919 1919 changesets twice if the incoming is followed by a pull.
1920 1920
1921 1921 See pull for valid source format details.
1922 1922 """
1923 1923 limit = cmdutil.loglimit(opts)
1924 1924 source, branches = hg.parseurl(ui.expandpath(source))
1925 1925 other = hg.repository(cmdutil.remoteui(repo, opts), source)
1926 1926 ui.status(_('comparing with %s\n') % url.hidepassword(source))
1927 1927 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
1928 1928 if revs:
1929 1929 revs = [other.lookup(rev) for rev in revs]
1930 1930 common, incoming, rheads = repo.findcommonincoming(other, heads=revs,
1931 1931 force=opts["force"])
1932 1932 if not incoming:
1933 1933 try:
1934 1934 os.unlink(opts["bundle"])
1935 1935 except:
1936 1936 pass
1937 1937 ui.status(_("no changes found\n"))
1938 1938 return 1
1939 1939
1940 1940 cleanup = None
1941 1941 try:
1942 1942 fname = opts["bundle"]
1943 1943 if fname or not other.local():
1944 1944 # create a bundle (uncompressed if other repo is not local)
1945 1945
1946 1946 if revs is None and other.capable('changegroupsubset'):
1947 1947 revs = rheads
1948 1948
1949 1949 if revs is None:
1950 1950 cg = other.changegroup(incoming, "incoming")
1951 1951 else:
1952 1952 cg = other.changegroupsubset(incoming, revs, 'incoming')
1953 1953 bundletype = other.local() and "HG10BZ" or "HG10UN"
1954 1954 fname = cleanup = changegroup.writebundle(cg, fname, bundletype)
1955 1955 # keep written bundle?
1956 1956 if opts["bundle"]:
1957 1957 cleanup = None
1958 1958 if not other.local():
1959 1959 # use the created uncompressed bundlerepo
1960 1960 other = bundlerepo.bundlerepository(ui, repo.root, fname)
1961 1961
1962 1962 o = other.changelog.nodesbetween(incoming, revs)[0]
1963 1963 if opts.get('newest_first'):
1964 1964 o.reverse()
1965 1965 displayer = cmdutil.show_changeset(ui, other, opts)
1966 1966 count = 0
1967 1967 for n in o:
1968 1968 if limit is not None and count >= limit:
1969 1969 break
1970 1970 parents = [p for p in other.changelog.parents(n) if p != nullid]
1971 1971 if opts.get('no_merges') and len(parents) == 2:
1972 1972 continue
1973 1973 count += 1
1974 1974 displayer.show(other[n])
1975 1975 displayer.close()
1976 1976 finally:
1977 1977 if hasattr(other, 'close'):
1978 1978 other.close()
1979 1979 if cleanup:
1980 1980 os.unlink(cleanup)
1981 1981
1982 1982 def init(ui, dest=".", **opts):
1983 1983 """create a new repository in the given directory
1984 1984
1985 1985 Initialize a new repository in the given directory. If the given
1986 1986 directory does not exist, it will be created.
1987 1987
1988 1988 If no directory is given, the current directory is used.
1989 1989
1990 1990 It is possible to specify an ``ssh://`` URL as the destination.
1991 1991 See 'hg help urls' for more information.
1992 1992 """
1993 1993 hg.repository(cmdutil.remoteui(ui, opts), dest, create=1)
1994 1994
1995 1995 def locate(ui, repo, *pats, **opts):
1996 1996 """locate files matching specific patterns
1997 1997
1998 1998 Print files under Mercurial control in the working directory whose
1999 1999 names match the given patterns.
2000 2000
2001 2001 By default, this command searches all directories in the working
2002 2002 directory. To search just the current directory and its
2003 2003 subdirectories, use "--include .".
2004 2004
2005 2005 If no patterns are given to match, this command prints the names
2006 2006 of all files under Mercurial control in the working directory.
2007 2007
2008 2008 If you want to feed the output of this command into the "xargs"
2009 2009 command, use the -0 option to both this command and "xargs". This
2010 2010 will avoid the problem of "xargs" treating single filenames that
2011 2011 contain whitespace as multiple filenames.
2012 2012 """
2013 2013 end = opts.get('print0') and '\0' or '\n'
2014 2014 rev = opts.get('rev') or None
2015 2015
2016 2016 ret = 1
2017 2017 m = cmdutil.match(repo, pats, opts, default='relglob')
2018 2018 m.bad = lambda x, y: False
2019 2019 for abs in repo[rev].walk(m):
2020 2020 if not rev and abs not in repo.dirstate:
2021 2021 continue
2022 2022 if opts.get('fullpath'):
2023 2023 ui.write(repo.wjoin(abs), end)
2024 2024 else:
2025 2025 ui.write(((pats and m.rel(abs)) or abs), end)
2026 2026 ret = 0
2027 2027
2028 2028 return ret
2029 2029
2030 2030 def log(ui, repo, *pats, **opts):
2031 2031 """show revision history of entire repository or files
2032 2032
2033 2033 Print the revision history of the specified files or the entire
2034 2034 project.
2035 2035
2036 2036 File history is shown without following rename or copy history of
2037 2037 files. Use -f/--follow with a filename to follow history across
2038 2038 renames and copies. --follow without a filename will only show
2039 2039 ancestors or descendants of the starting revision. --follow-first
2040 2040 only follows the first parent of merge revisions.
2041 2041
2042 2042 If no revision range is specified, the default is tip:0 unless
2043 2043 --follow is set, in which case the working directory parent is
2044 2044 used as the starting revision.
2045 2045
2046 2046 See 'hg help dates' for a list of formats valid for -d/--date.
2047 2047
2048 2048 By default this command prints revision number and changeset id,
2049 2049 tags, non-trivial parents, user, date and time, and a summary for
2050 2050 each commit. When the -v/--verbose switch is used, the list of
2051 2051 changed files and full commit message are shown.
2052 2052
2053 2053 NOTE: log -p/--patch may generate unexpected diff output for merge
2054 2054 changesets, as it will only compare the merge changeset against
2055 2055 its first parent. Also, only files different from BOTH parents
2056 2056 will appear in files:.
2057 2057 """
2058 2058
2059 2059 matchfn = cmdutil.match(repo, pats, opts)
2060 2060 limit = cmdutil.loglimit(opts)
2061 2061 count = 0
2062 2062
2063 2063 endrev = None
2064 2064 if opts.get('copies') and opts.get('rev'):
2065 2065 endrev = max(cmdutil.revrange(repo, opts.get('rev'))) + 1
2066 2066
2067 2067 df = False
2068 2068 if opts["date"]:
2069 2069 df = util.matchdate(opts["date"])
2070 2070
2071 2071 displayer = cmdutil.show_changeset(ui, repo, opts, True, matchfn)
2072 2072 def prep(ctx, fns):
2073 2073 rev = ctx.rev()
2074 2074 parents = [p for p in repo.changelog.parentrevs(rev)
2075 2075 if p != nullrev]
2076 2076 if opts.get('no_merges') and len(parents) == 2:
2077 2077 return
2078 2078 if opts.get('only_merges') and len(parents) != 2:
2079 2079 return
2080 2080 if opts.get('only_branch') and ctx.branch() not in opts['only_branch']:
2081 2081 return
2082 2082 if df and not df(ctx.date()[0]):
2083 2083 return
2084 2084 if opts['user'] and not [k for k in opts['user'] if k in ctx.user()]:
2085 2085 return
2086 2086 if opts.get('keyword'):
2087 2087 for k in [kw.lower() for kw in opts['keyword']]:
2088 2088 if (k in ctx.user().lower() or
2089 2089 k in ctx.description().lower() or
2090 2090 k in " ".join(ctx.files()).lower()):
2091 2091 break
2092 2092 else:
2093 2093 return
2094 2094
2095 2095 copies = None
2096 2096 if opts.get('copies') and rev:
2097 2097 copies = []
2098 2098 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
2099 2099 for fn in ctx.files():
2100 2100 rename = getrenamed(fn, rev)
2101 2101 if rename:
2102 2102 copies.append((fn, rename[0]))
2103 2103
2104 2104 displayer.show(ctx, copies=copies)
2105 2105
2106 2106 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
2107 2107 if count == limit:
2108 2108 break
2109 2109 if displayer.flush(ctx.rev()):
2110 2110 count += 1
2111 2111 displayer.close()
2112 2112
2113 2113 def manifest(ui, repo, node=None, rev=None):
2114 2114 """output the current or given revision of the project manifest
2115 2115
2116 2116 Print a list of version controlled files for the given revision.
2117 2117 If no revision is given, the first parent of the working directory
2118 2118 is used, or the null revision if no revision is checked out.
2119 2119
2120 2120 With -v, print file permissions, symlink and executable bits.
2121 2121 With --debug, print file revision hashes.
2122 2122 """
2123 2123
2124 2124 if rev and node:
2125 2125 raise util.Abort(_("please specify just one revision"))
2126 2126
2127 2127 if not node:
2128 2128 node = rev
2129 2129
2130 2130 decor = {'l':'644 @ ', 'x':'755 * ', '':'644 '}
2131 2131 ctx = repo[node]
2132 2132 for f in ctx:
2133 2133 if ui.debugflag:
2134 2134 ui.write("%40s " % hex(ctx.manifest()[f]))
2135 2135 if ui.verbose:
2136 2136 ui.write(decor[ctx.flags(f)])
2137 2137 ui.write("%s\n" % f)
2138 2138
2139 2139 def merge(ui, repo, node=None, **opts):
2140 2140 """merge working directory with another revision
2141 2141
2142 2142 The current working directory is updated with all changes made in
2143 2143 the requested revision since the last common predecessor revision.
2144 2144
2145 2145 Files that changed between either parent are marked as changed for
2146 2146 the next commit and a commit must be performed before any further
2147 2147 updates to the repository are allowed. The next commit will have
2148 2148 two parents.
2149 2149
2150 2150 If no revision is specified, the working directory's parent is a
2151 2151 head revision, and the current branch contains exactly one other
2152 2152 head, the other head is merged with by default. Otherwise, an
2153 2153 explicit revision with which to merge with must be provided.
2154 2154 """
2155 2155
2156 2156 if opts.get('rev') and node:
2157 2157 raise util.Abort(_("please specify just one revision"))
2158 2158 if not node:
2159 2159 node = opts.get('rev')
2160 2160
2161 2161 if not node:
2162 2162 branch = repo.changectx(None).branch()
2163 2163 bheads = repo.branchheads(branch)
2164 2164 if len(bheads) > 2:
2165 2165 ui.warn(_("abort: branch '%s' has %d heads - "
2166 2166 "please merge with an explicit rev\n")
2167 2167 % (branch, len(bheads)))
2168 2168 ui.status(_("(run 'hg heads .' to see heads)\n"))
2169 2169 return False
2170 2170
2171 2171 parent = repo.dirstate.parents()[0]
2172 2172 if len(bheads) == 1:
2173 2173 if len(repo.heads()) > 1:
2174 2174 ui.warn(_("abort: branch '%s' has one head - "
2175 2175 "please merge with an explicit rev\n" % branch))
2176 2176 ui.status(_("(run 'hg heads' to see all heads)\n"))
2177 2177 return False
2178 2178 msg = _('there is nothing to merge')
2179 2179 if parent != repo.lookup(repo[None].branch()):
2180 2180 msg = _('%s - use "hg update" instead') % msg
2181 2181 raise util.Abort(msg)
2182 2182
2183 2183 if parent not in bheads:
2184 2184 raise util.Abort(_('working dir not at a head rev - '
2185 2185 'use "hg update" or merge with an explicit rev'))
2186 2186 node = parent == bheads[0] and bheads[-1] or bheads[0]
2187 2187
2188 2188 if opts.get('preview'):
2189 2189 p1 = repo['.']
2190 2190 p2 = repo[node]
2191 2191 common = p1.ancestor(p2)
2192 2192 roots, heads = [common.node()], [p2.node()]
2193 2193 displayer = cmdutil.show_changeset(ui, repo, opts)
2194 2194 for node in repo.changelog.nodesbetween(roots=roots, heads=heads)[0]:
2195 2195 if node not in roots:
2196 2196 displayer.show(repo[node])
2197 2197 displayer.close()
2198 2198 return 0
2199 2199
2200 2200 return hg.merge(repo, node, force=opts.get('force'))
2201 2201
2202 2202 def outgoing(ui, repo, dest=None, **opts):
2203 2203 """show changesets not found in destination
2204 2204
2205 2205 Show changesets not found in the specified destination repository
2206 2206 or the default push location. These are the changesets that would
2207 2207 be pushed if a push was requested.
2208 2208
2209 2209 See pull for valid destination format details.
2210 2210 """
2211 2211 limit = cmdutil.loglimit(opts)
2212 2212 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2213 2213 dest, branches = hg.parseurl(dest)
2214 2214 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2215 2215 if revs:
2216 2216 revs = [repo.lookup(rev) for rev in revs]
2217 2217
2218 2218 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2219 2219 ui.status(_('comparing with %s\n') % url.hidepassword(dest))
2220 2220 o = repo.findoutgoing(other, force=opts.get('force'))
2221 2221 if not o:
2222 2222 ui.status(_("no changes found\n"))
2223 2223 return 1
2224 2224 o = repo.changelog.nodesbetween(o, revs)[0]
2225 2225 if opts.get('newest_first'):
2226 2226 o.reverse()
2227 2227 displayer = cmdutil.show_changeset(ui, repo, opts)
2228 2228 count = 0
2229 2229 for n in o:
2230 2230 if limit is not None and count >= limit:
2231 2231 break
2232 2232 parents = [p for p in repo.changelog.parents(n) if p != nullid]
2233 2233 if opts.get('no_merges') and len(parents) == 2:
2234 2234 continue
2235 2235 count += 1
2236 2236 displayer.show(repo[n])
2237 2237 displayer.close()
2238 2238
2239 2239 def parents(ui, repo, file_=None, **opts):
2240 2240 """show the parents of the working directory or revision
2241 2241
2242 2242 Print the working directory's parent revisions. If a revision is
2243 2243 given via -r/--rev, the parent of that revision will be printed.
2244 2244 If a file argument is given, the revision in which the file was
2245 2245 last changed (before the working directory revision or the
2246 2246 argument to --rev if given) is printed.
2247 2247 """
2248 2248 rev = opts.get('rev')
2249 2249 if rev:
2250 2250 ctx = repo[rev]
2251 2251 else:
2252 2252 ctx = repo[None]
2253 2253
2254 2254 if file_:
2255 2255 m = cmdutil.match(repo, (file_,), opts)
2256 2256 if m.anypats() or len(m.files()) != 1:
2257 2257 raise util.Abort(_('can only specify an explicit filename'))
2258 2258 file_ = m.files()[0]
2259 2259 filenodes = []
2260 2260 for cp in ctx.parents():
2261 2261 if not cp:
2262 2262 continue
2263 2263 try:
2264 2264 filenodes.append(cp.filenode(file_))
2265 2265 except error.LookupError:
2266 2266 pass
2267 2267 if not filenodes:
2268 2268 raise util.Abort(_("'%s' not found in manifest!") % file_)
2269 2269 fl = repo.file(file_)
2270 2270 p = [repo.lookup(fl.linkrev(fl.rev(fn))) for fn in filenodes]
2271 2271 else:
2272 2272 p = [cp.node() for cp in ctx.parents()]
2273 2273
2274 2274 displayer = cmdutil.show_changeset(ui, repo, opts)
2275 2275 for n in p:
2276 2276 if n != nullid:
2277 2277 displayer.show(repo[n])
2278 2278 displayer.close()
2279 2279
2280 2280 def paths(ui, repo, search=None):
2281 2281 """show aliases for remote repositories
2282 2282
2283 2283 Show definition of symbolic path name NAME. If no name is given,
2284 2284 show definition of all available names.
2285 2285
2286 2286 Path names are defined in the [paths] section of /etc/mercurial/hgrc
2287 2287 and $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too.
2288 2288
2289 2289 See 'hg help urls' for more information.
2290 2290 """
2291 2291 if search:
2292 2292 for name, path in ui.configitems("paths"):
2293 2293 if name == search:
2294 2294 ui.write("%s\n" % url.hidepassword(path))
2295 2295 return
2296 2296 ui.warn(_("not found!\n"))
2297 2297 return 1
2298 2298 else:
2299 2299 for name, path in ui.configitems("paths"):
2300 2300 ui.write("%s = %s\n" % (name, url.hidepassword(path)))
2301 2301
2302 2302 def postincoming(ui, repo, modheads, optupdate, checkout):
2303 2303 if modheads == 0:
2304 2304 return
2305 2305 if optupdate:
2306 2306 if (modheads <= 1 or len(repo.branchheads()) == 1) or checkout:
2307 2307 return hg.update(repo, checkout)
2308 2308 else:
2309 2309 ui.status(_("not updating, since new heads added\n"))
2310 2310 if modheads > 1:
2311 2311 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
2312 2312 else:
2313 2313 ui.status(_("(run 'hg update' to get a working copy)\n"))
2314 2314
2315 2315 def pull(ui, repo, source="default", **opts):
2316 2316 """pull changes from the specified source
2317 2317
2318 2318 Pull changes from a remote repository to a local one.
2319 2319
2320 2320 This finds all changes from the repository at the specified path
2321 2321 or URL and adds them to a local repository (the current one unless
2322 2322 -R is specified). By default, this does not update the copy of the
2323 2323 project in the working directory.
2324 2324
2325 2325 Use hg incoming if you want to see what would have been added by a
2326 2326 pull at the time you issued this command. If you then decide to
2327 2327 added those changes to the repository, you should use pull -r X
2328 2328 where X is the last changeset listed by hg incoming.
2329 2329
2330 2330 If SOURCE is omitted, the 'default' path will be used.
2331 2331 See 'hg help urls' for more information.
2332 2332 """
2333 2333 source, branches = hg.parseurl(ui.expandpath(source))
2334 2334 other = hg.repository(cmdutil.remoteui(repo, opts), source)
2335 2335 ui.status(_('pulling from %s\n') % url.hidepassword(source))
2336 2336 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
2337 2337 if revs:
2338 2338 try:
2339 2339 revs = [other.lookup(rev) for rev in revs]
2340 2340 except error.CapabilityError:
2341 2341 err = _("Other repository doesn't support revision lookup, "
2342 2342 "so a rev cannot be specified.")
2343 2343 raise util.Abort(err)
2344 2344
2345 2345 modheads = repo.pull(other, heads=revs, force=opts.get('force'))
2346 2346 if checkout:
2347 2347 checkout = str(repo.changelog.rev(other.lookup(checkout)))
2348 2348 return postincoming(ui, repo, modheads, opts.get('update'), checkout)
2349 2349
2350 2350 def push(ui, repo, dest=None, **opts):
2351 2351 """push changes to the specified destination
2352 2352
2353 2353 Push changes from the local repository to the given destination.
2354 2354
2355 2355 This is the symmetrical operation for pull. It moves changes from
2356 2356 the current repository to a different one. If the destination is
2357 2357 local this is identical to a pull in that directory from the
2358 2358 current one.
2359 2359
2360 2360 By default, push will refuse to run if it detects the result would
2361 2361 increase the number of remote heads. This generally indicates the
2362 2362 user forgot to pull and merge before pushing.
2363 2363
2364 2364 If -r/--rev is used, the named revision and all its ancestors will
2365 2365 be pushed to the remote repository.
2366 2366
2367 2367 Please see 'hg help urls' for important details about ``ssh://``
2368 2368 URLs. If DESTINATION is omitted, a default path will be used.
2369 2369 """
2370 2370 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2371 2371 dest, branches = hg.parseurl(dest)
2372 2372 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2373 2373 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2374 2374 ui.status(_('pushing to %s\n') % url.hidepassword(dest))
2375 2375 if revs:
2376 2376 revs = [repo.lookup(rev) for rev in revs]
2377 2377
2378 2378 # push subrepos depth-first for coherent ordering
2379 2379 c = repo['']
2380 2380 subs = c.substate # only repos that are committed
2381 2381 for s in sorted(subs):
2382 2382 c.sub(s).push(opts.get('force'))
2383 2383
2384 2384 r = repo.push(other, opts.get('force'), revs=revs)
2385 2385 return r == 0
2386 2386
2387 2387 def recover(ui, repo):
2388 2388 """roll back an interrupted transaction
2389 2389
2390 2390 Recover from an interrupted commit or pull.
2391 2391
2392 2392 This command tries to fix the repository status after an
2393 2393 interrupted operation. It should only be necessary when Mercurial
2394 2394 suggests it.
2395 2395 """
2396 2396 if repo.recover():
2397 2397 return hg.verify(repo)
2398 2398 return 1
2399 2399
2400 2400 def remove(ui, repo, *pats, **opts):
2401 2401 """remove the specified files on the next commit
2402 2402
2403 2403 Schedule the indicated files for removal from the repository.
2404 2404
2405 2405 This only removes files from the current branch, not from the
2406 2406 entire project history. -A/--after can be used to remove only
2407 2407 files that have already been deleted, -f/--force can be used to
2408 2408 force deletion, and -Af can be used to remove files from the next
2409 2409 revision without deleting them from the working directory.
2410 2410
2411 2411 The following table details the behavior of remove for different
2412 2412 file states (columns) and option combinations (rows). The file
2413 2413 states are Added [A], Clean [C], Modified [M] and Missing [!] (as
2414 2414 reported by hg status). The actions are Warn, Remove (from branch)
2415 2415 and Delete (from disk)::
2416 2416
2417 2417 A C M !
2418 2418 none W RD W R
2419 2419 -f R RD RD R
2420 2420 -A W W W R
2421 2421 -Af R R R R
2422 2422
2423 2423 This command schedules the files to be removed at the next commit.
2424 2424 To undo a remove before that, see hg revert.
2425 2425 """
2426 2426
2427 2427 after, force = opts.get('after'), opts.get('force')
2428 2428 if not pats and not after:
2429 2429 raise util.Abort(_('no files specified'))
2430 2430
2431 2431 m = cmdutil.match(repo, pats, opts)
2432 2432 s = repo.status(match=m, clean=True)
2433 2433 modified, added, deleted, clean = s[0], s[1], s[3], s[6]
2434 2434
2435 2435 for f in m.files():
2436 2436 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
2437 2437 ui.warn(_('not removing %s: file is untracked\n') % m.rel(f))
2438 2438
2439 2439 def warn(files, reason):
2440 2440 for f in files:
2441 2441 ui.warn(_('not removing %s: file %s (use -f to force removal)\n')
2442 2442 % (m.rel(f), reason))
2443 2443
2444 2444 if force:
2445 2445 remove, forget = modified + deleted + clean, added
2446 2446 elif after:
2447 2447 remove, forget = deleted, []
2448 2448 warn(modified + added + clean, _('still exists'))
2449 2449 else:
2450 2450 remove, forget = deleted + clean, []
2451 2451 warn(modified, _('is modified'))
2452 2452 warn(added, _('has been marked for add'))
2453 2453
2454 2454 for f in sorted(remove + forget):
2455 2455 if ui.verbose or not m.exact(f):
2456 2456 ui.status(_('removing %s\n') % m.rel(f))
2457 2457
2458 2458 repo.forget(forget)
2459 2459 repo.remove(remove, unlink=not after)
2460 2460
2461 2461 def rename(ui, repo, *pats, **opts):
2462 2462 """rename files; equivalent of copy + remove
2463 2463
2464 2464 Mark dest as copies of sources; mark sources for deletion. If dest
2465 2465 is a directory, copies are put in that directory. If dest is a
2466 2466 file, there can only be one source.
2467 2467
2468 2468 By default, this command copies the contents of files as they
2469 2469 exist in the working directory. If invoked with -A/--after, the
2470 2470 operation is recorded, but no copying is performed.
2471 2471
2472 2472 This command takes effect at the next commit. To undo a rename
2473 2473 before that, see hg revert.
2474 2474 """
2475 2475 wlock = repo.wlock(False)
2476 2476 try:
2477 2477 return cmdutil.copy(ui, repo, pats, opts, rename=True)
2478 2478 finally:
2479 2479 wlock.release()
2480 2480
2481 2481 def resolve(ui, repo, *pats, **opts):
2482 2482 """retry file merges from a merge or update
2483 2483
2484 2484 This command can cleanly retry unresolved file merges using file
2485 2485 revisions preserved from the last update or merge.
2486 2486
2487 2487 If a conflict is resolved manually, please note that the changes
2488 2488 will be overwritten if the merge is retried with resolve. The
2489 2489 -m/--mark switch should be used to mark the file as resolved.
2490 2490
2491 2491 You can specify a set of files to operate on, or use the -a/--all
2492 2492 switch to select all unresolved files.
2493 2493
2494 2494 This command also allows listing resolved files and manually
2495 2495 indicating whether or not files are resolved. All files must be
2496 2496 marked as resolved before a commit is permitted.
2497 2497
2498 2498 The codes used to show the status of files are::
2499 2499
2500 2500 U = unresolved
2501 2501 R = resolved
2502 2502 """
2503 2503
2504 2504 all, mark, unmark, show, nostatus = \
2505 2505 [opts.get(o) for o in 'all mark unmark list no_status'.split()]
2506 2506
2507 2507 if (show and (mark or unmark)) or (mark and unmark):
2508 2508 raise util.Abort(_("too many options specified"))
2509 2509 if pats and all:
2510 2510 raise util.Abort(_("can't specify --all and patterns"))
2511 2511 if not (all or pats or show or mark or unmark):
2512 2512 raise util.Abort(_('no files or directories specified; '
2513 2513 'use --all to remerge all files'))
2514 2514
2515 2515 ms = merge_.mergestate(repo)
2516 2516 m = cmdutil.match(repo, pats, opts)
2517 2517
2518 2518 for f in ms:
2519 2519 if m(f):
2520 2520 if show:
2521 2521 if nostatus:
2522 2522 ui.write("%s\n" % f)
2523 2523 else:
2524 2524 ui.write("%s %s\n" % (ms[f].upper(), f))
2525 2525 elif mark:
2526 2526 ms.mark(f, "r")
2527 2527 elif unmark:
2528 2528 ms.mark(f, "u")
2529 2529 else:
2530 2530 wctx = repo[None]
2531 2531 mctx = wctx.parents()[-1]
2532 2532
2533 2533 # backup pre-resolve (merge uses .orig for its own purposes)
2534 2534 a = repo.wjoin(f)
2535 2535 util.copyfile(a, a + ".resolve")
2536 2536
2537 2537 # resolve file
2538 2538 ms.resolve(f, wctx, mctx)
2539 2539
2540 2540 # replace filemerge's .orig file with our resolve file
2541 2541 util.rename(a + ".resolve", a + ".orig")
2542 2542
2543 2543 def revert(ui, repo, *pats, **opts):
2544 2544 """restore individual files or directories to an earlier state
2545 2545
2546 2546 (Use update -r to check out earlier revisions, revert does not
2547 2547 change the working directory parents.)
2548 2548
2549 2549 With no revision specified, revert the named files or directories
2550 2550 to the contents they had in the parent of the working directory.
2551 2551 This restores the contents of the affected files to an unmodified
2552 2552 state and unschedules adds, removes, copies, and renames. If the
2553 2553 working directory has two parents, you must explicitly specify the
2554 2554 revision to revert to.
2555 2555
2556 2556 Using the -r/--rev option, revert the given files or directories
2557 2557 to their contents as of a specific revision. This can be helpful
2558 2558 to "roll back" some or all of an earlier change. See 'hg help
2559 2559 dates' for a list of formats valid for -d/--date.
2560 2560
2561 2561 Revert modifies the working directory. It does not commit any
2562 2562 changes, or change the parent of the working directory. If you
2563 2563 revert to a revision other than the parent of the working
2564 2564 directory, the reverted files will thus appear modified
2565 2565 afterwards.
2566 2566
2567 2567 If a file has been deleted, it is restored. If the executable mode
2568 2568 of a file was changed, it is reset.
2569 2569
2570 2570 If names are given, all files matching the names are reverted.
2571 2571 If no arguments are given, no files are reverted.
2572 2572
2573 2573 Modified files are saved with a .orig suffix before reverting.
2574 2574 To disable these backups, use --no-backup.
2575 2575 """
2576 2576
2577 2577 if opts["date"]:
2578 2578 if opts["rev"]:
2579 2579 raise util.Abort(_("you can't specify a revision and a date"))
2580 2580 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
2581 2581
2582 2582 if not pats and not opts.get('all'):
2583 2583 raise util.Abort(_('no files or directories specified; '
2584 2584 'use --all to revert the whole repo'))
2585 2585
2586 2586 parent, p2 = repo.dirstate.parents()
2587 2587 if not opts.get('rev') and p2 != nullid:
2588 2588 raise util.Abort(_('uncommitted merge - please provide a '
2589 2589 'specific revision'))
2590 2590 ctx = repo[opts.get('rev')]
2591 2591 node = ctx.node()
2592 2592 mf = ctx.manifest()
2593 2593 if node == parent:
2594 2594 pmf = mf
2595 2595 else:
2596 2596 pmf = None
2597 2597
2598 2598 # need all matching names in dirstate and manifest of target rev,
2599 2599 # so have to walk both. do not print errors if files exist in one
2600 2600 # but not other.
2601 2601
2602 2602 names = {}
2603 2603
2604 2604 wlock = repo.wlock()
2605 2605 try:
2606 2606 # walk dirstate.
2607 2607
2608 2608 m = cmdutil.match(repo, pats, opts)
2609 2609 m.bad = lambda x, y: False
2610 2610 for abs in repo.walk(m):
2611 2611 names[abs] = m.rel(abs), m.exact(abs)
2612 2612
2613 2613 # walk target manifest.
2614 2614
2615 2615 def badfn(path, msg):
2616 2616 if path in names:
2617 2617 return
2618 2618 path_ = path + '/'
2619 2619 for f in names:
2620 2620 if f.startswith(path_):
2621 2621 return
2622 2622 ui.warn("%s: %s\n" % (m.rel(path), msg))
2623 2623
2624 2624 m = cmdutil.match(repo, pats, opts)
2625 2625 m.bad = badfn
2626 2626 for abs in repo[node].walk(m):
2627 2627 if abs not in names:
2628 2628 names[abs] = m.rel(abs), m.exact(abs)
2629 2629
2630 2630 m = cmdutil.matchfiles(repo, names)
2631 2631 changes = repo.status(match=m)[:4]
2632 2632 modified, added, removed, deleted = map(set, changes)
2633 2633
2634 2634 # if f is a rename, also revert the source
2635 2635 cwd = repo.getcwd()
2636 2636 for f in added:
2637 2637 src = repo.dirstate.copied(f)
2638 2638 if src and src not in names and repo.dirstate[src] == 'r':
2639 2639 removed.add(src)
2640 2640 names[src] = (repo.pathto(src, cwd), True)
2641 2641
2642 2642 def removeforget(abs):
2643 2643 if repo.dirstate[abs] == 'a':
2644 2644 return _('forgetting %s\n')
2645 2645 return _('removing %s\n')
2646 2646
2647 2647 revert = ([], _('reverting %s\n'))
2648 2648 add = ([], _('adding %s\n'))
2649 2649 remove = ([], removeforget)
2650 2650 undelete = ([], _('undeleting %s\n'))
2651 2651
2652 2652 disptable = (
2653 2653 # dispatch table:
2654 2654 # file state
2655 2655 # action if in target manifest
2656 2656 # action if not in target manifest
2657 2657 # make backup if in target manifest
2658 2658 # make backup if not in target manifest
2659 2659 (modified, revert, remove, True, True),
2660 2660 (added, revert, remove, True, False),
2661 2661 (removed, undelete, None, False, False),
2662 2662 (deleted, revert, remove, False, False),
2663 2663 )
2664 2664
2665 2665 for abs, (rel, exact) in sorted(names.items()):
2666 2666 mfentry = mf.get(abs)
2667 2667 target = repo.wjoin(abs)
2668 2668 def handle(xlist, dobackup):
2669 2669 xlist[0].append(abs)
2670 2670 if dobackup and not opts.get('no_backup') and util.lexists(target):
2671 2671 bakname = "%s.orig" % rel
2672 2672 ui.note(_('saving current version of %s as %s\n') %
2673 2673 (rel, bakname))
2674 2674 if not opts.get('dry_run'):
2675 2675 util.copyfile(target, bakname)
2676 2676 if ui.verbose or not exact:
2677 2677 msg = xlist[1]
2678 2678 if not isinstance(msg, basestring):
2679 2679 msg = msg(abs)
2680 2680 ui.status(msg % rel)
2681 2681 for table, hitlist, misslist, backuphit, backupmiss in disptable:
2682 2682 if abs not in table:
2683 2683 continue
2684 2684 # file has changed in dirstate
2685 2685 if mfentry:
2686 2686 handle(hitlist, backuphit)
2687 2687 elif misslist is not None:
2688 2688 handle(misslist, backupmiss)
2689 2689 break
2690 2690 else:
2691 2691 if abs not in repo.dirstate:
2692 2692 if mfentry:
2693 2693 handle(add, True)
2694 2694 elif exact:
2695 2695 ui.warn(_('file not managed: %s\n') % rel)
2696 2696 continue
2697 2697 # file has not changed in dirstate
2698 2698 if node == parent:
2699 2699 if exact:
2700 2700 ui.warn(_('no changes needed to %s\n') % rel)
2701 2701 continue
2702 2702 if pmf is None:
2703 2703 # only need parent manifest in this unlikely case,
2704 2704 # so do not read by default
2705 2705 pmf = repo[parent].manifest()
2706 2706 if abs in pmf:
2707 2707 if mfentry:
2708 2708 # if version of file is same in parent and target
2709 2709 # manifests, do nothing
2710 2710 if (pmf[abs] != mfentry or
2711 2711 pmf.flags(abs) != mf.flags(abs)):
2712 2712 handle(revert, False)
2713 2713 else:
2714 2714 handle(remove, False)
2715 2715
2716 2716 if not opts.get('dry_run'):
2717 2717 def checkout(f):
2718 2718 fc = ctx[f]
2719 2719 repo.wwrite(f, fc.data(), fc.flags())
2720 2720
2721 2721 audit_path = util.path_auditor(repo.root)
2722 2722 for f in remove[0]:
2723 2723 if repo.dirstate[f] == 'a':
2724 2724 repo.dirstate.forget(f)
2725 2725 continue
2726 2726 audit_path(f)
2727 2727 try:
2728 2728 util.unlink(repo.wjoin(f))
2729 2729 except OSError:
2730 2730 pass
2731 2731 repo.dirstate.remove(f)
2732 2732
2733 2733 normal = None
2734 2734 if node == parent:
2735 2735 # We're reverting to our parent. If possible, we'd like status
2736 2736 # to report the file as clean. We have to use normallookup for
2737 2737 # merges to avoid losing information about merged/dirty files.
2738 2738 if p2 != nullid:
2739 2739 normal = repo.dirstate.normallookup
2740 2740 else:
2741 2741 normal = repo.dirstate.normal
2742 2742 for f in revert[0]:
2743 2743 checkout(f)
2744 2744 if normal:
2745 2745 normal(f)
2746 2746
2747 2747 for f in add[0]:
2748 2748 checkout(f)
2749 2749 repo.dirstate.add(f)
2750 2750
2751 2751 normal = repo.dirstate.normallookup
2752 2752 if node == parent and p2 == nullid:
2753 2753 normal = repo.dirstate.normal
2754 2754 for f in undelete[0]:
2755 2755 checkout(f)
2756 2756 normal(f)
2757 2757
2758 2758 finally:
2759 2759 wlock.release()
2760 2760
2761 2761 def rollback(ui, repo):
2762 2762 """roll back the last transaction
2763 2763
2764 2764 This command should be used with care. There is only one level of
2765 2765 rollback, and there is no way to undo a rollback. It will also
2766 2766 restore the dirstate at the time of the last transaction, losing
2767 2767 any dirstate changes since that time. This command does not alter
2768 2768 the working directory.
2769 2769
2770 2770 Transactions are used to encapsulate the effects of all commands
2771 2771 that create new changesets or propagate existing changesets into a
2772 2772 repository. For example, the following commands are transactional,
2773 2773 and their effects can be rolled back:
2774 2774
2775 2775 - commit
2776 2776 - import
2777 2777 - pull
2778 2778 - push (with this repository as destination)
2779 2779 - unbundle
2780 2780
2781 2781 This command is not intended for use on public repositories. Once
2782 2782 changes are visible for pull by other users, rolling a transaction
2783 2783 back locally is ineffective (someone else may already have pulled
2784 2784 the changes). Furthermore, a race is possible with readers of the
2785 2785 repository; for example an in-progress pull from the repository
2786 2786 may fail if a rollback is performed.
2787 2787 """
2788 2788 repo.rollback()
2789 2789
2790 2790 def root(ui, repo):
2791 2791 """print the root (top) of the current working directory
2792 2792
2793 2793 Print the root directory of the current repository.
2794 2794 """
2795 2795 ui.write(repo.root + "\n")
2796 2796
2797 2797 def serve(ui, repo, **opts):
2798 2798 """export the repository via HTTP
2799 2799
2800 2800 Start a local HTTP repository browser and pull server.
2801 2801
2802 2802 By default, the server logs accesses to stdout and errors to
2803 2803 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
2804 2804 files.
2805 2805 """
2806 2806
2807 2807 if opts["stdio"]:
2808 2808 if repo is None:
2809 2809 raise error.RepoError(_("There is no Mercurial repository here"
2810 2810 " (.hg not found)"))
2811 2811 s = sshserver.sshserver(ui, repo)
2812 2812 s.serve_forever()
2813 2813
2814 2814 baseui = repo and repo.baseui or ui
2815 2815 optlist = ("name templates style address port prefix ipv6"
2816 2816 " accesslog errorlog webdir_conf certificate encoding")
2817 2817 for o in optlist.split():
2818 2818 if opts.get(o, None):
2819 2819 baseui.setconfig("web", o, str(opts[o]))
2820 2820 if (repo is not None) and (repo.ui != baseui):
2821 2821 repo.ui.setconfig("web", o, str(opts[o]))
2822 2822
2823 2823 if repo is None and not ui.config("web", "webdir_conf"):
2824 2824 raise error.RepoError(_("There is no Mercurial repository here"
2825 2825 " (.hg not found)"))
2826 2826
2827 2827 class service(object):
2828 2828 def init(self):
2829 2829 util.set_signal_handler()
2830 2830 self.httpd = server.create_server(baseui, repo)
2831 2831
2832 2832 if not ui.verbose:
2833 2833 return
2834 2834
2835 2835 if self.httpd.prefix:
2836 2836 prefix = self.httpd.prefix.strip('/') + '/'
2837 2837 else:
2838 2838 prefix = ''
2839 2839
2840 2840 port = ':%d' % self.httpd.port
2841 2841 if port == ':80':
2842 2842 port = ''
2843 2843
2844 2844 bindaddr = self.httpd.addr
2845 2845 if bindaddr == '0.0.0.0':
2846 2846 bindaddr = '*'
2847 2847 elif ':' in bindaddr: # IPv6
2848 2848 bindaddr = '[%s]' % bindaddr
2849 2849
2850 2850 fqaddr = self.httpd.fqaddr
2851 2851 if ':' in fqaddr:
2852 2852 fqaddr = '[%s]' % fqaddr
2853 2853 ui.status(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
2854 2854 (fqaddr, port, prefix, bindaddr, self.httpd.port))
2855 2855
2856 2856 def run(self):
2857 2857 self.httpd.serve_forever()
2858 2858
2859 2859 service = service()
2860 2860
2861 2861 cmdutil.service(opts, initfn=service.init, runfn=service.run)
2862 2862
2863 2863 def status(ui, repo, *pats, **opts):
2864 2864 """show changed files in the working directory
2865 2865
2866 2866 Show status of files in the repository. If names are given, only
2867 2867 files that match are shown. Files that are clean or ignored or
2868 2868 the source of a copy/move operation, are not listed unless
2869 2869 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
2870 2870 Unless options described with "show only ..." are given, the
2871 2871 options -mardu are used.
2872 2872
2873 2873 Option -q/--quiet hides untracked (unknown and ignored) files
2874 2874 unless explicitly requested with -u/--unknown or -i/--ignored.
2875 2875
2876 2876 NOTE: status may appear to disagree with diff if permissions have
2877 2877 changed or a merge has occurred. The standard diff format does not
2878 2878 report permission changes and diff only reports changes relative
2879 2879 to one merge parent.
2880 2880
2881 2881 If one revision is given, it is used as the base revision.
2882 2882 If two revisions are given, the differences between them are
2883 2883 shown. The --change option can also be used as a shortcut to list
2884 2884 the changed files of a revision from its first parent.
2885 2885
2886 2886 The codes used to show the status of files are::
2887 2887
2888 2888 M = modified
2889 2889 A = added
2890 2890 R = removed
2891 2891 C = clean
2892 2892 ! = missing (deleted by non-hg command, but still tracked)
2893 2893 ? = not tracked
2894 2894 I = ignored
2895 2895 = origin of the previous file listed as A (added)
2896 2896 """
2897 2897
2898 2898 revs = opts.get('rev')
2899 2899 change = opts.get('change')
2900 2900
2901 2901 if revs and change:
2902 2902 msg = _('cannot specify --rev and --change at the same time')
2903 2903 raise util.Abort(msg)
2904 2904 elif change:
2905 2905 node2 = repo.lookup(change)
2906 2906 node1 = repo[node2].parents()[0].node()
2907 2907 else:
2908 2908 node1, node2 = cmdutil.revpair(repo, revs)
2909 2909
2910 2910 cwd = (pats and repo.getcwd()) or ''
2911 2911 end = opts.get('print0') and '\0' or '\n'
2912 2912 copy = {}
2913 2913 states = 'modified added removed deleted unknown ignored clean'.split()
2914 2914 show = [k for k in states if opts.get(k)]
2915 2915 if opts.get('all'):
2916 2916 show += ui.quiet and (states[:4] + ['clean']) or states
2917 2917 if not show:
2918 2918 show = ui.quiet and states[:4] or states[:5]
2919 2919
2920 2920 stat = repo.status(node1, node2, cmdutil.match(repo, pats, opts),
2921 2921 'ignored' in show, 'clean' in show, 'unknown' in show)
2922 2922 changestates = zip(states, 'MAR!?IC', stat)
2923 2923
2924 2924 if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'):
2925 2925 ctxn = repo[nullid]
2926 2926 ctx1 = repo[node1]
2927 2927 ctx2 = repo[node2]
2928 2928 added = stat[1]
2929 2929 if node2 is None:
2930 2930 added = stat[0] + stat[1] # merged?
2931 2931
2932 2932 for k, v in copies.copies(repo, ctx1, ctx2, ctxn)[0].iteritems():
2933 2933 if k in added:
2934 2934 copy[k] = v
2935 2935 elif v in added:
2936 2936 copy[v] = k
2937 2937
2938 2938 for state, char, files in changestates:
2939 2939 if state in show:
2940 2940 format = "%s %%s%s" % (char, end)
2941 2941 if opts.get('no_status'):
2942 2942 format = "%%s%s" % end
2943 2943
2944 2944 for f in files:
2945 2945 ui.write(format % repo.pathto(f, cwd))
2946 2946 if f in copy:
2947 2947 ui.write(' %s%s' % (repo.pathto(copy[f], cwd), end))
2948 2948
2949 2949 def summary(ui, repo, **opts):
2950 2950 """summarize working directory state
2951 2951
2952 2952 This generates a brief summary of the working directory state,
2953 2953 including parents, branch, commit status, and available updates.
2954 2954
2955 2955 With the --remote option, this will check the default paths for
2956 2956 incoming and outgoing changes. This can be time-consuming.
2957 2957 """
2958 2958
2959 2959 ctx = repo[None]
2960 2960 parents = ctx.parents()
2961 2961 pnode = parents[0].node()
2962 2962 tags = repo.tags()
2963 2963
2964 2964 for p in parents:
2965 2965 t = ' '.join([t for t in tags if tags[t] == p.node()])
2966 2966 if p.rev() == -1:
2967 2967 if not len(repo):
2968 2968 t += _(' (empty repository)')
2969 2969 else:
2970 2970 t += _(' (no revision checked out)')
2971 2971 ui.write(_('parent: %d:%s %s\n') % (p.rev(), str(p), t))
2972 2972 if p.description():
2973 2973 ui.status(' ' + p.description().splitlines()[0].strip() + '\n')
2974 2974
2975 2975 branch = ctx.branch()
2976 2976 bheads = repo.branchheads(branch)
2977 2977 m = _('branch: %s\n') % branch
2978 2978 if branch != 'default':
2979 2979 ui.write(m)
2980 2980 else:
2981 2981 ui.status(m)
2982 2982
2983 2983 st = list(repo.status(unknown=True))[:7]
2984 2984 ms = merge_.mergestate(repo)
2985 2985 st.append([f for f in ms if f == 'u'])
2986 2986 labels = [_('%d modified'), _('%d added'), _('%d removed'),
2987 2987 _('%d deleted'), _('%d unknown'), _('%d ignored'),
2988 2988 _('%d unresolved')]
2989 2989 t = []
2990 2990 for s, l in zip(st, labels):
2991 2991 if s:
2992 2992 t.append(l % len(s))
2993 2993
2994 2994 t = ', '.join(t)
2995 2995 cleanworkdir = False
2996 2996
2997 2997 if len(parents) > 1:
2998 2998 t += _(' (merge)')
2999 2999 elif branch != parents[0].branch():
3000 3000 t += _(' (new branch)')
3001 3001 elif (not st[0] and not st[1] and not st[2]):
3002 3002 t += _(' (clean)')
3003 3003 cleanworkdir = True
3004 3004 elif pnode not in bheads:
3005 3005 t += _(' (new branch head)')
3006 3006
3007 3007 if cleanworkdir:
3008 3008 ui.status(_('commit: %s\n') % t.strip())
3009 3009 else:
3010 3010 ui.write(_('commit: %s\n') % t.strip())
3011 3011
3012 3012 # all ancestors of branch heads - all ancestors of parent = new csets
3013 3013 new = [0] * len(repo)
3014 3014 cl = repo.changelog
3015 3015 for a in cl.ancestors(*[cl.rev(n) for n in bheads]):
3016 3016 new[a] = 1
3017 3017 for a in cl.ancestors(*[p.rev() for p in parents]):
3018 3018 new[a] = 0
3019 3019 new = sum(new)
3020 3020
3021 3021 if new == 0:
3022 3022 ui.status(_('update: (current)\n'))
3023 3023 elif pnode not in bheads:
3024 3024 ui.write(_('update: %d new changesets (update)\n') % new)
3025 3025 else:
3026 3026 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
3027 3027 (new, len(bheads)))
3028 3028
3029 3029 if opts.get('remote'):
3030 3030 t = []
3031 3031 source, revs, checkout = hg.parseurl(ui.expandpath('default'),
3032 3032 opts.get('rev'))
3033 3033 other = hg.repository(cmdutil.remoteui(repo, {}), source)
3034 3034 ui.debug('comparing with %s\n' % url.hidepassword(source))
3035 3035 repo.ui.pushbuffer()
3036 3036 common, incoming, rheads = repo.findcommonincoming(other)
3037 3037 repo.ui.popbuffer()
3038 3038 if incoming:
3039 3039 t.append(_('1 or more incoming'))
3040 3040
3041 3041 dest, revs, checkout = hg.parseurl(
3042 3042 ui.expandpath('default-push', 'default'))
3043 3043 other = hg.repository(cmdutil.remoteui(repo, {}), dest)
3044 3044 ui.debug('comparing with %s\n' % url.hidepassword(dest))
3045 3045 repo.ui.pushbuffer()
3046 3046 o = repo.findoutgoing(other)
3047 3047 repo.ui.popbuffer()
3048 3048 o = repo.changelog.nodesbetween(o, revs)[0]
3049 3049 if o:
3050 3050 t.append(_('%d outgoing') % len(o))
3051 3051
3052 3052 if t:
3053 3053 ui.write(_('remote: %s\n') % (', '.join(t)))
3054 3054 else:
3055 3055 ui.status(_('remote: (synced)\n'))
3056 3056
3057 3057 def tag(ui, repo, name1, *names, **opts):
3058 3058 """add one or more tags for the current or given revision
3059 3059
3060 3060 Name a particular revision using <name>.
3061 3061
3062 3062 Tags are used to name particular revisions of the repository and are
3063 3063 very useful to compare different revisions, to go back to significant
3064 3064 earlier versions or to mark branch points as releases, etc.
3065 3065
3066 3066 If no revision is given, the parent of the working directory is
3067 3067 used, or tip if no revision is checked out.
3068 3068
3069 3069 To facilitate version control, distribution, and merging of tags,
3070 3070 they are stored as a file named ".hgtags" which is managed
3071 3071 similarly to other project files and can be hand-edited if
3072 3072 necessary. The file '.hg/localtags' is used for local tags (not
3073 3073 shared among repositories).
3074 3074
3075 3075 See 'hg help dates' for a list of formats valid for -d/--date.
3076 3076 """
3077 3077
3078 3078 rev_ = "."
3079 3079 names = (name1,) + names
3080 3080 if len(names) != len(set(names)):
3081 3081 raise util.Abort(_('tag names must be unique'))
3082 3082 for n in names:
3083 3083 if n in ['tip', '.', 'null']:
3084 3084 raise util.Abort(_('the name \'%s\' is reserved') % n)
3085 3085 if opts.get('rev') and opts.get('remove'):
3086 3086 raise util.Abort(_("--rev and --remove are incompatible"))
3087 3087 if opts.get('rev'):
3088 3088 rev_ = opts['rev']
3089 3089 message = opts.get('message')
3090 3090 if opts.get('remove'):
3091 3091 expectedtype = opts.get('local') and 'local' or 'global'
3092 3092 for n in names:
3093 3093 if not repo.tagtype(n):
3094 3094 raise util.Abort(_('tag \'%s\' does not exist') % n)
3095 3095 if repo.tagtype(n) != expectedtype:
3096 3096 if expectedtype == 'global':
3097 3097 raise util.Abort(_('tag \'%s\' is not a global tag') % n)
3098 3098 else:
3099 3099 raise util.Abort(_('tag \'%s\' is not a local tag') % n)
3100 3100 rev_ = nullid
3101 3101 if not message:
3102 3102 # we don't translate commit messages
3103 3103 message = 'Removed tag %s' % ', '.join(names)
3104 3104 elif not opts.get('force'):
3105 3105 for n in names:
3106 3106 if n in repo.tags():
3107 3107 raise util.Abort(_('tag \'%s\' already exists '
3108 3108 '(use -f to force)') % n)
3109 3109 if not rev_ and repo.dirstate.parents()[1] != nullid:
3110 3110 raise util.Abort(_('uncommitted merge - please provide a '
3111 3111 'specific revision'))
3112 3112 r = repo[rev_].node()
3113 3113
3114 3114 if not message:
3115 3115 # we don't translate commit messages
3116 3116 message = ('Added tag %s for changeset %s' %
3117 3117 (', '.join(names), short(r)))
3118 3118
3119 3119 date = opts.get('date')
3120 3120 if date:
3121 3121 date = util.parsedate(date)
3122 3122
3123 3123 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date)
3124 3124
3125 3125 def tags(ui, repo):
3126 3126 """list repository tags
3127 3127
3128 3128 This lists both regular and local tags. When the -v/--verbose
3129 3129 switch is used, a third column "local" is printed for local tags.
3130 3130 """
3131 3131
3132 3132 hexfunc = ui.debugflag and hex or short
3133 3133 tagtype = ""
3134 3134
3135 3135 for t, n in reversed(repo.tagslist()):
3136 3136 if ui.quiet:
3137 3137 ui.write("%s\n" % t)
3138 3138 continue
3139 3139
3140 3140 try:
3141 3141 hn = hexfunc(n)
3142 3142 r = "%5d:%s" % (repo.changelog.rev(n), hn)
3143 3143 except error.LookupError:
3144 3144 r = " ?:%s" % hn
3145 3145 else:
3146 3146 spaces = " " * (30 - encoding.colwidth(t))
3147 3147 if ui.verbose:
3148 3148 if repo.tagtype(t) == 'local':
3149 3149 tagtype = " local"
3150 3150 else:
3151 3151 tagtype = ""
3152 3152 ui.write("%s%s %s%s\n" % (t, spaces, r, tagtype))
3153 3153
3154 3154 def tip(ui, repo, **opts):
3155 3155 """show the tip revision
3156 3156
3157 3157 The tip revision (usually just called the tip) is the changeset
3158 3158 most recently added to the repository (and therefore the most
3159 3159 recently changed head).
3160 3160
3161 3161 If you have just made a commit, that commit will be the tip. If
3162 3162 you have just pulled changes from another repository, the tip of
3163 3163 that repository becomes the current tip. The "tip" tag is special
3164 3164 and cannot be renamed or assigned to a different changeset.
3165 3165 """
3166 3166 displayer = cmdutil.show_changeset(ui, repo, opts)
3167 3167 displayer.show(repo[len(repo) - 1])
3168 3168 displayer.close()
3169 3169
3170 3170 def unbundle(ui, repo, fname1, *fnames, **opts):
3171 3171 """apply one or more changegroup files
3172 3172
3173 3173 Apply one or more compressed changegroup files generated by the
3174 3174 bundle command.
3175 3175 """
3176 3176 fnames = (fname1,) + fnames
3177 3177
3178 3178 lock = repo.lock()
3179 3179 try:
3180 3180 for fname in fnames:
3181 3181 f = url.open(ui, fname)
3182 3182 gen = changegroup.readbundle(f, fname)
3183 3183 modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname)
3184 3184 finally:
3185 3185 lock.release()
3186 3186
3187 3187 return postincoming(ui, repo, modheads, opts.get('update'), None)
3188 3188
3189 3189 def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False):
3190 3190 """update working directory
3191 3191
3192 3192 Update the repository's working directory to the specified
3193 3193 changeset.
3194 3194
3195 3195 If no changeset is specified, attempt to update to the head of the
3196 3196 current branch. If this head is a descendant of the working
3197 3197 directory's parent, update to it, otherwise abort.
3198 3198
3199 3199 The following rules apply when the working directory contains
3200 3200 uncommitted changes:
3201 3201
3202 3202 1. If neither -c/--check nor -C/--clean is specified, and if
3203 3203 the requested changeset is an ancestor or descendant of
3204 3204 the working directory's parent, the uncommitted changes
3205 3205 are merged into the requested changeset and the merged
3206 3206 result is left uncommitted. If the requested changeset is
3207 3207 not an ancestor or descendant (that is, it is on another
3208 3208 branch), the update is aborted and the uncommitted changes
3209 3209 are preserved.
3210 3210
3211 3211 2. With the -c/--check option, the update is aborted and the
3212 3212 uncommitted changes are preserved.
3213 3213
3214 3214 3. With the -C/--clean option, uncommitted changes are discarded and
3215 3215 the working directory is updated to the requested changeset.
3216 3216
3217 3217 Use null as the changeset to remove the working directory (like 'hg
3218 3218 clone -U').
3219 3219
3220 3220 If you want to update just one file to an older changeset, use 'hg revert'.
3221 3221
3222 3222 See 'hg help dates' for a list of formats valid for -d/--date.
3223 3223 """
3224 3224 if rev and node:
3225 3225 raise util.Abort(_("please specify just one revision"))
3226 3226
3227 3227 if not rev:
3228 3228 rev = node
3229 3229
3230 3230 if check and clean:
3231 3231 raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
3232 3232
3233 3233 if check:
3234 3234 # we could use dirty() but we can ignore merge and branch trivia
3235 3235 c = repo[None]
3236 3236 if c.modified() or c.added() or c.removed():
3237 3237 raise util.Abort(_("uncommitted local changes"))
3238 3238
3239 3239 if date:
3240 3240 if rev:
3241 3241 raise util.Abort(_("you can't specify a revision and a date"))
3242 3242 rev = cmdutil.finddate(ui, repo, date)
3243 3243
3244 3244 if clean or check:
3245 3245 return hg.clean(repo, rev)
3246 3246 else:
3247 3247 return hg.update(repo, rev)
3248 3248
3249 3249 def verify(ui, repo):
3250 3250 """verify the integrity of the repository
3251 3251
3252 3252 Verify the integrity of the current repository.
3253 3253
3254 3254 This will perform an extensive check of the repository's
3255 3255 integrity, validating the hashes and checksums of each entry in
3256 3256 the changelog, manifest, and tracked files, as well as the
3257 3257 integrity of their crosslinks and indices.
3258 3258 """
3259 3259 return hg.verify(repo)
3260 3260
3261 3261 def version_(ui):
3262 3262 """output version and copyright information"""
3263 3263 ui.write(_("Mercurial Distributed SCM (version %s)\n")
3264 3264 % util.version())
3265 3265 ui.status(_(
3266 3266 "\nCopyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others\n"
3267 3267 "This is free software; see the source for copying conditions. "
3268 3268 "There is NO\nwarranty; "
3269 3269 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
3270 3270 ))
3271 3271
3272 3272 # Command options and aliases are listed here, alphabetically
3273 3273
3274 3274 globalopts = [
3275 3275 ('R', 'repository', '',
3276 3276 _('repository root directory or name of overlay bundle file')),
3277 3277 ('', 'cwd', '', _('change working directory')),
3278 3278 ('y', 'noninteractive', None,
3279 3279 _('do not prompt, assume \'yes\' for any required answers')),
3280 3280 ('q', 'quiet', None, _('suppress output')),
3281 3281 ('v', 'verbose', None, _('enable additional output')),
3282 3282 ('', 'config', [], _('set/override config option')),
3283 3283 ('', 'debug', None, _('enable debugging output')),
3284 3284 ('', 'debugger', None, _('start debugger')),
3285 3285 ('', 'encoding', encoding.encoding, _('set the charset encoding')),
3286 3286 ('', 'encodingmode', encoding.encodingmode,
3287 3287 _('set the charset encoding mode')),
3288 3288 ('', 'traceback', None, _('always print a traceback on exception')),
3289 3289 ('', 'time', None, _('time how long the command takes')),
3290 3290 ('', 'profile', None, _('print command execution profile')),
3291 3291 ('', 'version', None, _('output version information and exit')),
3292 3292 ('h', 'help', None, _('display help and exit')),
3293 3293 ]
3294 3294
3295 3295 dryrunopts = [('n', 'dry-run', None,
3296 3296 _('do not perform actions, just print output'))]
3297 3297
3298 3298 remoteopts = [
3299 3299 ('e', 'ssh', '', _('specify ssh command to use')),
3300 3300 ('', 'remotecmd', '', _('specify hg command to run on the remote side')),
3301 3301 ]
3302 3302
3303 3303 walkopts = [
3304 3304 ('I', 'include', [], _('include names matching the given patterns')),
3305 3305 ('X', 'exclude', [], _('exclude names matching the given patterns')),
3306 3306 ]
3307 3307
3308 3308 commitopts = [
3309 3309 ('m', 'message', '', _('use <text> as commit message')),
3310 3310 ('l', 'logfile', '', _('read commit message from <file>')),
3311 3311 ]
3312 3312
3313 3313 commitopts2 = [
3314 3314 ('d', 'date', '', _('record datecode as commit date')),
3315 3315 ('u', 'user', '', _('record the specified user as committer')),
3316 3316 ]
3317 3317
3318 3318 templateopts = [
3319 3319 ('', 'style', '', _('display using template map file')),
3320 3320 ('', 'template', '', _('display with template')),
3321 3321 ]
3322 3322
3323 3323 logopts = [
3324 3324 ('p', 'patch', None, _('show patch')),
3325 3325 ('g', 'git', None, _('use git extended diff format')),
3326 3326 ('l', 'limit', '', _('limit number of changes displayed')),
3327 3327 ('M', 'no-merges', None, _('do not show merges')),
3328 3328 ] + templateopts
3329 3329
3330 3330 diffopts = [
3331 3331 ('a', 'text', None, _('treat all files as text')),
3332 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 3336 diffopts2 = [
3337 3337 ('p', 'show-function', None, _('show which function each change is in')),
3338 3338 ('', 'reverse', None, _('produce a diff that undoes the changes')),
3339 3339 ('w', 'ignore-all-space', None,
3340 3340 _('ignore white space when comparing lines')),
3341 3341 ('b', 'ignore-space-change', None,
3342 3342 _('ignore changes in the amount of white space')),
3343 3343 ('B', 'ignore-blank-lines', None,
3344 3344 _('ignore changes whose lines are all blank')),
3345 3345 ('U', 'unified', '', _('number of lines of context to show')),
3346 3346 ('', 'stat', None, _('output diffstat-style summary of changes')),
3347 3347 ]
3348 3348
3349 3349 similarityopts = [
3350 3350 ('s', 'similarity', '',
3351 3351 _('guess renamed files by similarity (0<=s<=100)'))
3352 3352 ]
3353 3353
3354 3354 table = {
3355 3355 "^add": (add, walkopts + dryrunopts, _('[OPTION]... [FILE]...')),
3356 3356 "addremove":
3357 3357 (addremove, similarityopts + walkopts + dryrunopts,
3358 3358 _('[OPTION]... [FILE]...')),
3359 3359 "^annotate|blame":
3360 3360 (annotate,
3361 3361 [('r', 'rev', '', _('annotate the specified revision')),
3362 3362 ('', 'follow', None, _('follow copies and renames (DEPRECATED)')),
3363 3363 ('', 'no-follow', None, _("don't follow copies and renames")),
3364 3364 ('a', 'text', None, _('treat all files as text')),
3365 3365 ('u', 'user', None, _('list the author (long with -v)')),
3366 3366 ('f', 'file', None, _('list the filename')),
3367 3367 ('d', 'date', None, _('list the date (short with -q)')),
3368 3368 ('n', 'number', None, _('list the revision number (default)')),
3369 3369 ('c', 'changeset', None, _('list the changeset')),
3370 3370 ('l', 'line-number', None,
3371 3371 _('show line number at the first appearance'))
3372 3372 ] + walkopts,
3373 3373 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...')),
3374 3374 "archive":
3375 3375 (archive,
3376 3376 [('', 'no-decode', None, _('do not pass files through decoders')),
3377 3377 ('p', 'prefix', '', _('directory prefix for files in archive')),
3378 3378 ('r', 'rev', '', _('revision to distribute')),
3379 3379 ('t', 'type', '', _('type of distribution to create')),
3380 3380 ] + walkopts,
3381 3381 _('[OPTION]... DEST')),
3382 3382 "backout":
3383 3383 (backout,
3384 3384 [('', 'merge', None,
3385 3385 _('merge with old dirstate parent after backout')),
3386 3386 ('', 'parent', '', _('parent to choose when backing out merge')),
3387 3387 ('r', 'rev', '', _('revision to backout')),
3388 3388 ] + walkopts + commitopts + commitopts2,
3389 3389 _('[OPTION]... [-r] REV')),
3390 3390 "bisect":
3391 3391 (bisect,
3392 3392 [('r', 'reset', False, _('reset bisect state')),
3393 3393 ('g', 'good', False, _('mark changeset good')),
3394 3394 ('b', 'bad', False, _('mark changeset bad')),
3395 3395 ('s', 'skip', False, _('skip testing changeset')),
3396 3396 ('c', 'command', '', _('use command to check changeset state')),
3397 3397 ('U', 'noupdate', False, _('do not update to target'))],
3398 3398 _("[-gbsr] [-U] [-c CMD] [REV]")),
3399 3399 "branch":
3400 3400 (branch,
3401 3401 [('f', 'force', None,
3402 3402 _('set branch name even if it shadows an existing branch')),
3403 3403 ('C', 'clean', None, _('reset branch name to parent branch name'))],
3404 3404 _('[-fC] [NAME]')),
3405 3405 "branches":
3406 3406 (branches,
3407 3407 [('a', 'active', False,
3408 3408 _('show only branches that have unmerged heads')),
3409 3409 ('c', 'closed', False,
3410 3410 _('show normal and closed branches'))],
3411 3411 _('[-ac]')),
3412 3412 "bundle":
3413 3413 (bundle,
3414 3414 [('f', 'force', None,
3415 _('run even when remote repository is unrelated')),
3415 _('run even when the destination is unrelated')),
3416 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 3418 ('', 'base', [],
3419 _('a base changeset to specify instead of a destination')),
3419 _('a base changeset assumed to be available at the destination')),
3420 3420 ('a', 'all', None, _('bundle all changesets in the repository')),
3421 3421 ('t', 'type', 'bzip2', _('bundle compression type to use')),
3422 3422 ] + remoteopts,
3423 3423 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]')),
3424 3424 "cat":
3425 3425 (cat,
3426 3426 [('o', 'output', '', _('print output to file with formatted name')),
3427 3427 ('r', 'rev', '', _('print the given revision')),
3428 3428 ('', 'decode', None, _('apply any matching decode filter')),
3429 3429 ] + walkopts,
3430 3430 _('[OPTION]... FILE...')),
3431 3431 "^clone":
3432 3432 (clone,
3433 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 3435 ('u', 'updaterev', '',
3436 3436 _('revision, tag or branch to check out')),
3437 3437 ('r', 'rev', [],
3438 _('clone only the specified revisions and ancestors')),
3438 _('include the specified changeset')),
3439 3439 ('', 'pull', None, _('use pull protocol to copy metadata')),
3440 3440 ('', 'uncompressed', None,
3441 3441 _('use uncompressed transfer (fast over LAN)')),
3442 3442 ] + remoteopts,
3443 3443 _('[OPTION]... SOURCE [DEST]')),
3444 3444 "^commit|ci":
3445 3445 (commit,
3446 3446 [('A', 'addremove', None,
3447 3447 _('mark new/missing files as added/removed before committing')),
3448 3448 ('', 'close-branch', None,
3449 3449 _('mark a branch as closed, hiding it from the branch list')),
3450 3450 ] + walkopts + commitopts + commitopts2,
3451 3451 _('[OPTION]... [FILE]...')),
3452 3452 "copy|cp":
3453 3453 (copy,
3454 3454 [('A', 'after', None, _('record a copy that has already occurred')),
3455 3455 ('f', 'force', None,
3456 3456 _('forcibly copy over an existing managed file')),
3457 3457 ] + walkopts + dryrunopts,
3458 3458 _('[OPTION]... [SOURCE]... DEST')),
3459 3459 "debugancestor": (debugancestor, [], _('[INDEX] REV1 REV2')),
3460 3460 "debugcheckstate": (debugcheckstate, [], ''),
3461 3461 "debugcommands": (debugcommands, [], _('[COMMAND]')),
3462 3462 "debugcomplete":
3463 3463 (debugcomplete,
3464 3464 [('o', 'options', None, _('show the command options'))],
3465 3465 _('[-o] CMD')),
3466 3466 "debugdate":
3467 3467 (debugdate,
3468 3468 [('e', 'extended', None, _('try extended date formats'))],
3469 3469 _('[-e] DATE [RANGE]')),
3470 3470 "debugdata": (debugdata, [], _('FILE REV')),
3471 3471 "debugfsinfo": (debugfsinfo, [], _('[PATH]')),
3472 3472 "debugindex": (debugindex, [], _('FILE')),
3473 3473 "debugindexdot": (debugindexdot, [], _('FILE')),
3474 3474 "debuginstall": (debuginstall, [], ''),
3475 3475 "debugrebuildstate":
3476 3476 (debugrebuildstate,
3477 3477 [('r', 'rev', '', _('revision to rebuild to'))],
3478 3478 _('[-r REV] [REV]')),
3479 3479 "debugrename":
3480 3480 (debugrename,
3481 3481 [('r', 'rev', '', _('revision to debug'))],
3482 3482 _('[-r REV] FILE')),
3483 3483 "debugsetparents":
3484 3484 (debugsetparents, [], _('REV1 [REV2]')),
3485 3485 "debugstate":
3486 3486 (debugstate,
3487 3487 [('', 'nodates', None, _('do not display the saved mtime'))],
3488 3488 _('[OPTION]...')),
3489 3489 "debugsub":
3490 3490 (debugsub,
3491 3491 [('r', 'rev', '', _('revision to check'))],
3492 3492 _('[-r REV] [REV]')),
3493 3493 "debugwalk": (debugwalk, walkopts, _('[OPTION]... [FILE]...')),
3494 3494 "^diff":
3495 3495 (diff,
3496 3496 [('r', 'rev', [], _('revision')),
3497 3497 ('c', 'change', '', _('change made by revision'))
3498 3498 ] + diffopts + diffopts2 + walkopts,
3499 3499 _('[OPTION]... [-r REV1 [-r REV2]] [FILE]...')),
3500 3500 "^export":
3501 3501 (export,
3502 3502 [('o', 'output', '', _('print output to file with formatted name')),
3503 3503 ('', 'switch-parent', None, _('diff against the second parent')),
3504 3504 ('r', 'rev', [], _('revisions to export')),
3505 3505 ] + diffopts,
3506 3506 _('[OPTION]... [-o OUTFILESPEC] REV...')),
3507 3507 "^forget":
3508 3508 (forget,
3509 3509 [] + walkopts,
3510 3510 _('[OPTION]... FILE...')),
3511 3511 "grep":
3512 3512 (grep,
3513 3513 [('0', 'print0', None, _('end fields with NUL')),
3514 3514 ('', 'all', None, _('print all revisions that match')),
3515 3515 ('f', 'follow', None,
3516 3516 _('follow changeset history,'
3517 3517 ' or file history across copies and renames')),
3518 3518 ('i', 'ignore-case', None, _('ignore case when matching')),
3519 3519 ('l', 'files-with-matches', None,
3520 3520 _('print only filenames and revisions that match')),
3521 3521 ('n', 'line-number', None, _('print matching line numbers')),
3522 3522 ('r', 'rev', [], _('search in given revision range')),
3523 3523 ('u', 'user', None, _('list the author (long with -v)')),
3524 3524 ('d', 'date', None, _('list the date (short with -q)')),
3525 3525 ] + walkopts,
3526 3526 _('[OPTION]... PATTERN [FILE]...')),
3527 3527 "heads":
3528 3528 (heads,
3529 3529 [('r', 'rev', '', _('show only heads which are descendants of REV')),
3530 3530 ('t', 'topo', False, _('show topological heads only')),
3531 3531 ('a', 'active', False,
3532 3532 _('show active branchheads only [DEPRECATED]')),
3533 3533 ('c', 'closed', False,
3534 3534 _('show normal and closed branch heads')),
3535 3535 ] + templateopts,
3536 3536 _('[-ac] [-r STARTREV] [REV]...')),
3537 3537 "help": (help_, [], _('[TOPIC]')),
3538 3538 "identify|id":
3539 3539 (identify,
3540 3540 [('r', 'rev', '', _('identify the specified revision')),
3541 3541 ('n', 'num', None, _('show local revision number')),
3542 3542 ('i', 'id', None, _('show global revision id')),
3543 3543 ('b', 'branch', None, _('show branch')),
3544 3544 ('t', 'tags', None, _('show tags'))],
3545 3545 _('[-nibt] [-r REV] [SOURCE]')),
3546 3546 "import|patch":
3547 3547 (import_,
3548 3548 [('p', 'strip', 1,
3549 3549 _('directory strip option for patch. This has the same '
3550 3550 'meaning as the corresponding patch option')),
3551 3551 ('b', 'base', '', _('base path')),
3552 3552 ('f', 'force', None,
3553 3553 _('skip check for outstanding uncommitted changes')),
3554 3554 ('', 'no-commit', None,
3555 3555 _("don't commit, just update the working directory")),
3556 3556 ('', 'exact', None,
3557 3557 _('apply patch to the nodes from which it was generated')),
3558 3558 ('', 'import-branch', None,
3559 3559 _('use any branch information in patch (implied by --exact)'))] +
3560 3560 commitopts + commitopts2 + similarityopts,
3561 3561 _('[OPTION]... PATCH...')),
3562 3562 "incoming|in":
3563 3563 (incoming,
3564 3564 [('f', 'force', None,
3565 _('run even when remote repository is unrelated')),
3565 _('run even if remote repository is unrelated')),
3566 3566 ('n', 'newest-first', None, _('show newest record first')),
3567 3567 ('', 'bundle', '', _('file to store the bundles into')),
3568 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 3570 ] + logopts + remoteopts,
3571 3571 _('[-p] [-n] [-M] [-f] [-r REV]...'
3572 3572 ' [--bundle FILENAME] [SOURCE]')),
3573 3573 "^init":
3574 3574 (init,
3575 3575 remoteopts,
3576 3576 _('[-e CMD] [--remotecmd CMD] [DEST]')),
3577 3577 "locate":
3578 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 3580 ('0', 'print0', None,
3581 3581 _('end filenames with NUL, for use with xargs')),
3582 3582 ('f', 'fullpath', None,
3583 3583 _('print complete paths from the filesystem root')),
3584 3584 ] + walkopts,
3585 3585 _('[OPTION]... [PATTERN]...')),
3586 3586 "^log|history":
3587 3587 (log,
3588 3588 [('f', 'follow', None,
3589 3589 _('follow changeset history,'
3590 3590 ' or file history across copies and renames')),
3591 3591 ('', 'follow-first', None,
3592 3592 _('only follow the first parent of merge changesets')),
3593 3593 ('d', 'date', '', _('show revisions matching date spec')),
3594 3594 ('C', 'copies', None, _('show copied files')),
3595 3595 ('k', 'keyword', [], _('do case-insensitive search for a keyword')),
3596 3596 ('r', 'rev', [], _('show the specified revision or range')),
3597 3597 ('', 'removed', None, _('include revisions where files were removed')),
3598 3598 ('m', 'only-merges', None, _('show only merges')),
3599 3599 ('u', 'user', [], _('revisions committed by user')),
3600 3600 ('b', 'only-branch', [],
3601 3601 _('show only changesets within the given named branch')),
3602 3602 ('P', 'prune', [],
3603 3603 _('do not display revision or any of its ancestors')),
3604 3604 ] + logopts + walkopts,
3605 3605 _('[OPTION]... [FILE]')),
3606 3606 "manifest":
3607 3607 (manifest,
3608 3608 [('r', 'rev', '', _('revision to display'))],
3609 3609 _('[-r REV]')),
3610 3610 "^merge":
3611 3611 (merge,
3612 3612 [('f', 'force', None, _('force a merge with outstanding changes')),
3613 3613 ('r', 'rev', '', _('revision to merge')),
3614 3614 ('P', 'preview', None,
3615 3615 _('review revisions to merge (no merge is performed)'))],
3616 3616 _('[-P] [-f] [[-r] REV]')),
3617 3617 "outgoing|out":
3618 3618 (outgoing,
3619 3619 [('f', 'force', None,
3620 _('run even when remote repository is unrelated')),
3620 _('run even when the destination is unrelated')),
3621 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 3623 ('n', 'newest-first', None, _('show newest record first')),
3624 3624 ] + logopts + remoteopts,
3625 3625 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]')),
3626 3626 "parents":
3627 3627 (parents,
3628 [('r', 'rev', '', _('show parents from the specified revision')),
3628 [('r', 'rev', '', _('show parents of the specified revision')),
3629 3629 ] + templateopts,
3630 3630 _('[-r REV] [FILE]')),
3631 3631 "paths": (paths, [], _('[NAME]')),
3632 3632 "^pull":
3633 3633 (pull,
3634 3634 [('u', 'update', None,
3635 3635 _('update to new branch head if changesets were pulled')),
3636 3636 ('f', 'force', None,
3637 3637 _('run even when remote repository is unrelated')),
3638 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 3640 ] + remoteopts,
3641 3641 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]')),
3642 3642 "^push":
3643 3643 (push,
3644 3644 [('f', 'force', None, _('force push')),
3645 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 3647 ] + remoteopts,
3648 3648 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]')),
3649 3649 "recover": (recover, []),
3650 3650 "^remove|rm":
3651 3651 (remove,
3652 3652 [('A', 'after', None, _('record delete for missing files')),
3653 3653 ('f', 'force', None,
3654 3654 _('remove (and delete) file even if added or modified')),
3655 3655 ] + walkopts,
3656 3656 _('[OPTION]... FILE...')),
3657 3657 "rename|mv":
3658 3658 (rename,
3659 3659 [('A', 'after', None, _('record a rename that has already occurred')),
3660 3660 ('f', 'force', None,
3661 3661 _('forcibly copy over an existing managed file')),
3662 3662 ] + walkopts + dryrunopts,
3663 3663 _('[OPTION]... SOURCE... DEST')),
3664 3664 "resolve":
3665 3665 (resolve,
3666 3666 [('a', 'all', None, _('select all unresolved files')),
3667 3667 ('l', 'list', None, _('list state of files needing merge')),
3668 3668 ('m', 'mark', None, _('mark files as resolved')),
3669 3669 ('u', 'unmark', None, _('unmark files as resolved')),
3670 3670 ('n', 'no-status', None, _('hide status prefix'))]
3671 3671 + walkopts,
3672 3672 _('[OPTION]... [FILE]...')),
3673 3673 "revert":
3674 3674 (revert,
3675 3675 [('a', 'all', None, _('revert all changes when no arguments given')),
3676 3676 ('d', 'date', '', _('tipmost revision matching date')),
3677 ('r', 'rev', '', _('revision to revert to')),
3677 ('r', 'rev', '', _('revert to the specified revision')),
3678 3678 ('', 'no-backup', None, _('do not save backup copies of files')),
3679 3679 ] + walkopts + dryrunopts,
3680 3680 _('[OPTION]... [-r REV] [NAME]...')),
3681 3681 "rollback": (rollback, []),
3682 3682 "root": (root, []),
3683 3683 "^serve":
3684 3684 (serve,
3685 3685 [('A', 'accesslog', '', _('name of access log file to write to')),
3686 3686 ('d', 'daemon', None, _('run server in background')),
3687 3687 ('', 'daemon-pipefds', '', _('used internally by daemon mode')),
3688 3688 ('E', 'errorlog', '', _('name of error log file to write to')),
3689 3689 ('p', 'port', 0, _('port to listen on (default: 8000)')),
3690 3690 ('a', 'address', '',
3691 3691 _('address to listen on (default: all interfaces)')),
3692 3692 ('', 'prefix', '',
3693 3693 _('prefix path to serve from (default: server root)')),
3694 3694 ('n', 'name', '',
3695 3695 _('name to show in web pages (default: working directory)')),
3696 3696 ('', 'webdir-conf', '', _('name of the webdir config file'
3697 3697 ' (serve more than one repository)')),
3698 3698 ('', 'pid-file', '', _('name of file to write process ID to')),
3699 3699 ('', 'stdio', None, _('for remote clients')),
3700 3700 ('t', 'templates', '', _('web templates to use')),
3701 3701 ('', 'style', '', _('template style to use')),
3702 3702 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
3703 3703 ('', 'certificate', '', _('SSL certificate file'))],
3704 3704 _('[OPTION]...')),
3705 3705 "showconfig|debugconfig":
3706 3706 (showconfig,
3707 3707 [('u', 'untrusted', None, _('show untrusted configuration options'))],
3708 3708 _('[-u] [NAME]...')),
3709 3709 "^summary|sum":
3710 3710 (summary,
3711 3711 [('', 'remote', None, _('check for push and pull'))], '[--remote]'),
3712 3712 "^status|st":
3713 3713 (status,
3714 3714 [('A', 'all', None, _('show status of all files')),
3715 3715 ('m', 'modified', None, _('show only modified files')),
3716 3716 ('a', 'added', None, _('show only added files')),
3717 3717 ('r', 'removed', None, _('show only removed files')),
3718 3718 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
3719 3719 ('c', 'clean', None, _('show only files without changes')),
3720 3720 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
3721 3721 ('i', 'ignored', None, _('show only ignored files')),
3722 3722 ('n', 'no-status', None, _('hide status prefix')),
3723 3723 ('C', 'copies', None, _('show source of copied files')),
3724 3724 ('0', 'print0', None,
3725 3725 _('end filenames with NUL, for use with xargs')),
3726 3726 ('', 'rev', [], _('show difference from revision')),
3727 3727 ('', 'change', '', _('list the changed files of a revision')),
3728 3728 ] + walkopts,
3729 3729 _('[OPTION]... [FILE]...')),
3730 3730 "tag":
3731 3731 (tag,
3732 3732 [('f', 'force', None, _('replace existing tag')),
3733 3733 ('l', 'local', None, _('make the tag local')),
3734 3734 ('r', 'rev', '', _('revision to tag')),
3735 3735 ('', 'remove', None, _('remove a tag')),
3736 3736 # -l/--local is already there, commitopts cannot be used
3737 3737 ('m', 'message', '', _('use <text> as commit message')),
3738 3738 ] + commitopts2,
3739 3739 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...')),
3740 3740 "tags": (tags, [], ''),
3741 3741 "tip":
3742 3742 (tip,
3743 3743 [('p', 'patch', None, _('show patch')),
3744 3744 ('g', 'git', None, _('use git extended diff format')),
3745 3745 ] + templateopts,
3746 3746 _('[-p] [-g]')),
3747 3747 "unbundle":
3748 3748 (unbundle,
3749 3749 [('u', 'update', None,
3750 3750 _('update to new branch head if changesets were unbundled'))],
3751 3751 _('[-u] FILE...')),
3752 3752 "^update|up|checkout|co":
3753 3753 (update,
3754 3754 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
3755 3755 ('c', 'check', None, _('check for uncommitted changes')),
3756 3756 ('d', 'date', '', _('tipmost revision matching date')),
3757 3757 ('r', 'rev', '', _('revision'))],
3758 3758 _('[-c] [-C] [-d DATE] [[-r] REV]')),
3759 3759 "verify": (verify, []),
3760 3760 "version": (version_, []),
3761 3761 }
3762 3762
3763 3763 norepo = ("clone init version help debugcommands debugcomplete debugdata"
3764 3764 " debugindex debugindexdot debugdate debuginstall debugfsinfo")
3765 3765 optionalrepo = ("identify paths serve showconfig debugancestor")
@@ -1,582 +1,582
1 1 Mercurial Distributed SCM
2 2
3 3 basic commands:
4 4
5 5 add add the specified files on the next commit
6 6 annotate show changeset information by line for each file
7 7 clone make a copy of an existing repository
8 8 commit commit the specified files or all outstanding changes
9 9 diff diff repository (or selected files)
10 10 export dump the header and diffs for one or more changesets
11 11 forget forget the specified files on the next commit
12 12 init create a new repository in the given directory
13 13 log show revision history of entire repository or files
14 14 merge merge working directory with another revision
15 15 pull pull changes from the specified source
16 16 push push changes to the specified destination
17 17 remove remove the specified files on the next commit
18 18 serve export the repository via HTTP
19 19 status show changed files in the working directory
20 20 summary summarize working directory state
21 21 update update working directory
22 22
23 23 use "hg help" for the full list of commands or "hg -v" for details
24 24 add add the specified files on the next commit
25 25 annotate show changeset information by line for each file
26 26 clone make a copy of an existing repository
27 27 commit commit the specified files or all outstanding changes
28 28 diff diff repository (or selected files)
29 29 export dump the header and diffs for one or more changesets
30 30 forget forget the specified files on the next commit
31 31 init create a new repository in the given directory
32 32 log show revision history of entire repository or files
33 33 merge merge working directory with another revision
34 34 pull pull changes from the specified source
35 35 push push changes to the specified destination
36 36 remove remove the specified files on the next commit
37 37 serve export the repository via HTTP
38 38 status show changed files in the working directory
39 39 summary summarize working directory state
40 40 update update working directory
41 41 Mercurial Distributed SCM
42 42
43 43 list of commands:
44 44
45 45 add add the specified files on the next commit
46 46 addremove add all new files, delete all missing files
47 47 annotate show changeset information by line for each file
48 48 archive create an unversioned archive of a repository revision
49 49 backout reverse effect of earlier changeset
50 50 bisect subdivision search of changesets
51 51 branch set or show the current branch name
52 52 branches list repository named branches
53 53 bundle create a changegroup file
54 54 cat output the current or given revision of files
55 55 clone make a copy of an existing repository
56 56 commit commit the specified files or all outstanding changes
57 57 copy mark files as copied for the next commit
58 58 diff diff repository (or selected files)
59 59 export dump the header and diffs for one or more changesets
60 60 forget forget the specified files on the next commit
61 61 grep search for a pattern in specified files and revisions
62 62 heads show current repository heads or show branch heads
63 63 help show help for a given topic or a help overview
64 64 identify identify the working copy or specified revision
65 65 import import an ordered set of patches
66 66 incoming show new changesets found in source
67 67 init create a new repository in the given directory
68 68 locate locate files matching specific patterns
69 69 log show revision history of entire repository or files
70 70 manifest output the current or given revision of the project manifest
71 71 merge merge working directory with another revision
72 72 outgoing show changesets not found in destination
73 73 parents show the parents of the working directory or revision
74 74 paths show aliases for remote repositories
75 75 pull pull changes from the specified source
76 76 push push changes to the specified destination
77 77 recover roll back an interrupted transaction
78 78 remove remove the specified files on the next commit
79 79 rename rename files; equivalent of copy + remove
80 80 resolve retry file merges from a merge or update
81 81 revert restore individual files or directories to an earlier state
82 82 rollback roll back the last transaction
83 83 root print the root (top) of the current working directory
84 84 serve export the repository via HTTP
85 85 showconfig show combined config settings from all hgrc files
86 86 status show changed files in the working directory
87 87 summary summarize working directory state
88 88 tag add one or more tags for the current or given revision
89 89 tags list repository tags
90 90 tip show the tip revision
91 91 unbundle apply one or more changegroup files
92 92 update update working directory
93 93 verify verify the integrity of the repository
94 94 version output version and copyright information
95 95
96 96 additional help topics:
97 97
98 98 config Configuration Files
99 99 dates Date Formats
100 100 patterns File Name Patterns
101 101 environment Environment Variables
102 102 revisions Specifying Single Revisions
103 103 multirevs Specifying Multiple Revisions
104 104 diffs Diff Formats
105 105 templating Template Usage
106 106 urls URL Paths
107 107 extensions Using additional features
108 108
109 109 use "hg -v help" to show aliases and global options
110 110 add add the specified files on the next commit
111 111 addremove add all new files, delete all missing files
112 112 annotate show changeset information by line for each file
113 113 archive create an unversioned archive of a repository revision
114 114 backout reverse effect of earlier changeset
115 115 bisect subdivision search of changesets
116 116 branch set or show the current branch name
117 117 branches list repository named branches
118 118 bundle create a changegroup file
119 119 cat output the current or given revision of files
120 120 clone make a copy of an existing repository
121 121 commit commit the specified files or all outstanding changes
122 122 copy mark files as copied for the next commit
123 123 diff diff repository (or selected files)
124 124 export dump the header and diffs for one or more changesets
125 125 forget forget the specified files on the next commit
126 126 grep search for a pattern in specified files and revisions
127 127 heads show current repository heads or show branch heads
128 128 help show help for a given topic or a help overview
129 129 identify identify the working copy or specified revision
130 130 import import an ordered set of patches
131 131 incoming show new changesets found in source
132 132 init create a new repository in the given directory
133 133 locate locate files matching specific patterns
134 134 log show revision history of entire repository or files
135 135 manifest output the current or given revision of the project manifest
136 136 merge merge working directory with another revision
137 137 outgoing show changesets not found in destination
138 138 parents show the parents of the working directory or revision
139 139 paths show aliases for remote repositories
140 140 pull pull changes from the specified source
141 141 push push changes to the specified destination
142 142 recover roll back an interrupted transaction
143 143 remove remove the specified files on the next commit
144 144 rename rename files; equivalent of copy + remove
145 145 resolve retry file merges from a merge or update
146 146 revert restore individual files or directories to an earlier state
147 147 rollback roll back the last transaction
148 148 root print the root (top) of the current working directory
149 149 serve export the repository via HTTP
150 150 showconfig show combined config settings from all hgrc files
151 151 status show changed files in the working directory
152 152 summary summarize working directory state
153 153 tag add one or more tags for the current or given revision
154 154 tags list repository tags
155 155 tip show the tip revision
156 156 unbundle apply one or more changegroup files
157 157 update update working directory
158 158 verify verify the integrity of the repository
159 159 version output version and copyright information
160 160
161 161 additional help topics:
162 162
163 163 config Configuration Files
164 164 dates Date Formats
165 165 patterns File Name Patterns
166 166 environment Environment Variables
167 167 revisions Specifying Single Revisions
168 168 multirevs Specifying Multiple Revisions
169 169 diffs Diff Formats
170 170 templating Template Usage
171 171 urls URL Paths
172 172 extensions Using additional features
173 173 %% test short command list with verbose option
174 174 Mercurial Distributed SCM (version xxx)
175 175
176 176 Copyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others
177 177 This is free software; see the source for copying conditions. There is NO
178 178 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
179 179
180 180 basic commands:
181 181
182 182 add:
183 183 add the specified files on the next commit
184 184 annotate, blame:
185 185 show changeset information by line for each file
186 186 clone:
187 187 make a copy of an existing repository
188 188 commit, ci:
189 189 commit the specified files or all outstanding changes
190 190 diff:
191 191 diff repository (or selected files)
192 192 export:
193 193 dump the header and diffs for one or more changesets
194 194 forget:
195 195 forget the specified files on the next commit
196 196 init:
197 197 create a new repository in the given directory
198 198 log, history:
199 199 show revision history of entire repository or files
200 200 merge:
201 201 merge working directory with another revision
202 202 pull:
203 203 pull changes from the specified source
204 204 push:
205 205 push changes to the specified destination
206 206 remove, rm:
207 207 remove the specified files on the next commit
208 208 serve:
209 209 export the repository via HTTP
210 210 status, st:
211 211 show changed files in the working directory
212 212 summary, sum:
213 213 summarize working directory state
214 214 update, up, checkout, co:
215 215 update working directory
216 216
217 217 global options:
218 218 -R --repository repository root directory or name of overlay bundle file
219 219 --cwd change working directory
220 220 -y --noninteractive do not prompt, assume 'yes' for any required answers
221 221 -q --quiet suppress output
222 222 -v --verbose enable additional output
223 223 --config set/override config option
224 224 --debug enable debugging output
225 225 --debugger start debugger
226 226 --encoding set the charset encoding (default: ascii)
227 227 --encodingmode set the charset encoding mode (default: strict)
228 228 --traceback always print a traceback on exception
229 229 --time time how long the command takes
230 230 --profile print command execution profile
231 231 --version output version information and exit
232 232 -h --help display help and exit
233 233
234 234 use "hg help" for the full list of commands
235 235 hg add [OPTION]... [FILE]...
236 236
237 237 add the specified files on the next commit
238 238
239 239 Schedule files to be version controlled and added to the repository.
240 240
241 241 The files will be added to the repository at the next commit. To undo an
242 242 add before that, see hg forget.
243 243
244 244 If no names are given, add all files to the repository.
245 245
246 246 options:
247 247
248 248 -I --include include names matching the given patterns
249 249 -X --exclude exclude names matching the given patterns
250 250 -n --dry-run do not perform actions, just print output
251 251
252 252 use "hg -v help add" to show global options
253 253 %% test help option with version option
254 254 Mercurial Distributed SCM (version xxx)
255 255
256 256 Copyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others
257 257 This is free software; see the source for copying conditions. There is NO
258 258 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
259 259
260 260 hg add [OPTION]... [FILE]...
261 261
262 262 add the specified files on the next commit
263 263
264 264 Schedule files to be version controlled and added to the repository.
265 265
266 266 The files will be added to the repository at the next commit. To undo an
267 267 add before that, see hg forget.
268 268
269 269 If no names are given, add all files to the repository.
270 270
271 271 options:
272 272
273 273 -I --include include names matching the given patterns
274 274 -X --exclude exclude names matching the given patterns
275 275 -n --dry-run do not perform actions, just print output
276 276
277 277 use "hg -v help add" to show global options
278 278 hg add: option --skjdfks not recognized
279 279 hg add [OPTION]... [FILE]...
280 280
281 281 add the specified files on the next commit
282 282
283 283 Schedule files to be version controlled and added to the repository.
284 284
285 285 The files will be added to the repository at the next commit. To undo an
286 286 add before that, see hg forget.
287 287
288 288 If no names are given, add all files to the repository.
289 289
290 290 options:
291 291
292 292 -I --include include names matching the given patterns
293 293 -X --exclude exclude names matching the given patterns
294 294 -n --dry-run do not perform actions, just print output
295 295
296 296 use "hg -v help add" to show global options
297 297 %% test ambiguous command help
298 298 list of commands:
299 299
300 300 add add the specified files on the next commit
301 301 addremove add all new files, delete all missing files
302 302
303 303 use "hg -v help ad" to show aliases and global options
304 304 %% test command without options
305 305 hg verify
306 306
307 307 verify the integrity of the repository
308 308
309 309 Verify the integrity of the current repository.
310 310
311 311 This will perform an extensive check of the repository's integrity,
312 312 validating the hashes and checksums of each entry in the changelog,
313 313 manifest, and tracked files, as well as the integrity of their crosslinks
314 314 and indices.
315 315
316 316 use "hg -v help verify" to show global options
317 317 hg diff [OPTION]... [-r REV1 [-r REV2]] [FILE]...
318 318
319 319 diff repository (or selected files)
320 320
321 321 Show differences between revisions for the specified files.
322 322
323 323 Differences between files are shown using the unified diff format.
324 324
325 325 NOTE: diff may generate unexpected results for merges, as it will default
326 326 to comparing against the working directory's first parent changeset if no
327 327 revisions are specified.
328 328
329 329 When two revision arguments are given, then changes are shown between
330 330 those revisions. If only one revision is specified then that revision is
331 331 compared to the working directory, and, when no revisions are specified,
332 332 the working directory files are compared to its parent.
333 333
334 334 Without the -a/--text option, diff will avoid generating diffs of files it
335 335 detects as binary. With -a, diff will generate a diff anyway, probably
336 336 with undesirable results.
337 337
338 338 Use the -g/--git option to generate diffs in the git extended diff format.
339 339 For more information, read 'hg help diffs'.
340 340
341 341 options:
342 342
343 343 -r --rev revision
344 344 -c --change change made by revision
345 345 -a --text treat all files as text
346 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 348 -p --show-function show which function each change is in
349 349 --reverse produce a diff that undoes the changes
350 350 -w --ignore-all-space ignore white space when comparing lines
351 351 -b --ignore-space-change ignore changes in the amount of white space
352 352 -B --ignore-blank-lines ignore changes whose lines are all blank
353 353 -U --unified number of lines of context to show
354 354 --stat output diffstat-style summary of changes
355 355 -I --include include names matching the given patterns
356 356 -X --exclude exclude names matching the given patterns
357 357
358 358 use "hg -v help diff" to show global options
359 359 hg status [OPTION]... [FILE]...
360 360
361 361 aliases: st
362 362
363 363 show changed files in the working directory
364 364
365 365 Show status of files in the repository. If names are given, only files
366 366 that match are shown. Files that are clean or ignored or the source of a
367 367 copy/move operation, are not listed unless -c/--clean, -i/--ignored,
368 368 -C/--copies or -A/--all are given. Unless options described with "show
369 369 only ..." are given, the options -mardu are used.
370 370
371 371 Option -q/--quiet hides untracked (unknown and ignored) files unless
372 372 explicitly requested with -u/--unknown or -i/--ignored.
373 373
374 374 NOTE: status may appear to disagree with diff if permissions have changed
375 375 or a merge has occurred. The standard diff format does not report
376 376 permission changes and diff only reports changes relative to one merge
377 377 parent.
378 378
379 379 If one revision is given, it is used as the base revision. If two
380 380 revisions are given, the differences between them are shown. The --change
381 381 option can also be used as a shortcut to list the changed files of a
382 382 revision from its first parent.
383 383
384 384 The codes used to show the status of files are:
385 385
386 386 M = modified
387 387 A = added
388 388 R = removed
389 389 C = clean
390 390 ! = missing (deleted by non-hg command, but still tracked)
391 391 ? = not tracked
392 392 I = ignored
393 393 = origin of the previous file listed as A (added)
394 394
395 395 options:
396 396
397 397 -A --all show status of all files
398 398 -m --modified show only modified files
399 399 -a --added show only added files
400 400 -r --removed show only removed files
401 401 -d --deleted show only deleted (but tracked) files
402 402 -c --clean show only files without changes
403 403 -u --unknown show only unknown (not tracked) files
404 404 -i --ignored show only ignored files
405 405 -n --no-status hide status prefix
406 406 -C --copies show source of copied files
407 407 -0 --print0 end filenames with NUL, for use with xargs
408 408 --rev show difference from revision
409 409 --change list the changed files of a revision
410 410 -I --include include names matching the given patterns
411 411 -X --exclude exclude names matching the given patterns
412 412
413 413 use "hg -v help status" to show global options
414 414 hg status [OPTION]... [FILE]...
415 415
416 416 show changed files in the working directory
417 417 hg: unknown command 'foo'
418 418 Mercurial Distributed SCM
419 419
420 420 basic commands:
421 421
422 422 add add the specified files on the next commit
423 423 annotate show changeset information by line for each file
424 424 clone make a copy of an existing repository
425 425 commit commit the specified files or all outstanding changes
426 426 diff diff repository (or selected files)
427 427 export dump the header and diffs for one or more changesets
428 428 forget forget the specified files on the next commit
429 429 init create a new repository in the given directory
430 430 log show revision history of entire repository or files
431 431 merge merge working directory with another revision
432 432 pull pull changes from the specified source
433 433 push push changes to the specified destination
434 434 remove remove the specified files on the next commit
435 435 serve export the repository via HTTP
436 436 status show changed files in the working directory
437 437 summary summarize working directory state
438 438 update update working directory
439 439
440 440 use "hg help" for the full list of commands or "hg -v" for details
441 441 hg: unknown command 'skjdfks'
442 442 Mercurial Distributed SCM
443 443
444 444 basic commands:
445 445
446 446 add add the specified files on the next commit
447 447 annotate show changeset information by line for each file
448 448 clone make a copy of an existing repository
449 449 commit commit the specified files or all outstanding changes
450 450 diff diff repository (or selected files)
451 451 export dump the header and diffs for one or more changesets
452 452 forget forget the specified files on the next commit
453 453 init create a new repository in the given directory
454 454 log show revision history of entire repository or files
455 455 merge merge working directory with another revision
456 456 pull pull changes from the specified source
457 457 push push changes to the specified destination
458 458 remove remove the specified files on the next commit
459 459 serve export the repository via HTTP
460 460 status show changed files in the working directory
461 461 summary summarize working directory state
462 462 update update working directory
463 463
464 464 use "hg help" for the full list of commands or "hg -v" for details
465 465 %% test command with no help text
466 466 hg nohelp
467 467
468 468 (no help text available)
469 469
470 470 use "hg -v help nohelp" to show global options
471 471 %% test that default list of commands omits extension commands
472 472 Mercurial Distributed SCM
473 473
474 474 list of commands:
475 475
476 476 add add the specified files on the next commit
477 477 addremove add all new files, delete all missing files
478 478 annotate show changeset information by line for each file
479 479 archive create an unversioned archive of a repository revision
480 480 backout reverse effect of earlier changeset
481 481 bisect subdivision search of changesets
482 482 branch set or show the current branch name
483 483 branches list repository named branches
484 484 bundle create a changegroup file
485 485 cat output the current or given revision of files
486 486 clone make a copy of an existing repository
487 487 commit commit the specified files or all outstanding changes
488 488 copy mark files as copied for the next commit
489 489 diff diff repository (or selected files)
490 490 export dump the header and diffs for one or more changesets
491 491 forget forget the specified files on the next commit
492 492 grep search for a pattern in specified files and revisions
493 493 heads show current repository heads or show branch heads
494 494 help show help for a given topic or a help overview
495 495 identify identify the working copy or specified revision
496 496 import import an ordered set of patches
497 497 incoming show new changesets found in source
498 498 init create a new repository in the given directory
499 499 locate locate files matching specific patterns
500 500 log show revision history of entire repository or files
501 501 manifest output the current or given revision of the project manifest
502 502 merge merge working directory with another revision
503 503 outgoing show changesets not found in destination
504 504 parents show the parents of the working directory or revision
505 505 paths show aliases for remote repositories
506 506 pull pull changes from the specified source
507 507 push push changes to the specified destination
508 508 recover roll back an interrupted transaction
509 509 remove remove the specified files on the next commit
510 510 rename rename files; equivalent of copy + remove
511 511 resolve retry file merges from a merge or update
512 512 revert restore individual files or directories to an earlier state
513 513 rollback roll back the last transaction
514 514 root print the root (top) of the current working directory
515 515 serve export the repository via HTTP
516 516 showconfig show combined config settings from all hgrc files
517 517 status show changed files in the working directory
518 518 summary summarize working directory state
519 519 tag add one or more tags for the current or given revision
520 520 tags list repository tags
521 521 tip show the tip revision
522 522 unbundle apply one or more changegroup files
523 523 update update working directory
524 524 verify verify the integrity of the repository
525 525 version output version and copyright information
526 526
527 527 enabled extensions:
528 528
529 529 helpext (no help text available)
530 530
531 531 additional help topics:
532 532
533 533 config Configuration Files
534 534 dates Date Formats
535 535 patterns File Name Patterns
536 536 environment Environment Variables
537 537 revisions Specifying Single Revisions
538 538 multirevs Specifying Multiple Revisions
539 539 diffs Diff Formats
540 540 templating Template Usage
541 541 urls URL Paths
542 542 extensions Using additional features
543 543
544 544 use "hg -v help" to show aliases and global options
545 545 %% test list of commands with command with no help text
546 546 helpext extension - no help text available
547 547
548 548 list of commands:
549 549
550 550 nohelp (no help text available)
551 551
552 552 use "hg -v help helpext" to show aliases and global options
553 553 %% test a help topic
554 554 Specifying Single Revisions
555 555
556 556 Mercurial supports several ways to specify individual revisions.
557 557
558 558 A plain integer is treated as a revision number. Negative integers are
559 559 treated as sequential offsets from the tip, with -1 denoting the tip, -2
560 560 denoting the revision prior to the tip, and so forth.
561 561
562 562 A 40-digit hexadecimal string is treated as a unique revision identifier.
563 563
564 564 A hexadecimal string less than 40 characters long is treated as a unique
565 565 revision identifier and is referred to as a short-form identifier. A
566 566 short-form identifier is only valid if it is the prefix of exactly one
567 567 full-length identifier.
568 568
569 569 Any other string is treated as a tag or branch name. A tag name is a
570 570 symbolic name associated with a revision identifier. A branch name denotes
571 571 the tipmost revision of that branch. Tag and branch names must not contain
572 572 the ":" character.
573 573
574 574 The reserved name "tip" is a special tag that always identifies the most
575 575 recent revision.
576 576
577 577 The reserved name "null" indicates the null revision. This is the revision
578 578 of an empty repository, and the parent of revision 0.
579 579
580 580 The reserved name "." indicates the working directory parent. If no
581 581 working directory is checked out, it is equivalent to null. If an
582 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