annotate mercurial/cmdutil.py @ 38429:32fba6fe893d

scmutil: make cleanupnodes optionally also fix the phase We have had multiple bugs where the phase wasn't correctly carried forward to a rewritten changeset (for example: phabricator, split, evolve, fix). Handling the phase update in cleanupnodes() makes it less likely to happen again, especially once we have made it fix the phase by default (perhaps in the next release cycle). This patch also updates all applicable callers so we get some testing of it. Note that rebase and histedit can't be fixed yet because they call cleanupnodes() only at the end and the phase may have been changed by the user when the rebase/histedit was interrupted (due to merge conflicts). I think we should make them write one commit at a time (as it already does), along with associated obsmarkers, bookmark moves, etc. When that's done, we can switch them over to cleanupnodes(). Differential Revision: https://phab.mercurial-scm.org/D3818
author Martin von Zweigbergk <martinvonz@google.com>
date Tue, 19 Jun 2018 11:07:40 -0700
parents ef692614e601
children 8459e8d2f729
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2957
6e062d9b188f fix comment.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2885
diff changeset
1 # cmdutil.py - help for command processing in mercurial
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
2 #
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8210
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10249
diff changeset
6 # GNU General Public License version 2 or any later version.
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
7
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
8 from __future__ import absolute_import
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
9
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
10 import errno
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
11 import os
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
12 import re
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
13
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
14 from .i18n import _
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
15 from .node import (
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
16 hex,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
17 nullid,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
18 nullrev,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
19 short,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
20 )
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
21
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
22 from . import (
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
23 bookmarks,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
24 changelog,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
25 copies,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
26 crecord as crecordmod,
33616
5ac845ca059a commit: don't let failed commit with --addremove update dirstate (issue5645)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33548
diff changeset
27 dirstateguard,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
28 encoding,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
29 error,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
30 formatter,
35925
7625b4f7db70 cmdutil: split functions of log-like commands to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35914
diff changeset
31 logcmdutil,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
32 match as matchmod,
36048
46a54de96a54 merge: cut import cycle at merge -> extensions
Yuya Nishihara <yuya@tcha.org>
parents: 36047
diff changeset
33 merge as mergemod,
35853
eeb87b24aea7 amend: abort if unresolved merge conflicts found (issue5805)
Yuya Nishihara <yuya@tcha.org>
parents: 35746
diff changeset
34 mergeutil,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
35 obsolete,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
36 patch,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
37 pathutil,
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
38 phases,
30528
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30515
diff changeset
39 pycompat,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
40 revlog,
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
41 rewriteutil,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
42 scmutil,
31043
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30909
diff changeset
43 smartset,
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35993
diff changeset
44 subrepoutil,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
45 templatekw,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
46 templater,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
47 util,
31247
1b08aca7870a vfs: use 'vfs' module directly in 'mercurial.cmdutil'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31226
diff changeset
48 vfs as vfsmod,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
49 )
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
50
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
51 from .utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
52 dateutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
53 stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
54 )
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
55
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28837
diff changeset
56 stringio = util.stringio
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
57
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
58 # templates of common command options
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
59
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
60 dryrunopts = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
61 ('n', 'dry-run', None,
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
62 _('do not perform actions, just print output')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
63 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
64
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
65 remoteopts = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
66 ('e', 'ssh', '',
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
67 _('specify ssh command to use'), _('CMD')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
68 ('', 'remotecmd', '',
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
69 _('specify hg command to run on the remote side'), _('CMD')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
70 ('', 'insecure', None,
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
71 _('do not verify server certificate (ignoring web.cacerts config)')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
72 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
73
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
74 walkopts = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
75 ('I', 'include', [],
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
76 _('include names matching the given patterns'), _('PATTERN')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
77 ('X', 'exclude', [],
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
78 _('exclude names matching the given patterns'), _('PATTERN')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
79 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
80
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
81 commitopts = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
82 ('m', 'message', '',
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
83 _('use text as commit message'), _('TEXT')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
84 ('l', 'logfile', '',
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
85 _('read commit message from file'), _('FILE')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
86 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
87
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
88 commitopts2 = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
89 ('d', 'date', '',
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
90 _('record the specified date as commit date'), _('DATE')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
91 ('u', 'user', '',
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
92 _('record the specified user as committer'), _('USER')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
93 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
94
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
95 # hidden for now
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
96 formatteropts = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
97 ('T', 'template', '',
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
98 _('display with template (EXPERIMENTAL)'), _('TEMPLATE')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
99 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
100
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
101 templateopts = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
102 ('', 'style', '',
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
103 _('display using template map file (DEPRECATED)'), _('STYLE')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
104 ('T', 'template', '',
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
105 _('display with template'), _('TEMPLATE')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
106 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
107
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
108 logopts = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
109 ('p', 'patch', None, _('show patch')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
110 ('g', 'git', None, _('use git extended diff format')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
111 ('l', 'limit', '',
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
112 _('limit number of changes displayed'), _('NUM')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
113 ('M', 'no-merges', None, _('do not show merges')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
114 ('', 'stat', None, _('output diffstat-style summary of changes')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
115 ('G', 'graph', None, _("show the revision DAG")),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
116 ] + templateopts
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
117
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
118 diffopts = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
119 ('a', 'text', None, _('treat all files as text')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
120 ('g', 'git', None, _('use git extended diff format')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
121 ('', 'binary', None, _('generate binary diffs in git mode (default)')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
122 ('', 'nodates', None, _('omit dates from diff headers'))
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
123 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
124
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
125 diffwsopts = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
126 ('w', 'ignore-all-space', None,
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
127 _('ignore white space when comparing lines')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
128 ('b', 'ignore-space-change', None,
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
129 _('ignore changes in the amount of white space')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
130 ('B', 'ignore-blank-lines', None,
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
131 _('ignore changes whose lines are all blank')),
34031
da07367d683b mdiff: add a --ignore-space-at-eol option
David Soria Parra <davidsp@fb.com>
parents: 34019
diff changeset
132 ('Z', 'ignore-space-at-eol', None,
da07367d683b mdiff: add a --ignore-space-at-eol option
David Soria Parra <davidsp@fb.com>
parents: 34019
diff changeset
133 _('ignore changes in whitespace at EOL')),
32414
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
134 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
135
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
136 diffopts2 = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
137 ('', 'noprefix', None, _('omit a/ and b/ prefixes from filenames')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
138 ('p', 'show-function', None, _('show which function each change is in')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
139 ('', 'reverse', None, _('produce a diff that undoes the changes')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
140 ] + diffwsopts + [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
141 ('U', 'unified', '',
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
142 _('number of lines of context to show'), _('NUM')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
143 ('', 'stat', None, _('output diffstat-style summary of changes')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
144 ('', 'root', '', _('produce diffs relative to subdirectory'), _('DIR')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
145 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
146
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
147 mergetoolopts = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
148 ('t', 'tool', '', _('specify merge tool')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
149 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
150
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
151 similarityopts = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
152 ('s', 'similarity', '',
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
153 _('guess renamed files by similarity (0<=s<=100)'), _('SIMILARITY'))
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
154 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
155
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
156 subrepoopts = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
157 ('S', 'subrepos', None,
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
158 _('recurse into subrepositories'))
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
159 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
160
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
161 debugrevlogopts = [
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
162 ('c', 'changelog', False, _('open changelog')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
163 ('m', 'manifest', False, _('open manifest')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
164 ('', 'dir', '', _('open directory manifest')),
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
165 ]
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32401
diff changeset
166
30703
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
167 # special string such that everything below this line will be ingored in the
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
168 # editor text
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
169 _linebelow = "^HG: ------------------------ >8 ------------------------$"
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
170
25256
5a8398b085ed record: extract ishunk to a function
Laurent Charignon <lcharignon@fb.com>
parents: 25228
diff changeset
171 def ishunk(x):
5a8398b085ed record: extract ishunk to a function
Laurent Charignon <lcharignon@fb.com>
parents: 25228
diff changeset
172 hunkclasses = (crecordmod.uihunk, patch.recordhunk)
5a8398b085ed record: extract ishunk to a function
Laurent Charignon <lcharignon@fb.com>
parents: 25228
diff changeset
173 return isinstance(x, hunkclasses)
5a8398b085ed record: extract ishunk to a function
Laurent Charignon <lcharignon@fb.com>
parents: 25228
diff changeset
174
25257
07326d76f19d record: extract code to compute newly added and modified files
Laurent Charignon <lcharignon@fb.com>
parents: 25256
diff changeset
175 def newandmodified(chunks, originalchunks):
07326d76f19d record: extract code to compute newly added and modified files
Laurent Charignon <lcharignon@fb.com>
parents: 25256
diff changeset
176 newlyaddedandmodifiedfiles = set()
07326d76f19d record: extract code to compute newly added and modified files
Laurent Charignon <lcharignon@fb.com>
parents: 25256
diff changeset
177 for chunk in chunks:
07326d76f19d record: extract code to compute newly added and modified files
Laurent Charignon <lcharignon@fb.com>
parents: 25256
diff changeset
178 if ishunk(chunk) and chunk.header.isnewfile() and chunk not in \
07326d76f19d record: extract code to compute newly added and modified files
Laurent Charignon <lcharignon@fb.com>
parents: 25256
diff changeset
179 originalchunks:
07326d76f19d record: extract code to compute newly added and modified files
Laurent Charignon <lcharignon@fb.com>
parents: 25256
diff changeset
180 newlyaddedandmodifiedfiles.add(chunk.header.filename())
07326d76f19d record: extract code to compute newly added and modified files
Laurent Charignon <lcharignon@fb.com>
parents: 25256
diff changeset
181 return newlyaddedandmodifiedfiles
07326d76f19d record: extract code to compute newly added and modified files
Laurent Charignon <lcharignon@fb.com>
parents: 25256
diff changeset
182
10401
6252852b4332 mq: add -Q option to all commands not in norepo
Brendan Cully <brendan@kublai.com>
parents: 10344
diff changeset
183 def parsealiases(cmd):
6252852b4332 mq: add -Q option to all commands not in norepo
Brendan Cully <brendan@kublai.com>
parents: 10344
diff changeset
184 return cmd.lstrip("^").split("|")
6252852b4332 mq: add -Q option to all commands not in norepo
Brendan Cully <brendan@kublai.com>
parents: 10344
diff changeset
185
24356
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
186 def setupwrapcolorwrite(ui):
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
187 # wrap ui.write so diff output can be labeled/colorized
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
188 def wrapwrite(orig, *args, **kw):
35359
82ee401135dd py3: handle keyword arguments correctly in cmdutil.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35286
diff changeset
189 label = kw.pop(r'label', '')
24356
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
190 for chunk, l in patch.difflabel(lambda: args):
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
191 orig(chunk, label=label + l)
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
192
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
193 oldwrite = ui.write
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
194 def wrap(*args, **kwargs):
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
195 return wrapwrite(oldwrite, *args, **kwargs)
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
196 setattr(ui, 'write', wrap)
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
197 return oldwrite
a38f384f2a57 record: consolidate ui.write wrapping in a function
Laurent Charignon <lcharignon@fb.com>
parents: 24345
diff changeset
198
25310
c1f5ef76d1c2 record: add an operation arguments to customize recording ui
Laurent Charignon <lcharignon@fb.com>
parents: 25273
diff changeset
199 def filterchunks(ui, originalhunks, usecurses, testfile, operation=None):
38080
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
200 try:
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
201 if usecurses:
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
202 if testfile:
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
203 recordfn = crecordmod.testdecorator(
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
204 testfile, crecordmod.testchunkselector)
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
205 else:
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
206 recordfn = crecordmod.chunkselector
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
207
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
208 return crecordmod.filterpatch(ui, originalhunks, recordfn,
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
209 operation)
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
210 except crecordmod.fallbackerror as e:
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
211 ui.warn('%s\n' % e.message)
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
212 ui.warn(_('falling back to text mode\n'))
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
213
dabc2237963c crecord: fallback to text mode if diffs are too big for curses mode
Kyle Lippincott <spectral@google.com>
parents: 38002
diff changeset
214 return patch.filterpatch(ui, originalhunks, operation)
25310
c1f5ef76d1c2 record: add an operation arguments to customize recording ui
Laurent Charignon <lcharignon@fb.com>
parents: 25273
diff changeset
215
c1f5ef76d1c2 record: add an operation arguments to customize recording ui
Laurent Charignon <lcharignon@fb.com>
parents: 25273
diff changeset
216 def recordfilter(ui, originalhunks, operation=None):
c1f5ef76d1c2 record: add an operation arguments to customize recording ui
Laurent Charignon <lcharignon@fb.com>
parents: 25273
diff changeset
217 """ Prompts the user to filter the originalhunks and return a list of
c1f5ef76d1c2 record: add an operation arguments to customize recording ui
Laurent Charignon <lcharignon@fb.com>
parents: 25273
diff changeset
218 selected hunks.
29326
d48fc6f318a3 patch: define full messages for interactive record/revert
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29283
diff changeset
219 *operation* is used for to build ui messages to indicate the user what
d48fc6f318a3 patch: define full messages for interactive record/revert
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29283
diff changeset
220 kind of filtering they are doing: reverting, committing, shelving, etc.
d48fc6f318a3 patch: define full messages for interactive record/revert
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29283
diff changeset
221 (see patch.filterpatch).
25310
c1f5ef76d1c2 record: add an operation arguments to customize recording ui
Laurent Charignon <lcharignon@fb.com>
parents: 25273
diff changeset
222 """
27531
84d686cb62c4 cmdutil: use crecordmod.checkcurses
Sean Farley <sean@farley.io>
parents: 27370
diff changeset
223 usecurses = crecordmod.checkcurses(ui)
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33438
diff changeset
224 testfile = ui.config('experimental', 'crecordtest')
24358
8d9e9063b040 record: move ui.write wrapping where it should be
Laurent Charignon <lcharignon@fb.com>
parents: 24357
diff changeset
225 oldwrite = setupwrapcolorwrite(ui)
8d9e9063b040 record: move ui.write wrapping where it should be
Laurent Charignon <lcharignon@fb.com>
parents: 24357
diff changeset
226 try:
27155
8d3c5797a175 commit: add a way to return more information from the chunkselector
Laurent Charignon <lcharignon@fb.com>
parents: 27148
diff changeset
227 newchunks, newopts = filterchunks(ui, originalhunks, usecurses,
8d3c5797a175 commit: add a way to return more information from the chunkselector
Laurent Charignon <lcharignon@fb.com>
parents: 27148
diff changeset
228 testfile, operation)
24358
8d9e9063b040 record: move ui.write wrapping where it should be
Laurent Charignon <lcharignon@fb.com>
parents: 24357
diff changeset
229 finally:
8d9e9063b040 record: move ui.write wrapping where it should be
Laurent Charignon <lcharignon@fb.com>
parents: 24357
diff changeset
230 ui.write = oldwrite
27155
8d3c5797a175 commit: add a way to return more information from the chunkselector
Laurent Charignon <lcharignon@fb.com>
parents: 27148
diff changeset
231 return newchunks, newopts
24357
2da601ab3125 record: refactor the filtering code
Laurent Charignon <lcharignon@fb.com>
parents: 24356
diff changeset
232
24309
fefcafda10b8 record: change interface of dorecord to accept new filters
Laurent Charignon <lcharignon@fb.com>
parents: 24306
diff changeset
233 def dorecord(ui, repo, commitfunc, cmdsuggest, backupall,
fefcafda10b8 record: change interface of dorecord to accept new filters
Laurent Charignon <lcharignon@fb.com>
parents: 24306
diff changeset
234 filterfn, *pats, **opts):
32193
93155367a2a6 py3: convert opts to bytes in cmdutil.dorecord()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32046
diff changeset
235 opts = pycompat.byteskwargs(opts)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
236 if not ui.interactive():
25795
69145daacdfa cmdutil: allow callers of cmdutil.dorecord to omit suggestion
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25763
diff changeset
237 if cmdsuggest:
69145daacdfa cmdutil: allow callers of cmdutil.dorecord to omit suggestion
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25763
diff changeset
238 msg = _('running non-interactively, use %s instead') % cmdsuggest
69145daacdfa cmdutil: allow callers of cmdutil.dorecord to omit suggestion
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25763
diff changeset
239 else:
69145daacdfa cmdutil: allow callers of cmdutil.dorecord to omit suggestion
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25763
diff changeset
240 msg = _('running non-interactively')
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
241 raise error.Abort(msg)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
242
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
243 # make sure username is set before going interactive
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
244 if not opts.get('user'):
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
245 ui.username() # raise exception, username not provided
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
246
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
247 def recordfunc(ui, repo, message, match, opts):
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
248 """This is generic record driver.
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
249
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
250 Its job is to interactively filter local changes, and
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
251 accordingly prepare working directory into a state in which the
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
252 job can be delegated to a non-interactive commit command such as
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
253 'commit' or 'qrefresh'.
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
254
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
255 After the actual job is done by non-interactive command, the
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
256 working directory is restored to its original state.
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
257
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
258 In the end we'll record interesting changes, and everything else
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
259 will be left in place, so the user can continue working.
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
260 """
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
261
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
262 checkunfinished(repo, commit=True)
28815
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
263 wctx = repo[None]
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
264 merge = len(wctx.parents()) > 1
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
265 if merge:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
266 raise error.Abort(_('cannot partially commit a merge '
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
267 '(use "hg commit" instead)'))
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
268
28815
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
269 def fail(f, msg):
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
270 raise error.Abort('%s: %s' % (f, msg))
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
271
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
272 force = opts.get('force')
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
273 if not force:
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
274 vdirs = []
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
275 match.explicitdir = vdirs.append
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
276 match.bad = fail
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
277
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
278 status = repo.status(match=match)
28815
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
279 if not force:
44611ad4fbd9 crecord: check for untracked arguments
timeless <timeless@mozdev.org>
parents: 28638
diff changeset
280 repo.checkcommitpatterns(wctx, vdirs, match, status, fail)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
281 diffopts = patch.difffeatureopts(ui, opts=opts, whitespace=True)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
282 diffopts.nodates = True
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
283 diffopts.git = True
27411
c84a07530040 record: turn on showfunc
timeless <timeless@mozdev.org>
parents: 27391
diff changeset
284 diffopts.showfunc = True
27637
b502138f5faa cleanup: remove superfluous space after space after equals (python)
timeless <timeless@mozdev.org>
parents: 27625
diff changeset
285 originaldiff = patch.diff(repo, changes=status, opts=diffopts)
24341
616c01b69898 record: change interface of the filtering function
Laurent Charignon <lcharignon@fb.com>
parents: 24311
diff changeset
286 originalchunks = patch.parsepatch(originaldiff)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
287
28570
5508cf9a52fe crecord: rewrite a comment about filtering patches
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28452
diff changeset
288 # 1. filter patch, since we are intending to apply subset of it
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
289 try:
27155
8d3c5797a175 commit: add a way to return more information from the chunkselector
Laurent Charignon <lcharignon@fb.com>
parents: 27148
diff changeset
290 chunks, newopts = filterfn(ui, originalchunks)
34258
61714510220d error: move patch.PatchError so it can easily implement __bytes__ (API)
Yuya Nishihara <yuya@tcha.org>
parents: 34201
diff changeset
291 except error.PatchError as err:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
292 raise error.Abort(_('error parsing patch: %s') % err)
27155
8d3c5797a175 commit: add a way to return more information from the chunkselector
Laurent Charignon <lcharignon@fb.com>
parents: 27148
diff changeset
293 opts.update(newopts)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
294
24845
8133494accf1 record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 24843
diff changeset
295 # We need to keep a backup of files that have been newly added and
8133494accf1 record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 24843
diff changeset
296 # modified during the recording process because there is a previous
8133494accf1 record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 24843
diff changeset
297 # version without the edit in the workdir
25257
07326d76f19d record: extract code to compute newly added and modified files
Laurent Charignon <lcharignon@fb.com>
parents: 25256
diff changeset
298 newlyaddedandmodifiedfiles = newandmodified(chunks, originalchunks)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
299 contenders = set()
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
300 for h in chunks:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
301 try:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
302 contenders.update(set(h.files()))
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
303 except AttributeError:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
304 pass
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
305
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
306 changed = status.modified + status.added + status.removed
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
307 newfiles = [f for f in changed if f in contenders]
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
308 if not newfiles:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
309 ui.status(_('no changes to record\n'))
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
310 return 0
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
311
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
312 modified = set(status.modified)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
313
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
314 # 2. backup changed files, so we can restore them in the end
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
315
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
316 if backupall:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
317 tobackup = changed
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
318 else:
24845
8133494accf1 record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 24843
diff changeset
319 tobackup = [f for f in newfiles if f in modified or f in \
8133494accf1 record: edit patch of newly added files (issue4304)
Laurent Charignon <lcharignon@fb.com>
parents: 24843
diff changeset
320 newlyaddedandmodifiedfiles]
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
321 backups = {}
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
322 if tobackup:
31329
1b0db28dadf1 cmdutil: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31318
diff changeset
323 backupdir = repo.vfs.join('record-backups')
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
324 try:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
325 os.mkdir(backupdir)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25657
diff changeset
326 except OSError as err:
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
327 if err.errno != errno.EEXIST:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
328 raise
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
329 try:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
330 # backup continues
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
331 for f in tobackup:
38197
aac4be30e250 py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 38193
diff changeset
332 fd, tmpname = pycompat.mkstemp(prefix=f.replace('/', '_') + '.',
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
333 dir=backupdir)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
334 os.close(fd)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
335 ui.debug('backup %r as %r\n' % (f, tmpname))
27370
d9e3ebe56970 record: don't dereference symlinks while copying over stat data
Siddharth Agarwal <sid0@fb.com>
parents: 26781
diff changeset
336 util.copyfile(repo.wjoin(f), tmpname, copystat=True)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
337 backups[f] = tmpname
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
338
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28837
diff changeset
339 fp = stringio()
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
340 for c in chunks:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
341 fname = c.filename()
24837
edf907bd8144 record: fix record with change on moved file crashes (issue4619)
Laurent Charignon <lcharignon@fb.com>
parents: 24720
diff changeset
342 if fname in backups:
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
343 c.write(fp)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
344 dopatch = fp.tell()
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
345 fp.seek(0)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
346
28638
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
347 # 2.5 optionally review / modify patch in text editor
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
348 if opts.get('review', False):
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
349 patchtext = (crecordmod.diffhelptext
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
350 + crecordmod.patchhelptext
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
351 + fp.read())
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
352 reviewedpatch = ui.edit(patchtext, "",
34046
6e6452bc441d editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents: 34040
diff changeset
353 action="diff",
30848
7080652af6e6 ui: rename tmpdir parameter to more specific repopath
Sean Farley <sean@farley.io>
parents: 30836
diff changeset
354 repopath=repo.path)
28638
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
355 fp.truncate(0)
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
356 fp.write(reviewedpatch)
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
357 fp.seek(0)
44319097e7b9 crecord: re-enable reviewing a patch before comitting it
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 28630
diff changeset
358
24866
e1ec3d075c67 record: fix adding new file with record from within a subdir (issue4626)
Laurent Charignon <lcharignon@fb.com>
parents: 24864
diff changeset
359 [os.unlink(repo.wjoin(c)) for c in newlyaddedandmodifiedfiles]
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
360 # 3a. apply filtered patch to clean repo (clean)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
361 if backups:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
362 # Equivalent to hg.revert
27344
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27216
diff changeset
363 m = scmutil.matchfiles(repo, backups.keys())
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
364 mergemod.update(repo, repo.dirstate.p1(),
27344
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27216
diff changeset
365 False, True, matcher=m)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
366
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
367 # 3b. (apply)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
368 if dopatch:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
369 try:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
370 ui.debug('applying patch\n')
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
371 ui.debug(fp.getvalue())
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
372 patch.internalpatch(ui, repo, fp, 1, eolmode=None)
34258
61714510220d error: move patch.PatchError so it can easily implement __bytes__ (API)
Yuya Nishihara <yuya@tcha.org>
parents: 34201
diff changeset
373 except error.PatchError as err:
36742
390d16ea7c76 py3: use pycompat.bytestr instead of str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36692
diff changeset
374 raise error.Abort(pycompat.bytestr(err))
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
375 del fp
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
376
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
377 # 4. We prepared working directory according to filtered
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
378 # patch. Now is the time to delegate the job to
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
379 # commit/qrefresh or the like!
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
380
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
381 # Make all of the pathnames absolute.
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
382 newfiles = [repo.wjoin(nf) for nf in newfiles]
35359
82ee401135dd py3: handle keyword arguments correctly in cmdutil.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35286
diff changeset
383 return commitfunc(ui, repo, *newfiles, **pycompat.strkwargs(opts))
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
384 finally:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
385 # 5. finally restore backed-up files
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
386 try:
25759
ff11c1565c04 cmdutil: apply dirstate.normallookup on (maybe partially) committed files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25758
diff changeset
387 dirstate = repo.dirstate
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
388 for realname, tmpname in backups.iteritems():
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
389 ui.debug('restoring %r to %r\n' % (tmpname, realname))
25759
ff11c1565c04 cmdutil: apply dirstate.normallookup on (maybe partially) committed files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25758
diff changeset
390
ff11c1565c04 cmdutil: apply dirstate.normallookup on (maybe partially) committed files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25758
diff changeset
391 if dirstate[realname] == 'n':
ff11c1565c04 cmdutil: apply dirstate.normallookup on (maybe partially) committed files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25758
diff changeset
392 # without normallookup, restoring timestamp
ff11c1565c04 cmdutil: apply dirstate.normallookup on (maybe partially) committed files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25758
diff changeset
393 # may cause partially committed files
ff11c1565c04 cmdutil: apply dirstate.normallookup on (maybe partially) committed files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25758
diff changeset
394 # to be treated as unmodified
ff11c1565c04 cmdutil: apply dirstate.normallookup on (maybe partially) committed files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25758
diff changeset
395 dirstate.normallookup(realname)
ff11c1565c04 cmdutil: apply dirstate.normallookup on (maybe partially) committed files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25758
diff changeset
396
27370
d9e3ebe56970 record: don't dereference symlinks while copying over stat data
Siddharth Agarwal <sid0@fb.com>
parents: 26781
diff changeset
397 # copystat=True here and above are a hack to trick any
d9e3ebe56970 record: don't dereference symlinks while copying over stat data
Siddharth Agarwal <sid0@fb.com>
parents: 26781
diff changeset
398 # editors that have f open that we haven't modified them.
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
399 #
27370
d9e3ebe56970 record: don't dereference symlinks while copying over stat data
Siddharth Agarwal <sid0@fb.com>
parents: 26781
diff changeset
400 # Also note that this racy as an editor could notice the
d9e3ebe56970 record: don't dereference symlinks while copying over stat data
Siddharth Agarwal <sid0@fb.com>
parents: 26781
diff changeset
401 # file's mtime before we've finished writing it.
d9e3ebe56970 record: don't dereference symlinks while copying over stat data
Siddharth Agarwal <sid0@fb.com>
parents: 26781
diff changeset
402 util.copyfile(tmpname, repo.wjoin(realname), copystat=True)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
403 os.unlink(tmpname)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
404 if tobackup:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
405 os.rmdir(backupdir)
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
406 except OSError:
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
407 pass
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
408
25758
c5dfa47ad7ee cmdutil: put recordfunc invocation into wlock scope for consistency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25755
diff changeset
409 def recordinwlock(ui, repo, message, match, opts):
27801
7be6371c732e with: use context manager for wlock in recordinwlock
Bryan O'Sullivan <bryano@fb.com>
parents: 27698
diff changeset
410 with repo.wlock():
25758
c5dfa47ad7ee cmdutil: put recordfunc invocation into wlock scope for consistency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25755
diff changeset
411 return recordfunc(ui, repo, message, match, opts)
c5dfa47ad7ee cmdutil: put recordfunc invocation into wlock scope for consistency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25755
diff changeset
412
c5dfa47ad7ee cmdutil: put recordfunc invocation into wlock scope for consistency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25755
diff changeset
413 return commit(ui, repo, recordinwlock, pats, opts)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 24260
diff changeset
414
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
415 class dirnode(object):
33548
4cd4344a53c4 status: add a flag to terse the output (issue4119)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33509
diff changeset
416 """
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
417 Represent a directory in user working copy with information required for
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
418 the purpose of tersing its status.
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
419
38231
51e420a7a41a cmdutil: use internal separators when building the terse list
Matt Harbison <matt_harbison@yahoo.com>
parents: 38197
diff changeset
420 path is the path to the directory, without a trailing '/'
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
421
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
422 statuses is a set of statuses of all files in this directory (this includes
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
423 all the files in all the subdirectories too)
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
424
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
425 files is a list of files which are direct child of this directory
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
426
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
427 subdirs is a dictionary of sub-directory name as the key and it's own
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
428 dirnode object as the value
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
429 """
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
430
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
431 def __init__(self, dirpath):
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
432 self.path = dirpath
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
433 self.statuses = set([])
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
434 self.files = []
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
435 self.subdirs = {}
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
436
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
437 def _addfileindir(self, filename, status):
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
438 """Add a file in this directory as a direct child."""
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
439 self.files.append((filename, status))
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
440
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
441 def addfile(self, filename, status):
33548
4cd4344a53c4 status: add a flag to terse the output (issue4119)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33509
diff changeset
442 """
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
443 Add a file to this directory or to its direct parent directory.
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
444
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
445 If the file is not direct child of this directory, we traverse to the
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
446 directory of which this file is a direct child of and add the file
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
447 there.
33548
4cd4344a53c4 status: add a flag to terse the output (issue4119)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33509
diff changeset
448 """
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
449
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
450 # the filename contains a path separator, it means it's not the direct
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
451 # child of this directory
34928
362096cfdb1f terse: split on repo separator instead of os.sep (issue5715)
Matt Harbison <matt_harbison@yahoo.com>
parents: 34907
diff changeset
452 if '/' in filename:
362096cfdb1f terse: split on repo separator instead of os.sep (issue5715)
Matt Harbison <matt_harbison@yahoo.com>
parents: 34907
diff changeset
453 subdir, filep = filename.split('/', 1)
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
454
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
455 # does the dirnode object for subdir exists
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
456 if subdir not in self.subdirs:
38231
51e420a7a41a cmdutil: use internal separators when building the terse list
Matt Harbison <matt_harbison@yahoo.com>
parents: 38197
diff changeset
457 subdirpath = pathutil.join(self.path, subdir)
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
458 self.subdirs[subdir] = dirnode(subdirpath)
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
459
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
460 # try adding the file in subdir
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
461 self.subdirs[subdir].addfile(filep, status)
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
462
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
463 else:
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
464 self._addfileindir(filename, status)
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
465
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
466 if status not in self.statuses:
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
467 self.statuses.add(status)
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
468
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
469 def iterfilepaths(self):
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
470 """Yield (status, path) for files directly under this directory."""
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
471 for f, st in self.files:
38231
51e420a7a41a cmdutil: use internal separators when building the terse list
Matt Harbison <matt_harbison@yahoo.com>
parents: 38197
diff changeset
472 yield st, pathutil.join(self.path, f)
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
473
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
474 def tersewalk(self, terseargs):
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
475 """
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
476 Yield (status, path) obtained by processing the status of this
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
477 dirnode.
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
478
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
479 terseargs is the string of arguments passed by the user with `--terse`
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
480 flag.
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
481
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
482 Following are the cases which can happen:
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
483
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
484 1) All the files in the directory (including all the files in its
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
485 subdirectories) share the same status and the user has asked us to terse
38231
51e420a7a41a cmdutil: use internal separators when building the terse list
Matt Harbison <matt_harbison@yahoo.com>
parents: 38197
diff changeset
486 that status. -> yield (status, dirpath). dirpath will end in '/'.
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
487
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
488 2) Otherwise, we do following:
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
489
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
490 a) Yield (status, filepath) for all the files which are in this
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
491 directory (only the ones in this directory, not the subdirs)
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
492
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
493 b) Recurse the function on all the subdirectories of this
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
494 directory
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
495 """
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
496
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
497 if len(self.statuses) == 1:
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
498 onlyst = self.statuses.pop()
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
499
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
500 # Making sure we terse only when the status abbreviation is
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
501 # passed as terse argument
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
502 if onlyst in terseargs:
38231
51e420a7a41a cmdutil: use internal separators when building the terse list
Matt Harbison <matt_harbison@yahoo.com>
parents: 38197
diff changeset
503 yield onlyst, self.path + '/'
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
504 return
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
505
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
506 # add the files to status list
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
507 for st, fpath in self.iterfilepaths():
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
508 yield st, fpath
34683
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
509
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
510 #recurse on the subdirs
3d6d4b12128e tersestatus: make methods part of the dirnode class
Denis Laxalde <denis@laxalde.org>
parents: 34682
diff changeset
511 for dirobj in self.subdirs.values():
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
512 for st, fpath in dirobj.tersewalk(terseargs):
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
513 yield st, fpath
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
514
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
515 def tersedir(statuslist, terseargs):
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
516 """
34698
23eb03f46929 tersestatus: rework dirnode and tersedir docstrings
Denis Laxalde <denis@laxalde.org>
parents: 34684
diff changeset
517 Terse the status if all the files in a directory shares the same status.
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
518
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
519 statuslist is scmutil.status() object which contains a list of files for
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
520 each status.
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
521 terseargs is string which is passed by the user as the argument to `--terse`
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
522 flag.
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
523
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
524 The function makes a tree of objects of dirnode class, and at each node it
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
525 stores the information required to know whether we can terse a certain
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
526 directory or not.
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
527 """
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
528 # the order matters here as that is used to produce final list
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
529 allst = ('m', 'a', 'r', 'd', 'u', 'i', 'c')
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
530
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
531 # checking the argument validity
34893
068e0e531584 cmdutil: fix status tersing on Python 3
Augie Fackler <augie@google.com>
parents: 34857
diff changeset
532 for s in pycompat.bytestr(terseargs):
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
533 if s not in allst:
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
534 raise error.Abort(_("'%s' not recognized") % s)
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
535
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
536 # creating a dirnode object for the root of the repo
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
537 rootobj = dirnode('')
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
538 pstatus = ('modified', 'added', 'deleted', 'clean', 'unknown',
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
539 'ignored', 'removed')
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
540
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
541 tersedict = {}
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
542 for attrname in pstatus:
34893
068e0e531584 cmdutil: fix status tersing on Python 3
Augie Fackler <augie@google.com>
parents: 34857
diff changeset
543 statuschar = attrname[0:1]
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
544 for f in getattr(statuslist, attrname):
34893
068e0e531584 cmdutil: fix status tersing on Python 3
Augie Fackler <augie@google.com>
parents: 34857
diff changeset
545 rootobj.addfile(f, statuschar)
068e0e531584 cmdutil: fix status tersing on Python 3
Augie Fackler <augie@google.com>
parents: 34857
diff changeset
546 tersedict[statuschar] = []
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
547
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
548 # we won't be tersing the root dir, so add files in it
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
549 for st, fpath in rootobj.iterfilepaths():
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
550 tersedict[st].append(fpath)
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
551
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
552 # process each sub-directory and build tersedict
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
553 for subdir in rootobj.subdirs.values():
34684
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
554 for st, f in subdir.tersewalk(terseargs):
5d98674df18a tersestatus: avoid modifying tersedict
Denis Laxalde <denis@laxalde.org>
parents: 34683
diff changeset
555 tersedict[st].append(f)
34682
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
556
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
557 tersedlist = []
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
558 for st in allst:
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
559 tersedict[st].sort()
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
560 tersedlist.append(tersedict[st])
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
561
7e3001b74ab3 tersestatus: re-implement the functionality to terse the status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34373
diff changeset
562 return tersedlist
33548
4cd4344a53c4 status: add a flag to terse the output (issue4119)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33509
diff changeset
563
33792
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
564 def _commentlines(raw):
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
565 '''Surround lineswith a comment char and a new line'''
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
566 lines = raw.splitlines()
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
567 commentedlines = ['# %s' % line for line in lines]
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
568 return '\n'.join(commentedlines) + '\n'
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
569
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
570 def _conflictsmsg(repo):
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
571 mergestate = mergemod.mergestate.read(repo)
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
572 if not mergestate.active():
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
573 return
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
574
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
575 m = scmutil.match(repo[None])
34019
3340efe80803 morestatus: simplify check for unresolved merge conflicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 33902
diff changeset
576 unresolvedlist = [f for f in mergestate.unresolved() if m(f)]
33792
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
577 if unresolvedlist:
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
578 mergeliststr = '\n'.join(
34959
527655a049ee morestatus: don't crash with different drive letters for repo.root and CWD
Matt Harbison <matt_harbison@yahoo.com>
parents: 34928
diff changeset
579 [' %s' % util.pathto(repo.root, pycompat.getcwd(), path)
527655a049ee morestatus: don't crash with different drive letters for repo.root and CWD
Matt Harbison <matt_harbison@yahoo.com>
parents: 34928
diff changeset
580 for path in unresolvedlist])
33792
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
581 msg = _('''Unresolved merge conflicts:
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
582
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
583 %s
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
584
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
585 To mark files as resolved: hg resolve --mark FILE''') % mergeliststr
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
586 else:
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
587 msg = _('No unresolved merge conflicts.')
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
588
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
589 return _commentlines(msg)
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
590
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
591 def _helpmessage(continuecmd, abortcmd):
38347
50f5fc232c16 morestatus: remove some extra spaces
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38320
diff changeset
592 msg = _('To continue: %s\n'
50f5fc232c16 morestatus: remove some extra spaces
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38320
diff changeset
593 'To abort: %s') % (continuecmd, abortcmd)
33792
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
594 return _commentlines(msg)
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
595
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
596 def _rebasemsg():
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
597 return _helpmessage('hg rebase --continue', 'hg rebase --abort')
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
598
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
599 def _histeditmsg():
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
600 return _helpmessage('hg histedit --continue', 'hg histedit --abort')
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
601
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
602 def _unshelvemsg():
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
603 return _helpmessage('hg unshelve --continue', 'hg unshelve --abort')
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
604
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
605 def _updatecleanmsg(dest=None):
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
606 warning = _('warning: this will discard uncommitted changes')
38347
50f5fc232c16 morestatus: remove some extra spaces
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38320
diff changeset
607 return 'hg update --clean %s (%s)' % (dest or '.', warning)
33792
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
608
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
609 def _graftmsg():
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
610 # tweakdefaults requires `update` to have a rev hence the `.`
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
611 return _helpmessage('hg graft --continue', _updatecleanmsg())
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
612
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
613 def _mergemsg():
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
614 # tweakdefaults requires `update` to have a rev hence the `.`
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
615 return _helpmessage('hg commit', _updatecleanmsg())
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
616
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
617 def _bisectmsg():
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
618 msg = _('To mark the changeset good: hg bisect --good\n'
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
619 'To mark the changeset bad: hg bisect --bad\n'
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
620 'To abort: hg bisect --reset\n')
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
621 return _commentlines(msg)
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
622
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
623 def fileexistspredicate(filename):
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
624 return lambda repo: repo.vfs.exists(filename)
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
625
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
626 def _mergepredicate(repo):
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
627 return len(repo[None].parents()) > 1
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
628
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
629 STATES = (
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
630 # (state, predicate to detect states, helpful message function)
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
631 ('histedit', fileexistspredicate('histedit-state'), _histeditmsg),
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
632 ('bisect', fileexistspredicate('bisect.state'), _bisectmsg),
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
633 ('graft', fileexistspredicate('graftstate'), _graftmsg),
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
634 ('unshelve', fileexistspredicate('unshelverebasestate'), _unshelvemsg),
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
635 ('rebase', fileexistspredicate('rebasestate'), _rebasemsg),
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
636 # The merge state is part of a list that will be iterated over.
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
637 # They need to be last because some of the other unfinished states may also
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
638 # be in a merge or update state (eg. rebase, histedit, graft, etc).
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
639 # We want those to have priority.
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
640 ('merge', _mergepredicate, _mergemsg),
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
641 )
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
642
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
643 def _getrepostate(repo):
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
644 # experimental config: commands.status.skipstates
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
645 skip = set(repo.ui.configlist('commands', 'status.skipstates'))
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
646 for state, statedetectionpredicate, msgfn in STATES:
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
647 if state in skip:
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
648 continue
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
649 if statedetectionpredicate(repo):
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
650 return (state, statedetectionpredicate, msgfn)
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
651
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
652 def morestatus(repo, fm):
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
653 statetuple = _getrepostate(repo)
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
654 label = 'status.morestatus'
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
655 if statetuple:
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
656 fm.startitem()
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
657 state, statedetectionpredicate, helpfulmsg = statetuple
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
658 statemsg = _('The repository is in an unfinished *%s* state.') % state
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
659 fm.write('statemsg', '%s\n', _commentlines(statemsg), label=label)
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
660 conmsg = _conflictsmsg(repo)
33902
e5d104c35e51 morestatus: check whether the conflict message is None before printing
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33879
diff changeset
661 if conmsg:
e5d104c35e51 morestatus: check whether the conflict message is None before printing
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33879
diff changeset
662 fm.write('conflictsmsg', '%s\n', conmsg, label=label)
33792
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
663 if helpfulmsg:
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
664 helpmsg = helpfulmsg()
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
665 fm.write('helpmsg', '%s\n', helpmsg, label=label)
96f43981c1c4 morestatus: move fb extension to core by plugging to `hg status --verbose`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33763
diff changeset
666
7213
b4c035057d34 findcmd: have dispatch look up strict flag
Matt Mackall <mpm@selenic.com>
parents: 7121
diff changeset
667 def findpossible(cmd, table, strict=False):
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
668 """
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
669 Return cmd -> (aliases, command table entry)
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
670 for each matching command.
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
671 Return debug commands (or their aliases) only if no normal command matches.
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
672 """
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
673 choice = {}
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
674 debugchoice = {}
15600
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
675
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
676 if cmd in table:
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
677 # short-circuit exact matches, "log" alias beats "^log|history"
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
678 keys = [cmd]
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
679 else:
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
680 keys = table.keys()
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
681
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24216
diff changeset
682 allcmds = []
15600
195dbd1cef0c alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents: 15231
diff changeset
683 for e in keys:
10401
6252852b4332 mq: add -Q option to all commands not in norepo
Brendan Cully <brendan@kublai.com>
parents: 10344
diff changeset
684 aliases = parsealiases(e)
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24216
diff changeset
685 allcmds.extend(aliases)
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
686 found = None
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
687 if cmd in aliases:
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
688 found = cmd
7213
b4c035057d34 findcmd: have dispatch look up strict flag
Matt Mackall <mpm@selenic.com>
parents: 7121
diff changeset
689 elif not strict:
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
690 for a in aliases:
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
691 if a.startswith(cmd):
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
692 found = a
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
693 break
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
694 if found is not None:
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
695 if aliases[0].startswith("debug") or found.startswith("debug"):
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents: 5177
diff changeset
696 debugchoice[found] = (aliases, table[e])
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
697 else:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents: 5177
diff changeset
698 choice[found] = (aliases, table[e])
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
699
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
700 if not choice and debugchoice:
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
701 choice = debugchoice
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
702
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24216
diff changeset
703 return choice, allcmds
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
704
7213
b4c035057d34 findcmd: have dispatch look up strict flag
Matt Mackall <mpm@selenic.com>
parents: 7121
diff changeset
705 def findcmd(cmd, table, strict=True):
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
706 """Return (aliases, command table entry) for command string."""
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24216
diff changeset
707 choice, allcmds = findpossible(cmd, table, strict)
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
708
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5843
diff changeset
709 if cmd in choice:
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
710 return choice[cmd]
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
711
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
712 if len(choice) > 1:
32561
9f56d462634c cmdutil: use sorted(dict) instead of x = dict.keys(); x.sort()
Augie Fackler <raf@durin42.com>
parents: 32472
diff changeset
713 clist = sorted(choice)
7643
9a1ea6587557 error: move UnknownCommand and AmbiguousCommand
Matt Mackall <mpm@selenic.com>
parents: 7404
diff changeset
714 raise error.AmbiguousCommand(cmd, clist)
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
715
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
716 if choice:
32880
e4a43b810528 py3: explicitly convert dict.values() to a list on py3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32860
diff changeset
717 return list(choice.values())[0]
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
718
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24216
diff changeset
719 raise error.UnknownCommand(cmd, allcmds)
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
720
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
721 def changebranch(ui, repo, revs, label):
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
722 """ Change the branch name of given revs to label """
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
723
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
724 with repo.wlock(), repo.lock(), repo.transaction('branches'):
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
725 # abort in case of uncommitted merge or dirty wdir
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
726 bailifchanged(repo)
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
727 revs = scmutil.revrange(repo, revs)
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
728 if not revs:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
729 raise error.Abort("empty revision set")
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
730 roots = repo.revs('roots(%ld)', revs)
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
731 if len(roots) > 1:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
732 raise error.Abort(_("cannot change branch of non-linear revisions"))
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
733 rewriteutil.precheck(repo, revs, 'change branch of')
35746
e5b6ba786d83 branch: allow changing branch name to existing name if possible
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35745
diff changeset
734
e5b6ba786d83 branch: allow changing branch name to existing name if possible
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35745
diff changeset
735 root = repo[roots.first()]
e5b6ba786d83 branch: allow changing branch name to existing name if possible
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35745
diff changeset
736 if not root.p1().branch() == label and label in repo.branchmap():
e5b6ba786d83 branch: allow changing branch name to existing name if possible
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35745
diff changeset
737 raise error.Abort(_("a branch of the same name already exists"))
e5b6ba786d83 branch: allow changing branch name to existing name if possible
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35745
diff changeset
738
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
739 if repo.revs('merge() and %ld', revs):
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
740 raise error.Abort(_("cannot change branch of a merge commit"))
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
741 if repo.revs('obsolete() and %ld', revs):
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
742 raise error.Abort(_("cannot change branch of a obsolete changeset"))
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
743
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
744 # make sure only topological heads
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
745 if repo.revs('heads(%ld) - head()', revs):
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
746 raise error.Abort(_("cannot change branch in middle of a stack"))
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
747
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
748 replacements = {}
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
749 # avoid import cycle mercurial.cmdutil -> mercurial.context ->
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
750 # mercurial.subrepo -> mercurial.cmdutil
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
751 from . import context
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
752 for rev in revs:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
753 ctx = repo[rev]
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
754 oldbranch = ctx.branch()
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
755 # check if ctx has same branch
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
756 if oldbranch == label:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
757 continue
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
758
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
759 def filectxfn(repo, newctx, path):
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
760 try:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
761 return ctx[path]
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
762 except error.ManifestLookupError:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
763 return None
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
764
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
765 ui.debug("changing branch of '%s' from '%s' to '%s'\n"
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
766 % (hex(ctx.node()), oldbranch, label))
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
767 extra = ctx.extra()
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
768 extra['branch_change'] = hex(ctx.node())
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
769 # While changing branch of set of linear commits, make sure that
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
770 # we base our commits on new parent rather than old parent which
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
771 # was obsoleted while changing the branch
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
772 p1 = ctx.p1().node()
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
773 p2 = ctx.p2().node()
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
774 if p1 in replacements:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
775 p1 = replacements[p1][0]
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
776 if p2 in replacements:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
777 p2 = replacements[p2][0]
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
778
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
779 mc = context.memctx(repo, (p1, p2),
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
780 ctx.description(),
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
781 ctx.files(),
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
782 filectxfn,
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
783 user=ctx.user(),
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
784 date=ctx.date(),
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
785 extra=extra,
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
786 branch=label)
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
787
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
788 newnode = repo.commitctx(mc)
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
789 replacements[ctx.node()] = (newnode,)
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
790 ui.debug('new node id is %s\n' % hex(newnode))
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
791
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
792 # create obsmarkers and move bookmarks
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
793 scmutil.cleanupnodes(repo, replacements, 'branch-change', fixphase=True)
35745
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
794
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
795 # move the working copy too
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
796 wctx = repo[None]
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
797 # in-progress merge is a bit too complex for now.
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
798 if len(wctx.parents()) == 1:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
799 newid = replacements.get(wctx.p1().node())
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
800 if newid is not None:
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
801 # avoid import cycle mercurial.cmdutil -> mercurial.hg ->
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
802 # mercurial.cmdutil
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
803 from . import hg
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
804 hg.update(repo, newid[0], quietempty=True)
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
805
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
806 ui.status(_("changed branch on %d changesets\n") % len(replacements))
3bd8ab4c80a5 branch: add a --rev flag to change branch name of given revisions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35743
diff changeset
807
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
808 def findrepo(p):
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
809 while not os.path.isdir(os.path.join(p, ".hg")):
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
810 oldp, p = p, os.path.dirname(p)
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
811 if p == oldp:
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
812 return None
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
813
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
814 return p
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10401
diff changeset
815
30755
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
816 def bailifchanged(repo, merge=True, hint=None):
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
817 """ enforce the precondition that working directory must be clean.
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
818
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
819 'merge' can be set to false if a pending uncommitted merge should be
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
820 ignored (such as when 'update --check' runs).
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
821
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
822 'hint' is the usual hint given to Abort exception.
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
823 """
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
824
24472
1bf71faf042e cmdutil: allow bailifchanged to ignore merging in progress
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24471
diff changeset
825 if merge and repo.dirstate.p2() != nullid:
30755
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
826 raise error.Abort(_('outstanding uncommitted merge'), hint=hint)
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
827 modified, added, removed, deleted = repo.status()[:4]
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
828 if modified or added or removed or deleted:
30755
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
829 raise error.Abort(_('uncommitted changes'), hint=hint)
15231
cd6f10dccf16 cmdutil.bailifchanged: abort for dirty subrepos
Eric Roshan Eisner <ede@alum.mit.edu>
parents: 15214
diff changeset
830 ctx = repo[None]
18364
6252b4f1c4b4 subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 18340
diff changeset
831 for s in sorted(ctx.substate):
30755
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30724
diff changeset
832 ctx.sub(s).bailifchanged(hint=hint)
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
833
14635
217b7d83afc3 cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14518
diff changeset
834 def logmessage(ui, opts):
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
835 """ get the log message according to -m and -l option """
7667
bd5c37d792e6 cmdutil.logmessage: options should be optional
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7643
diff changeset
836 message = opts.get('message')
bd5c37d792e6 cmdutil.logmessage: options should be optional
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7643
diff changeset
837 logfile = opts.get('logfile')
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
838
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
839 if message and logfile:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
840 raise error.Abort(_('options --message and --logfile are mutually '
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
841 'exclusive'))
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
842 if not message and logfile:
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
843 try:
32641
d3e1c5b4986c cmdutil: use isstdiofilename() where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 32610
diff changeset
844 if isstdiofilename(logfile):
14635
217b7d83afc3 cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14518
diff changeset
845 message = ui.fin.read()
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
846 else:
14249
f4766e1bb0b3 cmdutil: normalize log message eols when reading from file
Patrick Mezard <pmezard@gmail.com>
parents: 14232
diff changeset
847 message = '\n'.join(util.readfile(logfile).splitlines())
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25657
diff changeset
848 except IOError as inst:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
849 raise error.Abort(_("can't read commit message '%s': %s") %
34040
d5b2beca16c0 python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents: 34037
diff changeset
850 (logfile, encoding.strtolocal(inst.strerror)))
4549
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
851 return message
0c61124ad877 dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents: 4548
diff changeset
852
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
853 def mergeeditform(ctxorbool, baseformname):
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
854 """return appropriate editform name (referencing a committemplate)
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
855
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
856 'ctxorbool' is either a ctx to be committed, or a bool indicating whether
22248
75618a223e18 commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22237
diff changeset
857 merging is committed.
75618a223e18 commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22237
diff changeset
858
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
859 This returns baseformname with '.merge' appended if it is a merge,
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
860 otherwise '.normal' is appended.
22248
75618a223e18 commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22237
diff changeset
861 """
75618a223e18 commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22237
diff changeset
862 if isinstance(ctxorbool, bool):
75618a223e18 commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22237
diff changeset
863 if ctxorbool:
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
864 return baseformname + ".merge"
22248
75618a223e18 commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22237
diff changeset
865 elif 1 < len(ctxorbool.parents()):
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
866 return baseformname + ".merge"
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
867
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
868 return baseformname + ".normal"
22248
75618a223e18 commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22237
diff changeset
869
21999
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
870 def getcommiteditor(edit=False, finishdesc=None, extramsg=None,
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
871 editform='', **opts):
21419
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
872 """get appropriate commit message editor according to '--edit' option
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
873
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
874 'finishdesc' is a function to be called with edited commit message
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
875 (= 'description' of the new changeset) just after editing, but
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
876 before checking empty-ness. It should return actual text to be
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
877 stored into history. This allows to change description before
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
878 storing.
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
879
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
880 'extramsg' is a extra message to be shown in the editor instead of
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
881 'Leave message empty to abort commit' line. 'HG: ' prefix and EOL
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
882 is automatically added.
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
883
21999
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
884 'editform' is a dot-separated list of names, to distinguish
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
885 the purpose of commit text editing.
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
886
21419
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
887 'getcommiteditor' returns 'commitforceeditor' regardless of
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
888 'edit', if one of 'finishdesc' or 'extramsg' is specified, because
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
889 they are specific for usage in MQ.
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
890 """
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
891 if edit or finishdesc or extramsg:
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
892 return lambda r, c, s: commitforceeditor(r, c, s,
272785489ed3 cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21417
diff changeset
893 finishdesc=finishdesc,
21999
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
894 extramsg=extramsg,
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
895 editform=editform)
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
896 elif editform:
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
897 return lambda r, c, s: commiteditor(r, c, s, editform=editform)
21405
dcf20f244c2a cmdutil: introduce "getcommiteditor()" to simplify code paths to choose editor
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21241
diff changeset
898 else:
dcf20f244c2a cmdutil: introduce "getcommiteditor()" to simplify code paths to choose editor
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21241
diff changeset
899 return commiteditor
dcf20f244c2a cmdutil: introduce "getcommiteditor()" to simplify code paths to choose editor
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21241
diff changeset
900
37774
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
901 def _escapecommandtemplate(tmpl):
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
902 parts = []
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
903 for typ, start, end in templater.scantemplate(tmpl, raw=True):
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
904 if typ == b'string':
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
905 parts.append(stringutil.escapestr(tmpl[start:end]))
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
906 else:
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
907 parts.append(tmpl[start:end])
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
908 return b''.join(parts)
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
909
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
910 def rendercommandtemplate(ui, tmpl, props):
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
911 r"""Expand a literal template 'tmpl' in a way suitable for command line
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
912
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
913 '\' in outermost string is not taken as an escape character because it
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
914 is a directory separator on Windows.
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
915
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
916 >>> from . import ui as uimod
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
917 >>> ui = uimod.ui()
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
918 >>> rendercommandtemplate(ui, b'c:\\{path}', {b'path': b'foo'})
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
919 'c:\\foo'
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
920 >>> rendercommandtemplate(ui, b'{"c:\\{path}"}', {'path': b'foo'})
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
921 'c:{path}'
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
922 """
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
923 if not tmpl:
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
924 return tmpl
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
925 t = formatter.maketemplater(ui, _escapecommandtemplate(tmpl))
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
926 return t.renderdefault(props)
d6970628b95f fix: use templater to substitute values in command string
Yuya Nishihara <yuya@tcha.org>
parents: 37763
diff changeset
927
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
928 def rendertemplate(ctx, tmpl, props=None):
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
929 """Expand a literal template 'tmpl' byte-string against one changeset
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
930
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
931 Each props item must be a stringify-able value or a callable returning
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
932 such value, i.e. no bare list nor dict should be passed.
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
933 """
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
934 repo = ctx.repo()
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
935 tres = formatter.templateresources(repo.ui, repo)
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
936 t = formatter.maketemplater(repo.ui, tmpl, defaults=templatekw.keywords,
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
937 resources=tres)
37106
be3f33f5e232 templater: switch 'revcache' based on new mapping items
Yuya Nishihara <yuya@tcha.org>
parents: 37091
diff changeset
938 mapping = {'ctx': ctx}
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
939 if props:
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
940 mapping.update(props)
36991
317382151ac3 templater: rename .render(mapping) to .renderdefault(mapping) (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
941 return t.renderdefault(mapping)
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
942
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
943 def _buildfntemplate(pat, total=None, seqno=None, revwidth=None, pathname=None):
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
944 r"""Convert old-style filename format string to template string
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
945
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
946 >>> _buildfntemplate(b'foo-%b-%n.patch', seqno=0)
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
947 'foo-{reporoot|basename}-{seqno}.patch'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
948 >>> _buildfntemplate(b'%R{tags % "{tag}"}%H')
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
949 '{rev}{tags % "{tag}"}{node}'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
950
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
951 '\' in outermost strings has to be escaped because it is a directory
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
952 separator on Windows:
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
953
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
954 >>> _buildfntemplate(b'c:\\tmp\\%R\\%n.patch', seqno=0)
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
955 'c:\\\\tmp\\\\{rev}\\\\{seqno}.patch'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
956 >>> _buildfntemplate(b'\\\\foo\\bar.patch')
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
957 '\\\\\\\\foo\\\\bar.patch'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
958 >>> _buildfntemplate(b'\\{tags % "{tag}"}')
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
959 '\\\\{tags % "{tag}"}'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
960
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
961 but inner strings follow the template rules (i.e. '\' is taken as an
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
962 escape character):
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
963
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
964 >>> _buildfntemplate(br'{"c:\tmp"}', seqno=0)
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
965 '{"c:\\tmp"}'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
966 """
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
967 expander = {
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
968 b'H': b'{node}',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
969 b'R': b'{rev}',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
970 b'h': b'{node|short}',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
971 b'm': br'{sub(r"[^\w]", "_", desc|firstline)}',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
972 b'r': b'{if(revwidth, pad(rev, revwidth, "0", left=True), rev)}',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
973 b'%': b'%',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
974 b'b': b'{reporoot|basename}',
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
975 }
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
976 if total is not None:
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
977 expander[b'N'] = b'{total}'
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
978 if seqno is not None:
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
979 expander[b'n'] = b'{seqno}'
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
980 if total is not None and seqno is not None:
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
981 expander[b'n'] = b'{pad(seqno, total|stringify|count, "0", left=True)}'
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
982 if pathname is not None:
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
983 expander[b's'] = b'{pathname|basename}'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
984 expander[b'd'] = b'{if(pathname|dirname, pathname|dirname, ".")}'
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
985 expander[b'p'] = b'{pathname}'
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
986
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
987 newname = []
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
988 for typ, start, end in templater.scantemplate(pat, raw=True):
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
989 if typ != b'string':
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
990 newname.append(pat[start:end])
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
991 continue
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
992 i = start
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
993 while i < end:
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
994 n = pat.find(b'%', i, end)
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
995 if n < 0:
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
996 newname.append(stringutil.escapestr(pat[i:end]))
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
997 break
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36991
diff changeset
998 newname.append(stringutil.escapestr(pat[i:n]))
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
999 if n + 2 > end:
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
1000 raise error.Abort(_("incomplete format spec in output "
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
1001 "filename"))
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
1002 c = pat[n + 1:n + 2]
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
1003 i = n + 2
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
1004 try:
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
1005 newname.append(expander[c])
36276
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
1006 except KeyError:
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
1007 raise error.Abort(_("invalid format spec '%%%s' in output "
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
1008 "filename") % c)
428de1a59f2d cmdutil: narrow scope of KeyError in makefilename()
Yuya Nishihara <yuya@tcha.org>
parents: 36245
diff changeset
1009 return ''.join(newname)
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1010
36540
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
1011 def makefilename(ctx, pat, **props):
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
1012 if not pat:
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
1013 return pat
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
1014 tmpl = _buildfntemplate(pat, **props)
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
1015 # BUG: alias expansion shouldn't be made against template fragments
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
1016 # rewritten from %-format strings, but we have no easy way to partially
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
1017 # disable the expansion.
aa3294027936 cmdutil: expand filename format string by templater (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 36538
diff changeset
1018 return rendertemplate(ctx, tmpl, pycompat.byteskwargs(props))
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1019
32572
447bbd970047 cmdutil: extract function checking if pattern should be taken as stdin/out
Yuya Nishihara <yuya@tcha.org>
parents: 32571
diff changeset
1020 def isstdiofilename(pat):
447bbd970047 cmdutil: extract function checking if pattern should be taken as stdin/out
Yuya Nishihara <yuya@tcha.org>
parents: 32571
diff changeset
1021 """True if the given pat looks like a filename denoting stdin/stdout"""
447bbd970047 cmdutil: extract function checking if pattern should be taken as stdin/out
Yuya Nishihara <yuya@tcha.org>
parents: 32571
diff changeset
1022 return not pat or pat == '-'
447bbd970047 cmdutil: extract function checking if pattern should be taken as stdin/out
Yuya Nishihara <yuya@tcha.org>
parents: 32571
diff changeset
1023
27418
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
1024 class _unclosablefile(object):
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
1025 def __init__(self, fp):
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
1026 self._fp = fp
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
1027
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
1028 def close(self):
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
1029 pass
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
1030
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
1031 def __iter__(self):
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
1032 return iter(self._fp)
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
1033
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
1034 def __getattr__(self, attr):
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
1035 return getattr(self._fp, attr)
2ce4661ac226 cmdutil: reimplement file wrapper that disables close()
Yuya Nishihara <yuya@tcha.org>
parents: 27417
diff changeset
1036
30142
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 30018
diff changeset
1037 def __enter__(self):
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 30018
diff changeset
1038 return self
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 30018
diff changeset
1039
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 30018
diff changeset
1040 def __exit__(self, exc_type, exc_value, exc_tb):
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 30018
diff changeset
1041 pass
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 30018
diff changeset
1042
37601
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
1043 def makefileobj(ctx, pat, mode='wb', **props):
13769
8796fb6af67e cmdutil: fix mode handling in make_file
Adrian Buehlmann <adrian@cadifra.com>
parents: 13534
diff changeset
1044 writable = mode not in ('r', 'rb')
7319
eae1767cc6a8 export: fixed silent output file overwriting
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 7308
diff changeset
1045
32572
447bbd970047 cmdutil: extract function checking if pattern should be taken as stdin/out
Yuya Nishihara <yuya@tcha.org>
parents: 32571
diff changeset
1046 if isstdiofilename(pat):
36243
976e1cfb2f64 cmdutil: pass ctx to makefileobj() in place of repo/node pair (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36242
diff changeset
1047 repo = ctx.repo()
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24301
diff changeset
1048 if writable:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24301
diff changeset
1049 fp = repo.ui.fout
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24301
diff changeset
1050 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24301
diff changeset
1051 fp = repo.ui.fin
27419
7e2495bf0ad8 cmdutil: do not duplicate stdout by makefileobj()
Yuya Nishihara <yuya@tcha.org>
parents: 27418
diff changeset
1052 return _unclosablefile(fp)
36538
d7a23d6184a2 cmdutil: reorder optional arguments passed to makefileobj()
Yuya Nishihara <yuya@tcha.org>
parents: 36537
diff changeset
1053 fn = makefilename(ctx, pat, **props)
18613
1a2f4c633410 export: clobber files with -o (bc) (issue3652)
Augie Fackler <raf@durin42.com>
parents: 18538
diff changeset
1054 return open(fn, mode)
2882
cf98cd70d2c4 move walk and matchpats from commands to cmdutil.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2874
diff changeset
1055
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1056 def openrevlog(repo, cmd, file_, opts):
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1057 """opens the changelog, manifest, a filelog or a given revlog"""
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1058 cl = opts['changelog']
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1059 mf = opts['manifest']
25119
49c583ca48c4 treemanifest: add --dir option to debug{revlog,data,index}
Martin von Zweigbergk <martinvonz@google.com>
parents: 25100
diff changeset
1060 dir = opts['dir']
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1061 msg = None
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1062 if cl and mf:
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1063 msg = _('cannot specify --changelog and --manifest at the same time')
25119
49c583ca48c4 treemanifest: add --dir option to debug{revlog,data,index}
Martin von Zweigbergk <martinvonz@google.com>
parents: 25100
diff changeset
1064 elif cl and dir:
49c583ca48c4 treemanifest: add --dir option to debug{revlog,data,index}
Martin von Zweigbergk <martinvonz@google.com>
parents: 25100
diff changeset
1065 msg = _('cannot specify --changelog and --dir at the same time')
29427
33a6b750b5b9 debug: make debug{revlog,index,data} --dir not just a flag
Martin von Zweigbergk <martinvonz@google.com>
parents: 29397
diff changeset
1066 elif cl or mf or dir:
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1067 if file_:
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1068 msg = _('cannot specify filename with --changelog or --manifest')
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1069 elif not repo:
25119
49c583ca48c4 treemanifest: add --dir option to debug{revlog,data,index}
Martin von Zweigbergk <martinvonz@google.com>
parents: 25100
diff changeset
1070 msg = _('cannot specify --changelog or --manifest or --dir '
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1071 'without a repository')
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1072 if msg:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
1073 raise error.Abort(msg)
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1074
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1075 r = None
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1076 if repo:
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1077 if cl:
21033
254f55b64e31 debugrevlog: use unfiltered view for changelog
Matt Mackall <mpm@selenic.com>
parents: 21024
diff changeset
1078 r = repo.unfiltered().changelog
25119
49c583ca48c4 treemanifest: add --dir option to debug{revlog,data,index}
Martin von Zweigbergk <martinvonz@google.com>
parents: 25100
diff changeset
1079 elif dir:
49c583ca48c4 treemanifest: add --dir option to debug{revlog,data,index}
Martin von Zweigbergk <martinvonz@google.com>
parents: 25100
diff changeset
1080 if 'treemanifest' not in repo.requirements:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
1081 raise error.Abort(_("--dir can only be used on repos with "
25119
49c583ca48c4 treemanifest: add --dir option to debug{revlog,data,index}
Martin von Zweigbergk <martinvonz@google.com>
parents: 25100
diff changeset
1082 "treemanifest enabled"))
37272
6ff8bd691fb8 narrow: add trailing slash to dir earlier for debug{revlog,index,data}
Martin von Zweigbergk <martinvonz@google.com>
parents: 37153
diff changeset
1083 if not dir.endswith('/'):
6ff8bd691fb8 narrow: add trailing slash to dir earlier for debug{revlog,index,data}
Martin von Zweigbergk <martinvonz@google.com>
parents: 37153
diff changeset
1084 dir = dir + '/'
30381
fccc3eea2ddb manifest: delete unused dirlog and _newmanifest functions
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
1085 dirlog = repo.manifestlog._revlog.dirlog(dir)
25119
49c583ca48c4 treemanifest: add --dir option to debug{revlog,data,index}
Martin von Zweigbergk <martinvonz@google.com>
parents: 25100
diff changeset
1086 if len(dirlog):
49c583ca48c4 treemanifest: add --dir option to debug{revlog,data,index}
Martin von Zweigbergk <martinvonz@google.com>
parents: 25100
diff changeset
1087 r = dirlog
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1088 elif mf:
30385
11b8b740d54a manifest: remove last uses of repo.manifest
Durham Goode <durham@fb.com>
parents: 30381
diff changeset
1089 r = repo.manifestlog._revlog
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1090 elif file_:
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1091 filelog = repo.file(file_)
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1092 if len(filelog):
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1093 r = filelog
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1094 if not r:
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1095 if not file_:
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1096 raise error.CommandError(cmd, _('invalid arguments'))
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1097 if not os.path.isfile(file_):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
1098 raise error.Abort(_("revlog '%s' not found") % file_)
31247
1b08aca7870a vfs: use 'vfs' module directly in 'mercurial.cmdutil'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31226
diff changeset
1099 r = revlog.revlog(vfsmod.vfs(pycompat.getcwd(), audit=False),
14323
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1100 file_[:-2] + ".i")
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1101 return r
a79fea6b3e77 debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents: 14322
diff changeset
1102
5610
2493a478f395 copy: handle rename internally
Matt Mackall <mpm@selenic.com>
parents: 5609
diff changeset
1103 def copy(ui, repo, pats, opts, rename=False):
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1104 # called with the repo lock held
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1105 #
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1106 # hgsep => pathname that uses "/" to separate directories
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1107 # ossep => pathname that uses os.sep to separate directories
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1108 cwd = repo.getcwd()
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1109 targets = {}
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1110 after = opts.get("after")
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1111 dryrun = opts.get("dry_run")
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11290
diff changeset
1112 wctx = repo[None]
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1113
5605
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1114 def walkpat(pat):
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1115 srcs = []
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24301
diff changeset
1116 if after:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24301
diff changeset
1117 badstates = '?'
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24301
diff changeset
1118 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24301
diff changeset
1119 badstates = '?r'
32421
c87db79b9507 cleanup: reuse existing wctx variables instead of calling repo[None]
Martin von Zweigbergk <martinvonz@google.com>
parents: 32414
diff changeset
1120 m = scmutil.match(wctx, [pat], opts, globbed=True)
c87db79b9507 cleanup: reuse existing wctx variables instead of calling repo[None]
Martin von Zweigbergk <martinvonz@google.com>
parents: 32414
diff changeset
1121 for abs in wctx.walk(m):
5605
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1122 state = repo.dirstate[abs]
6584
29c77e5dfb3c walk: remove rel and exact returns
Matt Mackall <mpm@selenic.com>
parents: 6582
diff changeset
1123 rel = m.rel(abs)
29c77e5dfb3c walk: remove rel and exact returns
Matt Mackall <mpm@selenic.com>
parents: 6582
diff changeset
1124 exact = m.exact(abs)
11223
0d09f2244805 rename: make --after work if source is already in R state
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 11177
diff changeset
1125 if state in badstates:
5605
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1126 if exact and state == '?':
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1127 ui.warn(_('%s: not copying - file is not managed\n') % rel)
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1128 if exact and state == 'r':
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1129 ui.warn(_('%s: not copying - file has been marked for'
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1130 ' remove\n') % rel)
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1131 continue
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1132 # abs: hgsep
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1133 # rel: ossep
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1134 srcs.append((abs, rel, exact))
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1135 return srcs
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1136
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1137 # abssrc: hgsep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1138 # relsrc: ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1139 # otarget: ossep
5605
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1140 def copyfile(abssrc, relsrc, otarget, exact):
20033
f962870712da pathutil: tease out a new library to break an import cycle from canonpath use
Augie Fackler <raf@durin42.com>
parents: 19944
diff changeset
1141 abstarget = pathutil.canonpath(repo.root, cwd, otarget)
16542
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16458
diff changeset
1142 if '/' in abstarget:
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16458
diff changeset
1143 # We cannot normalize abstarget itself, this would prevent
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16458
diff changeset
1144 # case only renames, like a => A.
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16458
diff changeset
1145 abspath, absname = abstarget.rsplit('/', 1)
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16458
diff changeset
1146 abstarget = repo.dirstate.normalize(abspath) + '/' + absname
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1147 reltarget = repo.pathto(abstarget, cwd)
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1148 target = repo.wjoin(abstarget)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1149 src = repo.wjoin(abssrc)
5608
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
1150 state = repo.dirstate[abstarget]
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1151
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13945
diff changeset
1152 scmutil.checkportable(ui, abstarget)
13945
03f3ce7ca2a8 copy: do not copy file if name is disallowed anyway
Adrian Buehlmann <adrian@cadifra.com>
parents: 13878
diff changeset
1153
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1154 # check for collisions
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1155 prevsrc = targets.get(abstarget)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1156 if prevsrc is not None:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1157 ui.warn(_('%s: not overwriting - %s collides with %s\n') %
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1158 (reltarget, repo.pathto(abssrc, cwd),
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1159 repo.pathto(prevsrc, cwd)))
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1160 return
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1161
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1162 # check for overwrites
12342
70236d6fd844 rename: do not overwrite existing broken symlinks
Patrick Mezard <pmezard@gmail.com>
parents: 11950
diff changeset
1163 exists = os.path.lexists(target)
16283
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1164 samefile = False
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1165 if exists and abssrc != abstarget:
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1166 if (repo.dirstate.normalize(abssrc) ==
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1167 repo.dirstate.normalize(abstarget)):
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1168 if not rename:
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1169 ui.warn(_("%s: can't copy - same file\n") % reltarget)
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1170 return
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1171 exists = False
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1172 samefile = True
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1173
8117
2b30d8488819 remove unnecessary outer parenthesis in if-statements
Martin Geisler <mg@lazybytes.net>
parents: 8013
diff changeset
1174 if not after and exists or after and state in 'mn':
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1175 if not opts['force']:
30151
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1176 if state in 'mn':
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1177 msg = _('%s: not overwriting - file already committed\n')
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1178 if after:
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1179 flags = '--after --force'
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1180 else:
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1181 flags = '--force'
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1182 if rename:
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1183 hint = _('(hg rename %s to replace the file by '
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1184 'recording a rename)\n') % flags
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1185 else:
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1186 hint = _('(hg copy %s to replace the file by '
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1187 'recording a copy)\n') % flags
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1188 else:
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1189 msg = _('%s: not overwriting - file exists\n')
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1190 if rename:
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1191 hint = _('(hg rename --after to record the rename)\n')
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1192 else:
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1193 hint = _('(hg copy --after to record the copy)\n')
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1194 ui.warn(msg % reltarget)
381293e1135e copy: distinguish "file exists" cases and add a hint (BC)
Augie Fackler <augie@google.com>
parents: 30142
diff changeset
1195 ui.warn(hint)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1196 return
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1197
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1198 if after:
5608
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
1199 if not exists:
11152
e8d10d085f47 cmdutil: Warn when trying to copy/rename --after to a nonexistant file.
Steve Losh <steve@stevelosh.com>
parents: 11061
diff changeset
1200 if rename:
e8d10d085f47 cmdutil: Warn when trying to copy/rename --after to a nonexistant file.
Steve Losh <steve@stevelosh.com>
parents: 11061
diff changeset
1201 ui.warn(_('%s: not recording move - %s does not exist\n') %
e8d10d085f47 cmdutil: Warn when trying to copy/rename --after to a nonexistant file.
Steve Losh <steve@stevelosh.com>
parents: 11061
diff changeset
1202 (relsrc, reltarget))
e8d10d085f47 cmdutil: Warn when trying to copy/rename --after to a nonexistant file.
Steve Losh <steve@stevelosh.com>
parents: 11061
diff changeset
1203 else:
e8d10d085f47 cmdutil: Warn when trying to copy/rename --after to a nonexistant file.
Steve Losh <steve@stevelosh.com>
parents: 11061
diff changeset
1204 ui.warn(_('%s: not recording copy - %s does not exist\n') %
e8d10d085f47 cmdutil: Warn when trying to copy/rename --after to a nonexistant file.
Steve Losh <steve@stevelosh.com>
parents: 11061
diff changeset
1205 (relsrc, reltarget))
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1206 return
5608
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
1207 elif not dryrun:
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1208 try:
5608
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
1209 if exists:
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
1210 os.unlink(target)
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
1211 targetdir = os.path.dirname(target) or '.'
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
1212 if not os.path.isdir(targetdir):
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
1213 os.makedirs(targetdir)
16283
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1214 if samefile:
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1215 tmp = target + "~hgrename"
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1216 os.rename(src, tmp)
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1217 os.rename(tmp, target)
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1218 else:
37091
08890706366e copyfile: preserve stat info (mtime, etc.) when doing copies/renames
Kyle Lippincott <spectral@google.com>
parents: 37087
diff changeset
1219 # Preserve stat info on renames, not on copies; this matches
08890706366e copyfile: preserve stat info (mtime, etc.) when doing copies/renames
Kyle Lippincott <spectral@google.com>
parents: 37087
diff changeset
1220 # Linux CLI behavior.
08890706366e copyfile: preserve stat info (mtime, etc.) when doing copies/renames
Kyle Lippincott <spectral@google.com>
parents: 37087
diff changeset
1221 util.copyfile(src, target, copystat=rename)
14518
a67e866f46f9 workingctx: eliminate remove function
Adrian Buehlmann <adrian@cadifra.com>
parents: 14442
diff changeset
1222 srcexists = True
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25657
diff changeset
1223 except IOError as inst:
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1224 if inst.errno == errno.ENOENT:
24364
135b23868f45 commands: replace "working copy" with "working directory" in help/messages
Yuya Nishihara <yuya@tcha.org>
parents: 24359
diff changeset
1225 ui.warn(_('%s: deleted in working directory\n') % relsrc)
14518
a67e866f46f9 workingctx: eliminate remove function
Adrian Buehlmann <adrian@cadifra.com>
parents: 14442
diff changeset
1226 srcexists = False
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1227 else:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1228 ui.warn(_('%s: cannot copy - %s\n') %
34040
d5b2beca16c0 python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents: 34037
diff changeset
1229 (relsrc, encoding.strtolocal(inst.strerror)))
5606
447ea621e50e copy: propagate errors properly
Matt Mackall <mpm@selenic.com>
parents: 5605
diff changeset
1230 return True # report a failure
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1231
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1232 if ui.verbose or not exact:
7894
caef5fdf1375 cmdutil: fix untranslatable string in copy
Martin Geisler <mg@daimi.au.dk>
parents: 7879
diff changeset
1233 if rename:
caef5fdf1375 cmdutil: fix untranslatable string in copy
Martin Geisler <mg@daimi.au.dk>
parents: 7879
diff changeset
1234 ui.status(_('moving %s to %s\n') % (relsrc, reltarget))
caef5fdf1375 cmdutil: fix untranslatable string in copy
Martin Geisler <mg@daimi.au.dk>
parents: 7879
diff changeset
1235 else:
caef5fdf1375 cmdutil: fix untranslatable string in copy
Martin Geisler <mg@daimi.au.dk>
parents: 7879
diff changeset
1236 ui.status(_('copying %s to %s\n') % (relsrc, reltarget))
5608
784eadabd985 copy: simplify inner copy
Matt Mackall <mpm@selenic.com>
parents: 5607
diff changeset
1237
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1238 targets[abstarget] = abssrc
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1239
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1240 # fix up dirstate
14321
003d63bb4fa5 scmutil: drop some aliases in cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14320
diff changeset
1241 scmutil.dirstatecopy(ui, repo, wctx, abssrc, abstarget,
003d63bb4fa5 scmutil: drop some aliases in cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14320
diff changeset
1242 dryrun=dryrun, cwd=cwd)
5610
2493a478f395 copy: handle rename internally
Matt Mackall <mpm@selenic.com>
parents: 5609
diff changeset
1243 if rename and not dryrun:
16283
6c4dbe28dda3 rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents: 16165
diff changeset
1244 if not after and srcexists and not samefile:
31318
8908f985570c vfs: use repo.wvfs.unlinkpath
Mads Kiilerich <madski@unity3d.com>
parents: 31247
diff changeset
1245 repo.wvfs.unlinkpath(abssrc)
14518
a67e866f46f9 workingctx: eliminate remove function
Adrian Buehlmann <adrian@cadifra.com>
parents: 14442
diff changeset
1246 wctx.forget([abssrc])
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1247
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1248 # pat: ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1249 # dest ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1250 # srcs: list of (hgsep, hgsep, ossep, bool)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1251 # return: function that takes hgsep and returns ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1252 def targetpathfn(pat, dest, srcs):
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1253 if os.path.isdir(pat):
20033
f962870712da pathutil: tease out a new library to break an import cycle from canonpath use
Augie Fackler <raf@durin42.com>
parents: 19944
diff changeset
1254 abspfx = pathutil.canonpath(repo.root, cwd, pat)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1255 abspfx = util.localpath(abspfx)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1256 if destdirexists:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1257 striplen = len(os.path.split(abspfx)[0])
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1258 else:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1259 striplen = len(abspfx)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1260 if striplen:
30620
bb77654dc7ae py3: replace os.sep with pycompat.ossep (part 3 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30543
diff changeset
1261 striplen += len(pycompat.ossep)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1262 res = lambda p: os.path.join(dest, util.localpath(p)[striplen:])
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1263 elif destdirexists:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1264 res = lambda p: os.path.join(dest,
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1265 os.path.basename(util.localpath(p)))
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1266 else:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1267 res = lambda p: dest
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1268 return res
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1269
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1270 # pat: ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1271 # dest ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1272 # srcs: list of (hgsep, hgsep, ossep, bool)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1273 # return: function that takes hgsep and returns ossep
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1274 def targetpathafterfn(pat, dest, srcs):
12085
6f833fc3ccab Consistently import foo as foomod when foo to avoid shadowing
Martin Geisler <mg@aragost.com>
parents: 12032
diff changeset
1275 if matchmod.patkind(pat):
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1276 # a mercurial pattern
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1277 res = lambda p: os.path.join(dest,
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1278 os.path.basename(util.localpath(p)))
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1279 else:
20033
f962870712da pathutil: tease out a new library to break an import cycle from canonpath use
Augie Fackler <raf@durin42.com>
parents: 19944
diff changeset
1280 abspfx = pathutil.canonpath(repo.root, cwd, pat)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1281 if len(abspfx) < len(srcs[0][0]):
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1282 # A directory. Either the target path contains the last
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1283 # component of the source path or it does not.
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1284 def evalpath(striplen):
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1285 score = 0
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1286 for s in srcs:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1287 t = os.path.join(dest, util.localpath(s[0])[striplen:])
12357
cb59654c2c7a Restore lexists() changes lost in e0ee3e822a9a merge
Patrick Mezard <pmezard@gmail.com>
parents: 12345
diff changeset
1288 if os.path.lexists(t):
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1289 score += 1
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1290 return score
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1291
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1292 abspfx = util.localpath(abspfx)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1293 striplen = len(abspfx)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1294 if striplen:
30620
bb77654dc7ae py3: replace os.sep with pycompat.ossep (part 3 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30543
diff changeset
1295 striplen += len(pycompat.ossep)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1296 if os.path.isdir(os.path.join(dest, os.path.split(abspfx)[1])):
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1297 score = evalpath(striplen)
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1298 striplen1 = len(os.path.split(abspfx)[0])
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1299 if striplen1:
30620
bb77654dc7ae py3: replace os.sep with pycompat.ossep (part 3 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30543
diff changeset
1300 striplen1 += len(pycompat.ossep)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1301 if evalpath(striplen1) > score:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1302 striplen = striplen1
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1303 res = lambda p: os.path.join(dest,
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1304 util.localpath(p)[striplen:])
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1305 else:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1306 # a file
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1307 if destdirexists:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1308 res = lambda p: os.path.join(dest,
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1309 os.path.basename(util.localpath(p)))
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1310 else:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1311 res = lambda p: dest
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1312 return res
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1313
14321
003d63bb4fa5 scmutil: drop some aliases in cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14320
diff changeset
1314 pats = scmutil.expandpats(pats)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1315 if not pats:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
1316 raise error.Abort(_('no source or destination specified'))
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1317 if len(pats) == 1:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
1318 raise error.Abort(_('no destination specified'))
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1319 dest = pats.pop()
6258
c24f4b3f156b Fix issue995 (copy --after and symlinks pointing to a directory)
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6211
diff changeset
1320 destdirexists = os.path.isdir(dest) and not os.path.islink(dest)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1321 if not destdirexists:
12085
6f833fc3ccab Consistently import foo as foomod when foo to avoid shadowing
Martin Geisler <mg@aragost.com>
parents: 12032
diff changeset
1322 if len(pats) > 1 or matchmod.patkind(pats[0]):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
1323 raise error.Abort(_('with multiple sources, destination must be an '
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1324 'existing directory'))
5843
83c354c4d529 Add endswithsep() and use it instead of using os.sep and os.altsep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5836
diff changeset
1325 if util.endswithsep(dest):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
1326 raise error.Abort(_('destination %s is not a directory') % dest)
5607
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1327
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1328 tfn = targetpathfn
e9bae5c80ab4 copy: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 5606
diff changeset
1329 if after:
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1330 tfn = targetpathafterfn
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1331 copylist = []
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1332 for pat in pats:
5605
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1333 srcs = walkpat(pat)
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1334 if not srcs:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1335 continue
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1336 copylist.append((tfn(pat, dest, srcs), srcs))
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1337 if not copylist:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
1338 raise error.Abort(_('no files to copy'))
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1339
5606
447ea621e50e copy: propagate errors properly
Matt Mackall <mpm@selenic.com>
parents: 5605
diff changeset
1340 errors = 0
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1341 for targetpath, srcs in copylist:
5605
e7a9ad999308 copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents: 5604
diff changeset
1342 for abssrc, relsrc, exact in srcs:
5606
447ea621e50e copy: propagate errors properly
Matt Mackall <mpm@selenic.com>
parents: 5605
diff changeset
1343 if copyfile(abssrc, relsrc, targetpath(abssrc), exact):
447ea621e50e copy: propagate errors properly
Matt Mackall <mpm@selenic.com>
parents: 5605
diff changeset
1344 errors += 1
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1345
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1346 if errors:
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1347 ui.warn(_('(consider using --after)\n'))
5609
a783d3627144 copy: move rename logic
Matt Mackall <mpm@selenic.com>
parents: 5608
diff changeset
1348
11177
6a64813276ed commands: initial audit of exit codes
Matt Mackall <mpm@selenic.com>
parents: 11152
diff changeset
1349 return errors != 0
5589
9981b6b19ecf move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents: 5550
diff changeset
1350
26561
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1351 ## facility to let extension process additional data into an import patch
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1352 # list of identifier to be executed in order
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1353 extrapreimport = [] # run before commit
26562
dd2f5e014806 import: allow processing of extra part header after import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26561
diff changeset
1354 extrapostimport = [] # run after commit
26561
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1355 # mapping from identifier to actual import function
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1356 #
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1357 # 'preimport' are run before the commit is made and are provided the following
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1358 # arguments:
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1359 # - repo: the localrepository instance,
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1360 # - patchdata: data extracted from patch header (cf m.patch.patchheadermap),
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26750
diff changeset
1361 # - extra: the future extra dictionary of the changeset, please mutate it,
26561
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1362 # - opts: the import options.
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1363 # XXX ideally, we would just pass an ctx ready to be computed, that would allow
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1364 # mutation of in memory commit and more. Feel free to rework the code to get
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1365 # there.
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1366 extrapreimportmap = {}
26562
dd2f5e014806 import: allow processing of extra part header after import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26561
diff changeset
1367 # 'postimport' are run after the commit is made and are provided the following
dd2f5e014806 import: allow processing of extra part header after import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26561
diff changeset
1368 # argument:
dd2f5e014806 import: allow processing of extra part header after import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26561
diff changeset
1369 # - ctx: the changectx created by import.
dd2f5e014806 import: allow processing of extra part header after import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26561
diff changeset
1370 extrapostimportmap = {}
26561
1f14920a892c import: allow processing of extra part header during import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26547
diff changeset
1371
37620
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
1372 def tryimportone(ui, repo, patchdata, parents, opts, msgs, updatefunc):
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1373 """Utility function used by commands.import to import a single patch
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1374
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1375 This function is explicitly defined here to help the evolve extension to
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1376 wrap this part of the import logic.
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1377
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1378 The API is currently a bit ugly because it a simple code translation from
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1379 the import command. Feel free to make it better.
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1380
37620
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
1381 :patchdata: a dictionary containing parsed patch data (such as from
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
1382 ``patch.extract()``)
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1383 :parents: nodes that will be parent of the created commit
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1384 :opts: the full dict of option passed to the import command
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1385 :msgs: list to save commit message to.
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1386 (used in case we need to save it when failing)
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1387 :updatefunc: a function that update a repo to a given node
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1388 updatefunc(<repo>, <node>)
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1389 """
25930
221491bbaf7e cmdutil: break import cycle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25795
diff changeset
1390 # avoid cycle context -> subrepo -> cmdutil
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
1391 from . import context
37620
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
1392
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
1393 tmpname = patchdata.get('filename')
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
1394 message = patchdata.get('message')
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
1395 user = opts.get('user') or patchdata.get('user')
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
1396 date = opts.get('date') or patchdata.get('date')
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
1397 branch = patchdata.get('branch')
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
1398 nodeid = patchdata.get('nodeid')
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
1399 p1 = patchdata.get('p1')
fd1dd79cff20 cmdutil: pass in parsed patch to tryimportone() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37604
diff changeset
1400 p2 = patchdata.get('p2')
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1401
27613
dffd2ed9a7c4 import: refactor nocommit and importbranch handling
timeless <timeless@mozdev.org>
parents: 27612
diff changeset
1402 nocommit = opts.get('no_commit')
dffd2ed9a7c4 import: refactor nocommit and importbranch handling
timeless <timeless@mozdev.org>
parents: 27612
diff changeset
1403 importbranch = opts.get('import_branch')
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1404 update = not opts.get('bypass')
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1405 strip = opts["strip"]
24259
5ac8ce04baa2 cmdutil.tryimportone: allow importing relative patches into the working dir
Siddharth Agarwal <sid0@fb.com>
parents: 24222
diff changeset
1406 prefix = opts["prefix"]
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1407 sim = float(opts.get('similarity') or 0)
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1408
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1409 if not tmpname:
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1410 return None, None, False
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1411
21553
bee0e1cffdd3 import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21419
diff changeset
1412 rejects = False
bee0e1cffdd3 import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21419
diff changeset
1413
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1414 cmdline_message = logmessage(ui, opts)
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1415 if cmdline_message:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1416 # pickup the cmdline msg
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1417 message = cmdline_message
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1418 elif message:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1419 # pickup the patch msg
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1420 message = message.strip()
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1421 else:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1422 # launch the editor
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1423 message = None
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1424 ui.debug('message:\n%s\n' % (message or ''))
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1425
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1426 if len(parents) == 1:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1427 parents.append(repo[nullid])
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1428 if opts.get('exact'):
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1429 if not nodeid or not p1:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1430 raise error.Abort(_('not a Mercurial patch'))
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1431 p1 = repo[p1]
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1432 p2 = repo[p2 or nullid]
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1433 elif p2:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1434 try:
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1435 p1 = repo[p1]
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1436 p2 = repo[p2]
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1437 # Without any options, consider p2 only if the
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1438 # patch is being applied on top of the recorded
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1439 # first parent.
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1440 if p1 != parents[0]:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1441 p1 = parents[0]
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1442 p2 = repo[nullid]
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1443 except error.RepoError:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1444 p1, p2 = parents
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1445 if p2.node() == nullid:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1446 ui.warn(_("warning: import the patch as a normal revision\n"
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1447 "(use --exact to import the patch as a merge)\n"))
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1448 else:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1449 p1, p2 = parents
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1450
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1451 n = None
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1452 if update:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1453 if p1 != parents[0]:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1454 updatefunc(repo, p1.node())
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1455 if p2 != parents[1]:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1456 repo.setparents(p1.node(), p2.node())
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1457
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1458 if opts.get('exact') or importbranch:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1459 repo.dirstate.setbranch(branch or 'default')
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1460
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1461 partial = opts.get('partial', False)
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1462 files = set()
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1463 try:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1464 patch.patch(ui, repo, tmpname, strip=strip, prefix=prefix,
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1465 files=files, eolmode=None, similarity=sim / 100.0)
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1466 except error.PatchError as e:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1467 if not partial:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1468 raise error.Abort(pycompat.bytestr(e))
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1469 if partial:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1470 rejects = True
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1471
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1472 files = list(files)
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1473 if nocommit:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1474 if message:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1475 msgs.append(message)
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1476 else:
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1477 if opts.get('exact') or p2:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1478 # If you got here, you either use --force and know what
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1479 # you are doing or used --exact or a merge patch while
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1480 # being updated to its first parent.
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1481 m = None
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1482 else:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1483 m = scmutil.matchfiles(repo, files or [])
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1484 editform = mergeeditform(repo[None], 'import.normal')
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1485 if opts.get('exact'):
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1486 editor = None
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1487 else:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1488 editor = getcommiteditor(editform=editform,
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1489 **pycompat.strkwargs(opts))
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1490 extra = {}
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1491 for idfunc in extrapreimport:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1492 extrapreimportmap[idfunc](repo, patchdata, extra, opts)
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1493 overrides = {}
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1494 if partial:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1495 overrides[('ui', 'allowemptycommit')] = True
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1496 with repo.ui.configoverride(overrides, 'import'):
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1497 n = repo.commit(message, user,
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1498 date, match=m,
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1499 editor=editor, extra=extra)
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1500 for idfunc in extrapostimport:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1501 extrapostimportmap[idfunc](repo[n])
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1502 else:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1503 if opts.get('exact') or importbranch:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1504 branch = branch or 'default'
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1505 else:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1506 branch = p1.branch()
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1507 store = patch.filestore()
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1508 try:
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1509 files = set()
21553
bee0e1cffdd3 import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21419
diff changeset
1510 try:
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1511 patch.patchrepo(ui, repo, p1, store, tmpname, strip, prefix,
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1512 files, eolmode=None)
34258
61714510220d error: move patch.PatchError so it can easily implement __bytes__ (API)
Yuya Nishihara <yuya@tcha.org>
parents: 34201
diff changeset
1513 except error.PatchError as e:
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1514 raise error.Abort(stringutil.forcebytestr(e))
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1515 if opts.get('exact'):
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1516 editor = None
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1517 else:
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1518 editor = getcommiteditor(editform='import.bypass')
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1519 memctx = context.memctx(repo, (p1.node(), p2.node()),
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1520 message,
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1521 files=files,
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1522 filectxfn=store,
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1523 user=user,
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1524 date=date,
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1525 branch=branch,
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1526 editor=editor)
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1527 n = memctx.commit()
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1528 finally:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1529 store.close()
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1530 if opts.get('exact') and nocommit:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1531 # --exact with --no-commit is still useful in that it does merge
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1532 # and branch bits
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1533 ui.warn(_("warning: can't check exact import with --no-commit\n"))
37815
32a75a8a5b0f import: fix crash on --exact check of empty commit (issue5702)
Yuya Nishihara <yuya@tcha.org>
parents: 37778
diff changeset
1534 elif opts.get('exact') and (not n or hex(n) != nodeid):
37621
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1535 raise error.Abort(_('patch is damaged or loses information'))
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1536 msg = _('applied to working directory')
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1537 if n:
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1538 # i18n: refers to a short changeset id
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1539 msg = _('created %s') % short(n)
5537d8f5e989 patch: make extract() a context manager (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37620
diff changeset
1540 return msg, n, rejects
20500
ce3f3082ec45 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20470
diff changeset
1541
26545
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
1542 # facility to let extensions include additional data in an exported patch
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
1543 # list of identifiers to be executed in order
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
1544 extraexport = []
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
1545 # mapping from identifier to actual export function
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
1546 # function as to return a string to be added to the header or None
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
1547 # it is given two arguments (sequencenumber, changectx)
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
1548 extraexportmap = {}
e99c3846d78a export: introduce a generic way to add patch header on export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26533
diff changeset
1549
37602
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1550 def _exportsingle(repo, ctx, fm, match, switch_parent, seqno, diffopts):
32682
9d201b39ccd9 export: map wctx.node() to 'ff...' node id (issue5438)
Yuya Nishihara <yuya@tcha.org>
parents: 32678
diff changeset
1551 node = scmutil.binnode(ctx)
32471
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1552 parents = [p.node() for p in ctx.parents() if p]
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1553 branch = ctx.branch()
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1554 if switch_parent:
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1555 parents.reverse()
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1556
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1557 if parents:
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1558 prev = parents[0]
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1559 else:
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1560 prev = nullid
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1561
37602
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1562 fm.context(ctx=ctx)
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1563 fm.plain('# HG changeset patch\n')
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1564 fm.write('user', '# User %s\n', ctx.user())
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1565 fm.plain('# Date %d %d\n' % ctx.date())
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1566 fm.write('date', '# %s\n', fm.formatdate(ctx.date()))
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1567 fm.condwrite(branch and branch != 'default',
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1568 'branch', '# Branch %s\n', branch)
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1569 fm.write('node', '# Node ID %s\n', hex(node))
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1570 fm.plain('# Parent %s\n' % hex(prev))
32471
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1571 if len(parents) > 1:
37602
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1572 fm.plain('# Parent %s\n' % hex(parents[1]))
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1573 fm.data(parents=fm.formatlist(pycompat.maplist(hex, parents), name='node'))
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1574
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1575 # TODO: redesign extraexportmap function to support formatter
32471
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1576 for headerid in extraexport:
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1577 header = extraexportmap[headerid](seqno, ctx)
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1578 if header is not None:
37602
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1579 fm.plain('# %s\n' % header)
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1580
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1581 fm.write('desc', '%s\n', ctx.description().rstrip())
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1582 fm.plain('\n')
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1583
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1584 if fm.isplain():
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1585 chunkiter = patch.diffui(repo, prev, node, match, opts=diffopts)
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1586 for chunk, label in chunkiter:
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1587 fm.plain(chunk, label=label)
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1588 else:
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1589 chunkiter = patch.diff(repo, prev, node, match, opts=diffopts)
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1590 # TODO: make it structured?
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1591 fm.data(diff=b''.join(chunkiter))
32471
7feaf5550a9e cmdutil: extract closure that performs the actual export formatting
Augie Fackler <augie@google.com>
parents: 32470
diff changeset
1592
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1593 def _exportfile(repo, revs, fm, dest, switch_parent, diffopts, match):
37600
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
1594 """Export changesets to stdout or a single file"""
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
1595 for seqno, rev in enumerate(revs, 1):
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
1596 ctx = repo[rev]
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
1597 if not dest.startswith('<'):
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
1598 repo.ui.note("%s\n" % dest)
37602
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1599 fm.startitem()
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1600 _exportsingle(repo, ctx, fm, match, switch_parent, seqno, diffopts)
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1601
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1602 def _exportfntemplate(repo, revs, basefm, fntemplate, switch_parent, diffopts,
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1603 match):
37600
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
1604 """Export changesets to possibly multiple files"""
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
1605 total = len(revs)
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
1606 revwidth = max(len(str(rev)) for rev in revs)
37601
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
1607 filemap = util.sortdict() # filename: [(seqno, rev), ...]
37600
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
1608
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
1609 for seqno, rev in enumerate(revs, 1):
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
1610 ctx = repo[rev]
37601
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
1611 dest = makefilename(ctx, fntemplate,
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
1612 total=total, seqno=seqno, revwidth=revwidth)
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
1613 filemap.setdefault(dest, []).append((seqno, rev))
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
1614
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
1615 for dest in filemap:
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1616 with formatter.maybereopen(basefm, dest) as fm:
37601
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
1617 repo.ui.note("%s\n" % dest)
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
1618 for seqno, rev in filemap[dest]:
37602
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1619 fm.startitem()
37601
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
1620 ctx = repo[rev]
37602
52670eaa14b4 export: port _exportsingle() to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 37601
diff changeset
1621 _exportsingle(repo, ctx, fm, match, switch_parent, seqno,
37601
2e0e61312a25 export: serialize revisions to be exported per destination file
Yuya Nishihara <yuya@tcha.org>
parents: 37600
diff changeset
1622 diffopts)
37600
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
1623
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1624 def export(repo, revs, basefm, fntemplate='hg-%h.patch', switch_parent=False,
26229
d1530c6e8613 extdiff: enable -I/-X with --patch
Matt Harbison <matt_harbison@yahoo.com>
parents: 26222
diff changeset
1625 opts=None, match=None):
32468
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1626 '''export changesets as hg patches
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1627
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1628 Args:
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1629 repo: The repository from which we're exporting revisions.
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1630 revs: A list of revisions to export as revision numbers.
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1631 basefm: A formatter to which patches should be written.
32469
9fd9f91b0c43 cmdutil: rename template param to export to fntemplate
Augie Fackler <augie@google.com>
parents: 32468
diff changeset
1632 fntemplate: An optional string to use for generating patch file names.
32468
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1633 switch_parent: If True, show diffs against second parent when not nullid.
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1634 Default is false, which always shows diff against p1.
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1635 opts: diff options to use for generating the patch.
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1636 match: If specified, only export changes to files matching this matcher.
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1637
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1638 Returns:
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1639 Nothing.
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1640
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1641 Side Effect:
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1642 "HG Changeset Patch" data is emitted to one of the following
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1643 destinations:
32469
9fd9f91b0c43 cmdutil: rename template param to export to fntemplate
Augie Fackler <augie@google.com>
parents: 32468
diff changeset
1644 fntemplate specified: Each rev is written to a unique file named using
32468
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1645 the given template.
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1646 Otherwise: All revs will be written to basefm.
32468
1f4be037f558 cmdutil: comprehensively document the interface of export
Augie Fackler <augie@google.com>
parents: 32421
diff changeset
1647 '''
37763
b54404d66f7e export: invoke the file prefetch hook
Matt Harbison <matt_harbison@yahoo.com>
parents: 37762
diff changeset
1648 scmutil.prefetchfiles(repo, revs, match)
b54404d66f7e export: invoke the file prefetch hook
Matt Harbison <matt_harbison@yahoo.com>
parents: 37762
diff changeset
1649
37603
678d760c71ff export: extract function to write patch to file object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37602
diff changeset
1650 if not fntemplate:
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1651 _exportfile(repo, revs, basefm, '<unnamed>', switch_parent, opts, match)
37600
7800ed2e4980 export: split cmdutil.export() to single-file and maybe-multiple-files cases
Yuya Nishihara <yuya@tcha.org>
parents: 37599
diff changeset
1652 else:
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1653 _exportfntemplate(repo, revs, basefm, fntemplate, switch_parent, opts,
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1654 match)
10611
e764f24a45ee patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10608
diff changeset
1655
37603
678d760c71ff export: extract function to write patch to file object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37602
diff changeset
1656 def exportfile(repo, revs, fp, switch_parent=False, opts=None, match=None):
678d760c71ff export: extract function to write patch to file object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37602
diff changeset
1657 """Export changesets to the given file stream"""
37763
b54404d66f7e export: invoke the file prefetch hook
Matt Harbison <matt_harbison@yahoo.com>
parents: 37762
diff changeset
1658 scmutil.prefetchfiles(repo, revs, match)
b54404d66f7e export: invoke the file prefetch hook
Matt Harbison <matt_harbison@yahoo.com>
parents: 37762
diff changeset
1659
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1660 dest = getattr(fp, 'name', '<unnamed>')
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1661 with formatter.formatter(repo.ui, fp, 'export', {}) as fm:
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37603
diff changeset
1662 _exportfile(repo, revs, fm, dest, switch_parent, opts, match)
37603
678d760c71ff export: extract function to write patch to file object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37602
diff changeset
1663
29806
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
1664 def showmarker(fm, marker, index=None):
20470
78f4c2b7052f debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20392
diff changeset
1665 """utility function to display obsolescence marker in a readable way
78f4c2b7052f debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20392
diff changeset
1666
78f4c2b7052f debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20392
diff changeset
1667 To be used by debug function."""
28613
6433da9c96a9 debugobsolete: add an option to show marker index
Kostia Balytskyi <ikostia@fb.com>
parents: 28608
diff changeset
1668 if index is not None:
29806
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
1669 fm.write('index', '%i ', index)
33877
eae63a9e59da obsmarker: precnode was renamed into prednode
Boris Feld <boris.feld@octobus.net>
parents: 33845
diff changeset
1670 fm.write('prednode', '%s ', hex(marker.prednode()))
29806
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
1671 succs = marker.succnodes()
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
1672 fm.condwrite(succs, 'succnodes', '%s ',
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
1673 fm.formatlist(map(hex, succs), name='node'))
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
1674 fm.write('flag', '%X ', marker.flags())
22260
2229d757802d debugobsolete: display parents information from markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22250
diff changeset
1675 parents = marker.parentnodes()
2229d757802d debugobsolete: display parents information from markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22250
diff changeset
1676 if parents is not None:
29806
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
1677 fm.write('parentnodes', '{%s} ',
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
1678 fm.formatlist(map(hex, parents), name='node', sep=', '))
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
1679 fm.write('date', '(%s) ', fm.formatdate(marker.date()))
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
1680 meta = marker.metadata().copy()
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
1681 meta.pop('date', None)
35944
fc44c2657dc5 py3: drop b'' from repr() of smartset
Yuya Nishihara <yuya@tcha.org>
parents: 35943
diff changeset
1682 smeta = util.rapply(pycompat.maybebytestr, meta)
35914
1bee7762fd46 cmdutil: add a kludge to make bytes repr() the same on 2 and 3
Augie Fackler <augie@google.com>
parents: 35746
diff changeset
1683 fm.write('metadata', '{%s}', fm.formatdict(smeta, fmt='%r: %r', sep=', '))
29806
142ae01820a3 debugobsolete: add formatter support (issue5134)
Yuya Nishihara <yuya@tcha.org>
parents: 29770
diff changeset
1684 fm.plain('\n')
20470
78f4c2b7052f debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20392
diff changeset
1685
3814
120be84f33de Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents: 3738
diff changeset
1686 def finddate(ui, repo, date):
120be84f33de Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents: 3738
diff changeset
1687 """Find the tipmost changeset that matches the given date spec"""
9667
8743f2e1bc54 merge changes from mpm
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9666 9665
diff changeset
1688
36636
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36540
diff changeset
1689 df = dateutil.matchdate(date)
14322
a90131b85fd8 scmutil: drop aliases in cmdutil for match functions
Matt Mackall <mpm@selenic.com>
parents: 14321
diff changeset
1690 m = scmutil.matchall(repo)
3814
120be84f33de Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents: 3738
diff changeset
1691 results = {}
9662
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9656
diff changeset
1692
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9656
diff changeset
1693 def prep(ctx, fns):
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9656
diff changeset
1694 d = ctx.date()
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9656
diff changeset
1695 if df(d[0]):
9668
2c24471d478c cmdutil: fix bug in finddate() implementation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9667
diff changeset
1696 results[ctx.rev()] = d
9662
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9656
diff changeset
1697
9667
8743f2e1bc54 merge changes from mpm
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9666 9665
diff changeset
1698 for ctx in walkchangerevs(repo, m, {'rev': None}, prep):
9662
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9656
diff changeset
1699 rev = ctx.rev()
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9656
diff changeset
1700 if rev in results:
16937
5487088f0d43 cmdutil: lowercase finddate status message
Martin Geisler <mg@aragost.com>
parents: 16776
diff changeset
1701 ui.status(_("found revision %s from %s\n") %
36636
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36540
diff changeset
1702 (rev, dateutil.datestr(results[rev])))
32204
055cca8e167b py3: use %d to format integers into bytestrings
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32202
diff changeset
1703 return '%d' % rev
3814
120be84f33de Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents: 3738
diff changeset
1704
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
1705 raise error.Abort(_("revision matching date not found"))
3814
120be84f33de Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents: 3738
diff changeset
1706
20553
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1707 def increasingwindows(windowsize=8, sizelimit=512):
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1708 while True:
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1709 yield windowsize
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1710 if windowsize < sizelimit:
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1711 windowsize *= 2
16776
5088d0b9a9a1 cmdutil: extract increasing_windows() from walkchangerevs()
Patrick Mezard <patrick@mezard.eu>
parents: 16701
diff changeset
1712
35682
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1713 def _walkrevs(repo, opts):
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1714 # Default --rev value depends on --follow but --follow behavior
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1715 # depends on revisions resolved from --rev...
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1716 follow = opts.get('follow') or opts.get('follow_first')
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1717 if opts.get('rev'):
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1718 revs = scmutil.revrange(repo, opts['rev'])
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1719 elif follow and repo.dirstate.p1() == nullid:
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1720 revs = smartset.baseset()
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1721 elif follow:
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1722 revs = repo.revs('reverse(:.)')
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1723 else:
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1724 revs = smartset.spanset(repo)
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1725 revs.reverse()
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1726 return revs
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1727
19290
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1728 class FileWalkError(Exception):
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1729 pass
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1730
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1731 def walkfilerevs(repo, match, follow, revs, fncache):
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1732 '''Walks the file history for the matched files.
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1733
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1734 Returns the changeset revs that are involved in the file history.
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1735
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1736 Throws FileWalkError if the file history can't be walked using
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1737 filelogs alone.
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1738 '''
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1739 wanted = set()
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1740 copies = []
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1741 minrev, maxrev = min(revs), max(revs)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1742 def filerevgen(filelog, last):
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1743 """
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1744 Only files, no patterns. Check the history of each file.
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1745
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1746 Examines filelog entries within minrev, maxrev linkrev range
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1747 Returns an iterator yielding (linkrev, parentlinkrevs, copied)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1748 tuples in backwards order
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1749 """
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1750 cl_count = len(repo)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1751 revs = []
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1752 for j in xrange(0, last + 1):
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1753 linkrev = filelog.linkrev(j)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1754 if linkrev < minrev:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1755 continue
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1756 # only yield rev for which we have the changelog, it can
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1757 # happen while doing "hg log" during a pull or commit
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1758 if linkrev >= cl_count:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1759 break
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1760
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1761 parentlinkrevs = []
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1762 for p in filelog.parentrevs(j):
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1763 if p != nullrev:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1764 parentlinkrevs.append(filelog.linkrev(p))
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1765 n = filelog.node(j)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1766 revs.append((linkrev, parentlinkrevs,
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1767 follow and filelog.renamed(n)))
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1768
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1769 return reversed(revs)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1770 def iterfiles():
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1771 pctx = repo['.']
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1772 for filename in match.files():
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1773 if follow:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1774 if filename not in pctx:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
1775 raise error.Abort(_('cannot follow file not in parent '
19290
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1776 'revision: "%s"') % filename)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1777 yield filename, pctx[filename].filenode()
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1778 else:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1779 yield filename, None
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1780 for filename_node in copies:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1781 yield filename_node
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1782
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1783 for file_, node in iterfiles():
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1784 filelog = repo.file(file_)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1785 if not len(filelog):
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1786 if node is None:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1787 # A zero count may be a directory or deleted file, so
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1788 # try to find matching entries on the slow path.
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1789 if follow:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
1790 raise error.Abort(
19290
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1791 _('cannot follow nonexistent file: "%s"') % file_)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1792 raise FileWalkError("Cannot walk via filelog")
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1793 else:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1794 continue
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1795
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1796 if node is None:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1797 last = len(filelog) - 1
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1798 else:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1799 last = filelog.rev(node)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1800
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1801 # keep track of all ancestors of the file
32331
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32329
diff changeset
1802 ancestors = {filelog.linkrev(last)}
19290
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1803
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1804 # iterate from latest to oldest revision
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1805 for rev, flparentlinkrevs, copied in filerevgen(filelog, last):
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1806 if not follow:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1807 if rev > maxrev:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1808 continue
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1809 else:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1810 # Note that last might not be the first interesting
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1811 # rev to us:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1812 # if the file has been changed after maxrev, we'll
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1813 # have linkrev(last) > maxrev, and we still need
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1814 # to explore the file graph
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1815 if rev not in ancestors:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1816 continue
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1817 # XXX insert 1327 fix here
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1818 if flparentlinkrevs:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1819 ancestors.update(flparentlinkrevs)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1820
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1821 fncache.setdefault(rev, []).append(file_)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1822 wanted.add(rev)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1823 if copied:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1824 copies.append(copied)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1825
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1826 return wanted
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1827
24391
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1828 class _followfilter(object):
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1829 def __init__(self, repo, onlyfirst=False):
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1830 self.repo = repo
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1831 self.startrev = nullrev
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1832 self.roots = set()
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1833 self.onlyfirst = onlyfirst
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1834
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1835 def match(self, rev):
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1836 def realparents(rev):
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1837 if self.onlyfirst:
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1838 return self.repo.changelog.parentrevs(rev)[0:1]
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1839 else:
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1840 return filter(lambda x: x != nullrev,
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1841 self.repo.changelog.parentrevs(rev))
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1842
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1843 if self.startrev == nullrev:
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1844 self.startrev = rev
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1845 return True
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1846
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1847 if rev > self.startrev:
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1848 # forward: all descendants
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1849 if not self.roots:
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1850 self.roots.add(self.startrev)
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1851 for parent in realparents(rev):
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1852 if parent in self.roots:
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1853 self.roots.add(rev)
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1854 return True
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1855 else:
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1856 # backwards: all parents
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1857 if not self.roots:
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1858 self.roots.update(realparents(self.startrev))
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1859 if rev in self.roots:
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1860 self.roots.remove(rev)
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1861 self.roots.update(realparents(rev))
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1862 return True
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1863
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1864 return False
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1865
9665
1de5ebfa5585 walkchangerevs: drop ui arg
Matt Mackall <mpm@selenic.com>
parents: 9664
diff changeset
1866 def walkchangerevs(repo, match, opts, prepare):
7807
bd8f44638847 help: miscellaneous language fixes
timeless <timeless@gmail.com>
parents: 7779
diff changeset
1867 '''Iterate over files and the revs in which they changed.
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1868
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1869 Callers most commonly need to iterate backwards over the history
7807
bd8f44638847 help: miscellaneous language fixes
timeless <timeless@gmail.com>
parents: 7779
diff changeset
1870 in which they are interested. Doing so has awful (quadratic-looking)
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1871 performance, so we use iterators in a "windowed" way.
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1872
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1873 We walk a window of revisions in the desired order. Within the
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1874 window, we first walk forwards to gather data, then in the desired
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1875 order (usually backwards) to display it.
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1876
9662
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9656
diff changeset
1877 This function returns an iterator yielding contexts. Before
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9656
diff changeset
1878 yielding each context, the iterator will first call the prepare
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9656
diff changeset
1879 function on each context in the window in forward order.'''
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1880
38348
b8f45fc27370 grep: adds allfiles mode
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 38347
diff changeset
1881 allfiles = opts.get('allfiles')
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1882 follow = opts.get('follow') or opts.get('follow_first')
35682
8273c1a47282 log: duplicate _logrevs() dedicated for walkchangerevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35662
diff changeset
1883 revs = _walkrevs(repo, opts)
11281
b724b8467b82 walkchangerevs: allow empty query sets
Matt Mackall <mpm@selenic.com>
parents: 11277
diff changeset
1884 if not revs:
b724b8467b82 walkchangerevs: allow empty query sets
Matt Mackall <mpm@selenic.com>
parents: 11277
diff changeset
1885 return []
38348
b8f45fc27370 grep: adds allfiles mode
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 38347
diff changeset
1886 if allfiles and len(revs) > 1:
b8f45fc27370 grep: adds allfiles mode
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 38347
diff changeset
1887 raise error.Abort(_("multiple revisions not supported with --allfiles"))
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8119
diff changeset
1888 wanted = set()
35462
5bec509dc1ff log: make "slowpath" condition slightly more readable
Yuya Nishihara <yuya@tcha.org>
parents: 35458
diff changeset
1889 slowpath = match.anypats() or (not match.always() and opts.get('removed'))
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1890 fncache = {}
37303
8823615f68a5 log: remove dependence on repo.changectx()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37272
diff changeset
1891 change = repo.__getitem__
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1892
11632
f418d2570920 log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11631
diff changeset
1893 # First step is to fill wanted, the set of revisions that we want to yield.
f418d2570920 log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11631
diff changeset
1894 # When it does not induce extra cost, we also fill fncache for revisions in
f418d2570920 log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11631
diff changeset
1895 # wanted: a cache of filenames that were changed (ctx.files()) and that
f418d2570920 log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11631
diff changeset
1896 # match the file filtering conditions.
f418d2570920 log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11631
diff changeset
1897
24384
5cb459dc32d2 walkchangerevs: simplify by using match.always() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 24379
diff changeset
1898 if match.always():
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1899 # No files, no patterns. Display all revs.
20553
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1900 wanted = revs
25271
1b1eaf1885df walkchangerevs: simplify with an 'elif'
Martin von Zweigbergk <martinvonz@google.com>
parents: 25259
diff changeset
1901 elif not slowpath:
11632
f418d2570920 log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11631
diff changeset
1902 # We only have to read through the filelog to find wanted revisions
f418d2570920 log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11631
diff changeset
1903
19290
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1904 try:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1905 wanted = walkfilerevs(repo, match, follow, revs, fncache)
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1906 except FileWalkError:
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1907 slowpath = True
11608
183e63112698 log: remove increasing windows usage in fastpath
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11607
diff changeset
1908
19290
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1909 # We decided to fall back to the slowpath because at least one
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1910 # of the paths was not a file. Check to see if at least one of them
f21f4a1b6c24 log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents: 19211
diff changeset
1911 # existed in history, otherwise simply return
17746
6d218e47cf9b log: speed up hg log for untracked files (issue1340)
smuralid
parents: 17676
diff changeset
1912 for path in match.files():
6d218e47cf9b log: speed up hg log for untracked files (issue1340)
smuralid
parents: 17676
diff changeset
1913 if path == '.' or path in repo.store:
6d218e47cf9b log: speed up hg log for untracked files (issue1340)
smuralid
parents: 17676
diff changeset
1914 break
18340
8802277c40ee log: make log work even if first parameter doesn't exist
Mads Kiilerich <mads@kiilerich.com>
parents: 18267
diff changeset
1915 else:
8802277c40ee log: make log work even if first parameter doesn't exist
Mads Kiilerich <mads@kiilerich.com>
parents: 18267
diff changeset
1916 return []
17746
6d218e47cf9b log: speed up hg log for untracked files (issue1340)
smuralid
parents: 17676
diff changeset
1917
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1918 if slowpath:
11632
f418d2570920 log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11631
diff changeset
1919 # We have to read the changelog to match filenames against
f418d2570920 log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11631
diff changeset
1920 # changed files
f418d2570920 log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11631
diff changeset
1921
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1922 if follow:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
1923 raise error.Abort(_('can only follow copies/renames for explicit '
8761
0289f384e1e5 Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents: 8731
diff changeset
1924 'filenames'))
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1925
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1926 # The slow path checks files modified in every changeset.
19730
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1927 # This is really slow on large repos, so compute the set lazily.
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1928 class lazywantedset(object):
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1929 def __init__(self):
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1930 self.set = set()
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1931 self.revs = set(revs)
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1932
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1933 # No need to worry about locality here because it will be accessed
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1934 # in the same order as the increasing window below.
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1935 def __contains__(self, value):
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1936 if value in self.set:
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1937 return True
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1938 elif not value in self.revs:
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1939 return False
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1940 else:
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1941 self.revs.discard(value)
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1942 ctx = change(value)
36379
f62369667a7c py3: use list comprehensions instead of filter where we need to eagerly filter
Augie Fackler <augie@google.com>
parents: 36276
diff changeset
1943 matches = [f for f in ctx.files() if match(f)]
19730
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1944 if matches:
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1945 fncache[value] = matches
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1946 self.set.add(value)
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1947 return True
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1948 return False
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1949
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1950 def discard(self, value):
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1951 self.revs.discard(value)
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1952 self.set.discard(value)
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1953
d184bae667e4 log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents: 19511
diff changeset
1954 wanted = lazywantedset()
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1955
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1956 # it might be worthwhile to do this in the iterator if the rev range
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1957 # is descending and the prune args are all within that range
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1958 for rev in opts.get('prune', ()):
16380
84ba30e8c790 cmdutil: use context instead of lookup
Matt Mackall <mpm@selenic.com>
parents: 16304
diff changeset
1959 rev = repo[rev].rev()
24391
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1960 ff = _followfilter(repo)
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1961 stop = min(revs[0], revs[-1])
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
1962 for x in xrange(rev, stop - 1, -1):
8152
08e1baf924ca replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents: 8119
diff changeset
1963 if ff.match(x):
20553
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1964 wanted = wanted - [x]
18710
49ef9d0ca815 cmdutil: use a small initial window with --limit
Bryan O'Sullivan <bryano@fb.com>
parents: 18688
diff changeset
1965
11632
f418d2570920 log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11631
diff changeset
1966 # Now that wanted is correctly initialized, we can iterate over the
f418d2570920 log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11631
diff changeset
1967 # revision range, yielding only revisions in wanted.
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1968 def iterate():
25272
6c76c42a5893 walkchangerevs: avoid match.files() in conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 25271
diff changeset
1969 if follow and match.always():
24391
6c3a93e690c7 walkchangerevs: make followfilter a top-level class
Martin von Zweigbergk <martinvonz@google.com>
parents: 24384
diff changeset
1970 ff = _followfilter(repo, onlyfirst=opts.get('follow_first'))
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1971 def want(rev):
8119
af44d0b953c6 cmdutil: return boolean result directly in want function
Martin Geisler <mg@lazybytes.net>
parents: 8117
diff changeset
1972 return ff.match(rev) and rev in wanted
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1973 else:
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1974 def want(rev):
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1975 return rev in wanted
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1976
20553
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1977 it = iter(revs)
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1978 stopiteration = False
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1979 for windowsize in increasingwindows():
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1980 nrevs = []
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1981 for i in xrange(windowsize):
25147
fb7b9a765bb9 walkchangerevs: replace try/except with 'next'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25119
diff changeset
1982 rev = next(it, None)
fb7b9a765bb9 walkchangerevs: replace try/except with 'next'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25119
diff changeset
1983 if rev is None:
20553
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1984 stopiteration = True
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
1985 break
25147
fb7b9a765bb9 walkchangerevs: replace try/except with 'next'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25119
diff changeset
1986 elif want(rev):
fb7b9a765bb9 walkchangerevs: replace try/except with 'next'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25119
diff changeset
1987 nrevs.append(rev)
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8189
diff changeset
1988 for rev in sorted(nrevs):
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1989 fns = fncache.get(rev)
9654
96fe91be9c1e walkchangerevs: yield contexts
Matt Mackall <mpm@selenic.com>
parents: 9653
diff changeset
1990 ctx = change(rev)
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1991 if not fns:
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1992 def fns_generator():
38348
b8f45fc27370 grep: adds allfiles mode
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 38347
diff changeset
1993 if allfiles:
b8f45fc27370 grep: adds allfiles mode
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 38347
diff changeset
1994 fiter = iter(ctx)
b8f45fc27370 grep: adds allfiles mode
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 38347
diff changeset
1995 else:
b8f45fc27370 grep: adds allfiles mode
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 38347
diff changeset
1996 fiter = ctx.files()
b8f45fc27370 grep: adds allfiles mode
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 38347
diff changeset
1997 for f in fiter:
9652
2cb0cab10d2e walkchangerevs: pull out matchfn
Matt Mackall <mpm@selenic.com>
parents: 9547
diff changeset
1998 if match(f):
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
1999 yield f
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
2000 fns = fns_generator()
9662
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9656
diff changeset
2001 prepare(ctx, fns)
3650
731e739b8659 move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3649
diff changeset
2002 for rev in nrevs:
9662
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9656
diff changeset
2003 yield change(rev)
20553
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
2004
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
2005 if stopiteration:
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
2006 break
86cefb15e7b5 cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20500
diff changeset
2007
9652
2cb0cab10d2e walkchangerevs: pull out matchfn
Matt Mackall <mpm@selenic.com>
parents: 9547
diff changeset
2008 return iterate()
5034
c0417a319e39 commands: move commit to cmdutil as wrapper for commit-like functions
Bryan O'Sullivan <bos@serpentine.com>
parents: 4965
diff changeset
2009
23885
9994f45ba714 add: pass options via keyword args
Matt Harbison <matt_harbison@yahoo.com>
parents: 23876
diff changeset
2010 def add(ui, repo, match, prefix, explicitonly, **opts):
12270
166b9866580a add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12269
diff changeset
2011 join = lambda f: os.path.join(prefix, f)
12269
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
2012 bad = []
25436
9724cbe2d546 add: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25424
diff changeset
2013
9724cbe2d546 add: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25424
diff changeset
2014 badfn = lambda x, y: bad.append(x) or match.bad(x, y)
12269
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
2015 names = []
12270
166b9866580a add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12269
diff changeset
2016 wctx = repo[None]
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14129
diff changeset
2017 cca = None
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14129
diff changeset
2018 abort, warn = scmutil.checkportabilityalert(ui)
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14129
diff changeset
2019 if abort or warn:
17201
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17182
diff changeset
2020 cca = scmutil.casecollisionauditor(ui, abort, repo.dirstate)
25436
9724cbe2d546 add: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25424
diff changeset
2021
26206
ab1c6e4efda4 add: pass full=False to dirstate walk
Durham Goode <durham@fb.com>
parents: 26098
diff changeset
2022 badmatch = matchmod.badmatch(match, badfn)
ab1c6e4efda4 add: pass full=False to dirstate walk
Durham Goode <durham@fb.com>
parents: 26098
diff changeset
2023 dirstate = repo.dirstate
ab1c6e4efda4 add: pass full=False to dirstate walk
Durham Goode <durham@fb.com>
parents: 26098
diff changeset
2024 # We don't want to just call wctx.walk here, since it would return a lot of
ab1c6e4efda4 add: pass full=False to dirstate walk
Durham Goode <durham@fb.com>
parents: 26098
diff changeset
2025 # clean files, which we aren't interested in and takes time.
34350
255c761a52db dirstate: use keyword arguments to clarify walk()'s callers
Martin von Zweigbergk <martinvonz@google.com>
parents: 34334
diff changeset
2026 for f in sorted(dirstate.walk(badmatch, subrepos=sorted(wctx.substate),
255c761a52db dirstate: use keyword arguments to clarify walk()'s callers
Martin von Zweigbergk <martinvonz@google.com>
parents: 34334
diff changeset
2027 unknown=True, ignored=False, full=False)):
12269
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
2028 exact = match.exact(f)
23462
afa3fbbcabd3 add: use lexists so that broken symbolic links are added
John Coomes <john.coomes@oracle.com>
parents: 23453
diff changeset
2029 if exact or not explicitonly and f not in wctx and repo.wvfs.lexists(f):
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14129
diff changeset
2030 if cca:
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14129
diff changeset
2031 cca(f)
12269
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
2032 names.append(f)
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
2033 if ui.verbose or not exact:
23686
164915e8ef7b narrowmatcher: propagate the rel() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 23674
diff changeset
2034 ui.status(_('adding %s\n') % match.rel(f))
12270
166b9866580a add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12269
diff changeset
2035
18364
6252b4f1c4b4 subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 18340
diff changeset
2036 for subpath in sorted(wctx.substate):
15410
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15231
diff changeset
2037 sub = wctx.sub(subpath)
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15231
diff changeset
2038 try:
28017
d3f1b7ee5e70 match: rename "narrowmatcher" to "subdirmatcher" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27985
diff changeset
2039 submatch = matchmod.subdirmatcher(subpath, match)
32196
a77e61b45384 py3: handle opts correctly for `hg add`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32193
diff changeset
2040 if opts.get(r'subrepos'):
23885
9994f45ba714 add: pass options via keyword args
Matt Harbison <matt_harbison@yahoo.com>
parents: 23876
diff changeset
2041 bad.extend(sub.add(ui, submatch, prefix, False, **opts))
15410
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15231
diff changeset
2042 else:
23885
9994f45ba714 add: pass options via keyword args
Matt Harbison <matt_harbison@yahoo.com>
parents: 23876
diff changeset
2043 bad.extend(sub.add(ui, submatch, prefix, True, **opts))
15410
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15231
diff changeset
2044 except error.LookupError:
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15231
diff changeset
2045 ui.status(_("skipping missing subrepository: %s\n")
9e99d2bbb1b1 add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents: 15231
diff changeset
2046 % join(subpath))
12270
166b9866580a add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12269
diff changeset
2047
32196
a77e61b45384 py3: handle opts correctly for `hg add`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32193
diff changeset
2048 if not opts.get(r'dry_run'):
12270
166b9866580a add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12269
diff changeset
2049 rejected = wctx.add(names, prefix)
12269
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
2050 bad.extend(f for f in rejected if f in match.files())
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
2051 return bad
877236cdd437 add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents: 12266
diff changeset
2052
32005
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
2053 def addwebdirpath(repo, serverpath, webconf):
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
2054 webconf[serverpath] = repo.root
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
2055 repo.ui.debug('adding %s = %s\n' % (serverpath, repo.root))
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
2056
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
2057 for r in repo.revs('filelog("path:.hgsub")'):
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
2058 ctx = repo[r]
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
2059 for subpath in ctx.substate:
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
2060 ctx.sub(subpath).addwebdirpath(serverpath, webconf)
2406dbba49bd serve: add support for Mercurial subrepositories
Matt Harbison <matt_harbison@yahoo.com>
parents: 31807
diff changeset
2061
37778
f10cb49951e1 forget: rename --confirm to --interactive
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37774
diff changeset
2062 def forget(ui, repo, match, prefix, explicitonly, dryrun, interactive):
f10cb49951e1 forget: rename --confirm to --interactive
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37774
diff changeset
2063 if dryrun and interactive:
f10cb49951e1 forget: rename --confirm to --interactive
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37774
diff changeset
2064 raise error.Abort(_("cannot specify both --dry-run and --interactive"))
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2065 join = lambda f: os.path.join(prefix, f)
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2066 bad = []
25437
9c1bcd95b3ff forget: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25436
diff changeset
2067 badfn = lambda x, y: bad.append(x) or match.bad(x, y)
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2068 wctx = repo[None]
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2069 forgot = []
25437
9c1bcd95b3ff forget: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25436
diff changeset
2070
9c1bcd95b3ff forget: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25436
diff changeset
2071 s = repo.status(match=matchmod.badmatch(match, badfn), clean=True)
32223
e4a4ebfd9d8e forget: access status fields by name, not index
Martin von Zweigbergk <martinvonz@google.com>
parents: 32204
diff changeset
2072 forget = sorted(s.modified + s.added + s.deleted + s.clean)
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2073 if explicitonly:
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2074 forget = [f for f in forget if match.exact(f)]
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2075
18364
6252b4f1c4b4 subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 18340
diff changeset
2076 for subpath in sorted(wctx.substate):
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2077 sub = wctx.sub(subpath)
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2078 try:
28017
d3f1b7ee5e70 match: rename "narrowmatcher" to "subdirmatcher" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27985
diff changeset
2079 submatch = matchmod.subdirmatcher(subpath, match)
37778
f10cb49951e1 forget: rename --confirm to --interactive
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37774
diff changeset
2080 subbad, subforgot = sub.forget(submatch, prefix, dryrun=dryrun,
f10cb49951e1 forget: rename --confirm to --interactive
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37774
diff changeset
2081 interactive=interactive)
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2082 bad.extend([subpath + '/' + f for f in subbad])
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2083 forgot.extend([subpath + '/' + f for f in subforgot])
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2084 except error.LookupError:
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2085 ui.status(_("skipping missing subrepository: %s\n")
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2086 % join(subpath))
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2087
16070
f11eee00c652 forget: show warning messages for forgetting in subrepo correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15912
diff changeset
2088 if not explicitonly:
f11eee00c652 forget: show warning messages for forgetting in subrepo correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15912
diff changeset
2089 for f in match.files():
23673
69cd91d04117 forget: use vfs instead of os.path + match.rel() for filesystem checks
Matt Harbison <matt_harbison@yahoo.com>
parents: 23579
diff changeset
2090 if f not in repo.dirstate and not repo.wvfs.isdir(f):
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2091 if f not in forgot:
23673
69cd91d04117 forget: use vfs instead of os.path + match.rel() for filesystem checks
Matt Harbison <matt_harbison@yahoo.com>
parents: 23579
diff changeset
2092 if repo.wvfs.exists(f):
24548
c780a63f61ca forget: cleanup the output for an inexact case match on icasefs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24169
diff changeset
2093 # Don't complain if the exact case match wasn't given.
c780a63f61ca forget: cleanup the output for an inexact case match on icasefs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24169
diff changeset
2094 # But don't do this until after checking 'forgot', so
c780a63f61ca forget: cleanup the output for an inexact case match on icasefs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24169
diff changeset
2095 # that subrepo files aren't normalized, and this op is
c780a63f61ca forget: cleanup the output for an inexact case match on icasefs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24169
diff changeset
2096 # purely from data cached by the status walk above.
c780a63f61ca forget: cleanup the output for an inexact case match on icasefs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24169
diff changeset
2097 if repo.dirstate.normalize(f) in repo.dirstate:
c780a63f61ca forget: cleanup the output for an inexact case match on icasefs
Matt Harbison <matt_harbison@yahoo.com>
parents: 24169
diff changeset
2098 continue
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2099 ui.warn(_('not removing %s: '
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2100 'file is already untracked\n')
23686
164915e8ef7b narrowmatcher: propagate the rel() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 23674
diff changeset
2101 % match.rel(f))
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2102 bad.append(f)
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2103
37778
f10cb49951e1 forget: rename --confirm to --interactive
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37774
diff changeset
2104 if interactive:
37756
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2105 responses = _('[Ynsa?]'
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2106 '$$ &Yes, forget this file'
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2107 '$$ &No, skip this file'
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2108 '$$ &Skip remaining files'
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2109 '$$ Include &all remaining files'
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2110 '$$ &? (display help)')
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2111 for filename in forget[:]:
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2112 r = ui.promptchoice(_('forget %s %s') % (filename, responses))
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2113 if r == 4: # ?
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2114 while r == 4:
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2115 for c, t in ui.extractchoices(responses)[1]:
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2116 ui.write('%s - %s\n' % (c, encoding.lower(t)))
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2117 r = ui.promptchoice(_('forget %s %s') % (filename,
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2118 responses))
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2119 if r == 0: # yes
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2120 continue
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2121 elif r == 1: # no
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2122 forget.remove(filename)
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2123 elif r == 2: # Skip
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2124 fnindex = forget.index(filename)
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2125 del forget[fnindex:]
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2126 break
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2127 elif r == 3: # All
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2128 break
e7bf5a73e4e1 forget: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37621
diff changeset
2129
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2130 for f in forget:
37778
f10cb49951e1 forget: rename --confirm to --interactive
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37774
diff changeset
2131 if ui.verbose or not match.exact(f) or interactive:
23686
164915e8ef7b narrowmatcher: propagate the rel() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 23674
diff changeset
2132 ui.status(_('removing %s\n') % match.rel(f))
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2133
36945
45bfcd16f27e forget: add --dry-run mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 36742
diff changeset
2134 if not dryrun:
45bfcd16f27e forget: add --dry-run mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 36742
diff changeset
2135 rejected = wctx.forget(forget, prefix)
45bfcd16f27e forget: add --dry-run mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 36742
diff changeset
2136 bad.extend(f for f in rejected if f in match.files())
45bfcd16f27e forget: add --dry-run mode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 36742
diff changeset
2137 forgot.extend(f for f in forget if f not in rejected)
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2138 return bad, forgot
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15911
diff changeset
2139
24413
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24391
diff changeset
2140 def files(ui, ctx, m, fm, fmt, subrepos):
24275
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
2141 ret = 1
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
2142
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
2143 for f in ctx.matches(m):
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
2144 fm.startitem()
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
2145 if ui.verbose:
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
2146 fc = ctx[f]
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
2147 fm.write('size flags', '% 10d % 1s ', fc.size(), fc.flags())
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
2148 fm.data(abspath=f)
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
2149 fm.write('path', fmt, m.rel(f))
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
2150 ret = 0
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
2151
25228
63a57a2727b6 files: recurse into subrepos automatically with an explicit path
Matt Harbison <matt_harbison@yahoo.com>
parents: 25169
diff changeset
2152 for subpath in sorted(ctx.substate):
29813
35560189677c subrepo: cleanup of subrepo filematcher logic
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29806
diff changeset
2153 submatch = matchmod.subdirmatcher(subpath, m)
35560189677c subrepo: cleanup of subrepo filematcher logic
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29806
diff changeset
2154 if (subrepos or m.exact(subpath) or any(submatch.files())):
24413
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24391
diff changeset
2155 sub = ctx.sub(subpath)
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24391
diff changeset
2156 try:
28387
97175d9bf7cf files: don't recurse into subrepos without a path or -S (issue5127)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28253
diff changeset
2157 recurse = m.exact(subpath) or subrepos
97175d9bf7cf files: don't recurse into subrepos without a path or -S (issue5127)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28253
diff changeset
2158 if sub.printfiles(ui, submatch, fm, fmt, recurse) == 0:
24413
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24391
diff changeset
2159 ret = 0
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24391
diff changeset
2160 except error.LookupError:
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24391
diff changeset
2161 ui.status(_("skipping missing subrepository: %s\n")
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24391
diff changeset
2162 % m.abs(subpath))
a8595176dd64 subrepo: add basic support to hgsubrepo for the files command
Matt Harbison <matt_harbison@yahoo.com>
parents: 24391
diff changeset
2163
24275
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
2164 return ret
e1cb460a3524 files: split reusable implementation into cmdutil for subrepo support
Matt Harbison <matt_harbison@yahoo.com>
parents: 24272
diff changeset
2165
37153
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
2166 def remove(ui, repo, m, prefix, after, force, subrepos, dryrun, warnings=None):
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2167 join = lambda f: os.path.join(prefix, f)
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2168 ret = 0
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2169 s = repo.status(match=m, clean=True)
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2170 modified, added, deleted, clean = s[0], s[1], s[3], s[6]
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2171
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2172 wctx = repo[None]
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2173
28607
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2174 if warnings is None:
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2175 warnings = []
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2176 warn = True
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2177 else:
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2178 warn = False
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2179
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
2180 subs = sorted(wctx.substate)
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2181 progress = ui.makeprogress(_('searching'), total=len(subs),
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2182 unit=_('subrepos'))
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
2183 for subpath in subs:
29813
35560189677c subrepo: cleanup of subrepo filematcher logic
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29806
diff changeset
2184 submatch = matchmod.subdirmatcher(subpath, m)
35560189677c subrepo: cleanup of subrepo filematcher logic
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29806
diff changeset
2185 if subrepos or m.exact(subpath) or any(submatch.files()):
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2186 progress.increment()
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2187 sub = wctx.sub(subpath)
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2188 try:
28607
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2189 if sub.removefiles(submatch, prefix, after, force, subrepos,
37153
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
2190 dryrun, warnings):
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2191 ret = 1
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2192 except error.LookupError:
28607
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2193 warnings.append(_("skipping missing subrepository: %s\n")
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2194 % join(subpath))
38379
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38353
diff changeset
2195 progress.complete()
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2196
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2197 # warn about failure to delete explicit files/dirs
24635
21e1ece30f8c util: move dirs() and finddirs() from scmutil to util
Drew Gottlieb <drgott@google.com>
parents: 24603
diff changeset
2198 deleteddirs = util.dirs(deleted)
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
2199 files = m.files()
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2200 progress = ui.makeprogress(_('deleting'), total=len(files),
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2201 unit=_('files'))
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
2202 for f in files:
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2203 def insubrepo():
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2204 for subpath in wctx.substate:
29622
9c2cc107547f cmdutil: warnings not issued in remove if subrepopath overlaps
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29498
diff changeset
2205 if f.startswith(subpath + '/'):
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2206 return True
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2207 return False
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2208
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2209 progress.increment()
24955
1df233bcb7f6 remove: use ctx.hasdir(f) instead of 'f in ctx.dirs()'
Martin von Zweigbergk <martinvonz@google.com>
parents: 24947
diff changeset
2210 isdir = f in deleteddirs or wctx.hasdir(f)
29622
9c2cc107547f cmdutil: warnings not issued in remove if subrepopath overlaps
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29498
diff changeset
2211 if (f in repo.dirstate or isdir or f == '.'
9c2cc107547f cmdutil: warnings not issued in remove if subrepopath overlaps
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29498
diff changeset
2212 or insubrepo() or f in subs):
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2213 continue
23325
4165cfd67519 remove: recurse into subrepositories with --subrepos/-S flag
Matt Harbison <matt_harbison@yahoo.com>
parents: 23289
diff changeset
2214
23674
6e36b9fc7869 remove: use vfs instead of os.path + match.rel() for filesystem checks
Matt Harbison <matt_harbison@yahoo.com>
parents: 23673
diff changeset
2215 if repo.wvfs.exists(f):
6e36b9fc7869 remove: use vfs instead of os.path + match.rel() for filesystem checks
Matt Harbison <matt_harbison@yahoo.com>
parents: 23673
diff changeset
2216 if repo.wvfs.isdir(f):
28607
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2217 warnings.append(_('not removing %s: no tracked files\n')
23686
164915e8ef7b narrowmatcher: propagate the rel() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 23674
diff changeset
2218 % m.rel(f))
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2219 else:
28607
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2220 warnings.append(_('not removing %s: file is untracked\n')
23686
164915e8ef7b narrowmatcher: propagate the rel() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 23674
diff changeset
2221 % m.rel(f))
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2222 # missing files will generate a warning elsewhere
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2223 ret = 1
38379
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38353
diff changeset
2224 progress.complete()
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2225
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2226 if force:
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2227 list = modified + deleted + clean + added
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2228 elif after:
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2229 list = deleted
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
2230 remaining = modified + added + clean
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2231 progress = ui.makeprogress(_('skipping'), total=len(remaining),
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2232 unit=_('files'))
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
2233 for f in remaining:
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2234 progress.increment()
35144
7a58608281dd remove: print message for each file in verbose mode only while using `-A` (BC)
pavanpc@fb.com
parents: 35130
diff changeset
2235 if ui.verbose or (f in files):
7a58608281dd remove: print message for each file in verbose mode only while using `-A` (BC)
pavanpc@fb.com
parents: 35130
diff changeset
2236 warnings.append(_('not removing %s: file still exists\n')
7a58608281dd remove: print message for each file in verbose mode only while using `-A` (BC)
pavanpc@fb.com
parents: 35130
diff changeset
2237 % m.rel(f))
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2238 ret = 1
38379
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38353
diff changeset
2239 progress.complete()
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2240 else:
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2241 list = deleted + clean
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2242 progress = ui.makeprogress(_('skipping'),
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2243 total=(len(modified) + len(added)),
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2244 unit=_('files'))
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2245 for f in modified:
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2246 progress.increment()
28607
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2247 warnings.append(_('not removing %s: file is modified (use -f'
23686
164915e8ef7b narrowmatcher: propagate the rel() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 23674
diff changeset
2248 ' to force removal)\n') % m.rel(f))
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2249 ret = 1
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2250 for f in added:
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2251 progress.increment()
29967
e824de573112 remove: specify hg in added warning
timeless <timeless@mozdev.org>
parents: 29960
diff changeset
2252 warnings.append(_("not removing %s: file has been marked for add"
e824de573112 remove: specify hg in added warning
timeless <timeless@mozdev.org>
parents: 29960
diff changeset
2253 " (use 'hg forget' to undo add)\n") % m.rel(f))
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2254 ret = 1
38379
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38353
diff changeset
2255 progress.complete()
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
2256
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
2257 list = sorted(list)
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2258 progress = ui.makeprogress(_('deleting'), total=len(list),
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2259 unit=_('files'))
28608
62e73d42bd14 remove: add progress support
timeless <timeless@mozdev.org>
parents: 28607
diff changeset
2260 for f in list:
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2261 if ui.verbose or not m.exact(f):
38353
89db59e5cf3e remove: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38348
diff changeset
2262 progress.increment()
23686
164915e8ef7b narrowmatcher: propagate the rel() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 23674
diff changeset
2263 ui.status(_('removing %s\n') % m.rel(f))
38379
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38353
diff changeset
2264 progress.complete()
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2265
37153
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
2266 if not dryrun:
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
2267 with repo.wlock():
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
2268 if not after:
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
2269 for f in list:
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
2270 if f in added:
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
2271 continue # we never unlink added files on remove
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
2272 repo.wvfs.unlinkpath(f, ignoremissing=True)
335e19c6b7fa remove: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 37106
diff changeset
2273 repo[None].forget(list)
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2274
28607
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2275 if warn:
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2276 for warning in warnings:
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2277 ui.warn(warning)
a88959ae5938 remove: queue warnings until after status messages (issue5140) (API)
timeless <timeless@mozdev.org>
parents: 28601
diff changeset
2278
23289
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2279 return ret
ae5d0a22ee7e remove: move most of the implementation into cmdutils.remove()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23258
diff changeset
2280
35662
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
2281 def _updatecatformatter(fm, ctx, matcher, path, decode):
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
2282 """Hook for adding data to the formatter used by ``hg cat``.
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
2283
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
2284 Extensions (e.g., lfs) can wrap this to inject keywords/data, but must call
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
2285 this method first."""
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
2286 data = ctx[path].data()
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
2287 if decode:
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
2288 data = ctx.repo().wwritedata(path, data)
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
2289 fm.startitem()
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
2290 fm.write('data', '%s', data)
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
2291 fm.data(abspath=path, path=matcher.rel(path))
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
2292
32610
746e12a767b3 cat: add formatter support
Yuya Nishihara <yuya@tcha.org>
parents: 32609
diff changeset
2293 def cat(ui, repo, ctx, matcher, basefm, fntemplate, prefix, **opts):
21040
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
2294 err = 1
35359
82ee401135dd py3: handle keyword arguments correctly in cmdutil.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35286
diff changeset
2295 opts = pycompat.byteskwargs(opts)
21040
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
2296
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
2297 def write(path):
32610
746e12a767b3 cat: add formatter support
Yuya Nishihara <yuya@tcha.org>
parents: 32609
diff changeset
2298 filename = None
32608
7f4435078a8f cat: stop using makefileobj()
Yuya Nishihara <yuya@tcha.org>
parents: 32573
diff changeset
2299 if fntemplate:
36242
33ed8b511185 cmdutil: pass ctx to makefilename() in place of repo/node pair (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36241
diff changeset
2300 filename = makefilename(ctx, fntemplate,
32608
7f4435078a8f cat: stop using makefileobj()
Yuya Nishihara <yuya@tcha.org>
parents: 32573
diff changeset
2301 pathname=os.path.join(prefix, path))
35048
407ec7f3ff02 cmdutil: create dirs for templated cat file output
Ryan McElroy <rmcelroy@fb.com>
parents: 35037
diff changeset
2302 # attempt to create the directory if it does not already exist
407ec7f3ff02 cmdutil: create dirs for templated cat file output
Ryan McElroy <rmcelroy@fb.com>
parents: 35037
diff changeset
2303 try:
407ec7f3ff02 cmdutil: create dirs for templated cat file output
Ryan McElroy <rmcelroy@fb.com>
parents: 35037
diff changeset
2304 os.makedirs(os.path.dirname(filename))
407ec7f3ff02 cmdutil: create dirs for templated cat file output
Ryan McElroy <rmcelroy@fb.com>
parents: 35037
diff changeset
2305 except OSError:
407ec7f3ff02 cmdutil: create dirs for templated cat file output
Ryan McElroy <rmcelroy@fb.com>
parents: 35037
diff changeset
2306 pass
37597
d110167610db formatter: carry opts to file-based formatters by basefm
Yuya Nishihara <yuya@tcha.org>
parents: 37470
diff changeset
2307 with formatter.maybereopen(basefm, filename) as fm:
35662
91f0979f16c0 cat: factor out a function that populates the formatter
Matt Harbison <matt_harbison@yahoo.com>
parents: 35645
diff changeset
2308 _updatecatformatter(fm, ctx, matcher, path, opts.get('decode'))
21040
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
2309
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
2310 # Automation often uses hg cat on single files, so special case it
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
2311 # for performance to avoid the cost of parsing the manifest.
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
2312 if len(matcher.files()) == 1 and not matcher.anypats():
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
2313 file = matcher.files()[0]
30350
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
2314 mfl = repo.manifestlog
24718
a4191e0c728f cat: use ctx.manifestnode() in place of ctx._changeset[0]
Yuya Nishihara <yuya@tcha.org>
parents: 24711
diff changeset
2315 mfnode = ctx.manifestnode()
30350
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
2316 try:
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
2317 if mfnode and mfl[mfnode].find(file)[0]:
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37756
diff changeset
2318 scmutil.prefetchfiles(repo, [ctx.rev()], matcher)
30350
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
2319 write(file)
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
2320 return 0
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
2321 except KeyError:
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
2322 pass
21040
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
2323
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37756
diff changeset
2324 scmutil.prefetchfiles(repo, [ctx.rev()], matcher)
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37756
diff changeset
2325
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37756
diff changeset
2326 for abs in ctx.walk(matcher):
21040
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
2327 write(abs)
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
2328 err = 0
21041
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
2329
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
2330 for subpath in sorted(ctx.substate):
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
2331 sub = ctx.sub(subpath)
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
2332 try:
28017
d3f1b7ee5e70 match: rename "narrowmatcher" to "subdirmatcher" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27985
diff changeset
2333 submatch = matchmod.subdirmatcher(subpath, matcher)
21041
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
2334
32610
746e12a767b3 cat: add formatter support
Yuya Nishihara <yuya@tcha.org>
parents: 32609
diff changeset
2335 if not sub.cat(submatch, basefm, fntemplate,
35359
82ee401135dd py3: handle keyword arguments correctly in cmdutil.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35286
diff changeset
2336 os.path.join(prefix, sub._path),
82ee401135dd py3: handle keyword arguments correctly in cmdutil.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35286
diff changeset
2337 **pycompat.strkwargs(opts)):
21041
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
2338 err = 0
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
2339 except error.RepoLookupError:
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
2340 ui.status(_("skipping missing subrepository: %s\n")
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
2341 % os.path.join(prefix, subpath))
a2cc3c08c3ac cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 21040
diff changeset
2342
21040
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
2343 return err
bdf5ed5246d2 cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents: 21036
diff changeset
2344
5034
c0417a319e39 commands: move commit to cmdutil as wrapper for commit-like functions
Bryan O'Sullivan <bos@serpentine.com>
parents: 4965
diff changeset
2345 def commit(ui, repo, commitfunc, pats, opts):
c0417a319e39 commands: move commit to cmdutil as wrapper for commit-like functions
Bryan O'Sullivan <bos@serpentine.com>
parents: 4965
diff changeset
2346 '''commit the specified files or all outstanding changes'''
6139
989467e8e3a9 Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6112
diff changeset
2347 date = opts.get('date')
989467e8e3a9 Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6112
diff changeset
2348 if date:
36636
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36540
diff changeset
2349 opts['date'] = dateutil.parsedate(date)
14635
217b7d83afc3 cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14518
diff changeset
2350 message = logmessage(ui, opts)
23533
891aaa7c0c70 scmutil: pass a matcher to scmutil.addremove() instead of a list of patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 23509
diff changeset
2351 matcher = scmutil.match(repo[None], pats, opts)
5034
c0417a319e39 commands: move commit to cmdutil as wrapper for commit-like functions
Bryan O'Sullivan <bos@serpentine.com>
parents: 4965
diff changeset
2352
33616
5ac845ca059a commit: don't let failed commit with --addremove update dirstate (issue5645)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33548
diff changeset
2353 dsguard = None
5829
784073457a0f cmdutil.commit: extract 'addremove' from opts carefully
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5797
diff changeset
2354 # extract addremove carefully -- this function can be called from a command
784073457a0f cmdutil.commit: extract 'addremove' from opts carefully
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5797
diff changeset
2355 # that doesn't support addremove
33844
5d286eb7009f commit: move dirstateguard creation out of try-block
Martin von Zweigbergk <martinvonz@google.com>
parents: 33804
diff changeset
2356 if opts.get('addremove'):
5d286eb7009f commit: move dirstateguard creation out of try-block
Martin von Zweigbergk <martinvonz@google.com>
parents: 33804
diff changeset
2357 dsguard = dirstateguard.dirstateguard(repo, 'commit')
33845
158dddc635ff commit: use context manager with dirstateguard
Martin von Zweigbergk <martinvonz@google.com>
parents: 33844
diff changeset
2358 with dsguard or util.nullcontextmanager():
33844
5d286eb7009f commit: move dirstateguard creation out of try-block
Martin von Zweigbergk <martinvonz@google.com>
parents: 33804
diff changeset
2359 if dsguard:
33616
5ac845ca059a commit: don't let failed commit with --addremove update dirstate (issue5645)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33548
diff changeset
2360 if scmutil.addremove(repo, matcher, "", opts) != 0:
5ac845ca059a commit: don't let failed commit with --addremove update dirstate (issue5645)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33548
diff changeset
2361 raise error.Abort(
5ac845ca059a commit: don't let failed commit with --addremove update dirstate (issue5645)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33548
diff changeset
2362 _("failed to mark all new/missing files as added/removed"))
5ac845ca059a commit: don't let failed commit with --addremove update dirstate (issue5645)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33548
diff changeset
2363
33845
158dddc635ff commit: use context manager with dirstateguard
Martin von Zweigbergk <martinvonz@google.com>
parents: 33844
diff changeset
2364 return commitfunc(ui, repo, message, matcher, opts)
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2365
29830
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
2366 def samefile(f, ctx1, ctx2):
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
2367 if f in ctx1.manifest():
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
2368 a = ctx1.filectx(f)
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
2369 if f in ctx2.manifest():
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
2370 b = ctx2.filectx(f)
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
2371 return (not a.cmp(b)
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
2372 and a.flags() == b.flags())
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
2373 else:
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
2374 return False
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
2375 else:
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
2376 return f not in ctx2.manifest()
2cec6eaf3610 cmdutil: extract samefile function from amend()
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29813
diff changeset
2377
34103
a39dce4a76b8 cmdutil: remove redundant commitfunc parameter in amend (API)
Saurabh Singh <singhsrb@fb.com>
parents: 34102
diff changeset
2378 def amend(ui, repo, old, extra, pats, opts):
25930
221491bbaf7e cmdutil: break import cycle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25795
diff changeset
2379 # avoid cycle context -> subrepo -> cmdutil
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
2380 from . import context
25930
221491bbaf7e cmdutil: break import cycle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25795
diff changeset
2381
23101
b564330d4b1f amend: abort early if no username is configured with evolve enabled (issue4211)
Matt Harbison <matt_harbison@yahoo.com>
parents: 22951
diff changeset
2382 # amend will reuse the existing user if not specified, but the obsolete
b564330d4b1f amend: abort early if no username is configured with evolve enabled (issue4211)
Matt Harbison <matt_harbison@yahoo.com>
parents: 22951
diff changeset
2383 # marker creation requires that the current user's name is specified.
24379
8c445d8a915b obsolete: remove last instance of _enabled
Durham Goode <durham@fb.com>
parents: 24364
diff changeset
2384 if obsolete.isenabled(repo, obsolete.createmarkersopt):
23101
b564330d4b1f amend: abort early if no username is configured with evolve enabled (issue4211)
Matt Harbison <matt_harbison@yahoo.com>
parents: 22951
diff changeset
2385 ui.username() # raise exception if username not set
b564330d4b1f amend: abort early if no username is configured with evolve enabled (issue4211)
Matt Harbison <matt_harbison@yahoo.com>
parents: 22951
diff changeset
2386
16458
55982f62651f commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents: 16430
diff changeset
2387 ui.note(_('amending changeset %s\n') % old)
55982f62651f commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents: 16430
diff changeset
2388 base = old.p1()
55982f62651f commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents: 16430
diff changeset
2389
33509
a3acacbd0ff3 bookmark: remove a useless 'recordchange' in the amend code
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
2390 with repo.wlock(), repo.lock(), repo.transaction('amend'):
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2391 # Participating changesets:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2392 #
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2393 # wctx o - workingctx that contains changes from working copy
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2394 # | to go into amending commit
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2395 # |
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2396 # old o - changeset to amend
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2397 # |
34073
7e9ccb1670e3 amend: rectify comment
Saurabh Singh <singhsrb@fb.com>
parents: 34072
diff changeset
2398 # base o - first parent of the changeset to amend
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2399 wctx = repo[None]
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2400
35207
5cc14407a739 amend: make a copy of "extra" to avoid mutating an input
Martin von Zweigbergk <martinvonz@google.com>
parents: 35184
diff changeset
2401 # Copy to avoid mutating input
5cc14407a739 amend: make a copy of "extra" to avoid mutating an input
Martin von Zweigbergk <martinvonz@google.com>
parents: 35184
diff changeset
2402 extra = extra.copy()
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2403 # Update extra dict from amended commit (e.g. to preserve graft
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2404 # source)
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2405 extra.update(old.extra())
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2406
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2407 # Also update it from the from the wctx
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2408 extra.update(wctx.extra())
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2409
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2410 user = opts.get('user') or old.user()
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2411 date = opts.get('date') or old.date()
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2412
34136
ae95853c250a cmdutil: fix amend when passing a date
Boris Feld <boris.feld@octobus.net>
parents: 34103
diff changeset
2413 # Parse the date to allow comparison between date and old.date()
36636
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36540
diff changeset
2414 date = dateutil.parsedate(date)
34136
ae95853c250a cmdutil: fix amend when passing a date
Boris Feld <boris.feld@octobus.net>
parents: 34103
diff changeset
2415
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2416 if len(old.parents()) > 1:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2417 # ctx.files() isn't reliable for merges, so fall back to the
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2418 # slower repo.status() method
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2419 files = set([fn for st in repo.status(base, old)[:3]
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2420 for fn in st])
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2421 else:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2422 files = set(old.files())
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2423
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2424 # add/remove the files to the working copy if the "addremove" option
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2425 # was specified.
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2426 matcher = scmutil.match(wctx, pats, opts)
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2427 if (opts.get('addremove')
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2428 and scmutil.addremove(repo, matcher, "", opts)):
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2429 raise error.Abort(
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2430 _("failed to mark all new/missing files as added/removed"))
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2431
34978
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
2432 # Check subrepos. This depends on in-place wctx._status update in
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
2433 # subrepo.precommit(). To minimize the risk of this hack, we do
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
2434 # nothing if .hgsub does not exist.
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
2435 if '.hgsub' in wctx or '.hgsub' in old:
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35993
diff changeset
2436 subs, commitsubs, newsubstate = subrepoutil.precommit(
34978
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
2437 ui, wctx, wctx._status, matcher)
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
2438 # amend should abort if commitsubrepos is enabled
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
2439 assert not commitsubs
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
2440 if subs:
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35993
diff changeset
2441 subrepoutil.writestate(repo, newsubstate)
34978
691524f0bbf6 amend: update .hgsubstate before committing a memctx (issue5677)
Yuya Nishihara <yuya@tcha.org>
parents: 34975
diff changeset
2442
35853
eeb87b24aea7 amend: abort if unresolved merge conflicts found (issue5805)
Yuya Nishihara <yuya@tcha.org>
parents: 35746
diff changeset
2443 ms = mergemod.mergestate.read(repo)
eeb87b24aea7 amend: abort if unresolved merge conflicts found (issue5805)
Yuya Nishihara <yuya@tcha.org>
parents: 35746
diff changeset
2444 mergeutil.checkunresolved(ms)
eeb87b24aea7 amend: abort if unresolved merge conflicts found (issue5805)
Yuya Nishihara <yuya@tcha.org>
parents: 35746
diff changeset
2445
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2446 filestoamend = set(f for f in wctx.files() if matcher(f))
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2447
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2448 changes = (len(filestoamend) > 0)
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2449 if changes:
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2450 # Recompute copies (avoid recording a -> b -> a)
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2451 copied = copies.pathcopies(base, wctx, matcher)
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2452 if old.p2:
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2453 copied.update(copies.pathcopies(old.p2(), wctx, matcher))
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2454
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2455 # Prune files which were reverted by the updates: if old
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2456 # introduced file X and the file was renamed in the working
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2457 # copy, then those two files are the same and
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2458 # we can discard X from our list of files. Likewise if X
34975
5f40efa472db amend: do not drop missing files (issue5732)
Yuya Nishihara <yuya@tcha.org>
parents: 34974
diff changeset
2459 # was removed, it's no longer relevant. If X is missing (aka
5f40efa472db amend: do not drop missing files (issue5732)
Yuya Nishihara <yuya@tcha.org>
parents: 34974
diff changeset
2460 # deleted), old X must be preserved.
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2461 files.update(filestoamend)
34975
5f40efa472db amend: do not drop missing files (issue5732)
Yuya Nishihara <yuya@tcha.org>
parents: 34974
diff changeset
2462 files = [f for f in files if (not samefile(f, wctx, base)
5f40efa472db amend: do not drop missing files (issue5732)
Yuya Nishihara <yuya@tcha.org>
parents: 34974
diff changeset
2463 or f in wctx.deleted())]
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2464
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2465 def filectxfn(repo, ctx_, path):
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2466 try:
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2467 # If the file being considered is not amongst the files
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2468 # to be amended, we should return the file context from the
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2469 # old changeset. This avoids issues when only some files in
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2470 # the working copy are being amended but there are also
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2471 # changes to other files from the old changeset.
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2472 if path not in filestoamend:
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2473 return old.filectx(path)
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2474
34974
0ba3b928f9a9 amend: do not take untracked files as modified or clean (issue5732)
Yuya Nishihara <yuya@tcha.org>
parents: 34959
diff changeset
2475 # Return None for removed files.
0ba3b928f9a9 amend: do not take untracked files as modified or clean (issue5732)
Yuya Nishihara <yuya@tcha.org>
parents: 34959
diff changeset
2476 if path in wctx.removed():
0ba3b928f9a9 amend: do not take untracked files as modified or clean (issue5732)
Yuya Nishihara <yuya@tcha.org>
parents: 34959
diff changeset
2477 return None
0ba3b928f9a9 amend: do not take untracked files as modified or clean (issue5732)
Yuya Nishihara <yuya@tcha.org>
parents: 34959
diff changeset
2478
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2479 fctx = wctx[path]
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2480 flags = fctx.flags()
35407
8a0cac20a1ad memfilectx: make changectx argument mandatory in constructor (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 35359
diff changeset
2481 mctx = context.memfilectx(repo, ctx_,
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2482 fctx.path(), fctx.data(),
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2483 islink='l' in flags,
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2484 isexec='x' in flags,
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2485 copied=copied.get(path))
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2486 return mctx
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2487 except KeyError:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2488 return None
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2489 else:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2490 ui.note(_('copying changeset %s to %s\n') % (old, base))
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2491
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2492 # Use version of files as in the old cset
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2493 def filectxfn(repo, ctx_, path):
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2494 try:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2495 return old.filectx(path)
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2496 except KeyError:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2497 return None
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2498
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2499 # See if we got a message from -m or -l, if not, open the editor with
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2500 # the message of the changeset to amend.
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2501 message = logmessage(ui, opts)
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2502
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2503 editform = mergeeditform(old, 'commit.amend')
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2504 editor = getcommiteditor(editform=editform,
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2505 **pycompat.strkwargs(opts))
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2506
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2507 if not message:
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2508 editor = getcommiteditor(edit=True, editform=editform)
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2509 message = old.description()
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2510
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2511 pureextra = extra.copy()
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2512 extra['amend_source'] = old.hex()
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2513
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2514 new = context.memctx(repo,
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2515 parents=[base.node(), old.p2().node()],
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2516 text=message,
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2517 files=files,
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2518 filectxfn=filectxfn,
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2519 user=user,
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2520 date=date,
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2521 extra=extra,
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2522 editor=editor)
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2523
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2524 newdesc = changelog.stripdesc(new.description())
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2525 if ((not changes)
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2526 and newdesc == old.description()
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2527 and user == old.user()
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2528 and date == old.date()
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2529 and pureextra == old.extra()):
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2530 # nothing changed. continuing here would create a new node
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2531 # anyway because of the amend_source noise.
17472
965fbe04fd96 amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17471
diff changeset
2532 #
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2533 # This not what we expect from amend.
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2534 return old.node()
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33362
diff changeset
2535
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
2536 commitphase = None
34098
5dc6ac6555e6 amend: use context manager for config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 34097
diff changeset
2537 if opts.get('secret'):
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
2538 commitphase = phases.secret
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
2539 newid = repo.commitctx(new)
34072
ae92e5c0441c amend: removing redundant if condition
Saurabh Singh <singhsrb@fb.com>
parents: 34046
diff changeset
2540
ae92e5c0441c amend: removing redundant if condition
Saurabh Singh <singhsrb@fb.com>
parents: 34046
diff changeset
2541 # Reroute the working copy parent to the new changeset
ae92e5c0441c amend: removing redundant if condition
Saurabh Singh <singhsrb@fb.com>
parents: 34046
diff changeset
2542 repo.setparents(newid, nullid)
ae92e5c0441c amend: removing redundant if condition
Saurabh Singh <singhsrb@fb.com>
parents: 34046
diff changeset
2543 mapping = {old.node(): (newid,)}
34794
5781e0931c16 cmdutil: pass metadata from amend() to cleanupnodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34698
diff changeset
2544 obsmetadata = None
5781e0931c16 cmdutil: pass metadata from amend() to cleanupnodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34698
diff changeset
2545 if opts.get('note'):
5781e0931c16 cmdutil: pass metadata from amend() to cleanupnodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34698
diff changeset
2546 obsmetadata = {'note': opts['note']}
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
2547 scmutil.cleanupnodes(repo, mapping, 'amend', metadata=obsmetadata,
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
2548 fixphase=True, targetphase=commitphase)
34072
ae92e5c0441c amend: removing redundant if condition
Saurabh Singh <singhsrb@fb.com>
parents: 34046
diff changeset
2549
34102
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2550 # Fixing the dirstate because localrepo.commitctx does not update
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2551 # it. This is rather convenient because we did not need to update
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2552 # the dirstate for all the files in the new commit which commitctx
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2553 # could have done if it updated the dirstate. Now, we can
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2554 # selectively update the dirstate only for the amended files.
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2555 dirstate = repo.dirstate
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2556
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2557 # Update the state of the files which were added and
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2558 # and modified in the amend to "normal" in the dirstate.
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2559 normalfiles = set(wctx.modified() + wctx.added()) & filestoamend
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2560 for f in normalfiles:
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2561 dirstate.normal(f)
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2562
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2563 # Update the state of files which were removed in the amend
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2564 # to "removed" in the dirstate.
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2565 removedfiles = set(wctx.removed()) & filestoamend
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2566 for f in removedfiles:
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2567 dirstate.drop(f)
e8a7c1a0565a cmdutil: remove the redundant commit during amend
Saurabh Singh <singhsrb@fb.com>
parents: 34100
diff changeset
2568
16458
55982f62651f commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents: 16430
diff changeset
2569 return newid
55982f62651f commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents: 16430
diff changeset
2570
21999
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
2571 def commiteditor(repo, ctx, subs, editform=''):
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2572 if ctx.description():
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2573 return ctx.description()
26742
bec1a579ebc4 commit: abort when a committemplate is not changed
Tony Tung <tonytung@fb.com>
parents: 26639
diff changeset
2574 return commitforceeditor(repo, ctx, subs, editform=editform,
bec1a579ebc4 commit: abort when a committemplate is not changed
Tony Tung <tonytung@fb.com>
parents: 26639
diff changeset
2575 unchangedmessagedetection=True)
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2576
21999
6ce282ed801e cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21998
diff changeset
2577 def commitforceeditor(repo, ctx, subs, finishdesc=None, extramsg=None,
26742
bec1a579ebc4 commit: abort when a committemplate is not changed
Tony Tung <tonytung@fb.com>
parents: 26639
diff changeset
2578 editform='', unchangedmessagedetection=False):
21923
e582e20cd3e6 commiteditor: refactor default extramsg
Matt Mackall <mpm@selenic.com>
parents: 21878
diff changeset
2579 if not extramsg:
e582e20cd3e6 commiteditor: refactor default extramsg
Matt Mackall <mpm@selenic.com>
parents: 21878
diff changeset
2580 extramsg = _("Leave message empty to abort commit.")
22012
9d92b9d1e282 cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22011
diff changeset
2581
9d92b9d1e282 cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22011
diff changeset
2582 forms = [e for e in editform.split('.') if e]
9d92b9d1e282 cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22011
diff changeset
2583 forms.insert(0, 'changeset')
26742
bec1a579ebc4 commit: abort when a committemplate is not changed
Tony Tung <tonytung@fb.com>
parents: 26639
diff changeset
2584 templatetext = None
22012
9d92b9d1e282 cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22011
diff changeset
2585 while forms:
32896
a3a36bcf122e commit: select template by spec.ref name
Yuya Nishihara <yuya@tcha.org>
parents: 32895
diff changeset
2586 ref = '.'.join(forms)
a3a36bcf122e commit: select template by spec.ref name
Yuya Nishihara <yuya@tcha.org>
parents: 32895
diff changeset
2587 if repo.ui.config('committemplate', ref):
26742
bec1a579ebc4 commit: abort when a committemplate is not changed
Tony Tung <tonytung@fb.com>
parents: 26639
diff changeset
2588 templatetext = committext = buildcommittemplate(
32896
a3a36bcf122e commit: select template by spec.ref name
Yuya Nishihara <yuya@tcha.org>
parents: 32895
diff changeset
2589 repo, ctx, subs, extramsg, ref)
22012
9d92b9d1e282 cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22011
diff changeset
2590 break
9d92b9d1e282 cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22011
diff changeset
2591 forms.pop()
21924
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
2592 else:
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
2593 committext = buildcommittext(repo, ctx, subs, extramsg)
21869
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
2594
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
2595 # run editor in the repository root
30528
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30515
diff changeset
2596 olddir = pycompat.getcwd()
21869
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
2597 os.chdir(repo.root)
26750
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26746
diff changeset
2598
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26746
diff changeset
2599 # make in-memory changes visible to external process
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26746
diff changeset
2600 tr = repo.currenttransaction()
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26746
diff changeset
2601 repo.dirstate.write(tr)
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26746
diff changeset
2602 pending = tr and tr.writepending() and repo.root
9f9ec4abe700 cmdutil: make in-memory changes visible to external editor (issue4378)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26746
diff changeset
2603
26742
bec1a579ebc4 commit: abort when a committemplate is not changed
Tony Tung <tonytung@fb.com>
parents: 26639
diff changeset
2604 editortext = repo.ui.edit(committext, ctx.user(), ctx.extra(),
30836
565c07036066 cmdutil: add tmpdir parament to ui.edit calls
Sean Farley <sean@farley.io>
parents: 30833
diff changeset
2605 editform=editform, pending=pending,
34046
6e6452bc441d editor: use an unambiguous path suffix for editor files
Michael Bolin <mbolin@fb.com>
parents: 34040
diff changeset
2606 repopath=repo.path, action='commit')
30724
ee47e951c6f9 commit: fix unmodified message detection for the "--- >8 ----" magic
Yuya Nishihara <yuya@tcha.org>
parents: 30720
diff changeset
2607 text = editortext
30703
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
2608
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
2609 # strip away anything below this special string (used for editors that want
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
2610 # to display the diff)
30724
ee47e951c6f9 commit: fix unmodified message detection for the "--- >8 ----" magic
Yuya Nishihara <yuya@tcha.org>
parents: 30720
diff changeset
2611 stripbelow = re.search(_linebelow, text, flags=re.MULTILINE)
30703
5c85c93cdd61 cmdutil: add special string that ignores rest of text
Sean Farley <sean@farley.io>
parents: 30695
diff changeset
2612 if stripbelow:
30724
ee47e951c6f9 commit: fix unmodified message detection for the "--- >8 ----" magic
Yuya Nishihara <yuya@tcha.org>
parents: 30720
diff changeset
2613 text = text[:stripbelow.start()]
ee47e951c6f9 commit: fix unmodified message detection for the "--- >8 ----" magic
Yuya Nishihara <yuya@tcha.org>
parents: 30720
diff changeset
2614
ee47e951c6f9 commit: fix unmodified message detection for the "--- >8 ----" magic
Yuya Nishihara <yuya@tcha.org>
parents: 30720
diff changeset
2615 text = re.sub("(?m)^HG:.*(\n|$)", "", text)
21869
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
2616 os.chdir(olddir)
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
2617
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
2618 if finishdesc:
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
2619 text = finishdesc(text)
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
2620 if not text.strip():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
2621 raise error.Abort(_("empty commit message"))
26742
bec1a579ebc4 commit: abort when a committemplate is not changed
Tony Tung <tonytung@fb.com>
parents: 26639
diff changeset
2622 if unchangedmessagedetection and editortext == templatetext:
bec1a579ebc4 commit: abort when a committemplate is not changed
Tony Tung <tonytung@fb.com>
parents: 26639
diff changeset
2623 raise error.Abort(_("commit message unchanged"))
21869
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
2624
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
2625 return text
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
2626
32896
a3a36bcf122e commit: select template by spec.ref name
Yuya Nishihara <yuya@tcha.org>
parents: 32895
diff changeset
2627 def buildcommittemplate(repo, ctx, subs, extramsg, ref):
21924
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
2628 ui = repo.ui
32896
a3a36bcf122e commit: select template by spec.ref name
Yuya Nishihara <yuya@tcha.org>
parents: 32895
diff changeset
2629 spec = formatter.templatespec(ref, None, None)
35993
386c1e45e671 logcmdutil: drop default arguments from changesetdisplayer/templater() calls
Yuya Nishihara <yuya@tcha.org>
parents: 35966
diff changeset
2630 t = logcmdutil.changesettemplater(ui, repo, spec)
32896
a3a36bcf122e commit: select template by spec.ref name
Yuya Nishihara <yuya@tcha.org>
parents: 32895
diff changeset
2631 t.t.cache.update((k, templater.unquotestring(v))
a3a36bcf122e commit: select template by spec.ref name
Yuya Nishihara <yuya@tcha.org>
parents: 32895
diff changeset
2632 for k, v in repo.ui.configitems('committemplate'))
22013
de5cee8ba088 cmdutil: use '[committemplate]' section like as map file for style definition
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22012
diff changeset
2633
21924
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
2634 if not extramsg:
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
2635 extramsg = '' # ensure that extramsg is string
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
2636
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
2637 ui.pushbuffer()
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
2638 t.show(ctx, extramsg=extramsg)
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
2639 return ui.popbuffer()
5375ba75df40 cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21923
diff changeset
2640
26426
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2641 def hgprefix(msg):
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2642 return "\n".join(["HG: %s" % a for a in msg.split("\n") if a])
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2643
21869
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
2644 def buildcommittext(repo, ctx, subs, extramsg):
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2645 edittext = []
8707
0550dfe4fca1 commit: editor reads file lists from provided context
Matt Mackall <mpm@selenic.com>
parents: 8680
diff changeset
2646 modified, added, removed = ctx.modified(), ctx.added(), ctx.removed()
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2647 if ctx.description():
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2648 edittext.append(ctx.description())
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2649 edittext.append("")
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2650 edittext.append("") # Empty line between message and comments.
26426
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2651 edittext.append(hgprefix(_("Enter commit message."
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2652 " Lines beginning with 'HG:' are removed.")))
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2653 edittext.append(hgprefix(extramsg))
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2654 edittext.append("HG: --")
26426
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2655 edittext.append(hgprefix(_("user: %s") % ctx.user()))
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2656 if ctx.p2():
26426
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2657 edittext.append(hgprefix(_("branch merge")))
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2658 if ctx.branch():
26426
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2659 edittext.append(hgprefix(_("branch '%s'") % ctx.branch()))
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24955
diff changeset
2660 if bookmarks.isactivewdirparent(repo):
26426
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2661 edittext.append(hgprefix(_("bookmark '%s'") % repo._activebookmark))
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2662 edittext.extend([hgprefix(_("subrepo %s") % s) for s in subs])
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2663 edittext.extend([hgprefix(_("added %s") % f) for f in added])
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2664 edittext.extend([hgprefix(_("changed %s") % f) for f in modified])
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2665 edittext.extend([hgprefix(_("removed %s") % f) for f in removed])
8707
0550dfe4fca1 commit: editor reads file lists from provided context
Matt Mackall <mpm@selenic.com>
parents: 8680
diff changeset
2666 if not added and not modified and not removed:
26426
0486c16ce621 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org
parents: 26389
diff changeset
2667 edittext.append(hgprefix(_("no files changed")))
8407
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2668 edittext.append("")
223000a687b0 commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents: 8390
diff changeset
2669
21869
e353fac7db26 cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21832
diff changeset
2670 return "\n".join(edittext)
14297
2daa5179e73f commands: use a decorator to build table incrementally
Adrian Buehlmann <adrian@cadifra.com>
parents: 14291
diff changeset
2671
26324
4a8e21578e14 addremove: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26229
diff changeset
2672 def commitstatus(repo, node, branch, bheads=None, opts=None):
4a8e21578e14 addremove: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26229
diff changeset
2673 if opts is None:
4a8e21578e14 addremove: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26229
diff changeset
2674 opts = {}
18688
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2675 ctx = repo[node]
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2676 parents = ctx.parents()
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2677
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2678 if (not opts.get('amend') and bheads and node not in bheads and not
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2679 [x for x in parents if x.node() in bheads and x.branch() == branch]):
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2680 repo.ui.status(_('created new head\n'))
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2681 # The message is not printed for initial roots. For the other
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2682 # changesets, it is printed in the following situations:
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2683 #
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2684 # Par column: for the 2 parents with ...
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2685 # N: null or no parent
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2686 # B: parent is on another named branch
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2687 # C: parent is a regular non head changeset
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2688 # H: parent was a branch head of the current branch
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2689 # Msg column: whether we print "created new head" message
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2690 # In the following, it is assumed that there already exists some
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2691 # initial branch heads of the current branch, otherwise nothing is
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2692 # printed anyway.
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2693 #
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2694 # Par Msg Comment
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2695 # N N y additional topo root
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2696 #
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2697 # B N y additional branch root
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2698 # C N y additional topo head
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2699 # H N n usual case
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2700 #
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2701 # B B y weird additional branch root
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2702 # C B y branch merge
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2703 # H B n merge with named branch
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2704 #
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2705 # C C y additional head from merge
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2706 # C H n merge with a head
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2707 #
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2708 # H H n head merge: head count decreases
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2709
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2710 if not opts.get('close_branch'):
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2711 for r in parents:
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2712 if r.closesbranch() and r.branch() == branch:
36436
fd2191d870ff cmdutil: use ctx.rev() instead of %d % ctx
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36432
diff changeset
2713 repo.ui.status(_('reopening closed branch head %d\n') % r.rev())
18688
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2714
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2715 if repo.ui.debugflag:
36432
ef6ae3f64c23 cmdutil: use ctx.rev() instead of int(ctx)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36379
diff changeset
2716 repo.ui.write(_('committed changeset %d:%s\n') % (ctx.rev(), ctx.hex()))
18688
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2717 elif repo.ui.verbose:
36432
ef6ae3f64c23 cmdutil: use ctx.rev() instead of int(ctx)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36379
diff changeset
2718 repo.ui.write(_('committed changeset %d:%s\n') % (ctx.rev(), ctx))
18688
79107fad06aa commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents: 18648
diff changeset
2719
27943
02c5f8ad00ac commit: factor the post commit status check into a cmdutil method
Matt Harbison <matt_harbison@yahoo.com>
parents: 27868
diff changeset
2720 def postcommitstatus(repo, pats, opts):
02c5f8ad00ac commit: factor the post commit status check into a cmdutil method
Matt Harbison <matt_harbison@yahoo.com>
parents: 27868
diff changeset
2721 return repo.status(match=scmutil.match(repo[None], pats, opts))
02c5f8ad00ac commit: factor the post commit status check into a cmdutil method
Matt Harbison <matt_harbison@yahoo.com>
parents: 27868
diff changeset
2722
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2723 def revert(ui, repo, ctx, parents, *pats, **opts):
35168
3da4bd50103d py3: fix handling of keyword arguments in revert
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35144
diff changeset
2724 opts = pycompat.byteskwargs(opts)
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2725 parent, p2 = parents
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2726 node = ctx.node()
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2727
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2728 mf = ctx.manifest()
21579
87a972b5c039 revert: use p2 as parent when reverting against it
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21578
diff changeset
2729 if node == p2:
87a972b5c039 revert: use p2 as parent when reverting against it
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21578
diff changeset
2730 parent = p2
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2731
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2732 # need all matching names in dirstate and manifest of target rev,
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2733 # so have to walk both. do not print errors if files exist in one
24451
c3bbafef25d6 revert: comment that filesets are always evaluated against workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 24450
diff changeset
2734 # but not other. in both cases, filesets should be evaluated against
c3bbafef25d6 revert: comment that filesets are always evaluated against workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 24450
diff changeset
2735 # workingctx to get consistent result (issue4497). this means 'set:**'
c3bbafef25d6 revert: comment that filesets are always evaluated against workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 24450
diff changeset
2736 # cannot be used to select missing files from target rev.
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2737
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
2738 # `names` is a mapping for all elements in working copy and target revision
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
2739 # The mapping is in the form:
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
2740 # <asb path in repo> -> (<path from CWD>, <exactly specified by matcher?>)
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2741 names = {}
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2742
27803
a8e8950ebd4d with: use context manager for wlock in revert
Bryan O'Sullivan <bryano@fb.com>
parents: 27802
diff changeset
2743 with repo.wlock():
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
2744 ## filling of the `names` mapping
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
2745 # walk dirstate to fill `names`
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2746
24475
06cbff4674a3 revert: fix --interactive on local modification (issue4576)
Laurent Charignon <lcharignon@fb.com>
parents: 24472
diff changeset
2747 interactive = opts.get('interactive', False)
24449
bab983bb6fd1 revert: define 'wctx' a little earlier and use it more
Martin von Zweigbergk <martinvonz@google.com>
parents: 24438
diff changeset
2748 wctx = repo[None]
bab983bb6fd1 revert: define 'wctx' a little earlier and use it more
Martin von Zweigbergk <martinvonz@google.com>
parents: 24438
diff changeset
2749 m = scmutil.match(wctx, pats, opts)
24479
871485bd03fd revert: move calculation of targetsubs earlier
Matt Mackall <mpm@selenic.com>
parents: 24476
diff changeset
2750
871485bd03fd revert: move calculation of targetsubs earlier
Matt Mackall <mpm@selenic.com>
parents: 24476
diff changeset
2751 # we'll need this later
871485bd03fd revert: move calculation of targetsubs earlier
Matt Mackall <mpm@selenic.com>
parents: 24476
diff changeset
2752 targetsubs = sorted(s for s in wctx.substate if m(s))
871485bd03fd revert: move calculation of targetsubs earlier
Matt Mackall <mpm@selenic.com>
parents: 24476
diff changeset
2753
24450
961790c35b4f revert: take fast path also when not reverting to '.'
Martin von Zweigbergk <martinvonz@google.com>
parents: 24449
diff changeset
2754 if not m.always():
32401
7b3c27af90c2 cmdutil: use repo[None].walk instead of repo.walk
Augie Fackler <augie@google.com>
parents: 32382
diff changeset
2755 matcher = matchmod.badmatch(m, lambda x, y: False)
32421
c87db79b9507 cleanup: reuse existing wctx variables instead of calling repo[None]
Martin von Zweigbergk <martinvonz@google.com>
parents: 32414
diff changeset
2756 for abs in wctx.walk(matcher):
22573
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2757 names[abs] = m.rel(abs), m.exact(abs)
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2758
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2759 # walk target manifest to fill `names`
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2760
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2761 def badfn(path, msg):
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2762 if path in names:
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2763 return
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2764 if path in ctx.substate:
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2765 return
22573
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2766 path_ = path + '/'
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2767 for f in names:
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2768 if f.startswith(path_):
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2769 return
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2770 ui.warn("%s: %s\n" % (m.rel(path), msg))
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2771
25439
aaede04c0ba6 revert: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25438
diff changeset
2772 for abs in ctx.walk(matchmod.badmatch(m, badfn)):
22573
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2773 if abs not in names:
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2774 names[abs] = m.rel(abs), m.exact(abs)
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2775
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2776 # Find status of all file in `names`.
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2777 m = scmutil.matchfiles(repo, names)
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2778
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2779 changes = repo.status(node1=node, match=m,
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2780 unknown=True, ignored=True, clean=True)
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2781 else:
24450
961790c35b4f revert: take fast path also when not reverting to '.'
Martin von Zweigbergk <martinvonz@google.com>
parents: 24449
diff changeset
2782 changes = repo.status(node1=node, match=m)
22573
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2783 for kind in changes:
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2784 for abs in kind:
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2785 names[abs] = m.rel(abs), m.exact(abs)
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2786
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2787 m = scmutil.matchfiles(repo, names)
f528bfb25b45 revert: special case 'hg revert --all'
Durham Goode <durham@fb.com>
parents: 22551
diff changeset
2788
23374
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
2789 modified = set(changes.modified)
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
2790 added = set(changes.added)
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
2791 removed = set(changes.removed)
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
2792 _deleted = set(changes.deleted)
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
2793 unknown = set(changes.unknown)
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
2794 unknown.update(changes.ignored)
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
2795 clean = set(changes.clean)
22610
0f323ed8effd revert: track added files with local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22609
diff changeset
2796 modadded = set()
22185
afead12e724b revert: triage "deleted" files into more appropriate categories
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22173
diff changeset
2797
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
2798 # We need to account for the state of the file in the dirstate,
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24176
diff changeset
2799 # even when we revert against something else than parent. This will
22155
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
2800 # slightly alter the behavior of revert (doing back up or not, delete
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23101
diff changeset
2801 # or just forget etc).
22155
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
2802 if parent == node:
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
2803 dsmodified = modified
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
2804 dsadded = added
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
2805 dsremoved = removed
23403
edf29f9c15f0 revert: look for copy information for all local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23101
diff changeset
2806 # store all local modifications, useful later for rename detection
edf29f9c15f0 revert: look for copy information for all local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23101
diff changeset
2807 localchanges = dsmodified | dsadded
22155
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
2808 modified, added, removed = set(), set(), set()
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
2809 else:
530390629842 revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22154
diff changeset
2810 changes = repo.status(node1=parent, match=m)
23374
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
2811 dsmodified = set(changes.modified)
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
2812 dsadded = set(changes.added)
aa0a430d9c75 revert: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@google.com>
parents: 23327
diff changeset
2813 dsremoved = set(changes.removed)
23403
edf29f9c15f0 revert: look for copy information for all local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23101
diff changeset
2814 # store all local modifications, useful later for rename detection
edf29f9c15f0 revert: look for copy information for all local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23101
diff changeset
2815 localchanges = dsmodified | dsadded
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2816
22188
0ad619c5e1a4 revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22187
diff changeset
2817 # only take into account for removes between wc and target
0ad619c5e1a4 revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22187
diff changeset
2818 clean |= dsremoved - removed
0ad619c5e1a4 revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22187
diff changeset
2819 dsremoved &= removed
0ad619c5e1a4 revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22187
diff changeset
2820 # distinct between dirstate remove and other
0ad619c5e1a4 revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22187
diff changeset
2821 removed -= dsremoved
0ad619c5e1a4 revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22187
diff changeset
2822
22610
0f323ed8effd revert: track added files with local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22609
diff changeset
2823 modadded = added & dsmodified
0f323ed8effd revert: track added files with local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22609
diff changeset
2824 added -= modadded
0f323ed8effd revert: track added files with local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22609
diff changeset
2825
22190
55308ab8117c revert: use modified information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22189
diff changeset
2826 # tell newly modified apart.
55308ab8117c revert: use modified information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22189
diff changeset
2827 dsmodified &= modified
29103
f2aa1c3e7e77 cmdutil: typo fix in comment
Augie Fackler <augie@google.com>
parents: 28999
diff changeset
2828 dsmodified |= modified & dsadded # dirstate added may need backup
22190
55308ab8117c revert: use modified information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22189
diff changeset
2829 modified -= dsmodified
55308ab8117c revert: use modified information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22189
diff changeset
2830
22488
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
2831 # We need to wait for some post-processing to update this set
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
2832 # before making the distinction. The dirstate will be used for
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
2833 # that purpose.
22208
d3659b3795e9 revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22205
diff changeset
2834 dsadded = added
d3659b3795e9 revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22205
diff changeset
2835
22209
06fbd9518bc5 revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22208
diff changeset
2836 # in case of merge, files that are actually added can be reported as
06fbd9518bc5 revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22208
diff changeset
2837 # modified, we need to post process the result
06fbd9518bc5 revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22208
diff changeset
2838 if p2 != nullid:
31149
c22253c4c1b8 revert: remove set(mf) because it's O(manifest)
Durham Goode <durham@fb.com>
parents: 31095
diff changeset
2839 mergeadd = set(dsmodified)
c22253c4c1b8 revert: remove set(mf) because it's O(manifest)
Durham Goode <durham@fb.com>
parents: 31095
diff changeset
2840 for path in dsmodified:
c22253c4c1b8 revert: remove set(mf) because it's O(manifest)
Durham Goode <durham@fb.com>
parents: 31095
diff changeset
2841 if path in mf:
c22253c4c1b8 revert: remove set(mf) because it's O(manifest)
Durham Goode <durham@fb.com>
parents: 31095
diff changeset
2842 mergeadd.remove(path)
22209
06fbd9518bc5 revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22208
diff changeset
2843 dsadded |= mergeadd
06fbd9518bc5 revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22208
diff changeset
2844 dsmodified -= mergeadd
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2845
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
2846 # if f is a rename, update `names` to also revert the source
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2847 cwd = repo.getcwd()
23403
edf29f9c15f0 revert: look for copy information for all local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23101
diff changeset
2848 for f in localchanges:
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2849 src = repo.dirstate.copied(f)
22213
f1debbcd71cd revert: add an XXX about rename tracking
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22212
diff changeset
2850 # XXX should we check for rename down to target node?
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2851 if src and src not in names and repo.dirstate[src] == 'r':
22154
fc422de25773 revert: prefix variable names for dirstate status with "ds"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22153
diff changeset
2852 dsremoved.add(src)
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2853 names[src] = (repo.pathto(src, cwd), True)
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2854
31167
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
2855 # determine the exact nature of the deleted changesets
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
2856 deladded = set(_deleted)
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
2857 for path in _deleted:
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
2858 if path in mf:
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
2859 deladded.remove(path)
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
2860 deleted = _deleted - deladded
accdd5e62066 revert: move code dealing with deletions closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 31149
diff changeset
2861
22488
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
2862 # distinguish between file to forget and the other
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
2863 added = set()
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
2864 for abs in dsadded:
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
2865 if repo.dirstate[abs] != 'a':
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
2866 added.add(abs)
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
2867 dsadded -= added
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
2868
22490
bcab7bc7280e revert: explicitly track added but deleted file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22489
diff changeset
2869 for abs in deladded:
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2870 if repo.dirstate[abs] == 'a':
22490
bcab7bc7280e revert: explicitly track added but deleted file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22489
diff changeset
2871 dsadded.add(abs)
bcab7bc7280e revert: explicitly track added but deleted file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22489
diff changeset
2872 deladded -= dsadded
bcab7bc7280e revert: explicitly track added but deleted file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22489
diff changeset
2873
22396
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2874 # For files marked as removed, we check if an unknown file is present at
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2875 # the same path. If a such file exists it may need to be backed up.
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2876 # Making the distinction at this stage helps have simpler backup
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2877 # logic.
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2878 removunk = set()
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2879 for abs in removed:
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2880 target = repo.wjoin(abs)
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2881 if os.path.lexists(target):
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2882 removunk.add(abs)
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2883 removed -= removunk
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2884
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2885 dsremovunk = set()
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2886 for abs in dsremoved:
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2887 target = repo.wjoin(abs)
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2888 if os.path.lexists(target):
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2889 dsremovunk.add(abs)
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2890 dsremoved -= dsremovunk
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2891
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
2892 # action to be actually performed by revert
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
2893 # (<list of file>, message>) tuple
21576
33395a7e5527 revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21575
diff changeset
2894 actions = {'revert': ([], _('reverting %s\n')),
33395a7e5527 revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21575
diff changeset
2895 'add': ([], _('adding %s\n')),
22489
0d57bf80c7cb revert: have an explicit action for "forget"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22488
diff changeset
2896 'remove': ([], _('removing %s\n')),
22491
5e16fe6fdd32 revert: add a `drop` action
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22490
diff changeset
2897 'drop': ([], _('removing %s\n')),
22489
0d57bf80c7cb revert: have an explicit action for "forget"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22488
diff changeset
2898 'forget': ([], _('forgetting %s\n')),
22231
10d9e7908a3c revert: use actions[...] in all disptable cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22230
diff changeset
2899 'undelete': ([], _('undeleting %s\n')),
22234
fe9fc29ac2d0 revert: add a message to noop action
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22233
diff changeset
2900 'noop': (None, _('no changes needed to %s\n')),
22236
3c24fb96900f revert: handle unknown files through status
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22235
diff changeset
2901 'unknown': (None, _('file not managed: %s\n')),
22231
10d9e7908a3c revert: use actions[...] in all disptable cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22230
diff changeset
2902 }
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2903
22608
bf0ecb224316 revert: small refactoring in the way backup value are handled
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22588
diff changeset
2904 # "constant" that convey the backup strategy.
bf0ecb224316 revert: small refactoring in the way backup value are handled
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22588
diff changeset
2905 # All set to `discard` if `no-backup` is set do avoid checking
bf0ecb224316 revert: small refactoring in the way backup value are handled
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22588
diff changeset
2906 # no_backup lower in the code.
22609
3760ebf786b8 revert: distinguish between "check" and "backup" strategy
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22608
diff changeset
2907 # These values are ordered for comparison purposes
29498
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2908 backupinteractive = 3 # do backup if interactively modified
22608
bf0ecb224316 revert: small refactoring in the way backup value are handled
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22588
diff changeset
2909 backup = 2 # unconditionally do backup
22609
3760ebf786b8 revert: distinguish between "check" and "backup" strategy
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22608
diff changeset
2910 check = 1 # check if the existing file differs from target
22608
bf0ecb224316 revert: small refactoring in the way backup value are handled
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22588
diff changeset
2911 discard = 0 # never do backup
bf0ecb224316 revert: small refactoring in the way backup value are handled
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22588
diff changeset
2912 if opts.get('no_backup'):
29498
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2913 backupinteractive = backup = check = discard
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2914 if interactive:
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2915 dsmodifiedbackup = backupinteractive
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2916 else:
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2917 dsmodifiedbackup = backup
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2918 tobackup = set()
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2919
22611
2ff28e07d7d6 revert: properly back up added files with local modification
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22610
diff changeset
2920 backupanddel = actions['remove']
2ff28e07d7d6 revert: properly back up added files with local modification
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22610
diff changeset
2921 if not opts.get('no_backup'):
2ff28e07d7d6 revert: properly back up added files with local modification
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22610
diff changeset
2922 backupanddel = actions['drop']
2ff28e07d7d6 revert: properly back up added files with local modification
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22610
diff changeset
2923
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2924 disptable = (
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2925 # dispatch table:
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2926 # file state
22153
fc8bc2787528 revert: move manifest membership condition outside of the loop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22013
diff changeset
2927 # action
fc8bc2787528 revert: move manifest membership condition outside of the loop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22013
diff changeset
2928 # make backup
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
2929
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
2930 ## Sets that results that will change file on disk
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
2931 # Modified compared to target, no local change
22372
8da5864dcfda revert: add more padding in the dispatch list
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22371
diff changeset
2932 (modified, actions['revert'], discard),
22397
1db04829bdc1 revert: distinguish between deleted file and locally modified
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22396
diff changeset
2933 # Modified compared to target, but local file is deleted
1db04829bdc1 revert: distinguish between deleted file and locally modified
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22396
diff changeset
2934 (deleted, actions['revert'], discard),
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
2935 # Modified compared to target, local change
29498
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2936 (dsmodified, actions['revert'], dsmodifiedbackup),
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
2937 # Added since target
22488
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
2938 (added, actions['remove'], discard),
6c52ed3f888e revert: split between newly added file and file added in other changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22485
diff changeset
2939 # Added in working directory
22489
0d57bf80c7cb revert: have an explicit action for "forget"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22488
diff changeset
2940 (dsadded, actions['forget'], discard),
22610
0f323ed8effd revert: track added files with local modifications
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22609
diff changeset
2941 # Added since target, have local modification
22611
2ff28e07d7d6 revert: properly back up added files with local modification
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22610
diff changeset
2942 (modadded, backupanddel, backup),
22490
bcab7bc7280e revert: explicitly track added but deleted file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22489
diff changeset
2943 # Added since target but file is missing in working directory
22491
5e16fe6fdd32 revert: add a `drop` action
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22490
diff changeset
2944 (deladded, actions['drop'], discard),
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
2945 # Removed since target, before working copy parent
22396
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2946 (removed, actions['add'], discard),
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2947 # Same as `removed` but an unknown file exists at the same path
22609
3760ebf786b8 revert: distinguish between "check" and "backup" strategy
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22608
diff changeset
2948 (removunk, actions['add'], check),
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
2949 # Removed since targe, marked as such in working copy parent
22396
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2950 (dsremoved, actions['undelete'], discard),
c0213f2cb942 revert: detect unknown files in the same path as files marked as removed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22395
diff changeset
2951 # Same as `dsremoved` but an unknown file exists at the same path
22609
3760ebf786b8 revert: distinguish between "check" and "backup" strategy
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22608
diff changeset
2952 (dsremovunk, actions['undelete'], check),
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
2953 ## the following sets does not result in any file changes
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
2954 # File with no modification
22372
8da5864dcfda revert: add more padding in the dispatch list
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22371
diff changeset
2955 (clean, actions['noop'], discard),
22371
81ad62defef5 revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22370
diff changeset
2956 # Existing file, not tracked anywhere
22372
8da5864dcfda revert: add more padding in the dispatch list
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22371
diff changeset
2957 (unknown, actions['unknown'], discard),
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2958 )
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2959
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2960 for abs, (rel, exact) in sorted(names.items()):
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
2961 # target file to be touch on disk (relative to cwd)
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2962 target = repo.wjoin(abs)
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
2963 # search the entry in the dispatch table.
22212
f18aca03ddd9 revert: inline a now useless closure
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22211
diff changeset
2964 # if the file is in any of these sets, it was touched in the working
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
2965 # directory parent and we are sure it needs to be reverted.
22232
91df98701e9e revert: explode the action tuple in the for loop
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22231
diff changeset
2966 for table, (xlist, msg), dobackup in disptable:
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2967 if abs not in table:
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2968 continue
22233
4ab61b24e20c revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22232
diff changeset
2969 if xlist is not None:
4ab61b24e20c revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22232
diff changeset
2970 xlist.append(abs)
29498
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2971 if dobackup:
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2972 # If in interactive mode, don't automatically create
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2973 # .orig files (issue4793)
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2974 if dobackup == backupinteractive:
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2975 tobackup.add(abs)
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
2976 elif (backup <= dobackup or wctx[abs].cmp(ctx[abs])):
27651
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 27637
diff changeset
2977 bakname = scmutil.origpath(ui, repo, rel)
22609
3760ebf786b8 revert: distinguish between "check" and "backup" strategy
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22608
diff changeset
2978 ui.note(_('saving current version of %s as %s\n') %
3760ebf786b8 revert: distinguish between "check" and "backup" strategy
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22608
diff changeset
2979 (rel, bakname))
3760ebf786b8 revert: distinguish between "check" and "backup" strategy
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22608
diff changeset
2980 if not opts.get('dry_run'):
24475
06cbff4674a3 revert: fix --interactive on local modification (issue4576)
Laurent Charignon <lcharignon@fb.com>
parents: 24472
diff changeset
2981 if interactive:
06cbff4674a3 revert: fix --interactive on local modification (issue4576)
Laurent Charignon <lcharignon@fb.com>
parents: 24472
diff changeset
2982 util.copyfile(target, bakname)
06cbff4674a3 revert: fix --interactive on local modification (issue4576)
Laurent Charignon <lcharignon@fb.com>
parents: 24472
diff changeset
2983 else:
06cbff4674a3 revert: fix --interactive on local modification (issue4576)
Laurent Charignon <lcharignon@fb.com>
parents: 24472
diff changeset
2984 util.rename(target, bakname)
22233
4ab61b24e20c revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22232
diff changeset
2985 if ui.verbose or not exact:
35208
bfd072c52e03 py3: use bytes in place of basestring
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35207
diff changeset
2986 if not isinstance(msg, bytes):
22233
4ab61b24e20c revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22232
diff changeset
2987 msg = msg(abs)
4ab61b24e20c revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22232
diff changeset
2988 ui.status(msg % rel)
4ab61b24e20c revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22232
diff changeset
2989 elif exact:
22234
fe9fc29ac2d0 revert: add a message to noop action
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22233
diff changeset
2990 ui.warn(msg % rel)
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2991 break
21575
8262c2a39ab8 revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21574
diff changeset
2992
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
2993 if not opts.get('dry_run'):
23965
6156edaa82aa revert: move prefetch to after the actions logic
Durham Goode <durham@fb.com>
parents: 23955
diff changeset
2994 needdata = ('revert', 'add', 'undelete')
35963
efbd04238029 cmdutil: convert _revertprefetch() to a generic stored file hook (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35950
diff changeset
2995 oplist = [actions[name][0] for name in needdata]
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37756
diff changeset
2996 prefetch = scmutil.prefetchfiles
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37756
diff changeset
2997 matchfiles = scmutil.matchfiles
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37756
diff changeset
2998 prefetch(repo, [ctx.rev()],
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37756
diff changeset
2999 matchfiles(repo,
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37756
diff changeset
3000 [f for sublist in oplist for f in sublist]))
29498
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
3001 _performrevert(repo, parents, ctx, actions, interactive, tobackup)
19129
bd19587a3347 revert: ensure that copies and renames are honored (issue3920)
Bryan O'Sullivan <bryano@fb.com>
parents: 19024
diff changeset
3002
24134
afed5d2e7985 revert: display full subrepo output with --dry-run
Matt Harbison <matt_harbison@yahoo.com>
parents: 24064
diff changeset
3003 if targetsubs:
afed5d2e7985 revert: display full subrepo output with --dry-run
Matt Harbison <matt_harbison@yahoo.com>
parents: 24064
diff changeset
3004 # Revert the subrepos on the revert list
afed5d2e7985 revert: display full subrepo output with --dry-run
Matt Harbison <matt_harbison@yahoo.com>
parents: 24064
diff changeset
3005 for sub in targetsubs:
24463
06d199e66bbc revert: handle subrepos missing in the given --rev
Matt Harbison <matt_harbison@yahoo.com>
parents: 24455
diff changeset
3006 try:
35168
3da4bd50103d py3: fix handling of keyword arguments in revert
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35144
diff changeset
3007 wctx.sub(sub).revert(ctx.substate[sub], *pats,
3da4bd50103d py3: fix handling of keyword arguments in revert
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35144
diff changeset
3008 **pycompat.strkwargs(opts))
24463
06d199e66bbc revert: handle subrepos missing in the given --rev
Matt Harbison <matt_harbison@yahoo.com>
parents: 24455
diff changeset
3009 except KeyError:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
3010 raise error.Abort("subrepository '%s' does not exist in %s!"
24463
06d199e66bbc revert: handle subrepos missing in the given --rev
Matt Harbison <matt_harbison@yahoo.com>
parents: 24455
diff changeset
3011 % (sub, short(ctx.node())))
16304
a740fa28d718 revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 16283
diff changeset
3012
29498
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
3013 def _performrevert(repo, parents, ctx, actions, interactive=False,
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
3014 tobackup=None):
21576
33395a7e5527 revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21575
diff changeset
3015 """function that actually perform all the actions computed for revert
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3016
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3017 This is an independent function to let extension to plug in and react to
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3018 the imminent revert.
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3019
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 20790
diff changeset
3020 Make sure you have the working directory locked when calling this function.
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3021 """
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3022 parent, p2 = parents
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3023 node = ctx.node()
27985
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
3024 excluded_files = []
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
3025
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3026 def checkout(f):
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3027 fc = ctx[f]
25755
72d395e399c1 cmdutil: remove useless dirstate.normallookup() invocation in revert()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25739
diff changeset
3028 repo.wwrite(f, fc.data(), fc.flags())
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3029
30541
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3030 def doremove(f):
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3031 try:
31318
8908f985570c vfs: use repo.wvfs.unlinkpath
Mads Kiilerich <madski@unity3d.com>
parents: 31247
diff changeset
3032 repo.wvfs.unlinkpath(f)
30541
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3033 except OSError:
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3034 pass
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3035 repo.dirstate.remove(f)
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3036
33647
377e8ddaebef pathauditor: disable cache of audited paths by default (issue5628)
Yuya Nishihara <yuya@tcha.org>
parents: 33616
diff changeset
3037 audit_path = pathutil.pathauditor(repo.root, cached=True)
22489
0d57bf80c7cb revert: have an explicit action for "forget"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22488
diff changeset
3038 for f in actions['forget'][0]:
27985
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
3039 if interactive:
30539
74013a831872 style: avoid an unnecessary line split
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30528
diff changeset
3040 choice = repo.ui.promptchoice(
30540
841092fd6b85 revert: indicate the default choice when prompting to forget files
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30539
diff changeset
3041 _("forget added file %s (Yn)?$$ &Yes $$ &No") % f)
27985
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
3042 if choice == 0:
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
3043 repo.dirstate.drop(f)
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
3044 else:
36232
39b3aab6231e revert: use an exact matcher in interactive diff selection (issue5789)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 36179
diff changeset
3045 excluded_files.append(f)
27985
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
3046 else:
79139c7a88bd revert: makes interactive mode ask to forget added files (issue4936)
liscju <piotr.listkiewicz@gmail.com>
parents: 27973
diff changeset
3047 repo.dirstate.drop(f)
21576
33395a7e5527 revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21575
diff changeset
3048 for f in actions['remove'][0]:
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3049 audit_path(f)
30541
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3050 if interactive:
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3051 choice = repo.ui.promptchoice(
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3052 _("remove added file %s (Yn)?$$ &Yes $$ &No") % f)
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3053 if choice == 0:
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3054 doremove(f)
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3055 else:
36232
39b3aab6231e revert: use an exact matcher in interactive diff selection (issue5789)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 36179
diff changeset
3056 excluded_files.append(f)
30541
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3057 else:
66b162fa3ffa revert: prompt before removing files in interactive mode
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30540
diff changeset
3058 doremove(f)
22491
5e16fe6fdd32 revert: add a `drop` action
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22490
diff changeset
3059 for f in actions['drop'][0]:
5e16fe6fdd32 revert: add a `drop` action
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22490
diff changeset
3060 audit_path(f)
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3061 repo.dirstate.remove(f)
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3062
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3063 normal = None
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3064 if node == parent:
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3065 # We're reverting to our parent. If possible, we'd like status
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3066 # to report the file as clean. We have to use normallookup for
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3067 # merges to avoid losing information about merged/dirty files.
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3068 if p2 != nullid:
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3069 normal = repo.dirstate.normallookup
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3070 else:
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3071 normal = repo.dirstate.normal
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3072
25259
5b05f10c5024 revert: fix edition of newly added file during --interactive
Laurent Charignon <lcharignon@fb.com>
parents: 25258
diff changeset
3073 newlyaddedandmodifiedfiles = set()
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3074 if interactive:
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3075 # Prompt the user for changes to revert
36232
39b3aab6231e revert: use an exact matcher in interactive diff selection (issue5789)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 36179
diff changeset
3076 torevert = [f for f in actions['revert'][0] if f not in excluded_files]
39b3aab6231e revert: use an exact matcher in interactive diff selection (issue5789)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 36179
diff changeset
3077 m = scmutil.matchfiles(repo, torevert)
25258
f37a69ec3f47 revert: make revert --interactive use git style diff
Laurent Charignon <lcharignon@fb.com>
parents: 25257
diff changeset
3078 diffopts = patch.difffeatureopts(repo.ui, whitespace=True)
f37a69ec3f47 revert: make revert --interactive use git style diff
Laurent Charignon <lcharignon@fb.com>
parents: 25257
diff changeset
3079 diffopts.nodates = True
f37a69ec3f47 revert: make revert --interactive use git style diff
Laurent Charignon <lcharignon@fb.com>
parents: 25257
diff changeset
3080 diffopts.git = True
31206
3af9a9628ecf revert: always display hunks reversed when reverting to parent
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31181
diff changeset
3081 operation = 'discard'
3af9a9628ecf revert: always display hunks reversed when reverting to parent
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31181
diff changeset
3082 reversehunks = True
3af9a9628ecf revert: always display hunks reversed when reverting to parent
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31181
diff changeset
3083 if node != parent:
35023
3649c3f2cd90 revert: do not reverse hunks in interactive when REV is not parent (issue5096)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34928
diff changeset
3084 operation = 'apply'
3649c3f2cd90 revert: do not reverse hunks in interactive when REV is not parent (issue5096)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34928
diff changeset
3085 reversehunks = False
25424
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
3086 if reversehunks:
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
3087 diff = patch.diff(repo, ctx.node(), None, m, opts=diffopts)
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
3088 else:
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
3089 diff = patch.diff(repo, None, ctx.node(), m, opts=diffopts)
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3090 originalchunks = patch.parsepatch(diff)
25424
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
3091
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3092 try:
25424
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
3093
29283
14eee72c8d52 revert: use "discard"/"revert" verb when reverting interactively (issue5143)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29216
diff changeset
3094 chunks, opts = recordfilter(repo.ui, originalchunks,
14eee72c8d52 revert: use "discard"/"revert" verb when reverting interactively (issue5143)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29216
diff changeset
3095 operation=operation)
25424
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
3096 if reversehunks:
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
3097 chunks = patch.reversehunks(chunks)
69609f43c752 revert: add an experimental config to use inverted selection
Laurent Charignon <lcharignon@fb.com>
parents: 25358
diff changeset
3098
34258
61714510220d error: move patch.PatchError so it can easily implement __bytes__ (API)
Yuya Nishihara <yuya@tcha.org>
parents: 34201
diff changeset
3099 except error.PatchError as err:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
3100 raise error.Abort(_('error parsing patch: %s') % err)
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3101
25259
5b05f10c5024 revert: fix edition of newly added file during --interactive
Laurent Charignon <lcharignon@fb.com>
parents: 25258
diff changeset
3102 newlyaddedandmodifiedfiles = newandmodified(chunks, originalchunks)
29498
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
3103 if tobackup is None:
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
3104 tobackup = set()
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3105 # Apply changes
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28837
diff changeset
3106 fp = stringio()
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3107 for c in chunks:
29498
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
3108 # Create a backup file only if this hunk should be backed up
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
3109 if ishunk(c) and c.header.filename() in tobackup:
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
3110 abs = c.header.filename()
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
3111 target = repo.wjoin(abs)
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
3112 bakname = scmutil.origpath(repo.ui, repo, m.rel(abs))
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
3113 util.copyfile(target, bakname)
1b38cfde9530 revert: don't backup if no files reverted in interactive mode (issue4793)
skarlage <skarlage@fb.com>
parents: 29427
diff changeset
3114 tobackup.remove(abs)
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3115 c.write(fp)
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3116 dopatch = fp.tell()
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3117 fp.seek(0)
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3118 if dopatch:
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3119 try:
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3120 patch.internalpatch(repo.ui, repo, fp, 1, eolmode=None)
34258
61714510220d error: move patch.PatchError so it can easily implement __bytes__ (API)
Yuya Nishihara <yuya@tcha.org>
parents: 34201
diff changeset
3121 except error.PatchError as err:
36742
390d16ea7c76 py3: use pycompat.bytestr instead of str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36692
diff changeset
3122 raise error.Abort(pycompat.bytestr(err))
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3123 del fp
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3124 else:
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3125 for f in actions['revert'][0]:
25755
72d395e399c1 cmdutil: remove useless dirstate.normallookup() invocation in revert()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25739
diff changeset
3126 checkout(f)
24359
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3127 if normal:
521fe8287dd5 revert: add flag to make revert interactive
Laurent Charignon <lcharignon@fb.com>
parents: 24358
diff changeset
3128 normal(f)
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3129
21576
33395a7e5527 revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21575
diff changeset
3130 for f in actions['add'][0]:
25259
5b05f10c5024 revert: fix edition of newly added file during --interactive
Laurent Charignon <lcharignon@fb.com>
parents: 25258
diff changeset
3131 # Don't checkout modified files, they are already created by the diff
5b05f10c5024 revert: fix edition of newly added file during --interactive
Laurent Charignon <lcharignon@fb.com>
parents: 25258
diff changeset
3132 if f not in newlyaddedandmodifiedfiles:
5b05f10c5024 revert: fix edition of newly added file during --interactive
Laurent Charignon <lcharignon@fb.com>
parents: 25258
diff changeset
3133 checkout(f)
5b05f10c5024 revert: fix edition of newly added file during --interactive
Laurent Charignon <lcharignon@fb.com>
parents: 25258
diff changeset
3134 repo.dirstate.add(f)
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3135
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3136 normal = repo.dirstate.normallookup
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3137 if node == parent and p2 == nullid:
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3138 normal = repo.dirstate.normal
21576
33395a7e5527 revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21575
diff changeset
3139 for f in actions['undelete'][0]:
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3140 checkout(f)
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3141 normal(f)
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3142
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3143 copied = copies.pathcopies(repo[parent], ctx)
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3144
21576
33395a7e5527 revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21575
diff changeset
3145 for f in actions['add'][0] + actions['undelete'][0] + actions['revert'][0]:
20571
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3146 if f in copied:
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3147 repo.dirstate.copy(copied[f], f)
d4893e64f300 revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20553
diff changeset
3148
21051
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21047
diff changeset
3149 # a list of (ui, repo, otherpeer, opts, missing) functions called by
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21047
diff changeset
3150 # commands.outgoing. "missing" is "missing" of the result of
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21047
diff changeset
3151 # "findcommonoutgoing()"
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21047
diff changeset
3152 outgoinghooks = util.hooks()
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21047
diff changeset
3153
19211
3bfd7f1e7485 summary: augment output with info from extensions
Bryan O'Sullivan <bryano@fb.com>
parents: 19129
diff changeset
3154 # a list of (ui, repo) functions called by commands.summary
3bfd7f1e7485 summary: augment output with info from extensions
Bryan O'Sullivan <bryano@fb.com>
parents: 19129
diff changeset
3155 summaryhooks = util.hooks()
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3156
21047
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
3157 # a list of (ui, repo, opts, changes) functions called by commands.summary.
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
3158 #
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
3159 # functions should return tuple of booleans below, if 'changes' is None:
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
3160 # (whether-incomings-are-needed, whether-outgoings-are-needed)
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
3161 #
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
3162 # otherwise, 'changes' is a tuple of tuples below:
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
3163 # - (sourceurl, sourcebranch, sourcepeer, incoming)
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
3164 # - (desturl, destbranch, destpeer, outgoing)
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
3165 summaryremotehooks = util.hooks()
f0003f989e72 summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21041
diff changeset
3166
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3167 # A list of state files kept by multistep operations like graft.
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3168 # Since graft cannot be aborted, it is considered 'clearable' by update.
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3169 # note: bisect is intentionally excluded
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19482
diff changeset
3170 # (state file, clearable, allowcommit, error, hint)
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3171 unfinishedstates = [
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19482
diff changeset
3172 ('graftstate', True, False, _('graft in progress'),
38320
47f5454a30ed cmdutil: say that `graft --stop` stops the graft instead of aborting
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38292
diff changeset
3173 _("use 'hg graft --continue' or 'hg graft --stop' to stop")),
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19482
diff changeset
3174 ('updatestate', True, False, _('last update was interrupted'),
19482
499fc471296b update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents: 19474
diff changeset
3175 _("use 'hg update' to get a consistent checkout"))
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3176 ]
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3177
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19482
diff changeset
3178 def checkunfinished(repo, commit=False):
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3179 '''Look for an unfinished multistep operation, like graft, and abort
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3180 if found. It's probably good to check this right before
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3181 bailifchanged().
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3182 '''
37855
79c54e7c0c52 rebase: prioritize indicating an interrupted rebase over update (issue5838)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37815
diff changeset
3183 # Check for non-clearable states first, so things like rebase will take
79c54e7c0c52 rebase: prioritize indicating an interrupted rebase over update (issue5838)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37815
diff changeset
3184 # precedence over update.
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19482
diff changeset
3185 for f, clearable, allowcommit, msg, hint in unfinishedstates:
37855
79c54e7c0c52 rebase: prioritize indicating an interrupted rebase over update (issue5838)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37815
diff changeset
3186 if clearable or (commit and allowcommit):
79c54e7c0c52 rebase: prioritize indicating an interrupted rebase over update (issue5838)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37815
diff changeset
3187 continue
79c54e7c0c52 rebase: prioritize indicating an interrupted rebase over update (issue5838)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37815
diff changeset
3188 if repo.vfs.exists(f):
79c54e7c0c52 rebase: prioritize indicating an interrupted rebase over update (issue5838)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37815
diff changeset
3189 raise error.Abort(msg, hint=hint)
79c54e7c0c52 rebase: prioritize indicating an interrupted rebase over update (issue5838)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37815
diff changeset
3190
79c54e7c0c52 rebase: prioritize indicating an interrupted rebase over update (issue5838)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37815
diff changeset
3191 for f, clearable, allowcommit, msg, hint in unfinishedstates:
79c54e7c0c52 rebase: prioritize indicating an interrupted rebase over update (issue5838)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37815
diff changeset
3192 if not clearable or (commit and allowcommit):
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19482
diff changeset
3193 continue
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3194 if repo.vfs.exists(f):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
3195 raise error.Abort(msg, hint=hint)
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3196
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3197 def clearunfinished(repo):
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3198 '''Check for unfinished operations (as above), and clear the ones
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3199 that are clearable.
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3200 '''
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19482
diff changeset
3201 for f, clearable, allowcommit, msg, hint in unfinishedstates:
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3202 if not clearable and repo.vfs.exists(f):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26579
diff changeset
3203 raise error.Abort(msg, hint=hint)
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19482
diff changeset
3204 for f, clearable, allowcommit, msg, hint in unfinishedstates:
19474
894fd1a7c533 cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19293
diff changeset
3205 if clearable and repo.vfs.exists(f):
31329
1b0db28dadf1 cmdutil: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31318
diff changeset
3206 util.unlink(repo.vfs.join(f))
24991
4169a4f83548 cmdutil: add class to restore dirstate during unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24988
diff changeset
3207
27624
d46db4390715 resolve: suggest the next action
timeless <timeless@mozdev.org>
parents: 27622
diff changeset
3208 afterresolvedstates = [
27625
cdb9493a7e2f graft: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents: 27624
diff changeset
3209 ('graftstate',
cdb9493a7e2f graft: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents: 27624
diff changeset
3210 _('hg graft --continue')),
27624
d46db4390715 resolve: suggest the next action
timeless <timeless@mozdev.org>
parents: 27622
diff changeset
3211 ]
d46db4390715 resolve: suggest the next action
timeless <timeless@mozdev.org>
parents: 27622
diff changeset
3212
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3213 def howtocontinue(repo):
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3214 '''Check for an unfinished operation and return the command to finish
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3215 it.
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3216
30342
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30286
diff changeset
3217 afterresolvedstates tuples define a .hg/{file} and the corresponding
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3218 command needed to finish it.
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3219
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3220 Returns a (msg, warning) tuple. 'msg' is a string and 'warning' is
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3221 a boolean.
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3222 '''
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3223 contmsg = _("continue: %s")
27624
d46db4390715 resolve: suggest the next action
timeless <timeless@mozdev.org>
parents: 27622
diff changeset
3224 for f, msg in afterresolvedstates:
d46db4390715 resolve: suggest the next action
timeless <timeless@mozdev.org>
parents: 27622
diff changeset
3225 if repo.vfs.exists(f):
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3226 return contmsg % msg, True
33362
e48fb90f80c8 cmdutil: simplify the dirty check in howtocontinue()
Matt Harbison <matt_harbison@yahoo.com>
parents: 33334
diff changeset
3227 if repo[None].dirty(missing=True, merge=False, branch=False):
28120
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3228 return contmsg % _("hg commit"), False
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3229 return None, None
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3230
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3231 def checkafterresolved(repo):
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3232 '''Inform the user about the next action after completing hg resolve
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3233
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3234 If there's a matching afterresolvedstates, howtocontinue will yield
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3235 repo.ui.warn as the reporter.
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3236
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3237 Otherwise, it will yield repo.ui.note.
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3238 '''
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3239 msg, warning = howtocontinue(repo)
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3240 if msg is not None:
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3241 if warning:
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3242 repo.ui.warn("%s\n" % msg)
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3243 else:
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3244 repo.ui.note("%s\n" % msg)
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3245
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3246 def wrongtooltocontinue(repo, task):
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3247 '''Raise an abort suggesting how to properly continue if there is an
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3248 active task.
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3249
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3250 Uses howtocontinue() to find the active task.
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3251
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3252 If there's no task (repo.ui.note for 'hg commit'), it does not offer
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3253 a hint.
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3254 '''
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3255 after = howtocontinue(repo)
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3256 hint = None
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3257 if after[1]:
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3258 hint = after[0]
ed4d06f180b8 cmdutil: provide a way to report how to continue
timeless <timeless@mozdev.org>
parents: 28027
diff changeset
3259 raise error.Abort(_('no %s in progress') % task, hint=hint)