Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/cmdutil.py @ 22373:f6a1386d540e
revert: no backup for `dsadded` set
There is only one case where a backup is required in the `dsadded` set, and the
current backup mechanism fails to handle it. So we stop trying to do backups at
all for now. This will help us to simplify the backup code and finally fix
this backup issue.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Sat, 30 Aug 2014 01:49:28 +0200 |
parents | 8da5864dcfda |
children | 4509a16c76c2 |
rev | line source |
---|---|
2957 | 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 | 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 |
6211
f89fd07fc51d
Expand import * to allow Pyflakes to find problems
Joel Rosdahl <joel@rosdahl.net>
parents:
6190
diff
changeset
|
8 from node import hex, nullid, nullrev, short |
3891 | 9 from i18n import _ |
14269
66257848c154
cmdutil: fix errors reported by pyflakes test
Sune Foldager <cryo@cyanite.org>
parents:
14259
diff
changeset
|
10 import os, sys, errno, re, tempfile |
15214
231aac5280ba
rebase: move updatedirstate into cmdutil so it can be shared
Matt Mackall <mpm@selenic.com>
parents:
14986
diff
changeset
|
11 import util, scmutil, templater, patch, error, templatekw, revlog, copies |
12085
6f833fc3ccab
Consistently import foo as foomod when foo to avoid shadowing
Martin Geisler <mg@aragost.com>
parents:
12032
diff
changeset
|
12 import match as matchmod |
20392
d4f804caa0ed
itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents:
20364
diff
changeset
|
13 import context, repair, graphmod, revset, phases, obsolete, pathutil |
17811
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
14 import changelog |
18538
94317c2d53b8
commit: show active bookmark in commit editor helper text
Antonio Zanardo <zanardo@gmail.com>
parents:
18364
diff
changeset
|
15 import bookmarks |
17471
ad1561723dde
amend: lock the repository during the whole process
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17468
diff
changeset
|
16 import lock as lockmod |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
17 |
10401
6252852b4332
mq: add -Q option to all commands not in norepo
Brendan Cully <brendan@kublai.com>
parents:
10344
diff
changeset
|
18 def parsealiases(cmd): |
6252852b4332
mq: add -Q option to all commands not in norepo
Brendan Cully <brendan@kublai.com>
parents:
10344
diff
changeset
|
19 return cmd.lstrip("^").split("|") |
6252852b4332
mq: add -Q option to all commands not in norepo
Brendan Cully <brendan@kublai.com>
parents:
10344
diff
changeset
|
20 |
7213
b4c035057d34
findcmd: have dispatch look up strict flag
Matt Mackall <mpm@selenic.com>
parents:
7121
diff
changeset
|
21 def findpossible(cmd, table, strict=False): |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
22 """ |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
23 Return cmd -> (aliases, command table entry) |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
24 for each matching command. |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
25 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
|
26 """ |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
27 choice = {} |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
28 debugchoice = {} |
15600
195dbd1cef0c
alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents:
15231
diff
changeset
|
29 |
195dbd1cef0c
alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents:
15231
diff
changeset
|
30 if cmd in table: |
195dbd1cef0c
alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents:
15231
diff
changeset
|
31 # 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
|
32 keys = [cmd] |
195dbd1cef0c
alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents:
15231
diff
changeset
|
33 else: |
195dbd1cef0c
alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents:
15231
diff
changeset
|
34 keys = table.keys() |
195dbd1cef0c
alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents:
15231
diff
changeset
|
35 |
195dbd1cef0c
alias: shortcut command matching show shadowing works properly (issue3104)
Matt Mackall <mpm@selenic.com>
parents:
15231
diff
changeset
|
36 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
|
37 aliases = parsealiases(e) |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
38 found = None |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
39 if cmd in aliases: |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
40 found = cmd |
7213
b4c035057d34
findcmd: have dispatch look up strict flag
Matt Mackall <mpm@selenic.com>
parents:
7121
diff
changeset
|
41 elif not strict: |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
42 for a in aliases: |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
43 if a.startswith(cmd): |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
44 found = a |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
45 break |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
46 if found is not None: |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
47 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
|
48 debugchoice[found] = (aliases, table[e]) |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
49 else: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
5177
diff
changeset
|
50 choice[found] = (aliases, table[e]) |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
51 |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
52 if not choice and debugchoice: |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
53 choice = debugchoice |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
54 |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
55 return choice |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
56 |
7213
b4c035057d34
findcmd: have dispatch look up strict flag
Matt Mackall <mpm@selenic.com>
parents:
7121
diff
changeset
|
57 def findcmd(cmd, table, strict=True): |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
58 """Return (aliases, command table entry) for command string.""" |
7213
b4c035057d34
findcmd: have dispatch look up strict flag
Matt Mackall <mpm@selenic.com>
parents:
7121
diff
changeset
|
59 choice = findpossible(cmd, table, strict) |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
60 |
5915
d0576d065993
Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents:
5843
diff
changeset
|
61 if cmd in choice: |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
62 return choice[cmd] |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
63 |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
64 if len(choice) > 1: |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
65 clist = choice.keys() |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
66 clist.sort() |
7643
9a1ea6587557
error: move UnknownCommand and AmbiguousCommand
Matt Mackall <mpm@selenic.com>
parents:
7404
diff
changeset
|
67 raise error.AmbiguousCommand(cmd, clist) |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
68 |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
69 if choice: |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
70 return choice.values()[0] |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
71 |
7643
9a1ea6587557
error: move UnknownCommand and AmbiguousCommand
Matt Mackall <mpm@selenic.com>
parents:
7404
diff
changeset
|
72 raise error.UnknownCommand(cmd) |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
73 |
10402
d216fa04e48a
mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents:
10401
diff
changeset
|
74 def findrepo(p): |
d216fa04e48a
mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents:
10401
diff
changeset
|
75 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
|
76 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
|
77 if p == oldp: |
d216fa04e48a
mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents:
10401
diff
changeset
|
78 return None |
d216fa04e48a
mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents:
10401
diff
changeset
|
79 |
d216fa04e48a
mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents:
10401
diff
changeset
|
80 return p |
d216fa04e48a
mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents:
10401
diff
changeset
|
81 |
14289
d68ddccf276b
cmdutil: bail_if_changed to bailifchanged
Matt Mackall <mpm@selenic.com>
parents:
14269
diff
changeset
|
82 def bailifchanged(repo): |
13878
a8d13ee0ce68
misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents:
13769
diff
changeset
|
83 if repo.dirstate.p2() != nullid: |
5716
be367cbafe70
cmdutil: make bail_if_changed bail on uncommitted merge
Matt Mackall <mpm@selenic.com>
parents:
5610
diff
changeset
|
84 raise util.Abort(_('outstanding uncommitted merge')) |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
85 modified, added, removed, deleted = repo.status()[:4] |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
86 if modified or added or removed or deleted: |
19804
061ce98c888d
cmdutil.bailifchanged: standardize error message for dirty working dir
Siddharth Agarwal <sid0@fb.com>
parents:
19730
diff
changeset
|
87 raise util.Abort(_('uncommitted changes')) |
15231
cd6f10dccf16
cmdutil.bailifchanged: abort for dirty subrepos
Eric Roshan Eisner <ede@alum.mit.edu>
parents:
15214
diff
changeset
|
88 ctx = repo[None] |
18364
6252b4f1c4b4
subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents:
18340
diff
changeset
|
89 for s in sorted(ctx.substate): |
15231
cd6f10dccf16
cmdutil.bailifchanged: abort for dirty subrepos
Eric Roshan Eisner <ede@alum.mit.edu>
parents:
15214
diff
changeset
|
90 if ctx.sub(s).dirty(): |
cd6f10dccf16
cmdutil.bailifchanged: abort for dirty subrepos
Eric Roshan Eisner <ede@alum.mit.edu>
parents:
15214
diff
changeset
|
91 raise util.Abort(_("uncommitted changes in subrepo %s") % s) |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
92 |
14635
217b7d83afc3
cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents:
14518
diff
changeset
|
93 def logmessage(ui, opts): |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
94 """ 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
|
95 message = opts.get('message') |
bd5c37d792e6
cmdutil.logmessage: options should be optional
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7643
diff
changeset
|
96 logfile = opts.get('logfile') |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
97 |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
98 if message and logfile: |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
99 raise util.Abort(_('options --message and --logfile are mutually ' |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
100 'exclusive')) |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
101 if not message and logfile: |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
102 try: |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
103 if logfile == '-': |
14635
217b7d83afc3
cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents:
14518
diff
changeset
|
104 message = ui.fin.read() |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
105 else: |
14249
f4766e1bb0b3
cmdutil: normalize log message eols when reading from file
Patrick Mezard <pmezard@gmail.com>
parents:
14232
diff
changeset
|
106 message = '\n'.join(util.readfile(logfile).splitlines()) |
4549
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
107 except IOError, inst: |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
108 raise util.Abort(_("can't read commit message '%s': %s") % |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
109 (logfile, inst.strerror)) |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
110 return message |
0c61124ad877
dispatch: move dispatching code to cmdutil
Matt Mackall <mpm@selenic.com>
parents:
4548
diff
changeset
|
111 |
22248
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
112 def mergeeditform(ctxorbool, baseform): |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
113 """build appropriate editform from ctxorbool and baseform |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
114 |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
115 'cxtorbool' is one of a ctx to be committed, or a bool whether |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
116 merging is committed. |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
117 |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
118 This returns editform 'baseform' with '.merge' if merging is |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
119 committed, or one with '.normal' suffix otherwise. |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
120 """ |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
121 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
|
122 if ctxorbool: |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
123 return baseform + ".merge" |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
124 elif 1 < len(ctxorbool.parents()): |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
125 return baseform + ".merge" |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
126 |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
127 return baseform + ".normal" |
75618a223e18
commit: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22237
diff
changeset
|
128 |
21999
6ce282ed801e
cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21998
diff
changeset
|
129 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
|
130 editform='', **opts): |
21419
272785489ed3
cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21417
diff
changeset
|
131 """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
|
132 |
272785489ed3
cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21417
diff
changeset
|
133 '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
|
134 (= '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
|
135 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
|
136 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
|
137 storing. |
272785489ed3
cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21417
diff
changeset
|
138 |
272785489ed3
cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21417
diff
changeset
|
139 '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
|
140 '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
|
141 is automatically added. |
272785489ed3
cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21417
diff
changeset
|
142 |
21999
6ce282ed801e
cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21998
diff
changeset
|
143 '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
|
144 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
|
145 |
21419
272785489ed3
cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21417
diff
changeset
|
146 '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
|
147 '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
|
148 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
|
149 """ |
272785489ed3
cmdutil: enhance "getcommiteditor()" for specific usages in MQ
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21417
diff
changeset
|
150 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
|
151 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
|
152 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
|
153 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
|
154 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
|
155 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
|
156 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
|
157 else: |
dcf20f244c2a
cmdutil: introduce "getcommiteditor()" to simplify code paths to choose editor
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21241
diff
changeset
|
158 return commiteditor |
dcf20f244c2a
cmdutil: introduce "getcommiteditor()" to simplify code paths to choose editor
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21241
diff
changeset
|
159 |
6190
a79d9408806f
Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6145
diff
changeset
|
160 def loglimit(opts): |
a79d9408806f
Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6145
diff
changeset
|
161 """get the log limit according to option -l/--limit""" |
a79d9408806f
Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6145
diff
changeset
|
162 limit = opts.get('limit') |
a79d9408806f
Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6145
diff
changeset
|
163 if limit: |
a79d9408806f
Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6145
diff
changeset
|
164 try: |
a79d9408806f
Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6145
diff
changeset
|
165 limit = int(limit) |
a79d9408806f
Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6145
diff
changeset
|
166 except ValueError: |
a79d9408806f
Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6145
diff
changeset
|
167 raise util.Abort(_('limit must be a positive integer')) |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
168 if limit <= 0: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
169 raise util.Abort(_('limit must be positive')) |
6190
a79d9408806f
Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6145
diff
changeset
|
170 else: |
10111
27457d31ae3f
cmdutil: replace sys.maxint with None as default value in loglimit
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
10061
diff
changeset
|
171 limit = None |
6190
a79d9408806f
Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6145
diff
changeset
|
172 return limit |
a79d9408806f
Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6145
diff
changeset
|
173 |
14986
70e11de6964d
export: add %m to file format string (first line of the commit message)
Andrzej Bieniek <andyhelp@gmail.com>
parents:
14948
diff
changeset
|
174 def makefilename(repo, pat, node, desc=None, |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
175 total=None, seqno=None, revwidth=None, pathname=None): |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
176 node_expander = { |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
177 'H': lambda: hex(node), |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
178 'R': lambda: str(repo.changelog.rev(node)), |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
179 'h': lambda: short(node), |
14986
70e11de6964d
export: add %m to file format string (first line of the commit message)
Andrzej Bieniek <andyhelp@gmail.com>
parents:
14948
diff
changeset
|
180 'm': lambda: re.sub('[^\w]', '_', str(desc)) |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
181 } |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
182 expander = { |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
183 '%': lambda: '%', |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
184 'b': lambda: os.path.basename(repo.root), |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
185 } |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
186 |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
187 try: |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
188 if node: |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
189 expander.update(node_expander) |
4836
0e2d0a78f81a
archive: make the %r escape work.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4825
diff
changeset
|
190 if node: |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
191 expander['r'] = (lambda: |
4836
0e2d0a78f81a
archive: make the %r escape work.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4825
diff
changeset
|
192 str(repo.changelog.rev(node)).zfill(revwidth or 0)) |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
193 if total is not None: |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
194 expander['N'] = lambda: str(total) |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
195 if seqno is not None: |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
196 expander['n'] = lambda: str(seqno) |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
197 if total is not None and seqno is not None: |
3673
eb0b4a2d70a9
white space and line break cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3657
diff
changeset
|
198 expander['n'] = lambda: str(seqno).zfill(len(str(total))) |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
199 if pathname is not None: |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
200 expander['s'] = lambda: os.path.basename(pathname) |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
201 expander['d'] = lambda: os.path.dirname(pathname) or '.' |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
202 expander['p'] = lambda: pathname |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
203 |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
204 newname = [] |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
205 patlen = len(pat) |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
206 i = 0 |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
207 while i < patlen: |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
208 c = pat[i] |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
209 if c == '%': |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
210 i += 1 |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
211 c = pat[i] |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
212 c = expander[c]() |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
213 newname.append(c) |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
214 i += 1 |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
215 return ''.join(newname) |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
216 except KeyError, inst: |
8761
0289f384e1e5
Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents:
8731
diff
changeset
|
217 raise util.Abort(_("invalid format spec '%%%s' in output filename") % |
3072
bc3fe3b5b785
Never apply string formatting to generated errors with util.Abort.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2958
diff
changeset
|
218 inst.args[0]) |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
219 |
14986
70e11de6964d
export: add %m to file format string (first line of the commit message)
Andrzej Bieniek <andyhelp@gmail.com>
parents:
14948
diff
changeset
|
220 def makefileobj(repo, pat, node=None, desc=None, total=None, |
19944
b7f76db06dc0
cmdutil: fix makefileobj not to clobber default modemap dict
Yuya Nishihara <yuya@tcha.org>
parents:
19894
diff
changeset
|
221 seqno=None, revwidth=None, mode='wb', modemap=None, |
18613
1a2f4c633410
export: clobber files with -o (bc) (issue3652)
Augie Fackler <raf@durin42.com>
parents:
18538
diff
changeset
|
222 pathname=None): |
7319
eae1767cc6a8
export: fixed silent output file overwriting
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
7308
diff
changeset
|
223 |
13769
8796fb6af67e
cmdutil: fix mode handling in make_file
Adrian Buehlmann <adrian@cadifra.com>
parents:
13534
diff
changeset
|
224 writable = mode not in ('r', 'rb') |
7319
eae1767cc6a8
export: fixed silent output file overwriting
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
7308
diff
changeset
|
225 |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
226 if not pat or pat == '-': |
14637
5e9d691229d5
cmdutil: use ui descriptors in makefileobj
Idan Kamara <idankk86@gmail.com>
parents:
14635
diff
changeset
|
227 fp = writable and repo.ui.fout or repo.ui.fin |
14948
32302480b402
cmdutil: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14671
diff
changeset
|
228 if util.safehasattr(fp, 'fileno'): |
14638
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
229 return os.fdopen(os.dup(fp.fileno()), mode) |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
230 else: |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
231 # if this fp can't be duped properly, return |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
232 # a dummy object that can be closed |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
233 class wrappedfileobj(object): |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
234 noop = lambda x: None |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
235 def __init__(self, f): |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
236 self.f = f |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
237 def __getattr__(self, attr): |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
238 if attr == 'close': |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
239 return self.noop |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
240 else: |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
241 return getattr(self.f, attr) |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
242 |
1bdbca0b6604
cmdutil: return a dummy, closable file object if it cannot be duped
Idan Kamara <idankk86@gmail.com>
parents:
14637
diff
changeset
|
243 return wrappedfileobj(fp) |
14948
32302480b402
cmdutil: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14671
diff
changeset
|
244 if util.safehasattr(pat, 'write') and writable: |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
245 return pat |
14948
32302480b402
cmdutil: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14671
diff
changeset
|
246 if util.safehasattr(pat, 'read') and 'r' in mode: |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
247 return pat |
18613
1a2f4c633410
export: clobber files with -o (bc) (issue3652)
Augie Fackler <raf@durin42.com>
parents:
18538
diff
changeset
|
248 fn = makefilename(repo, pat, node, desc, total, seqno, revwidth, pathname) |
19944
b7f76db06dc0
cmdutil: fix makefileobj not to clobber default modemap dict
Yuya Nishihara <yuya@tcha.org>
parents:
19894
diff
changeset
|
249 if modemap is not None: |
b7f76db06dc0
cmdutil: fix makefileobj not to clobber default modemap dict
Yuya Nishihara <yuya@tcha.org>
parents:
19894
diff
changeset
|
250 mode = modemap.get(fn, mode) |
b7f76db06dc0
cmdutil: fix makefileobj not to clobber default modemap dict
Yuya Nishihara <yuya@tcha.org>
parents:
19894
diff
changeset
|
251 if mode == 'wb': |
b7f76db06dc0
cmdutil: fix makefileobj not to clobber default modemap dict
Yuya Nishihara <yuya@tcha.org>
parents:
19894
diff
changeset
|
252 modemap[fn] = 'ab' |
18613
1a2f4c633410
export: clobber files with -o (bc) (issue3652)
Augie Fackler <raf@durin42.com>
parents:
18538
diff
changeset
|
253 return open(fn, mode) |
2882
cf98cd70d2c4
move walk and matchpats from commands to cmdutil.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2874
diff
changeset
|
254 |
14323
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
255 def openrevlog(repo, cmd, file_, opts): |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
256 """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
|
257 cl = opts['changelog'] |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
258 mf = opts['manifest'] |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
259 msg = None |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
260 if cl and mf: |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
261 msg = _('cannot specify --changelog and --manifest at the same time') |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
262 elif cl or mf: |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
263 if file_: |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
264 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
|
265 elif not repo: |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
266 msg = _('cannot specify --changelog or --manifest ' |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
267 'without a repository') |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
268 if msg: |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
269 raise util.Abort(msg) |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
270 |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
271 r = None |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
272 if repo: |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
273 if cl: |
21033
254f55b64e31
debugrevlog: use unfiltered view for changelog
Matt Mackall <mpm@selenic.com>
parents:
21024
diff
changeset
|
274 r = repo.unfiltered().changelog |
14323
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
275 elif mf: |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
276 r = repo.manifest |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
277 elif file_: |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
278 filelog = repo.file(file_) |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
279 if len(filelog): |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
280 r = filelog |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
281 if not r: |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
282 if not file_: |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
283 raise error.CommandError(cmd, _('invalid arguments')) |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
284 if not os.path.isfile(file_): |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
285 raise util.Abort(_("revlog '%s' not found") % file_) |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
286 r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
287 file_[:-2] + ".i") |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
288 return r |
a79fea6b3e77
debugindex etc.: add --changelog and --manifest options
Sune Foldager <cryo@cyanite.org>
parents:
14322
diff
changeset
|
289 |
5610
2493a478f395
copy: handle rename internally
Matt Mackall <mpm@selenic.com>
parents:
5609
diff
changeset
|
290 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
|
291 # called with the repo lock held |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
292 # |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
293 # hgsep => pathname that uses "/" to separate directories |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
294 # 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
|
295 cwd = repo.getcwd() |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
296 targets = {} |
5607 | 297 after = opts.get("after") |
298 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
|
299 wctx = repo[None] |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
300 |
5605
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
301 def walkpat(pat): |
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
302 srcs = [] |
11223
0d09f2244805
rename: make --after work if source is already in R state
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
11177
diff
changeset
|
303 badstates = after and '?' or '?r' |
14671
35c2cc322ba8
scmutil: switch match users to supplying contexts
Matt Mackall <mpm@selenic.com>
parents:
14638
diff
changeset
|
304 m = scmutil.match(repo[None], [pat], opts, globbed=True) |
6586
d3463007d368
walk: return a single value
Matt Mackall <mpm@selenic.com>
parents:
6585
diff
changeset
|
305 for abs in repo.walk(m): |
5605
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
306 state = repo.dirstate[abs] |
6584
29c77e5dfb3c
walk: remove rel and exact returns
Matt Mackall <mpm@selenic.com>
parents:
6582
diff
changeset
|
307 rel = m.rel(abs) |
29c77e5dfb3c
walk: remove rel and exact returns
Matt Mackall <mpm@selenic.com>
parents:
6582
diff
changeset
|
308 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
|
309 if state in badstates: |
5605
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
310 if exact and state == '?': |
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
311 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
|
312 if exact and state == 'r': |
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
313 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
|
314 ' remove\n') % rel) |
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
315 continue |
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
316 # abs: hgsep |
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
317 # rel: ossep |
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
318 srcs.append((abs, rel, exact)) |
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
319 return srcs |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
320 |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
321 # abssrc: hgsep |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
322 # relsrc: ossep |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
323 # otarget: ossep |
5605
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
324 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
|
325 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
|
326 if '/' in abstarget: |
e596a631210e
dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents:
16458
diff
changeset
|
327 # 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
|
328 # case only renames, like a => A. |
e596a631210e
dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents:
16458
diff
changeset
|
329 abspath, absname = abstarget.rsplit('/', 1) |
e596a631210e
dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents:
16458
diff
changeset
|
330 abstarget = repo.dirstate.normalize(abspath) + '/' + absname |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
331 reltarget = repo.pathto(abstarget, cwd) |
5607 | 332 target = repo.wjoin(abstarget) |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
333 src = repo.wjoin(abssrc) |
5608 | 334 state = repo.dirstate[abstarget] |
5607 | 335 |
13962
8b252e826c68
add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13945
diff
changeset
|
336 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
|
337 |
5607 | 338 # check for collisions |
339 prevsrc = targets.get(abstarget) | |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
340 if prevsrc is not None: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
341 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
|
342 (reltarget, repo.pathto(abssrc, cwd), |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
343 repo.pathto(prevsrc, cwd))) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
344 return |
5607 | 345 |
346 # check for overwrites | |
12342
70236d6fd844
rename: do not overwrite existing broken symlinks
Patrick Mezard <pmezard@gmail.com>
parents:
11950
diff
changeset
|
347 exists = os.path.lexists(target) |
16283
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
348 samefile = False |
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
349 if exists and abssrc != abstarget: |
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
350 if (repo.dirstate.normalize(abssrc) == |
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
351 repo.dirstate.normalize(abstarget)): |
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
352 if not rename: |
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
353 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
|
354 return |
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
355 exists = False |
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
356 samefile = True |
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
357 |
8117
2b30d8488819
remove unnecessary outer parenthesis in if-statements
Martin Geisler <mg@lazybytes.net>
parents:
8013
diff
changeset
|
358 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
|
359 if not opts['force']: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
360 ui.warn(_('%s: not overwriting - file exists\n') % |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
361 reltarget) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
362 return |
5607 | 363 |
364 if after: | |
5608 | 365 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
|
366 if rename: |
e8d10d085f47
cmdutil: Warn when trying to copy/rename --after to a nonexistant file.
Steve Losh <steve@stevelosh.com>
parents:
11061
diff
changeset
|
367 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
|
368 (relsrc, reltarget)) |
e8d10d085f47
cmdutil: Warn when trying to copy/rename --after to a nonexistant file.
Steve Losh <steve@stevelosh.com>
parents:
11061
diff
changeset
|
369 else: |
e8d10d085f47
cmdutil: Warn when trying to copy/rename --after to a nonexistant file.
Steve Losh <steve@stevelosh.com>
parents:
11061
diff
changeset
|
370 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
|
371 (relsrc, reltarget)) |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
372 return |
5608 | 373 elif not dryrun: |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
374 try: |
5608 | 375 if exists: |
376 os.unlink(target) | |
377 targetdir = os.path.dirname(target) or '.' | |
378 if not os.path.isdir(targetdir): | |
379 os.makedirs(targetdir) | |
16283
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
380 if samefile: |
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
381 tmp = target + "~hgrename" |
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
382 os.rename(src, tmp) |
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
383 os.rename(tmp, target) |
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
384 else: |
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
385 util.copyfile(src, target) |
14518
a67e866f46f9
workingctx: eliminate remove function
Adrian Buehlmann <adrian@cadifra.com>
parents:
14442
diff
changeset
|
386 srcexists = True |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
387 except IOError, inst: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
388 if inst.errno == errno.ENOENT: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
389 ui.warn(_('%s: deleted in working copy\n') % relsrc) |
14518
a67e866f46f9
workingctx: eliminate remove function
Adrian Buehlmann <adrian@cadifra.com>
parents:
14442
diff
changeset
|
390 srcexists = False |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
391 else: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
392 ui.warn(_('%s: cannot copy - %s\n') % |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
393 (relsrc, inst.strerror)) |
5606
447ea621e50e
copy: propagate errors properly
Matt Mackall <mpm@selenic.com>
parents:
5605
diff
changeset
|
394 return True # report a failure |
5607 | 395 |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
396 if ui.verbose or not exact: |
7894
caef5fdf1375
cmdutil: fix untranslatable string in copy
Martin Geisler <mg@daimi.au.dk>
parents:
7879
diff
changeset
|
397 if rename: |
caef5fdf1375
cmdutil: fix untranslatable string in copy
Martin Geisler <mg@daimi.au.dk>
parents:
7879
diff
changeset
|
398 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
|
399 else: |
caef5fdf1375
cmdutil: fix untranslatable string in copy
Martin Geisler <mg@daimi.au.dk>
parents:
7879
diff
changeset
|
400 ui.status(_('copying %s to %s\n') % (relsrc, reltarget)) |
5608 | 401 |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
402 targets[abstarget] = abssrc |
5607 | 403 |
404 # fix up dirstate | |
14321
003d63bb4fa5
scmutil: drop some aliases in cmdutil
Matt Mackall <mpm@selenic.com>
parents:
14320
diff
changeset
|
405 scmutil.dirstatecopy(ui, repo, wctx, abssrc, abstarget, |
003d63bb4fa5
scmutil: drop some aliases in cmdutil
Matt Mackall <mpm@selenic.com>
parents:
14320
diff
changeset
|
406 dryrun=dryrun, cwd=cwd) |
5610
2493a478f395
copy: handle rename internally
Matt Mackall <mpm@selenic.com>
parents:
5609
diff
changeset
|
407 if rename and not dryrun: |
16283
6c4dbe28dda3
rename: handle case-changing (issue1717)
Matt Mackall <mpm@selenic.com>
parents:
16165
diff
changeset
|
408 if not after and srcexists and not samefile: |
14518
a67e866f46f9
workingctx: eliminate remove function
Adrian Buehlmann <adrian@cadifra.com>
parents:
14442
diff
changeset
|
409 util.unlinkpath(repo.wjoin(abssrc)) |
a67e866f46f9
workingctx: eliminate remove function
Adrian Buehlmann <adrian@cadifra.com>
parents:
14442
diff
changeset
|
410 wctx.forget([abssrc]) |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
411 |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
412 # pat: ossep |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
413 # dest ossep |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
414 # srcs: list of (hgsep, hgsep, ossep, bool) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
415 # return: function that takes hgsep and returns ossep |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
416 def targetpathfn(pat, dest, srcs): |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
417 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
|
418 abspfx = pathutil.canonpath(repo.root, cwd, pat) |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
419 abspfx = util.localpath(abspfx) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
420 if destdirexists: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
421 striplen = len(os.path.split(abspfx)[0]) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
422 else: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
423 striplen = len(abspfx) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
424 if striplen: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
425 striplen += len(os.sep) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
426 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
|
427 elif destdirexists: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
428 res = lambda p: os.path.join(dest, |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
429 os.path.basename(util.localpath(p))) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
430 else: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
431 res = lambda p: dest |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
432 return res |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
433 |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
434 # pat: ossep |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
435 # dest ossep |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
436 # srcs: list of (hgsep, hgsep, ossep, bool) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
437 # return: function that takes hgsep and returns ossep |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
438 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
|
439 if matchmod.patkind(pat): |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
440 # a mercurial pattern |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
441 res = lambda p: os.path.join(dest, |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
442 os.path.basename(util.localpath(p))) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
443 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
|
444 abspfx = pathutil.canonpath(repo.root, cwd, pat) |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
445 if len(abspfx) < len(srcs[0][0]): |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
446 # 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
|
447 # 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
|
448 def evalpath(striplen): |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
449 score = 0 |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
450 for s in srcs: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
451 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
|
452 if os.path.lexists(t): |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
453 score += 1 |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
454 return score |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
455 |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
456 abspfx = util.localpath(abspfx) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
457 striplen = len(abspfx) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
458 if striplen: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
459 striplen += len(os.sep) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
460 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
|
461 score = evalpath(striplen) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
462 striplen1 = len(os.path.split(abspfx)[0]) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
463 if striplen1: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
464 striplen1 += len(os.sep) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
465 if evalpath(striplen1) > score: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
466 striplen = striplen1 |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
467 res = lambda p: os.path.join(dest, |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
468 util.localpath(p)[striplen:]) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
469 else: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
470 # a file |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
471 if destdirexists: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
472 res = lambda p: os.path.join(dest, |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
473 os.path.basename(util.localpath(p))) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
474 else: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
475 res = lambda p: dest |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
476 return res |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
477 |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
478 |
14321
003d63bb4fa5
scmutil: drop some aliases in cmdutil
Matt Mackall <mpm@selenic.com>
parents:
14320
diff
changeset
|
479 pats = scmutil.expandpats(pats) |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
480 if not pats: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
481 raise util.Abort(_('no source or destination specified')) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
482 if len(pats) == 1: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
483 raise util.Abort(_('no destination specified')) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
484 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
|
485 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
|
486 if not destdirexists: |
12085
6f833fc3ccab
Consistently import foo as foomod when foo to avoid shadowing
Martin Geisler <mg@aragost.com>
parents:
12032
diff
changeset
|
487 if len(pats) > 1 or matchmod.patkind(pats[0]): |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
488 raise util.Abort(_('with multiple sources, destination must be an ' |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
489 '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
|
490 if util.endswithsep(dest): |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
491 raise util.Abort(_('destination %s is not a directory') % dest) |
5607 | 492 |
493 tfn = targetpathfn | |
494 if after: | |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
495 tfn = targetpathafterfn |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
496 copylist = [] |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
497 for pat in pats: |
5605
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
498 srcs = walkpat(pat) |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
499 if not srcs: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
500 continue |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
501 copylist.append((tfn(pat, dest, srcs), srcs)) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
502 if not copylist: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
503 raise util.Abort(_('no files to copy')) |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
504 |
5606
447ea621e50e
copy: propagate errors properly
Matt Mackall <mpm@selenic.com>
parents:
5605
diff
changeset
|
505 errors = 0 |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
506 for targetpath, srcs in copylist: |
5605
e7a9ad999308
copy: refactor okaytocopy into walkpat
Matt Mackall <mpm@selenic.com>
parents:
5604
diff
changeset
|
507 for abssrc, relsrc, exact in srcs: |
5606
447ea621e50e
copy: propagate errors properly
Matt Mackall <mpm@selenic.com>
parents:
5605
diff
changeset
|
508 if copyfile(abssrc, relsrc, targetpath(abssrc), exact): |
447ea621e50e
copy: propagate errors properly
Matt Mackall <mpm@selenic.com>
parents:
5605
diff
changeset
|
509 errors += 1 |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
510 |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
511 if errors: |
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
512 ui.warn(_('(consider using --after)\n')) |
5609 | 513 |
11177
6a64813276ed
commands: initial audit of exit codes
Matt Mackall <mpm@selenic.com>
parents:
11152
diff
changeset
|
514 return errors != 0 |
5589
9981b6b19ecf
move commands.docopy to cmdutil.copy
Matt Mackall <mpm@selenic.com>
parents:
5550
diff
changeset
|
515 |
9513
ae88c721f916
cmdutil: service: add an optional runargs argument to pass the command to run
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9367
diff
changeset
|
516 def service(opts, parentfn=None, initfn=None, runfn=None, logfile=None, |
10012
2bfe1a23dafa
cmdutil: service: add appendpid parameter to append pids to pid file
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9975
diff
changeset
|
517 runargs=None, appendpid=False): |
4380
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
518 '''Run a command as a service.''' |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
519 |
19867
edce20ebe1f3
cmdutil.service: move pidfile writing to a local function
Siddharth Agarwal <sid0@fb.com>
parents:
19804
diff
changeset
|
520 def writepid(pid): |
edce20ebe1f3
cmdutil.service: move pidfile writing to a local function
Siddharth Agarwal <sid0@fb.com>
parents:
19804
diff
changeset
|
521 if opts['pid_file']: |
edce20ebe1f3
cmdutil.service: move pidfile writing to a local function
Siddharth Agarwal <sid0@fb.com>
parents:
19804
diff
changeset
|
522 mode = appendpid and 'a' or 'w' |
edce20ebe1f3
cmdutil.service: move pidfile writing to a local function
Siddharth Agarwal <sid0@fb.com>
parents:
19804
diff
changeset
|
523 fp = open(opts['pid_file'], mode) |
edce20ebe1f3
cmdutil.service: move pidfile writing to a local function
Siddharth Agarwal <sid0@fb.com>
parents:
19804
diff
changeset
|
524 fp.write(str(pid) + '\n') |
edce20ebe1f3
cmdutil.service: move pidfile writing to a local function
Siddharth Agarwal <sid0@fb.com>
parents:
19804
diff
changeset
|
525 fp.close() |
edce20ebe1f3
cmdutil.service: move pidfile writing to a local function
Siddharth Agarwal <sid0@fb.com>
parents:
19804
diff
changeset
|
526 |
4380
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
527 if opts['daemon'] and not opts['daemon_pipefds']: |
10238
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
528 # Signal child process startup with file removal |
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
529 lockfd, lockpath = tempfile.mkstemp(prefix='hg-service-') |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
530 os.close(lockfd) |
10238
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
531 try: |
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
532 if not runargs: |
10239
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10238
diff
changeset
|
533 runargs = util.hgcmd() + sys.argv[1:] |
10238
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
534 runargs.append('--daemon-pipefds=%s' % lockpath) |
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
535 # Don't pass --cwd to the child process, because we've already |
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
536 # changed directory. |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
537 for i in xrange(1, len(runargs)): |
10238
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
538 if runargs[i].startswith('--cwd='): |
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
539 del runargs[i] |
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
540 break |
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
541 elif runargs[i].startswith('--cwd'): |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
542 del runargs[i:i + 2] |
10238
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
543 break |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
544 def condfn(): |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
545 return not os.path.exists(lockpath) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
546 pid = util.rundetached(runargs, condfn) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
547 if pid < 0: |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
548 raise util.Abort(_('child process failed to start')) |
19868
0532c8f8e911
cmdutil.service: move pidfile writing to the parent in daemon mode
Siddharth Agarwal <sid0@fb.com>
parents:
19867
diff
changeset
|
549 writepid(pid) |
10238
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
550 finally: |
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
551 try: |
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
552 os.unlink(lockpath) |
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
553 except OSError, e: |
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
554 if e.errno != errno.ENOENT: |
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
555 raise |
4380
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
556 if parentfn: |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
557 return parentfn(pid) |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
558 else: |
9896
2c2f7593ffc4
cmdutil.service: do not _exit(0) in the parent process
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9668
diff
changeset
|
559 return |
4380
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
560 |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
561 if initfn: |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
562 initfn() |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
563 |
19868
0532c8f8e911
cmdutil.service: move pidfile writing to the parent in daemon mode
Siddharth Agarwal <sid0@fb.com>
parents:
19867
diff
changeset
|
564 if not opts['daemon']: |
0532c8f8e911
cmdutil.service: move pidfile writing to the parent in daemon mode
Siddharth Agarwal <sid0@fb.com>
parents:
19867
diff
changeset
|
565 writepid(os.getpid()) |
4380
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
566 |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
567 if opts['daemon_pipefds']: |
10238
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
568 lockpath = opts['daemon_pipefds'] |
4380
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
569 try: |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
570 os.setsid() |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
571 except AttributeError: |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
572 pass |
10238
e22695b4472f
cmdutil: replace unix pipe handshake with file lock
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
573 os.unlink(lockpath) |
10240
3af4b39afe2a
cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents:
10239
diff
changeset
|
574 util.hidewindow() |
4380
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
575 sys.stdout.flush() |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
576 sys.stderr.flush() |
8789
e0ed17984a48
cmdutil: service: logfile option to redirect stdout & stderr in a file
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8778
diff
changeset
|
577 |
17391
fc24c10424d2
util: replace util.nulldev with os.devnull
Ross Lagerwall <rosslagerwall@gmail.com>
parents:
17308
diff
changeset
|
578 nullfd = os.open(os.devnull, os.O_RDWR) |
8789
e0ed17984a48
cmdutil: service: logfile option to redirect stdout & stderr in a file
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8778
diff
changeset
|
579 logfilefd = nullfd |
e0ed17984a48
cmdutil: service: logfile option to redirect stdout & stderr in a file
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8778
diff
changeset
|
580 if logfile: |
e0ed17984a48
cmdutil: service: logfile option to redirect stdout & stderr in a file
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8778
diff
changeset
|
581 logfilefd = os.open(logfile, os.O_RDWR | os.O_CREAT | os.O_APPEND) |
e0ed17984a48
cmdutil: service: logfile option to redirect stdout & stderr in a file
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8778
diff
changeset
|
582 os.dup2(nullfd, 0) |
e0ed17984a48
cmdutil: service: logfile option to redirect stdout & stderr in a file
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8778
diff
changeset
|
583 os.dup2(logfilefd, 1) |
e0ed17984a48
cmdutil: service: logfile option to redirect stdout & stderr in a file
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8778
diff
changeset
|
584 os.dup2(logfilefd, 2) |
e0ed17984a48
cmdutil: service: logfile option to redirect stdout & stderr in a file
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8778
diff
changeset
|
585 if nullfd not in (0, 1, 2): |
e0ed17984a48
cmdutil: service: logfile option to redirect stdout & stderr in a file
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8778
diff
changeset
|
586 os.close(nullfd) |
e0ed17984a48
cmdutil: service: logfile option to redirect stdout & stderr in a file
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8778
diff
changeset
|
587 if logfile and logfilefd not in (0, 1, 2): |
e0ed17984a48
cmdutil: service: logfile option to redirect stdout & stderr in a file
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8778
diff
changeset
|
588 os.close(logfilefd) |
4380
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
589 |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
590 if runfn: |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
591 return runfn() |
e89f9afc462b
Refactor commands.serve to allow other commands to run as services.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4355
diff
changeset
|
592 |
20500
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
593 def tryimportone(ui, repo, hunk, parents, opts, msgs, updatefunc): |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
594 """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
|
595 |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
596 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
|
597 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
|
598 |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
599 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
|
600 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
|
601 |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
602 :hunk: a patch (as a binary string) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
603 :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
|
604 :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
|
605 :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
|
606 (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
|
607 :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
|
608 updatefunc(<repo>, <node>) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
609 """ |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
610 tmpname, message, user, date, branch, nodeid, p1, p2 = \ |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
611 patch.extract(ui, hunk) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
612 |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
613 update = not opts.get('bypass') |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
614 strip = opts["strip"] |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
615 sim = float(opts.get('similarity') or 0) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
616 if not tmpname: |
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
|
617 return (None, None, False) |
20500
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
618 msg = _('applied to working directory') |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
619 |
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
|
620 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
|
621 |
20500
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
622 try: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
623 cmdline_message = logmessage(ui, opts) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
624 if cmdline_message: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
625 # pickup the cmdline msg |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
626 message = cmdline_message |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
627 elif message: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
628 # pickup the patch msg |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
629 message = message.strip() |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
630 else: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
631 # launch the editor |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
632 message = None |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
633 ui.debug('message:\n%s\n' % message) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
634 |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
635 if len(parents) == 1: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
636 parents.append(repo[nullid]) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
637 if opts.get('exact'): |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
638 if not nodeid or not p1: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
639 raise util.Abort(_('not a Mercurial patch')) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
640 p1 = repo[p1] |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
641 p2 = repo[p2 or nullid] |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
642 elif p2: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
643 try: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
644 p1 = repo[p1] |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
645 p2 = repo[p2] |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
646 # Without any options, consider p2 only if the |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
647 # patch is being applied on top of the recorded |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
648 # first parent. |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
649 if p1 != parents[0]: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
650 p1 = parents[0] |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
651 p2 = repo[nullid] |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
652 except error.RepoError: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
653 p1, p2 = parents |
22303
0c838e7459a5
import: show the warning message for failure of merging
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22301
diff
changeset
|
654 if p2.node() == nullid: |
0c838e7459a5
import: show the warning message for failure of merging
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22301
diff
changeset
|
655 ui.warn(_("warning: import the patch as a normal revision\n" |
0c838e7459a5
import: show the warning message for failure of merging
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22301
diff
changeset
|
656 "(use --exact to import the patch as a merge)\n")) |
20500
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
657 else: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
658 p1, p2 = parents |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
659 |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
660 n = None |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
661 if update: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
662 if p1 != parents[0]: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
663 updatefunc(repo, p1.node()) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
664 if p2 != parents[1]: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
665 repo.setparents(p1.node(), p2.node()) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
666 |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
667 if opts.get('exact') or opts.get('import_branch'): |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
668 repo.dirstate.setbranch(branch or 'default') |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
669 |
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
|
670 partial = opts.get('partial', False) |
20500
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
671 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
|
672 try: |
bee0e1cffdd3
import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21419
diff
changeset
|
673 patch.patch(ui, repo, tmpname, strip=strip, files=files, |
bee0e1cffdd3
import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21419
diff
changeset
|
674 eolmode=None, similarity=sim / 100.0) |
bee0e1cffdd3
import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21419
diff
changeset
|
675 except patch.PatchError, e: |
bee0e1cffdd3
import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21419
diff
changeset
|
676 if not partial: |
bee0e1cffdd3
import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21419
diff
changeset
|
677 raise util.Abort(str(e)) |
bee0e1cffdd3
import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21419
diff
changeset
|
678 if partial: |
bee0e1cffdd3
import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21419
diff
changeset
|
679 rejects = True |
bee0e1cffdd3
import: add --partial flag to create a changeset despite failed hunks
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21419
diff
changeset
|
680 |
20500
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
681 files = list(files) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
682 if opts.get('no_commit'): |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
683 if message: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
684 msgs.append(message) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
685 else: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
686 if opts.get('exact') or p2: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
687 # If you got here, you either use --force and know what |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
688 # you are doing or used --exact or a merge patch while |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
689 # being updated to its first parent. |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
690 m = None |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
691 else: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
692 m = scmutil.matchfiles(repo, files or []) |
22250
f3200bf460a8
import: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22249
diff
changeset
|
693 editform = mergeeditform(repo[None], 'import.normal') |
22278
ffaaa80fa724
import: avoid editor invocation when importing with "--exact" for exact-ness
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22260
diff
changeset
|
694 if opts.get('exact'): |
ffaaa80fa724
import: avoid editor invocation when importing with "--exact" for exact-ness
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22260
diff
changeset
|
695 editor = None |
ffaaa80fa724
import: avoid editor invocation when importing with "--exact" for exact-ness
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22260
diff
changeset
|
696 else: |
ffaaa80fa724
import: avoid editor invocation when importing with "--exact" for exact-ness
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22260
diff
changeset
|
697 editor = getcommiteditor(editform=editform, **opts) |
20500
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
698 n = repo.commit(message, opts.get('user') or user, |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
699 opts.get('date') or date, match=m, |
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
|
700 editor=editor, force=partial) |
20500
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
701 else: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
702 if opts.get('exact') or opts.get('import_branch'): |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
703 branch = branch or 'default' |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
704 else: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
705 branch = p1.branch() |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
706 store = patch.filestore() |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
707 try: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
708 files = set() |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
709 try: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
710 patch.patchrepo(ui, repo, p1, store, tmpname, strip, |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
711 files, eolmode=None) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
712 except patch.PatchError, e: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
713 raise util.Abort(str(e)) |
22278
ffaaa80fa724
import: avoid editor invocation when importing with "--exact" for exact-ness
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22260
diff
changeset
|
714 if opts.get('exact'): |
ffaaa80fa724
import: avoid editor invocation when importing with "--exact" for exact-ness
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22260
diff
changeset
|
715 editor = None |
ffaaa80fa724
import: avoid editor invocation when importing with "--exact" for exact-ness
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22260
diff
changeset
|
716 else: |
ffaaa80fa724
import: avoid editor invocation when importing with "--exact" for exact-ness
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22260
diff
changeset
|
717 editor = getcommiteditor(editform='import.bypass') |
20500
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
718 memctx = context.makememctx(repo, (p1.node(), p2.node()), |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
719 message, |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
720 opts.get('user') or user, |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
721 opts.get('date') or date, |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
722 branch, files, store, |
22011
97acb4504704
import: pass 'editform' argument to 'cmdutil.getcommiteditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22010
diff
changeset
|
723 editor=editor) |
20500
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
724 n = memctx.commit() |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
725 finally: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
726 store.close() |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
727 if opts.get('exact') and hex(n) != nodeid: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
728 raise util.Abort(_('patch is damaged or loses information')) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
729 if n: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
730 # i18n: refers to a short changeset id |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
731 msg = _('created %s') % short(n) |
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
|
732 return (msg, n, rejects) |
20500
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
733 finally: |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
734 os.unlink(tmpname) |
ce3f3082ec45
import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20470
diff
changeset
|
735 |
10611
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
736 def export(repo, revs, template='hg-%h.patch', fp=None, switch_parent=False, |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
737 opts=None): |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
738 '''export changesets as hg patches.''' |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
739 |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
740 total = len(revs) |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
741 revwidth = max([len(str(rev)) for rev in revs]) |
18613
1a2f4c633410
export: clobber files with -o (bc) (issue3652)
Augie Fackler <raf@durin42.com>
parents:
18538
diff
changeset
|
742 filemode = {} |
10611
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
743 |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
744 def single(rev, seqno, fp): |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
745 ctx = repo[rev] |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
746 node = ctx.node() |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
747 parents = [p.node() for p in ctx.parents() if p] |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
748 branch = ctx.branch() |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
749 if switch_parent: |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
750 parents.reverse() |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
751 prev = (parents and parents[0]) or nullid |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
752 |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13386
diff
changeset
|
753 shouldclose = False |
17460
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
754 if not fp and len(template) > 0: |
14986
70e11de6964d
export: add %m to file format string (first line of the commit message)
Andrzej Bieniek <andyhelp@gmail.com>
parents:
14948
diff
changeset
|
755 desc_lines = ctx.description().rstrip().split('\n') |
70e11de6964d
export: add %m to file format string (first line of the commit message)
Andrzej Bieniek <andyhelp@gmail.com>
parents:
14948
diff
changeset
|
756 desc = desc_lines[0] #Commit always has a first line. |
70e11de6964d
export: add %m to file format string (first line of the commit message)
Andrzej Bieniek <andyhelp@gmail.com>
parents:
14948
diff
changeset
|
757 fp = makefileobj(repo, template, node, desc=desc, total=total, |
18613
1a2f4c633410
export: clobber files with -o (bc) (issue3652)
Augie Fackler <raf@durin42.com>
parents:
18538
diff
changeset
|
758 seqno=seqno, revwidth=revwidth, mode='wb', |
1a2f4c633410
export: clobber files with -o (bc) (issue3652)
Augie Fackler <raf@durin42.com>
parents:
18538
diff
changeset
|
759 modemap=filemode) |
13467
31aa2e5b0750
export: only close files which export itself has opened
Waqas Hussain <waqas20@gmail.com>
parents:
13400
diff
changeset
|
760 if fp != template: |
31aa2e5b0750
export: only close files which export itself has opened
Waqas Hussain <waqas20@gmail.com>
parents:
13400
diff
changeset
|
761 shouldclose = True |
17460
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
762 if fp and fp != sys.stdout and util.safehasattr(fp, 'name'): |
10611
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
763 repo.ui.note("%s\n" % fp.name) |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
764 |
17460
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
765 if not fp: |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
766 write = repo.ui.write |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
767 else: |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
768 def write(s, **kw): |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
769 fp.write(s) |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
770 |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
771 |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
772 write("# HG changeset patch\n") |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
773 write("# User %s\n" % ctx.user()) |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
774 write("# Date %d %d\n" % ctx.date()) |
18648
76b69cccb07a
export: show 'Date' header in a format that also is readable for humans
Mads Kiilerich <mads@kiilerich.com>
parents:
18613
diff
changeset
|
775 write("# %s\n" % util.datestr(ctx.date())) |
11821
15aa42aaae4c
cmdutil: remove unnecessary parenthesis
Martin Geisler <mg@aragost.com>
parents:
11635
diff
changeset
|
776 if branch and branch != 'default': |
17460
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
777 write("# Branch %s\n" % branch) |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
778 write("# Node ID %s\n" % hex(node)) |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
779 write("# Parent %s\n" % hex(prev)) |
10611
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
780 if len(parents) > 1: |
17460
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
781 write("# Parent %s\n" % hex(parents[1])) |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
782 write(ctx.description().rstrip()) |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
783 write("\n\n") |
10611
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
784 |
17460
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
785 for chunk, label in patch.diffui(repo, prev, node, opts=opts): |
a306837f8c87
color: enabled color support for export command (issue1507)
Ankur Dahiya <ankurd@fb.com>
parents:
17424
diff
changeset
|
786 write(chunk, label=label) |
10611
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
787 |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13386
diff
changeset
|
788 if shouldclose: |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13386
diff
changeset
|
789 fp.close() |
13081
79184986658c
export: flush the file pointer between patches
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13047
diff
changeset
|
790 |
10611
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
791 for seqno, rev in enumerate(revs): |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
792 single(rev, seqno + 1, fp) |
e764f24a45ee
patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10608
diff
changeset
|
793 |
11050
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
794 def diffordiffstat(ui, repo, diffopts, node1, node2, match, |
12167
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
795 changes=None, stat=False, fp=None, prefix='', |
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
796 listsubrepos=False): |
11050
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
797 '''show diff or diffstat.''' |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
798 if fp is None: |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
799 write = ui.write |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
800 else: |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
801 def write(s, **kw): |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
802 fp.write(s) |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
803 |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
804 if stat: |
11950
d157e040ac4c
log: fix the bug 'hg log --stat -p == hg log --stat'
Alecs King <alecsk@gmail.com>
parents:
11488
diff
changeset
|
805 diffopts = diffopts.copy(context=0) |
11050
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
806 width = 80 |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
807 if not ui.plain(): |
12689
c52c629ce19e
termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents:
12619
diff
changeset
|
808 width = ui.termwidth() |
12167
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
809 chunks = patch.diff(repo, node1, node2, match, changes, diffopts, |
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
810 prefix=prefix) |
11050
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
811 for chunk, label in patch.diffstatui(util.iterlines(chunks), |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
812 width=width, |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
813 git=diffopts.git): |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
814 write(chunk, label=label) |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
815 else: |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
816 for chunk, label in patch.diffui(repo, node1, node2, match, |
12167
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
817 changes, diffopts, prefix=prefix): |
11050
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
818 write(chunk, label=label) |
5d35f7d93514
commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents:
11017
diff
changeset
|
819 |
12167
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
820 if listsubrepos: |
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
821 ctx1 = repo[node1] |
12175
c0a8f9dea0f6
subrepos: handle modified but uncommitted .hgsub
Martin Geisler <mg@lazybytes.net>
parents:
12167
diff
changeset
|
822 ctx2 = repo[node2] |
20392
d4f804caa0ed
itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents:
20364
diff
changeset
|
823 for subpath, sub in scmutil.itersubrepos(ctx1, ctx2): |
15698
43e068c15619
diff: when diffing a revision with a deleted subrepo, maintain the node context (issue3153)
Alistair Bell <alistair.bell@netronome.com>
parents:
15634
diff
changeset
|
824 tempnode2 = node2 |
15634
cfc15cbecc5e
diff: don't crash when diffing a revision with a deleted subrepo (issue3153)
Renato Cunha <renato@renatocunha.com>
parents:
15600
diff
changeset
|
825 try: |
cfc15cbecc5e
diff: don't crash when diffing a revision with a deleted subrepo (issue3153)
Renato Cunha <renato@renatocunha.com>
parents:
15600
diff
changeset
|
826 if node2 is not None: |
15698
43e068c15619
diff: when diffing a revision with a deleted subrepo, maintain the node context (issue3153)
Alistair Bell <alistair.bell@netronome.com>
parents:
15634
diff
changeset
|
827 tempnode2 = ctx2.substate[subpath][1] |
15634
cfc15cbecc5e
diff: don't crash when diffing a revision with a deleted subrepo (issue3153)
Renato Cunha <renato@renatocunha.com>
parents:
15600
diff
changeset
|
828 except KeyError: |
cfc15cbecc5e
diff: don't crash when diffing a revision with a deleted subrepo (issue3153)
Renato Cunha <renato@renatocunha.com>
parents:
15600
diff
changeset
|
829 # A subrepo that existed in node1 was deleted between node1 and |
cfc15cbecc5e
diff: don't crash when diffing a revision with a deleted subrepo (issue3153)
Renato Cunha <renato@renatocunha.com>
parents:
15600
diff
changeset
|
830 # node2 (inclusive). Thus, ctx2's substate won't contain that |
cfc15cbecc5e
diff: don't crash when diffing a revision with a deleted subrepo (issue3153)
Renato Cunha <renato@renatocunha.com>
parents:
15600
diff
changeset
|
831 # subpath. The best we can do is to ignore it. |
15698
43e068c15619
diff: when diffing a revision with a deleted subrepo, maintain the node context (issue3153)
Alistair Bell <alistair.bell@netronome.com>
parents:
15634
diff
changeset
|
832 tempnode2 = None |
12167
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
833 submatch = matchmod.narrowmatcher(subpath, match) |
18006
0c10cf819146
subrepo: add argument to "diff()" to pass "ui" of caller side (issue3712) (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17924
diff
changeset
|
834 sub.diff(ui, diffopts, tempnode2, submatch, changes=changes, |
12167
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
835 stat=stat, fp=fp, prefix=prefix) |
d2c5b0927c28
diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12164
diff
changeset
|
836 |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
837 class changeset_printer(object): |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
838 '''show changeset information when templating not requested.''' |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
839 |
7762
fece056bf240
add --git option to commands supporting --patch (log, incoming, history, tip)
Jim Correia <jim.correia@pobox.com>
parents:
7667
diff
changeset
|
840 def __init__(self, ui, repo, patch, diffopts, buffered): |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
841 self.ui = ui |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
842 self.repo = repo |
3645
b984dcb1df71
Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents:
3643
diff
changeset
|
843 self.buffered = buffered |
b984dcb1df71
Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents:
3643
diff
changeset
|
844 self.patch = patch |
7762
fece056bf240
add --git option to commands supporting --patch (log, incoming, history, tip)
Jim Correia <jim.correia@pobox.com>
parents:
7667
diff
changeset
|
845 self.diffopts = diffopts |
3738
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
846 self.header = {} |
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
847 self.hunk = {} |
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
848 self.lastheader = None |
10152
56284451a22c
Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents:
10111
diff
changeset
|
849 self.footer = None |
3645
b984dcb1df71
Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents:
3643
diff
changeset
|
850 |
b984dcb1df71
Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents:
3643
diff
changeset
|
851 def flush(self, rev): |
3738
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
852 if rev in self.header: |
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
853 h = self.header[rev] |
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
854 if h != self.lastheader: |
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
855 self.lastheader = h |
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
856 self.ui.write(h) |
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
857 del self.header[rev] |
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
858 if rev in self.hunk: |
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
859 self.ui.write(self.hunk[rev]) |
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
860 del self.hunk[rev] |
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
861 return 1 |
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
862 return 0 |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
863 |
10152
56284451a22c
Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents:
10111
diff
changeset
|
864 def close(self): |
56284451a22c
Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents:
10111
diff
changeset
|
865 if self.footer: |
56284451a22c
Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents:
10111
diff
changeset
|
866 self.ui.write(self.footer) |
56284451a22c
Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents:
10111
diff
changeset
|
867 |
11488
f786fc4b8764
log: follow filenames through renames (issue647)
Mads Kiilerich <mads@kiilerich.com>
parents:
11465
diff
changeset
|
868 def show(self, ctx, copies=None, matchfn=None, **props): |
3738
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
869 if self.buffered: |
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
870 self.ui.pushbuffer() |
11488
f786fc4b8764
log: follow filenames through renames (issue647)
Mads Kiilerich <mads@kiilerich.com>
parents:
11465
diff
changeset
|
871 self._show(ctx, copies, matchfn, props) |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
872 self.hunk[ctx.rev()] = self.ui.popbuffer(labeled=True) |
3738
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
873 else: |
11488
f786fc4b8764
log: follow filenames through renames (issue647)
Mads Kiilerich <mads@kiilerich.com>
parents:
11465
diff
changeset
|
874 self._show(ctx, copies, matchfn, props) |
3738
cb48cd27d3f4
use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents:
3718
diff
changeset
|
875 |
11488
f786fc4b8764
log: follow filenames through renames (issue647)
Mads Kiilerich <mads@kiilerich.com>
parents:
11465
diff
changeset
|
876 def _show(self, ctx, copies, matchfn, props): |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
877 '''show a single changeset or file revision''' |
7369
87158be081b8
cmdutil: use change contexts for cset-printer and cset-templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7361
diff
changeset
|
878 changenode = ctx.node() |
87158be081b8
cmdutil: use change contexts for cset-printer and cset-templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7361
diff
changeset
|
879 rev = ctx.rev() |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
880 |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
881 if self.ui.quiet: |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
882 self.ui.write("%d:%s\n" % (rev, short(changenode)), |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
883 label='log.node') |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
884 return |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
885 |
7369
87158be081b8
cmdutil: use change contexts for cset-printer and cset-templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7361
diff
changeset
|
886 log = self.repo.changelog |
9547
f57640bf10d4
cmdutil: changeset_printer: use methods of filectx/changectx.
Greg Ward <greg-hg@gerg.ca>
parents:
9536
diff
changeset
|
887 date = util.datestr(ctx.date()) |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
888 |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
889 hexfunc = self.ui.debugflag and hex or short |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
890 |
4825
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
891 parents = [(p, hexfunc(log.node(p))) |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
892 for p in self._meaningful_parentrevs(log, rev)] |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
893 |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
894 # i18n: column positioning for "hg log" |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
895 self.ui.write(_("changeset: %d:%s\n") % (rev, hexfunc(changenode)), |
17788
9912baaae7df
color: add additional changeset.phase label to log.changeset and log.parent
Sean Farley <sean.michael.farley@gmail.com>
parents:
17746
diff
changeset
|
896 label='log.changeset changeset.%s' % ctx.phasestr()) |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
897 |
9637
64425c5a9257
cmdutil: minor refactoring of changeset_printer._show
Adrian Buehlmann <adrian@cadifra.com>
parents:
9547
diff
changeset
|
898 branch = ctx.branch() |
4176
f9bbcebcacea
"default" is the default branch name
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4055
diff
changeset
|
899 # don't show the default branch name |
f9bbcebcacea
"default" is the default branch name
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4055
diff
changeset
|
900 if branch != 'default': |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
901 # i18n: column positioning for "hg log" |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
902 self.ui.write(_("branch: %s\n") % branch, |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
903 label='log.branch') |
13386
f78bc5ddbe4f
templater: add bookmarks to templates and default output
David Soria Parra <dsp@php.net>
parents:
13121
diff
changeset
|
904 for bookmark in self.repo.nodebookmarks(changenode): |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
905 # i18n: column positioning for "hg log" |
13386
f78bc5ddbe4f
templater: add bookmarks to templates and default output
David Soria Parra <dsp@php.net>
parents:
13121
diff
changeset
|
906 self.ui.write(_("bookmark: %s\n") % bookmark, |
f78bc5ddbe4f
templater: add bookmarks to templates and default output
David Soria Parra <dsp@php.net>
parents:
13121
diff
changeset
|
907 label='log.bookmark') |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
908 for tag in self.repo.nodetags(changenode): |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
909 # i18n: column positioning for "hg log" |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
910 self.ui.write(_("tag: %s\n") % tag, |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
911 label='log.tag') |
15907
51fc43253a52
changeset_printer: display changeset phase on debug level
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15777
diff
changeset
|
912 if self.ui.debugflag and ctx.phase(): |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
913 # i18n: column positioning for "hg log" |
15907
51fc43253a52
changeset_printer: display changeset phase on debug level
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15777
diff
changeset
|
914 self.ui.write(_("phase: %s\n") % _(ctx.phasestr()), |
51fc43253a52
changeset_printer: display changeset phase on debug level
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15777
diff
changeset
|
915 label='log.phase') |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
916 for parent in parents: |
22301
f6371cc62d2a
log: use correct phase info for parent field (issue4347)
Sean Farley <sean.michael.farley@gmail.com>
parents:
22167
diff
changeset
|
917 label = 'log.parent changeset.%s' % self.repo[parent[0]].phasestr() |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
918 # i18n: column positioning for "hg log" |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
919 self.ui.write(_("parent: %d:%s\n") % parent, |
22301
f6371cc62d2a
log: use correct phase info for parent field (issue4347)
Sean Farley <sean.michael.farley@gmail.com>
parents:
22167
diff
changeset
|
920 label=label) |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
921 |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
922 if self.ui.debugflag: |
9547
f57640bf10d4
cmdutil: changeset_printer: use methods of filectx/changectx.
Greg Ward <greg-hg@gerg.ca>
parents:
9536
diff
changeset
|
923 mnode = ctx.manifestnode() |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
924 # i18n: column positioning for "hg log" |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
925 self.ui.write(_("manifest: %d:%s\n") % |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
926 (self.repo.manifest.rev(mnode), hex(mnode)), |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
927 label='ui.debug log.manifest') |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
928 # i18n: column positioning for "hg log" |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
929 self.ui.write(_("user: %s\n") % ctx.user(), |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
930 label='log.user') |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
931 # i18n: column positioning for "hg log" |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
932 self.ui.write(_("date: %s\n") % date, |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
933 label='log.date') |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
934 |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
935 if self.ui.debugflag: |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
936 files = self.repo.status(log.parents(changenode)[0], changenode)[:3] |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
937 for key, value in zip([# i18n: column positioning for "hg log" |
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
938 _("files:"), |
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
939 # i18n: column positioning for "hg log" |
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
940 _("files+:"), |
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
941 # i18n: column positioning for "hg log" |
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
942 _("files-:")], files): |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
943 if value: |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
944 self.ui.write("%-12s %s\n" % (key, " ".join(value)), |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
945 label='ui.debug log.files') |
9547
f57640bf10d4
cmdutil: changeset_printer: use methods of filectx/changectx.
Greg Ward <greg-hg@gerg.ca>
parents:
9536
diff
changeset
|
946 elif ctx.files() and self.ui.verbose: |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
947 # i18n: column positioning for "hg log" |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
948 self.ui.write(_("files: %s\n") % " ".join(ctx.files()), |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
949 label='ui.note log.files') |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
950 if copies and self.ui.verbose: |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
951 copies = ['%s (%s)' % c for c in copies] |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
952 # i18n: column positioning for "hg log" |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
953 self.ui.write(_("copies: %s\n") % ' '.join(copies), |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
954 label='ui.note log.copies') |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
955 |
9637
64425c5a9257
cmdutil: minor refactoring of changeset_printer._show
Adrian Buehlmann <adrian@cadifra.com>
parents:
9547
diff
changeset
|
956 extra = ctx.extra() |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
957 if extra and self.ui.debugflag: |
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
8189
diff
changeset
|
958 for key, value in sorted(extra.items()): |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
959 # i18n: column positioning for "hg log" |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
960 self.ui.write(_("extra: %s=%s\n") |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
961 % (key, value.encode('string_escape')), |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
962 label='ui.debug log.extra') |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
963 |
9547
f57640bf10d4
cmdutil: changeset_printer: use methods of filectx/changectx.
Greg Ward <greg-hg@gerg.ca>
parents:
9536
diff
changeset
|
964 description = ctx.description().strip() |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
965 if description: |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
966 if self.ui.verbose: |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
967 self.ui.write(_("description:\n"), |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
968 label='ui.note log.description') |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
969 self.ui.write(description, |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
970 label='ui.note log.description') |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
971 self.ui.write("\n\n") |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
972 else: |
17891
8f85151ce201
i18n: add "i18n" comment to column positioning messages of "hg log"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
17863
diff
changeset
|
973 # i18n: column positioning for "hg log" |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
974 self.ui.write(_("summary: %s\n") % |
10819
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
975 description.splitlines()[0], |
36c6a667d733
cmdutil: make use of output labeling in changeset_printer
Brodie Rao <brodie@bitheap.org>
parents:
10724
diff
changeset
|
976 label='log.summary') |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
977 self.ui.write("\n") |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
978 |
11488
f786fc4b8764
log: follow filenames through renames (issue647)
Mads Kiilerich <mads@kiilerich.com>
parents:
11465
diff
changeset
|
979 self.showpatch(changenode, matchfn) |
3645
b984dcb1df71
Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents:
3643
diff
changeset
|
980 |
11488
f786fc4b8764
log: follow filenames through renames (issue647)
Mads Kiilerich <mads@kiilerich.com>
parents:
11465
diff
changeset
|
981 def showpatch(self, node, matchfn): |
f786fc4b8764
log: follow filenames through renames (issue647)
Mads Kiilerich <mads@kiilerich.com>
parents:
11465
diff
changeset
|
982 if not matchfn: |
f786fc4b8764
log: follow filenames through renames (issue647)
Mads Kiilerich <mads@kiilerich.com>
parents:
11465
diff
changeset
|
983 matchfn = self.patch |
f786fc4b8764
log: follow filenames through renames (issue647)
Mads Kiilerich <mads@kiilerich.com>
parents:
11465
diff
changeset
|
984 if matchfn: |
11061
51d0387523c6
log: add --stat for diffstat output
Yuya Nishihara <yuya@tcha.org>
parents:
11059
diff
changeset
|
985 stat = self.diffopts.get('stat') |
11950
d157e040ac4c
log: fix the bug 'hg log --stat -p == hg log --stat'
Alecs King <alecsk@gmail.com>
parents:
11488
diff
changeset
|
986 diff = self.diffopts.get('patch') |
11061
51d0387523c6
log: add --stat for diffstat output
Yuya Nishihara <yuya@tcha.org>
parents:
11059
diff
changeset
|
987 diffopts = patch.diffopts(self.ui, self.diffopts) |
3645
b984dcb1df71
Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents:
3643
diff
changeset
|
988 prev = self.repo.changelog.parents(node)[0] |
11950
d157e040ac4c
log: fix the bug 'hg log --stat -p == hg log --stat'
Alecs King <alecsk@gmail.com>
parents:
11488
diff
changeset
|
989 if stat: |
d157e040ac4c
log: fix the bug 'hg log --stat -p == hg log --stat'
Alecs King <alecsk@gmail.com>
parents:
11488
diff
changeset
|
990 diffordiffstat(self.ui, self.repo, diffopts, prev, node, |
d157e040ac4c
log: fix the bug 'hg log --stat -p == hg log --stat'
Alecs King <alecsk@gmail.com>
parents:
11488
diff
changeset
|
991 match=matchfn, stat=True) |
d157e040ac4c
log: fix the bug 'hg log --stat -p == hg log --stat'
Alecs King <alecsk@gmail.com>
parents:
11488
diff
changeset
|
992 if diff: |
d157e040ac4c
log: fix the bug 'hg log --stat -p == hg log --stat'
Alecs King <alecsk@gmail.com>
parents:
11488
diff
changeset
|
993 if stat: |
d157e040ac4c
log: fix the bug 'hg log --stat -p == hg log --stat'
Alecs King <alecsk@gmail.com>
parents:
11488
diff
changeset
|
994 self.ui.write("\n") |
d157e040ac4c
log: fix the bug 'hg log --stat -p == hg log --stat'
Alecs King <alecsk@gmail.com>
parents:
11488
diff
changeset
|
995 diffordiffstat(self.ui, self.repo, diffopts, prev, node, |
d157e040ac4c
log: fix the bug 'hg log --stat -p == hg log --stat'
Alecs King <alecsk@gmail.com>
parents:
11488
diff
changeset
|
996 match=matchfn, stat=False) |
3645
b984dcb1df71
Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents:
3643
diff
changeset
|
997 self.ui.write("\n") |
b984dcb1df71
Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents:
3643
diff
changeset
|
998 |
4825
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
999 def _meaningful_parentrevs(self, log, rev): |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1000 """Return list of meaningful (or all if debug) parentrevs for rev. |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1001 |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1002 For merges (two non-nullrev revisions) both parents are meaningful. |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1003 Otherwise the first parent revision is considered meaningful if it |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1004 is not the preceding revision. |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1005 """ |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1006 parents = log.parentrevs(rev) |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1007 if not self.ui.debugflag and parents[1] == nullrev: |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1008 if parents[0] >= rev - 1: |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1009 parents = [] |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1010 else: |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1011 parents = [parents[0]] |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1012 return parents |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1013 |
3cf94964c56b
hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4824
diff
changeset
|
1014 |
3645
b984dcb1df71
Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents:
3643
diff
changeset
|
1015 class changeset_templater(changeset_printer): |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1016 '''format changeset information.''' |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1017 |
20667
e96e9f805c19
changeset_templater: remove use_template method
Matt Mackall <mpm@selenic.com>
parents:
20666
diff
changeset
|
1018 def __init__(self, ui, repo, patch, diffopts, tmpl, mapfile, buffered): |
7762
fece056bf240
add --git option to commands supporting --patch (log, incoming, history, tip)
Jim Correia <jim.correia@pobox.com>
parents:
7667
diff
changeset
|
1019 changeset_printer.__init__(self, ui, repo, patch, diffopts, buffered) |
8360
acc202b71619
templater: provide the standard template filters by default
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8312
diff
changeset
|
1020 formatnode = ui.debugflag and (lambda x: x) or (lambda x: x[:12]) |
10061
9e2ab10728a2
Make {file_copies} usable as a --template key
Patrick Mezard <pmezard@gmail.com>
parents:
10060
diff
changeset
|
1021 defaulttempl = { |
9e2ab10728a2
Make {file_copies} usable as a --template key
Patrick Mezard <pmezard@gmail.com>
parents:
10060
diff
changeset
|
1022 'parent': '{rev}:{node|formatnode} ', |
9e2ab10728a2
Make {file_copies} usable as a --template key
Patrick Mezard <pmezard@gmail.com>
parents:
10060
diff
changeset
|
1023 'manifest': '{rev}:{node|formatnode}', |
9e2ab10728a2
Make {file_copies} usable as a --template key
Patrick Mezard <pmezard@gmail.com>
parents:
10060
diff
changeset
|
1024 'file_copy': '{name} ({source})', |
9e2ab10728a2
Make {file_copies} usable as a --template key
Patrick Mezard <pmezard@gmail.com>
parents:
10060
diff
changeset
|
1025 'extra': '{key}={value|stringescape}' |
9e2ab10728a2
Make {file_copies} usable as a --template key
Patrick Mezard <pmezard@gmail.com>
parents:
10060
diff
changeset
|
1026 } |
9e2ab10728a2
Make {file_copies} usable as a --template key
Patrick Mezard <pmezard@gmail.com>
parents:
10060
diff
changeset
|
1027 # filecopy is preserved for compatibility reasons |
9e2ab10728a2
Make {file_copies} usable as a --template key
Patrick Mezard <pmezard@gmail.com>
parents:
10060
diff
changeset
|
1028 defaulttempl['filecopy'] = defaulttempl['file_copy'] |
8360
acc202b71619
templater: provide the standard template filters by default
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8312
diff
changeset
|
1029 self.t = templater.templater(mapfile, {'formatnode': formatnode}, |
10061
9e2ab10728a2
Make {file_copies} usable as a --template key
Patrick Mezard <pmezard@gmail.com>
parents:
10060
diff
changeset
|
1030 cache=defaulttempl) |
20667
e96e9f805c19
changeset_templater: remove use_template method
Matt Mackall <mpm@selenic.com>
parents:
20666
diff
changeset
|
1031 if tmpl: |
e96e9f805c19
changeset_templater: remove use_template method
Matt Mackall <mpm@selenic.com>
parents:
20666
diff
changeset
|
1032 self.t.cache['changeset'] = tmpl |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1033 |
20667
e96e9f805c19
changeset_templater: remove use_template method
Matt Mackall <mpm@selenic.com>
parents:
20666
diff
changeset
|
1034 self.cache = {} |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1035 |
7878
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1036 def _meaningful_parentrevs(self, ctx): |
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1037 """Return list of meaningful (or all if debug) parentrevs for rev. |
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1038 """ |
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1039 parents = ctx.parents() |
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1040 if len(parents) > 1: |
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1041 return parents |
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1042 if self.ui.debugflag: |
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1043 return [parents[0], self.repo['null']] |
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1044 if parents[0].rev() >= ctx.rev() - 1: |
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1045 return [] |
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1046 return parents |
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1047 |
11488
f786fc4b8764
log: follow filenames through renames (issue647)
Mads Kiilerich <mads@kiilerich.com>
parents:
11465
diff
changeset
|
1048 def _show(self, ctx, copies, matchfn, props): |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1049 '''show a single changeset or file revision''' |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1050 |
10053
5c5c6295533d
cmdutil: replace showlist() closure with a function
Patrick Mezard <pmezard@gmail.com>
parents:
10026
diff
changeset
|
1051 showlist = templatekw.showlist |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1052 |
10058
c829563b3118
cmdutil: extract file copies closure into templatekw
Patrick Mezard <pmezard@gmail.com>
parents:
10057
diff
changeset
|
1053 # showparents() behaviour depends on ui trace level which |
c829563b3118
cmdutil: extract file copies closure into templatekw
Patrick Mezard <pmezard@gmail.com>
parents:
10057
diff
changeset
|
1054 # causes unexpected behaviours at templating level and makes |
c829563b3118
cmdutil: extract file copies closure into templatekw
Patrick Mezard <pmezard@gmail.com>
parents:
10057
diff
changeset
|
1055 # it harder to extract it in a standalone function. Its |
c829563b3118
cmdutil: extract file copies closure into templatekw
Patrick Mezard <pmezard@gmail.com>
parents:
10057
diff
changeset
|
1056 # behaviour cannot be changed so leave it here for now. |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1057 def showparents(**args): |
10260
fe699ca08a45
templatekw: fix extras, manifest and showlist args (issue1989)
Patrick Mezard <pmezard@gmail.com>
parents:
10250
diff
changeset
|
1058 ctx = args['ctx'] |
7878
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1059 parents = [[('rev', p.rev()), ('node', p.hex())] |
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1060 for p in self._meaningful_parentrevs(ctx)] |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1061 return showlist('parent', parents, **args) |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1062 |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1063 props = props.copy() |
10054
1a85861f59af
cmdutil: extract ctx dependent closures into templatekw
Patrick Mezard <pmezard@gmail.com>
parents:
10053
diff
changeset
|
1064 props.update(templatekw.keywords) |
10058
c829563b3118
cmdutil: extract file copies closure into templatekw
Patrick Mezard <pmezard@gmail.com>
parents:
10057
diff
changeset
|
1065 props['parents'] = showparents |
10053
5c5c6295533d
cmdutil: replace showlist() closure with a function
Patrick Mezard <pmezard@gmail.com>
parents:
10026
diff
changeset
|
1066 props['templ'] = self.t |
10054
1a85861f59af
cmdutil: extract ctx dependent closures into templatekw
Patrick Mezard <pmezard@gmail.com>
parents:
10053
diff
changeset
|
1067 props['ctx'] = ctx |
10055
e400a511e63a
cmdutil: extract repo dependent closures in templatekw
Patrick Mezard <pmezard@gmail.com>
parents:
10054
diff
changeset
|
1068 props['repo'] = self.repo |
10058
c829563b3118
cmdutil: extract file copies closure into templatekw
Patrick Mezard <pmezard@gmail.com>
parents:
10057
diff
changeset
|
1069 props['revcache'] = {'copies': copies} |
10057
babc00a82c5e
cmdutil: extract latest tags closures in templatekw
Patrick Mezard <pmezard@gmail.com>
parents:
10056
diff
changeset
|
1070 props['cache'] = self.cache |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1071 |
8013
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1072 # find correct templates for current mode |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1073 |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1074 tmplmodes = [ |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1075 (True, None), |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1076 (self.ui.verbose, 'verbose'), |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1077 (self.ui.quiet, 'quiet'), |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1078 (self.ui.debugflag, 'debug'), |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1079 ] |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1080 |
10152
56284451a22c
Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents:
10111
diff
changeset
|
1081 types = {'header': '', 'footer':'', 'changeset': 'changeset'} |
8013
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1082 for mode, postfix in tmplmodes: |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1083 for type in types: |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1084 cur = postfix and ('%s_%s' % (type, postfix)) or type |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1085 if mode and cur in self.t: |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1086 types[type] = cur |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1087 |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1088 try: |
8013
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1089 |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1090 # write header |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1091 if types['header']: |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1092 h = templater.stringify(self.t(types['header'], **props)) |
3645
b984dcb1df71
Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents:
3643
diff
changeset
|
1093 if self.buffered: |
7878
8c09952cd39a
templater: use contexts consistently throughout changeset_templater
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7807
diff
changeset
|
1094 self.header[ctx.rev()] = h |
3645
b984dcb1df71
Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents:
3643
diff
changeset
|
1095 else: |
11465
ace5bd98bee3
heads: fix templating of headers again (issue2130)
Simon Howkins <simonh@symbian.org>
parents:
11441
diff
changeset
|
1096 if self.lastheader != h: |
ace5bd98bee3
heads: fix templating of headers again (issue2130)
Simon Howkins <simonh@symbian.org>
parents:
11441
diff
changeset
|
1097 self.lastheader = h |
11441
d74fe370ab04
cmdutil: only output style header once in non-buffered mode (issue2130)
Simon Howkins <simonh@symbian.org>
parents:
11410
diff
changeset
|
1098 self.ui.write(h) |
8013
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1099 |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1100 # write changeset metadata, then patch if requested |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1101 key = types['changeset'] |
3645
b984dcb1df71
Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents:
3643
diff
changeset
|
1102 self.ui.write(templater.stringify(self.t(key, **props))) |
11488
f786fc4b8764
log: follow filenames through renames (issue647)
Mads Kiilerich <mads@kiilerich.com>
parents:
11465
diff
changeset
|
1103 self.showpatch(ctx.node(), matchfn) |
8013
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1104 |
10160
48653dea23dd
Bugfix and test for hg log XML output
Robert Bachmann <rbachm@gmail.com>
parents:
10152
diff
changeset
|
1105 if types['footer']: |
10152
56284451a22c
Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents:
10111
diff
changeset
|
1106 if not self.footer: |
56284451a22c
Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents:
10111
diff
changeset
|
1107 self.footer = templater.stringify(self.t(types['footer'], |
56284451a22c
Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents:
10111
diff
changeset
|
1108 **props)) |
56284451a22c
Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents:
10111
diff
changeset
|
1109 |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1110 except KeyError, inst: |
8013
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1111 msg = _("%s: no key named '%s'") |
9ec25db32b4e
cmdutil: prevent code repetition by abstraction in changeset_templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7967
diff
changeset
|
1112 raise util.Abort(msg % (self.t.mapfile, inst.args[0])) |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1113 except SyntaxError, inst: |
10829
56fffc9c8928
cmdutil: do not translate trivial string
Martin Geisler <mg@lazybytes.net>
parents:
10819
diff
changeset
|
1114 raise util.Abort('%s: %s' % (self.t.mapfile, inst.args[0])) |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1115 |
20666
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1116 def gettemplate(ui, tmpl, style): |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1117 """ |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1118 Find the template matching the given template spec or style. |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1119 """ |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1120 |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1121 # ui settings |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1122 if not tmpl and not style: |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1123 tmpl = ui.config('ui', 'logtemplate') |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1124 if tmpl: |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1125 try: |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1126 tmpl = templater.parsestring(tmpl) |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1127 except SyntaxError: |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1128 tmpl = templater.parsestring(tmpl, quoted=False) |
20668
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1129 return tmpl, None |
20666
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1130 else: |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1131 style = util.expandpath(ui.config('ui', 'style', '')) |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1132 |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1133 if style: |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1134 mapfile = style |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1135 if not os.path.split(mapfile)[0]: |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1136 mapname = (templater.templatepath('map-cmdline.' + mapfile) |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1137 or templater.templatepath(mapfile)) |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1138 if mapname: |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1139 mapfile = mapname |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1140 return None, mapfile |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1141 |
20668
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1142 if not tmpl: |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1143 return None, None |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1144 |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1145 # looks like a literal template? |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1146 if '{' in tmpl: |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1147 return tmpl, None |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1148 |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1149 # perhaps a stock style? |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1150 if not os.path.split(tmpl)[0]: |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1151 mapname = (templater.templatepath('map-cmdline.' + tmpl) |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1152 or templater.templatepath(tmpl)) |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1153 if mapname and os.path.isfile(mapname): |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1154 return None, mapname |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1155 |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1156 # perhaps it's a reference to [templates] |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1157 t = ui.config('templates', tmpl) |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1158 if t: |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1159 try: |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1160 tmpl = templater.parsestring(t) |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1161 except SyntaxError: |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1162 tmpl = templater.parsestring(t, quoted=False) |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1163 return tmpl, None |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1164 |
21944
0483ff40e326
templates: re-add template listing support
Matt Mackall <mpm@selenic.com>
parents:
21924
diff
changeset
|
1165 if tmpl == 'list': |
0483ff40e326
templates: re-add template listing support
Matt Mackall <mpm@selenic.com>
parents:
21924
diff
changeset
|
1166 ui.write(_("available styles: %s\n") % templater.stylelist()) |
0483ff40e326
templates: re-add template listing support
Matt Mackall <mpm@selenic.com>
parents:
21924
diff
changeset
|
1167 raise util.Abort(_("specify a template")) |
0483ff40e326
templates: re-add template listing support
Matt Mackall <mpm@selenic.com>
parents:
21924
diff
changeset
|
1168 |
20668
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1169 # perhaps it's a path to a map or a template |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1170 if ('/' in tmpl or '\\' in tmpl) and os.path.isfile(tmpl): |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1171 # is it a mapfile for a style? |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1172 if os.path.basename(tmpl).startswith("map-"): |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1173 return None, os.path.realpath(tmpl) |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1174 tmpl = open(tmpl).read() |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1175 return tmpl, None |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1176 |
3a35ba2681ec
templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents:
20667
diff
changeset
|
1177 # constant string? |
20666
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1178 return tmpl, None |
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1179 |
11488
f786fc4b8764
log: follow filenames through renames (issue647)
Mads Kiilerich <mads@kiilerich.com>
parents:
11465
diff
changeset
|
1180 def show_changeset(ui, repo, opts, buffered=False): |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1181 """show one changeset using template or regular display. |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1182 |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1183 Display format will be the first non-empty hit of: |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1184 1. option 'template' |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1185 2. option 'style' |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1186 3. [ui] setting 'logtemplate' |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1187 4. [ui] setting 'style' |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1188 If all of these values are either the unset or the empty string, |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1189 regular display via changeset_printer() is done. |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1190 """ |
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1191 # options |
19894
df91e2df6ba3
cmdutil: use None as default value for "function pointer" instead of False
Mads Kiilerich <madski@unity3d.com>
parents:
19868
diff
changeset
|
1192 patch = None |
11061
51d0387523c6
log: add --stat for diffstat output
Yuya Nishihara <yuya@tcha.org>
parents:
11059
diff
changeset
|
1193 if opts.get('patch') or opts.get('stat'): |
14322
a90131b85fd8
scmutil: drop aliases in cmdutil for match functions
Matt Mackall <mpm@selenic.com>
parents:
14321
diff
changeset
|
1194 patch = scmutil.matchall(repo) |
3837
7df171ea50cd
Fix log regression where log -p file showed diffs for other files
Matt Mackall <mpm@selenic.com>
parents:
3827
diff
changeset
|
1195 |
20666
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1196 tmpl, mapfile = gettemplate(ui, opts.get('template'), opts.get('style')) |
7967
c03f42159afa
cmdutil: refactor handling of templating in show_changeset()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7948
diff
changeset
|
1197 |
20666
e3eb480a9391
cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents:
20604
diff
changeset
|
1198 if not tmpl and not mapfile: |
7967
c03f42159afa
cmdutil: refactor handling of templating in show_changeset()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7948
diff
changeset
|
1199 return changeset_printer(ui, repo, patch, opts, buffered) |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1200 |
7967
c03f42159afa
cmdutil: refactor handling of templating in show_changeset()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7948
diff
changeset
|
1201 try: |
20667
e96e9f805c19
changeset_templater: remove use_template method
Matt Mackall <mpm@selenic.com>
parents:
20666
diff
changeset
|
1202 t = changeset_templater(ui, repo, patch, opts, tmpl, mapfile, buffered) |
7967
c03f42159afa
cmdutil: refactor handling of templating in show_changeset()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7948
diff
changeset
|
1203 except SyntaxError, inst: |
c03f42159afa
cmdutil: refactor handling of templating in show_changeset()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7948
diff
changeset
|
1204 raise util.Abort(inst.args[0]) |
c03f42159afa
cmdutil: refactor handling of templating in show_changeset()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7948
diff
changeset
|
1205 return t |
3643
b4ad640a3bcf
templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3531
diff
changeset
|
1206 |
20470
78f4c2b7052f
debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20392
diff
changeset
|
1207 def showmarker(ui, marker): |
78f4c2b7052f
debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20392
diff
changeset
|
1208 """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
|
1209 |
78f4c2b7052f
debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20392
diff
changeset
|
1210 To be used by debug function.""" |
78f4c2b7052f
debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20392
diff
changeset
|
1211 ui.write(hex(marker.precnode())) |
78f4c2b7052f
debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20392
diff
changeset
|
1212 for repl in marker.succnodes(): |
78f4c2b7052f
debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20392
diff
changeset
|
1213 ui.write(' ') |
78f4c2b7052f
debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20392
diff
changeset
|
1214 ui.write(hex(repl)) |
22215
525cde5d954d
obsmarker: add a `flags` method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22213
diff
changeset
|
1215 ui.write(' %X ' % marker.flags()) |
22260
2229d757802d
debugobsolete: display parents information from markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22250
diff
changeset
|
1216 parents = marker.parentnodes() |
2229d757802d
debugobsolete: display parents information from markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22250
diff
changeset
|
1217 if parents is not None: |
2229d757802d
debugobsolete: display parents information from markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22250
diff
changeset
|
1218 ui.write('{%s} ' % ', '.join(hex(p) for p in parents)) |
22220
908c76e84ec5
debugobsolete: explicitly display date in the output
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22215
diff
changeset
|
1219 ui.write('(%s) ' % util.datestr(marker.date())) |
20470
78f4c2b7052f
debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20392
diff
changeset
|
1220 ui.write('{%s}' % (', '.join('%r: %r' % t for t in |
22220
908c76e84ec5
debugobsolete: explicitly display date in the output
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22215
diff
changeset
|
1221 sorted(marker.metadata().items()) |
908c76e84ec5
debugobsolete: explicitly display date in the output
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22215
diff
changeset
|
1222 if t[0] != 'date'))) |
20470
78f4c2b7052f
debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20392
diff
changeset
|
1223 ui.write('\n') |
78f4c2b7052f
debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20392
diff
changeset
|
1224 |
3814
120be84f33de
Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents:
3738
diff
changeset
|
1225 def finddate(ui, repo, date): |
120be84f33de
Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents:
3738
diff
changeset
|
1226 """Find the tipmost changeset that matches the given date spec""" |
9667 | 1227 |
5836
c5c9a022bd9a
Tweak finddate to pass date directly.
mark.williamson@cl.cam.ac.uk
parents:
5829
diff
changeset
|
1228 df = util.matchdate(date) |
14322
a90131b85fd8
scmutil: drop aliases in cmdutil for match functions
Matt Mackall <mpm@selenic.com>
parents:
14321
diff
changeset
|
1229 m = scmutil.matchall(repo) |
3814
120be84f33de
Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents:
3738
diff
changeset
|
1230 results = {} |
9662
f3d60543924f
walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents:
9656
diff
changeset
|
1231 |
f3d60543924f
walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents:
9656
diff
changeset
|
1232 def prep(ctx, fns): |
f3d60543924f
walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents:
9656
diff
changeset
|
1233 d = ctx.date() |
f3d60543924f
walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents:
9656
diff
changeset
|
1234 if df(d[0]): |
9668
2c24471d478c
cmdutil: fix bug in finddate() implementation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9667
diff
changeset
|
1235 results[ctx.rev()] = d |
9662
f3d60543924f
walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents:
9656
diff
changeset
|
1236 |
9667 | 1237 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
|
1238 rev = ctx.rev() |
f3d60543924f
walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents:
9656
diff
changeset
|
1239 if rev in results: |
16937
5487088f0d43
cmdutil: lowercase finddate status message
Martin Geisler <mg@aragost.com>
parents:
16776
diff
changeset
|
1240 ui.status(_("found revision %s from %s\n") % |
9662
f3d60543924f
walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents:
9656
diff
changeset
|
1241 (rev, util.datestr(results[rev]))) |
f3d60543924f
walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents:
9656
diff
changeset
|
1242 return str(rev) |
3814
120be84f33de
Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents:
3738
diff
changeset
|
1243 |
120be84f33de
Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents:
3738
diff
changeset
|
1244 raise util.Abort(_("revision matching date not found")) |
120be84f33de
Add --date support to update and revert
Matt Mackall <mpm@selenic.com>
parents:
3738
diff
changeset
|
1245 |
20553
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1246 def increasingwindows(windowsize=8, sizelimit=512): |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1247 while True: |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1248 yield windowsize |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1249 if windowsize < sizelimit: |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1250 windowsize *= 2 |
16776
5088d0b9a9a1
cmdutil: extract increasing_windows() from walkchangerevs()
Patrick Mezard <patrick@mezard.eu>
parents:
16701
diff
changeset
|
1251 |
19290
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1252 class FileWalkError(Exception): |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1253 pass |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1254 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1255 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
|
1256 '''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
|
1257 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1258 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
|
1259 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1260 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
|
1261 filelogs alone. |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1262 ''' |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1263 wanted = set() |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1264 copies = [] |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1265 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
|
1266 def filerevgen(filelog, last): |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1267 """ |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1268 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
|
1269 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1270 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
|
1271 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
|
1272 tuples in backwards order |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1273 """ |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1274 cl_count = len(repo) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1275 revs = [] |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1276 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
|
1277 linkrev = filelog.linkrev(j) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1278 if linkrev < minrev: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1279 continue |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1280 # 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
|
1281 # 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
|
1282 if linkrev >= cl_count: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1283 break |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1284 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1285 parentlinkrevs = [] |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1286 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
|
1287 if p != nullrev: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1288 parentlinkrevs.append(filelog.linkrev(p)) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1289 n = filelog.node(j) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1290 revs.append((linkrev, parentlinkrevs, |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1291 follow and filelog.renamed(n))) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1292 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1293 return reversed(revs) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1294 def iterfiles(): |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1295 pctx = repo['.'] |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1296 for filename in match.files(): |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1297 if follow: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1298 if filename not in pctx: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1299 raise util.Abort(_('cannot follow file not in parent ' |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1300 'revision: "%s"') % filename) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1301 yield filename, pctx[filename].filenode() |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1302 else: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1303 yield filename, None |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1304 for filename_node in copies: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1305 yield filename_node |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1306 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1307 for file_, node in iterfiles(): |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1308 filelog = repo.file(file_) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1309 if not len(filelog): |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1310 if node is None: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1311 # 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
|
1312 # 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
|
1313 if follow: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1314 raise util.Abort( |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1315 _('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
|
1316 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
|
1317 else: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1318 continue |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1319 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1320 if node is None: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1321 last = len(filelog) - 1 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1322 else: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1323 last = filelog.rev(node) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1324 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1325 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1326 # keep track of all ancestors of the file |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1327 ancestors = set([filelog.linkrev(last)]) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1328 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1329 # 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
|
1330 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
|
1331 if not follow: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1332 if rev > maxrev: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1333 continue |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1334 else: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1335 # 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
|
1336 # rev to us: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1337 # 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
|
1338 # 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
|
1339 # to explore the file graph |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1340 if rev not in ancestors: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1341 continue |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1342 # XXX insert 1327 fix here |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1343 if flparentlinkrevs: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1344 ancestors.update(flparentlinkrevs) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1345 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1346 fncache.setdefault(rev, []).append(file_) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1347 wanted.add(rev) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1348 if copied: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1349 copies.append(copied) |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1350 |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1351 return wanted |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1352 |
9665
1de5ebfa5585
walkchangerevs: drop ui arg
Matt Mackall <mpm@selenic.com>
parents:
9664
diff
changeset
|
1353 def walkchangerevs(repo, match, opts, prepare): |
7807
bd8f44638847
help: miscellaneous language fixes
timeless <timeless@gmail.com>
parents:
7779
diff
changeset
|
1354 '''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
|
1355 |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1356 Callers most commonly need to iterate backwards over the history |
7807
bd8f44638847
help: miscellaneous language fixes
timeless <timeless@gmail.com>
parents:
7779
diff
changeset
|
1357 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
|
1358 performance, so we use iterators in a "windowed" way. |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1359 |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1360 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
|
1361 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
|
1362 order (usually backwards) to display it. |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1363 |
9662
f3d60543924f
walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents:
9656
diff
changeset
|
1364 This function returns an iterator yielding contexts. Before |
f3d60543924f
walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents:
9656
diff
changeset
|
1365 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
|
1366 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
|
1367 |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1368 follow = opts.get('follow') or opts.get('follow_first') |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1369 |
17676
f87683a1b02a
clfilter: remove any explicit revision number from default cmdutil range
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17675
diff
changeset
|
1370 if opts.get('rev'): |
f87683a1b02a
clfilter: remove any explicit revision number from default cmdutil range
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17675
diff
changeset
|
1371 revs = scmutil.revrange(repo, opts.get('rev')) |
f87683a1b02a
clfilter: remove any explicit revision number from default cmdutil range
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17675
diff
changeset
|
1372 elif follow: |
f87683a1b02a
clfilter: remove any explicit revision number from default cmdutil range
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17675
diff
changeset
|
1373 revs = repo.revs('reverse(:.)') |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1374 else: |
20704
623ed0ed793e
cmdutil: changed walkchangerevs to use spanset instead of baseset
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20668
diff
changeset
|
1375 revs = revset.spanset(repo) |
17676
f87683a1b02a
clfilter: remove any explicit revision number from default cmdutil range
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17675
diff
changeset
|
1376 revs.reverse() |
11281
b724b8467b82
walkchangerevs: allow empty query sets
Matt Mackall <mpm@selenic.com>
parents:
11277
diff
changeset
|
1377 if not revs: |
b724b8467b82
walkchangerevs: allow empty query sets
Matt Mackall <mpm@selenic.com>
parents:
11277
diff
changeset
|
1378 return [] |
8152
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8119
diff
changeset
|
1379 wanted = set() |
9652
2cb0cab10d2e
walkchangerevs: pull out matchfn
Matt Mackall <mpm@selenic.com>
parents:
9547
diff
changeset
|
1380 slowpath = match.anypats() or (match.files() and opts.get('removed')) |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1381 fncache = {} |
16108
f7e0d95d0a0b
log: remove caching of all visited revisions (issue3253)
Matt Mackall <mpm@selenic.com>
parents:
16070
diff
changeset
|
1382 change = repo.changectx |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1383 |
11632
f418d2570920
log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11631
diff
changeset
|
1384 # 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
|
1385 # 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
|
1386 # 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
|
1387 # match the file filtering conditions. |
f418d2570920
log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11631
diff
changeset
|
1388 |
9652
2cb0cab10d2e
walkchangerevs: pull out matchfn
Matt Mackall <mpm@selenic.com>
parents:
9547
diff
changeset
|
1389 if not slowpath and not match.files(): |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1390 # No files, no patterns. Display all revs. |
20553
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1391 wanted = revs |
9665
1de5ebfa5585
walkchangerevs: drop ui arg
Matt Mackall <mpm@selenic.com>
parents:
9664
diff
changeset
|
1392 |
16381
64c8ae09162e
log: bypass file scan part of fastpath when no files
Matt Mackall <mpm@selenic.com>
parents:
16380
diff
changeset
|
1393 if not slowpath and match.files(): |
11632
f418d2570920
log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11631
diff
changeset
|
1394 # 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
|
1395 |
19290
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1396 try: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1397 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
|
1398 except FileWalkError: |
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1399 slowpath = True |
11608
183e63112698
log: remove increasing windows usage in fastpath
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11607
diff
changeset
|
1400 |
19290
f21f4a1b6c24
log: move log file walk to its own function
Durham Goode <durham@fb.com>
parents:
19211
diff
changeset
|
1401 # 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
|
1402 # 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
|
1403 # existed in history, otherwise simply return |
17746
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1404 for path in match.files(): |
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1405 if path == '.' or path in repo.store: |
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1406 break |
18340
8802277c40ee
log: make log work even if first parameter doesn't exist
Mads Kiilerich <mads@kiilerich.com>
parents:
18267
diff
changeset
|
1407 else: |
8802277c40ee
log: make log work even if first parameter doesn't exist
Mads Kiilerich <mads@kiilerich.com>
parents:
18267
diff
changeset
|
1408 return [] |
17746
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1409 |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1410 if slowpath: |
11632
f418d2570920
log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11631
diff
changeset
|
1411 # 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
|
1412 # changed files |
f418d2570920
log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11631
diff
changeset
|
1413 |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1414 if follow: |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1415 raise util.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
|
1416 'filenames')) |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1417 |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1418 # 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
|
1419 # 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
|
1420 class lazywantedset(object): |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1421 def __init__(self): |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1422 self.set = set() |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1423 self.revs = set(revs) |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1424 |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1425 # 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
|
1426 # 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
|
1427 def __contains__(self, value): |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1428 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
|
1429 return True |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1430 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
|
1431 return False |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1432 else: |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1433 self.revs.discard(value) |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1434 ctx = change(value) |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1435 matches = filter(match, ctx.files()) |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1436 if matches: |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1437 fncache[value] = matches |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1438 self.set.add(value) |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1439 return True |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1440 return False |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1441 |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1442 def discard(self, value): |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1443 self.revs.discard(value) |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1444 self.set.discard(value) |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1445 |
d184bae667e4
log: make file log slow path usable on large repos
Durham Goode <durham@fb.com>
parents:
19511
diff
changeset
|
1446 wanted = lazywantedset() |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1447 |
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8761
diff
changeset
|
1448 class followfilter(object): |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1449 def __init__(self, onlyfirst=False): |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1450 self.startrev = nullrev |
10024
2b630e4c8f2f
log --follow: use a set instead of a list
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10012
diff
changeset
|
1451 self.roots = set() |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1452 self.onlyfirst = onlyfirst |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1453 |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1454 def match(self, rev): |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1455 def realparents(rev): |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1456 if self.onlyfirst: |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1457 return repo.changelog.parentrevs(rev)[0:1] |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1458 else: |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1459 return filter(lambda x: x != nullrev, |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1460 repo.changelog.parentrevs(rev)) |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1461 |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1462 if self.startrev == nullrev: |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1463 self.startrev = rev |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1464 return True |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1465 |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1466 if rev > self.startrev: |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1467 # forward: all descendants |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1468 if not self.roots: |
10024
2b630e4c8f2f
log --follow: use a set instead of a list
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10012
diff
changeset
|
1469 self.roots.add(self.startrev) |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1470 for parent in realparents(rev): |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1471 if parent in self.roots: |
10024
2b630e4c8f2f
log --follow: use a set instead of a list
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10012
diff
changeset
|
1472 self.roots.add(rev) |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1473 return True |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1474 else: |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1475 # backwards: all parents |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1476 if not self.roots: |
10024
2b630e4c8f2f
log --follow: use a set instead of a list
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10012
diff
changeset
|
1477 self.roots.update(realparents(self.startrev)) |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1478 if rev in self.roots: |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1479 self.roots.remove(rev) |
10024
2b630e4c8f2f
log --follow: use a set instead of a list
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10012
diff
changeset
|
1480 self.roots.update(realparents(rev)) |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1481 return True |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1482 |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1483 return False |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1484 |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1485 # 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
|
1486 # 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
|
1487 for rev in opts.get('prune', ()): |
16380
84ba30e8c790
cmdutil: use context instead of lookup
Matt Mackall <mpm@selenic.com>
parents:
16304
diff
changeset
|
1488 rev = repo[rev].rev() |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1489 ff = followfilter() |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1490 stop = min(revs[0], revs[-1]) |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1491 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
|
1492 if ff.match(x): |
20553
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1493 wanted = wanted - [x] |
18710
49ef9d0ca815
cmdutil: use a small initial window with --limit
Bryan O'Sullivan <bryano@fb.com>
parents:
18688
diff
changeset
|
1494 |
11632
f418d2570920
log: document the different phases in walkchangerevs
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11631
diff
changeset
|
1495 # 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
|
1496 # revision range, yielding only revisions in wanted. |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1497 def iterate(): |
9652
2cb0cab10d2e
walkchangerevs: pull out matchfn
Matt Mackall <mpm@selenic.com>
parents:
9547
diff
changeset
|
1498 if follow and not match.files(): |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1499 ff = followfilter(onlyfirst=opts.get('follow_first')) |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1500 def want(rev): |
8119
af44d0b953c6
cmdutil: return boolean result directly in want function
Martin Geisler <mg@lazybytes.net>
parents:
8117
diff
changeset
|
1501 return ff.match(rev) and rev in wanted |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1502 else: |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1503 def want(rev): |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1504 return rev in wanted |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1505 |
20553
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1506 it = iter(revs) |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1507 stopiteration = False |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1508 for windowsize in increasingwindows(): |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1509 nrevs = [] |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1510 for i in xrange(windowsize): |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1511 try: |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1512 rev = it.next() |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1513 if want(rev): |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1514 nrevs.append(rev) |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1515 except (StopIteration): |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1516 stopiteration = True |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1517 break |
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
8189
diff
changeset
|
1518 for rev in sorted(nrevs): |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1519 fns = fncache.get(rev) |
9654
96fe91be9c1e
walkchangerevs: yield contexts
Matt Mackall <mpm@selenic.com>
parents:
9653
diff
changeset
|
1520 ctx = change(rev) |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1521 if not fns: |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1522 def fns_generator(): |
9654
96fe91be9c1e
walkchangerevs: yield contexts
Matt Mackall <mpm@selenic.com>
parents:
9653
diff
changeset
|
1523 for f in ctx.files(): |
9652
2cb0cab10d2e
walkchangerevs: pull out matchfn
Matt Mackall <mpm@selenic.com>
parents:
9547
diff
changeset
|
1524 if match(f): |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1525 yield f |
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1526 fns = fns_generator() |
9662
f3d60543924f
walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents:
9656
diff
changeset
|
1527 prepare(ctx, fns) |
3650
731e739b8659
move walkchangerevs to cmdutils
Matt Mackall <mpm@selenic.com>
parents:
3649
diff
changeset
|
1528 for rev in nrevs: |
9662
f3d60543924f
walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents:
9656
diff
changeset
|
1529 yield change(rev) |
20553
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1530 |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1531 if stopiteration: |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1532 break |
86cefb15e7b5
cmdutil: implemented new lazy increasingwindows
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20500
diff
changeset
|
1533 |
9652
2cb0cab10d2e
walkchangerevs: pull out matchfn
Matt Mackall <mpm@selenic.com>
parents:
9547
diff
changeset
|
1534 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
|
1535 |
22166
ac7a3b2a85e3
cmdutil: rename _makelogfilematcher to _makefollowlogfilematcher
Siddharth Agarwal <sid0@fb.com>
parents:
21966
diff
changeset
|
1536 def _makefollowlogfilematcher(repo, files, followfirst): |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1537 # When displaying a revision with --patch --follow FILE, we have |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1538 # to know which file of the revision must be diffed. With |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1539 # --follow, we want the names of the ancestors of FILE in the |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1540 # revision, stored in "fcache". "fcache" is populated by |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1541 # reproducing the graph traversal already done by --follow revset |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1542 # and relating linkrevs to file names (which is not "correct" but |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1543 # good enough). |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1544 fcache = {} |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1545 fcacheready = [False] |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1546 pctx = repo['.'] |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1547 |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1548 def populate(): |
21876
584bbfd1b50d
log: make --patch --follow work inside a subdirectory
Siddharth Agarwal <sid0@fb.com>
parents:
21825
diff
changeset
|
1549 for fn in files: |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1550 for i in ((pctx[fn],), pctx[fn].ancestors(followfirst=followfirst)): |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1551 for c in i: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1552 fcache.setdefault(c.linkrev(), set()).add(c.path()) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1553 |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1554 def filematcher(rev): |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1555 if not fcacheready[0]: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1556 # Lazy initialization |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1557 fcacheready[0] = True |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1558 populate() |
21878
e2530d4a47c1
log: use an exact matcher for --patch --follow
Siddharth Agarwal <sid0@fb.com>
parents:
21877
diff
changeset
|
1559 return scmutil.matchfiles(repo, fcache.get(rev, [])) |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1560 |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1561 return filematcher |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1562 |
22167
d4bc38f6eab7
cmdutil: add a hook for making custom non-follow log file matchers
Siddharth Agarwal <sid0@fb.com>
parents:
22166
diff
changeset
|
1563 def _makenofollowlogfilematcher(repo, pats, opts): |
d4bc38f6eab7
cmdutil: add a hook for making custom non-follow log file matchers
Siddharth Agarwal <sid0@fb.com>
parents:
22166
diff
changeset
|
1564 '''hook for extensions to override the filematcher for non-follow cases''' |
d4bc38f6eab7
cmdutil: add a hook for making custom non-follow log file matchers
Siddharth Agarwal <sid0@fb.com>
parents:
22166
diff
changeset
|
1565 return None |
d4bc38f6eab7
cmdutil: add a hook for making custom non-follow log file matchers
Siddharth Agarwal <sid0@fb.com>
parents:
22166
diff
changeset
|
1566 |
21108
e5ad36a845af
cmdutil: changed _makegraphlogrevset to _makelogrevset
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21051
diff
changeset
|
1567 def _makelogrevset(repo, pats, opts, revs): |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1568 """Return (expr, filematcher) where expr is a revset string built |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1569 from log options and file patterns or None. If --stat or --patch |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1570 are not passed filematcher is None. Otherwise it is a callable |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1571 taking a revision number and returning a match objects filtering |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1572 the files to be detailed when displaying the revision. |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1573 """ |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1574 opt2revset = { |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1575 'no_merges': ('not merge()', None), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1576 'only_merges': ('merge()', None), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1577 '_ancestors': ('ancestors(%(val)s)', None), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1578 '_fancestors': ('_firstancestors(%(val)s)', None), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1579 '_descendants': ('descendants(%(val)s)', None), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1580 '_fdescendants': ('_firstdescendants(%(val)s)', None), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1581 '_matchfiles': ('_matchfiles(%(val)s)', None), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1582 'date': ('date(%(val)r)', None), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1583 'branch': ('branch(%(val)r)', ' or '), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1584 '_patslog': ('filelog(%(val)r)', ' or '), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1585 '_patsfollow': ('follow(%(val)r)', ' or '), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1586 '_patsfollowfirst': ('_followfirst(%(val)r)', ' or '), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1587 'keyword': ('keyword(%(val)r)', ' or '), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1588 'prune': ('not (%(val)r or ancestors(%(val)r))', ' and '), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1589 'user': ('user(%(val)r)', ' or '), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1590 } |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1591 |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1592 opts = dict(opts) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1593 # follow or not follow? |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1594 follow = opts.get('follow') or opts.get('follow_first') |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1595 followfirst = opts.get('follow_first') and 1 or 0 |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1596 # --follow with FILE behaviour depends on revs... |
20756
e7833e63bb42
cmdutil: changed code in _makegraphlogrevset not to use getitem
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20755
diff
changeset
|
1597 it = iter(revs) |
e7833e63bb42
cmdutil: changed code in _makegraphlogrevset not to use getitem
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20755
diff
changeset
|
1598 startrev = it.next() |
e7833e63bb42
cmdutil: changed code in _makegraphlogrevset not to use getitem
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20755
diff
changeset
|
1599 try: |
e7833e63bb42
cmdutil: changed code in _makegraphlogrevset not to use getitem
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20755
diff
changeset
|
1600 followdescendants = startrev < it.next() |
e7833e63bb42
cmdutil: changed code in _makegraphlogrevset not to use getitem
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20755
diff
changeset
|
1601 except (StopIteration): |
e7833e63bb42
cmdutil: changed code in _makegraphlogrevset not to use getitem
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20755
diff
changeset
|
1602 followdescendants = False |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1603 |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1604 # branch and only_branch are really aliases and must be handled at |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1605 # the same time |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1606 opts['branch'] = opts.get('branch', []) + opts.get('only_branch', []) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1607 opts['branch'] = [repo.lookupbranch(b) for b in opts['branch']] |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1608 # pats/include/exclude are passed to match.match() directly in |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17391
diff
changeset
|
1609 # _matchfiles() revset but walkchangerevs() builds its matcher with |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1610 # scmutil.match(). The difference is input pats are globbed on |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1611 # platforms without shell expansion (windows). |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1612 pctx = repo[None] |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1613 match, pats = scmutil.matchandpats(pctx, pats, opts) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1614 slowpath = match.anypats() or (match.files() and opts.get('removed')) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1615 if not slowpath: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1616 for f in match.files(): |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1617 if follow and f not in pctx: |
21998 | 1618 # If the file exists, it may be a directory, so let it |
1619 # take the slow path. | |
1620 if os.path.exists(repo.wjoin(f)): | |
1621 slowpath = True | |
1622 continue | |
1623 else: | |
1624 raise util.Abort(_('cannot follow file not in parent ' | |
1625 'revision: "%s"') % f) | |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1626 filelog = repo.file(f) |
19293
446ab88d3f1c
filelog: switch 'not len(filerevlog)' to 'not filerevlog'
Durham Goode <durham@fb.com>
parents:
19290
diff
changeset
|
1627 if not filelog: |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1628 # A zero count may be a directory or deleted file, so |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1629 # try to find matching entries on the slow path. |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1630 if follow: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1631 raise util.Abort( |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1632 _('cannot follow nonexistent file: "%s"') % f) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1633 slowpath = True |
17746
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1634 |
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1635 # We decided to fall back to the slowpath because at least one |
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1636 # of the paths was not a file. Check to see if at least one of them |
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1637 # existed in history - in that case, we'll continue down the |
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1638 # slowpath; otherwise, we can turn off the slowpath |
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1639 if slowpath: |
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1640 for path in match.files(): |
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1641 if path == '.' or path in repo.store: |
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1642 break |
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1643 else: |
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1644 slowpath = False |
6d218e47cf9b
log: speed up hg log for untracked files (issue1340)
smuralid
parents:
17676
diff
changeset
|
1645 |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1646 if slowpath: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1647 # See walkchangerevs() slow path. |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1648 # |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1649 # pats/include/exclude cannot be represented as separate |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1650 # revset expressions as their filtering logic applies at file |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1651 # level. For instance "-I a -X a" matches a revision touching |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1652 # "a" and "b" while "file(a) and not file(b)" does |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1653 # not. Besides, filesets are evaluated against the working |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1654 # directory. |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1655 matchargs = ['r:', 'd:relpath'] |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1656 for p in pats: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1657 matchargs.append('p:' + p) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1658 for p in opts.get('include', []): |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1659 matchargs.append('i:' + p) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1660 for p in opts.get('exclude', []): |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1661 matchargs.append('x:' + p) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1662 matchargs = ','.join(('%r' % p) for p in matchargs) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1663 opts['_matchfiles'] = matchargs |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1664 else: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1665 if follow: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1666 fpats = ('_patsfollow', '_patsfollowfirst') |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1667 fnopats = (('_ancestors', '_fancestors'), |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1668 ('_descendants', '_fdescendants')) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1669 if pats: |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17391
diff
changeset
|
1670 # follow() revset interprets its file argument as a |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1671 # manifest entry, so use match.files(), not pats. |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1672 opts[fpats[followfirst]] = list(match.files()) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1673 else: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1674 opts[fnopats[followdescendants][followfirst]] = str(startrev) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1675 else: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1676 opts['_patslog'] = list(pats) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1677 |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1678 filematcher = None |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1679 if opts.get('patch') or opts.get('stat'): |
21998 | 1680 # When following files, track renames via a special matcher. |
1681 # If we're forced to take the slowpath it means we're following | |
1682 # at least one pattern/directory, so don't bother with rename tracking. | |
1683 if follow and not match.always() and not slowpath: | |
21876
584bbfd1b50d
log: make --patch --follow work inside a subdirectory
Siddharth Agarwal <sid0@fb.com>
parents:
21825
diff
changeset
|
1684 # _makelogfilematcher expects its files argument to be relative to |
584bbfd1b50d
log: make --patch --follow work inside a subdirectory
Siddharth Agarwal <sid0@fb.com>
parents:
21825
diff
changeset
|
1685 # the repo root, so use match.files(), not pats. |
22166
ac7a3b2a85e3
cmdutil: rename _makelogfilematcher to _makefollowlogfilematcher
Siddharth Agarwal <sid0@fb.com>
parents:
21966
diff
changeset
|
1686 filematcher = _makefollowlogfilematcher(repo, match.files(), |
ac7a3b2a85e3
cmdutil: rename _makelogfilematcher to _makefollowlogfilematcher
Siddharth Agarwal <sid0@fb.com>
parents:
21966
diff
changeset
|
1687 followfirst) |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1688 else: |
22167
d4bc38f6eab7
cmdutil: add a hook for making custom non-follow log file matchers
Siddharth Agarwal <sid0@fb.com>
parents:
22166
diff
changeset
|
1689 filematcher = _makenofollowlogfilematcher(repo, pats, opts) |
d4bc38f6eab7
cmdutil: add a hook for making custom non-follow log file matchers
Siddharth Agarwal <sid0@fb.com>
parents:
22166
diff
changeset
|
1690 if filematcher is None: |
d4bc38f6eab7
cmdutil: add a hook for making custom non-follow log file matchers
Siddharth Agarwal <sid0@fb.com>
parents:
22166
diff
changeset
|
1691 filematcher = lambda rev: match |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1692 |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1693 expr = [] |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1694 for op, val in opts.iteritems(): |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1695 if not val: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1696 continue |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1697 if op not in opt2revset: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1698 continue |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1699 revop, andor = opt2revset[op] |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1700 if '%(val)' not in revop: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1701 expr.append(revop) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1702 else: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1703 if not isinstance(val, list): |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1704 e = revop % {'val': val} |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1705 else: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1706 e = '(' + andor.join((revop % {'val': v}) for v in val) + ')' |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1707 expr.append(e) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1708 |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1709 if expr: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1710 expr = '(' + ' and '.join(expr) + ')' |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1711 else: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1712 expr = None |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1713 return expr, filematcher |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1714 |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1715 def getgraphlogrevs(repo, pats, opts): |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1716 """Return (revs, expr, filematcher) where revs is an iterable of |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1717 revision numbers, expr is a revset string built from log options |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1718 and file patterns or None, and used to filter 'revs'. If --stat or |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1719 --patch are not passed filematcher is None. Otherwise it is a |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1720 callable taking a revision number and returning a match objects |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1721 filtering the files to be detailed when displaying the revision. |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1722 """ |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1723 if not len(repo): |
18171
9d350f2d9458
cmdutil: stop pretending we can calculate revs for graphlog lazily
Siddharth Agarwal <sid0@fb.com>
parents:
18170
diff
changeset
|
1724 return [], None, None |
18172
e6c5e0092469
cmdutil: make getgraphlogrevs limit-aware
Siddharth Agarwal <sid0@fb.com>
parents:
18171
diff
changeset
|
1725 limit = loglimit(opts) |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1726 # Default --rev value depends on --follow but --follow behaviour |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1727 # depends on revisions resolved from --rev... |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1728 follow = opts.get('follow') or opts.get('follow_first') |
18169
ae663cba9a8d
cmdutil: make getgraphlogrevs return revs in descending order
Siddharth Agarwal <sid0@fb.com>
parents:
18031
diff
changeset
|
1729 possiblyunsorted = False # whether revs might need sorting |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1730 if opts.get('rev'): |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1731 revs = scmutil.revrange(repo, opts['rev']) |
21108
e5ad36a845af
cmdutil: changed _makegraphlogrevset to _makelogrevset
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21051
diff
changeset
|
1732 # Don't sort here because _makelogrevset might depend on the |
18169
ae663cba9a8d
cmdutil: make getgraphlogrevs return revs in descending order
Siddharth Agarwal <sid0@fb.com>
parents:
18031
diff
changeset
|
1733 # order of revs |
ae663cba9a8d
cmdutil: make getgraphlogrevs return revs in descending order
Siddharth Agarwal <sid0@fb.com>
parents:
18031
diff
changeset
|
1734 possiblyunsorted = True |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1735 else: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1736 if follow and len(repo) > 0: |
17676
f87683a1b02a
clfilter: remove any explicit revision number from default cmdutil range
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17675
diff
changeset
|
1737 revs = repo.revs('reverse(:.)') |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1738 else: |
20757
3813a1dd9eb9
cmdutil: changed revset for spanset
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20756
diff
changeset
|
1739 revs = revset.spanset(repo) |
17675
8575f4a2126e
clfilter: remove usage of `range` in favor of iteration over changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17475
diff
changeset
|
1740 revs.reverse() |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1741 if not revs: |
20759
74139960c302
getgraphlogrevs: return an empty baseset instead of a empty list
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20758
diff
changeset
|
1742 return revset.baseset(), None, None |
21108
e5ad36a845af
cmdutil: changed _makegraphlogrevset to _makelogrevset
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21051
diff
changeset
|
1743 expr, filematcher = _makelogrevset(repo, pats, opts, revs) |
18169
ae663cba9a8d
cmdutil: make getgraphlogrevs return revs in descending order
Siddharth Agarwal <sid0@fb.com>
parents:
18031
diff
changeset
|
1744 if possiblyunsorted: |
ae663cba9a8d
cmdutil: make getgraphlogrevs return revs in descending order
Siddharth Agarwal <sid0@fb.com>
parents:
18031
diff
changeset
|
1745 revs.sort(reverse=True) |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1746 if expr: |
18171
9d350f2d9458
cmdutil: stop pretending we can calculate revs for graphlog lazily
Siddharth Agarwal <sid0@fb.com>
parents:
18170
diff
changeset
|
1747 # Revset matchers often operate faster on revisions in changelog |
9d350f2d9458
cmdutil: stop pretending we can calculate revs for graphlog lazily
Siddharth Agarwal <sid0@fb.com>
parents:
18170
diff
changeset
|
1748 # order, because most filters deal with the changelog. |
9d350f2d9458
cmdutil: stop pretending we can calculate revs for graphlog lazily
Siddharth Agarwal <sid0@fb.com>
parents:
18170
diff
changeset
|
1749 revs.reverse() |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1750 matcher = revset.match(repo.ui, expr) |
18171
9d350f2d9458
cmdutil: stop pretending we can calculate revs for graphlog lazily
Siddharth Agarwal <sid0@fb.com>
parents:
18170
diff
changeset
|
1751 # Revset matches can reorder revisions. "A or B" typically returns |
9d350f2d9458
cmdutil: stop pretending we can calculate revs for graphlog lazily
Siddharth Agarwal <sid0@fb.com>
parents:
18170
diff
changeset
|
1752 # returns the revision matching A then the revision matching B. Sort |
9d350f2d9458
cmdutil: stop pretending we can calculate revs for graphlog lazily
Siddharth Agarwal <sid0@fb.com>
parents:
18170
diff
changeset
|
1753 # again to fix that. |
9d350f2d9458
cmdutil: stop pretending we can calculate revs for graphlog lazily
Siddharth Agarwal <sid0@fb.com>
parents:
18170
diff
changeset
|
1754 revs = matcher(repo, revs) |
9d350f2d9458
cmdutil: stop pretending we can calculate revs for graphlog lazily
Siddharth Agarwal <sid0@fb.com>
parents:
18170
diff
changeset
|
1755 revs.sort(reverse=True) |
18243
b3b1b8e127e5
log: use "hidden" filtering instead of manual check at display time
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18235
diff
changeset
|
1756 if limit is not None: |
20755
cfd03c069e08
cmdutil: changed code in getgraphlogrevs not to use getitem
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20710
diff
changeset
|
1757 limitedrevs = revset.baseset() |
cfd03c069e08
cmdutil: changed code in getgraphlogrevs not to use getitem
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20710
diff
changeset
|
1758 for idx, rev in enumerate(revs): |
cfd03c069e08
cmdutil: changed code in getgraphlogrevs not to use getitem
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20710
diff
changeset
|
1759 if idx >= limit: |
cfd03c069e08
cmdutil: changed code in getgraphlogrevs not to use getitem
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20710
diff
changeset
|
1760 break |
cfd03c069e08
cmdutil: changed code in getgraphlogrevs not to use getitem
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20710
diff
changeset
|
1761 limitedrevs.append(rev) |
cfd03c069e08
cmdutil: changed code in getgraphlogrevs not to use getitem
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20710
diff
changeset
|
1762 revs = limitedrevs |
18172
e6c5e0092469
cmdutil: make getgraphlogrevs limit-aware
Siddharth Agarwal <sid0@fb.com>
parents:
18171
diff
changeset
|
1763 |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1764 return revs, expr, filematcher |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1765 |
21127
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1766 def getlogrevs(repo, pats, opts): |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1767 """Return (revs, expr, filematcher) where revs is an iterable of |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1768 revision numbers, expr is a revset string built from log options |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1769 and file patterns or None, and used to filter 'revs'. If --stat or |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1770 --patch are not passed filematcher is None. Otherwise it is a |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1771 callable taking a revision number and returning a match objects |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1772 filtering the files to be detailed when displaying the revision. |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1773 """ |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1774 limit = loglimit(opts) |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1775 # Default --rev value depends on --follow but --follow behaviour |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1776 # depends on revisions resolved from --rev... |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1777 follow = opts.get('follow') or opts.get('follow_first') |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1778 if opts.get('rev'): |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1779 revs = scmutil.revrange(repo, opts['rev']) |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1780 elif follow: |
21872
abae1eb695c0
log: allow revset for --follow to be lazily evaluated
Siddharth Agarwal <sid0@fb.com>
parents:
21869
diff
changeset
|
1781 revs = repo.revs('reverse(:.)') |
21127
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1782 else: |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1783 revs = revset.spanset(repo) |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1784 revs.reverse() |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1785 if not revs: |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1786 return revset.baseset([]), None, None |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1787 expr, filematcher = _makelogrevset(repo, pats, opts, revs) |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1788 if expr: |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1789 # Revset matchers often operate faster on revisions in changelog |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1790 # order, because most filters deal with the changelog. |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1791 if not opts.get('rev'): |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1792 revs.reverse() |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1793 matcher = revset.match(repo.ui, expr) |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1794 # Revset matches can reorder revisions. "A or B" typically returns |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1795 # returns the revision matching A then the revision matching B. Sort |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1796 # again to fix that. |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1797 revs = matcher(repo, revs) |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1798 if not opts.get('rev'): |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1799 revs.sort(reverse=True) |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1800 if limit is not None: |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1801 count = 0 |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1802 limitedrevs = revset.baseset([]) |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1803 it = iter(revs) |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1804 while count < limit: |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1805 try: |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1806 limitedrevs.append(it.next()) |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1807 except (StopIteration): |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1808 break |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1809 count += 1 |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1810 revs = limitedrevs |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1811 |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1812 return revs, expr, filematcher |
69402eb72115
log: changed implementation to use graphlog code
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
21108
diff
changeset
|
1813 |
17180
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1814 def displaygraph(ui, dag, displayer, showparents, edgefn, getrenamed=None, |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1815 filematcher=None): |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1816 seen, state = [], graphmod.asciistate() |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1817 for rev, type, ctx, parents in dag: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1818 char = 'o' |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1819 if ctx.node() in showparents: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1820 char = '@' |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1821 elif ctx.obsolete(): |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1822 char = 'x' |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1823 copies = None |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1824 if getrenamed and ctx.rev(): |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1825 copies = [] |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1826 for fn in ctx.files(): |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1827 rename = getrenamed(fn, ctx.rev()) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1828 if rename: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1829 copies.append((fn, rename[0])) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1830 revmatchfn = None |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1831 if filematcher is not None: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1832 revmatchfn = filematcher(ctx.rev()) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1833 displayer.show(ctx, copies=copies, matchfn=revmatchfn) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1834 lines = displayer.hunk.pop(rev).split('\n') |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1835 if not lines[-1]: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1836 del lines[-1] |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1837 displayer.flush(rev) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1838 edges = edgefn(type, char, lines, seen, rev, parents) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1839 for type, char, lines, coldata in edges: |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1840 graphmod.ascii(ui, state, type, char, lines, coldata) |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1841 displayer.close() |
ae0629161090
graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
1842 |
17181
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1843 def graphlog(ui, repo, *pats, **opts): |
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1844 # Parameters are identical to log command ones |
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1845 revs, expr, filematcher = getgraphlogrevs(repo, pats, opts) |
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1846 revdag = graphmod.dagwalker(repo, revs) |
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1847 |
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1848 getrenamed = None |
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1849 if opts.get('copies'): |
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1850 endrev = None |
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1851 if opts.get('rev'): |
20760
d5fa413346e7
cmdutil: changed max method for lazy call
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20759
diff
changeset
|
1852 endrev = scmutil.revrange(repo, opts.get('rev')).max() + 1 |
17181
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1853 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev) |
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1854 displayer = show_changeset(ui, repo, opts, buffered=True) |
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1855 showparents = [ctx.node() for ctx in repo[None].parents()] |
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1856 displaygraph(ui, revdag, displayer, showparents, |
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1857 graphmod.asciiedges, getrenamed, filematcher) |
6f71167292f2
log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents:
17180
diff
changeset
|
1858 |
17182
cdf1532d89c6
incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents:
17181
diff
changeset
|
1859 def checkunsupportedgraphflags(pats, opts): |
cdf1532d89c6
incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents:
17181
diff
changeset
|
1860 for op in ["newest_first"]: |
cdf1532d89c6
incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents:
17181
diff
changeset
|
1861 if op in opts and opts[op]: |
cdf1532d89c6
incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents:
17181
diff
changeset
|
1862 raise util.Abort(_("-G/--graph option is incompatible with --%s") |
cdf1532d89c6
incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents:
17181
diff
changeset
|
1863 % op.replace("_", "-")) |
cdf1532d89c6
incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents:
17181
diff
changeset
|
1864 |
cdf1532d89c6
incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents:
17181
diff
changeset
|
1865 def graphrevs(repo, nodes, opts): |
cdf1532d89c6
incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents:
17181
diff
changeset
|
1866 limit = loglimit(opts) |
cdf1532d89c6
incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents:
17181
diff
changeset
|
1867 nodes.reverse() |
cdf1532d89c6
incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents:
17181
diff
changeset
|
1868 if limit is not None: |
cdf1532d89c6
incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents:
17181
diff
changeset
|
1869 nodes = nodes[:limit] |
cdf1532d89c6
incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents:
17181
diff
changeset
|
1870 return graphmod.nodes(repo, nodes) |
cdf1532d89c6
incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents:
17181
diff
changeset
|
1871 |
15911
c654eac03452
add: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15907
diff
changeset
|
1872 def add(ui, repo, match, dryrun, listsubrepos, prefix, explicitonly): |
12270
166b9866580a
add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12269
diff
changeset
|
1873 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
|
1874 bad = [] |
877236cdd437
add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents:
12266
diff
changeset
|
1875 oldbad = match.bad |
877236cdd437
add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents:
12266
diff
changeset
|
1876 match.bad = lambda x, y: bad.append(x) or oldbad(x, y) |
877236cdd437
add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents:
12266
diff
changeset
|
1877 names = [] |
12270
166b9866580a
add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12269
diff
changeset
|
1878 wctx = repo[None] |
14138
c18204fd35b0
scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents:
14129
diff
changeset
|
1879 cca = None |
c18204fd35b0
scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents:
14129
diff
changeset
|
1880 abort, warn = scmutil.checkportabilityalert(ui) |
c18204fd35b0
scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents:
14129
diff
changeset
|
1881 if abort or warn: |
17201
afd75476939e
scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents:
17182
diff
changeset
|
1882 cca = scmutil.casecollisionauditor(ui, abort, repo.dirstate) |
12269
877236cdd437
add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents:
12266
diff
changeset
|
1883 for f in repo.walk(match): |
877236cdd437
add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents:
12266
diff
changeset
|
1884 exact = match.exact(f) |
15911
c654eac03452
add: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15907
diff
changeset
|
1885 if exact or not explicitonly and f not in repo.dirstate: |
14138
c18204fd35b0
scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents:
14129
diff
changeset
|
1886 if cca: |
c18204fd35b0
scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents:
14129
diff
changeset
|
1887 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
|
1888 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
|
1889 if ui.verbose or not exact: |
12270
166b9866580a
add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12269
diff
changeset
|
1890 ui.status(_('adding %s\n') % match.rel(join(f))) |
166b9866580a
add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12269
diff
changeset
|
1891 |
18364
6252b4f1c4b4
subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents:
18340
diff
changeset
|
1892 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
|
1893 sub = wctx.sub(subpath) |
9e99d2bbb1b1
add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents:
15231
diff
changeset
|
1894 try: |
9e99d2bbb1b1
add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents:
15231
diff
changeset
|
1895 submatch = matchmod.narrowmatcher(subpath, match) |
9e99d2bbb1b1
add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents:
15231
diff
changeset
|
1896 if listsubrepos: |
15911
c654eac03452
add: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15907
diff
changeset
|
1897 bad.extend(sub.add(ui, submatch, dryrun, listsubrepos, prefix, |
c654eac03452
add: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15907
diff
changeset
|
1898 False)) |
15410
9e99d2bbb1b1
add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents:
15231
diff
changeset
|
1899 else: |
15911
c654eac03452
add: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15907
diff
changeset
|
1900 bad.extend(sub.add(ui, submatch, dryrun, listsubrepos, prefix, |
c654eac03452
add: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15907
diff
changeset
|
1901 True)) |
15410
9e99d2bbb1b1
add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents:
15231
diff
changeset
|
1902 except error.LookupError: |
9e99d2bbb1b1
add: support adding explicit files in subrepos
David M. Carr <david@carrclan.us>
parents:
15231
diff
changeset
|
1903 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
|
1904 % join(subpath)) |
12270
166b9866580a
add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12269
diff
changeset
|
1905 |
12269
877236cdd437
add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents:
12266
diff
changeset
|
1906 if not dryrun: |
12270
166b9866580a
add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12269
diff
changeset
|
1907 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
|
1908 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
|
1909 return bad |
877236cdd437
add: move main part to cmdutil to make it easier to reuse
Martin Geisler <mg@lazybytes.net>
parents:
12266
diff
changeset
|
1910 |
15912
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1911 def forget(ui, repo, match, prefix, explicitonly): |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1912 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
|
1913 bad = [] |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1914 oldbad = match.bad |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1915 match.bad = lambda x, y: bad.append(x) or oldbad(x, y) |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1916 wctx = repo[None] |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1917 forgot = [] |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1918 s = repo.status(match=match, clean=True) |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1919 forget = sorted(s[0] + s[1] + s[3] + s[6]) |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1920 if explicitonly: |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1921 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
|
1922 |
18364
6252b4f1c4b4
subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents:
18340
diff
changeset
|
1923 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
|
1924 sub = wctx.sub(subpath) |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1925 try: |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1926 submatch = matchmod.narrowmatcher(subpath, match) |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1927 subbad, subforgot = sub.forget(ui, submatch, prefix) |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1928 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
|
1929 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
|
1930 except error.LookupError: |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1931 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
|
1932 % join(subpath)) |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1933 |
16070
f11eee00c652
forget: show warning messages for forgetting in subrepo correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15912
diff
changeset
|
1934 if not explicitonly: |
f11eee00c652
forget: show warning messages for forgetting in subrepo correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15912
diff
changeset
|
1935 for f in match.files(): |
15912
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1936 if f not in repo.dirstate and not os.path.isdir(match.rel(join(f))): |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1937 if f not in forgot: |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1938 if os.path.exists(match.rel(join(f))): |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1939 ui.warn(_('not removing %s: ' |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1940 'file is already untracked\n') |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1941 % match.rel(join(f))) |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1942 bad.append(f) |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1943 |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1944 for f in forget: |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1945 if ui.verbose or not match.exact(f): |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1946 ui.status(_('removing %s\n') % match.rel(join(f))) |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1947 |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1948 rejected = wctx.forget(forget, prefix) |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1949 bad.extend(f for f in rejected if f in match.files()) |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1950 forgot.extend(forget) |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1951 return bad, forgot |
2bd54ffaa27e
forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents:
15911
diff
changeset
|
1952 |
21041
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1953 def cat(ui, repo, ctx, matcher, prefix, **opts): |
21040
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1954 err = 1 |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1955 |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1956 def write(path): |
21041
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1957 fp = makefileobj(repo, opts.get('output'), ctx.node(), |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1958 pathname=os.path.join(prefix, path)) |
21040
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1959 data = ctx[path].data() |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1960 if opts.get('decode'): |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1961 data = repo.wwritedata(path, data) |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1962 fp.write(data) |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1963 fp.close() |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1964 |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1965 # 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
|
1966 # 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
|
1967 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
|
1968 file = matcher.files()[0] |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1969 mf = repo.manifest |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1970 mfnode = ctx._changeset[0] |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1971 if mf.find(mfnode, file)[0]: |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1972 write(file) |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1973 return 0 |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1974 |
21041
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1975 # Don't warn about "missing" files that are really in subrepos |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1976 bad = matcher.bad |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1977 |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1978 def badfn(path, msg): |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1979 for subpath in ctx.substate: |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1980 if path.startswith(subpath): |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1981 return |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1982 bad(path, msg) |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1983 |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1984 matcher.bad = badfn |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1985 |
21040
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1986 for abs in ctx.walk(matcher): |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1987 write(abs) |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
1988 err = 0 |
21041
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1989 |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1990 matcher.bad = bad |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1991 |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1992 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
|
1993 sub = ctx.sub(subpath) |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1994 try: |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1995 submatch = matchmod.narrowmatcher(subpath, matcher) |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1996 |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1997 if not sub.cat(ui, submatch, os.path.join(prefix, sub._path), |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1998 **opts): |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
1999 err = 0 |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
2000 except error.RepoLookupError: |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
2001 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
|
2002 % os.path.join(prefix, subpath)) |
a2cc3c08c3ac
cat: support cat with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
21040
diff
changeset
|
2003 |
21040
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
2004 return err |
bdf5ed5246d2
cat: move most of the implementation into cmdutils.cat()
Matt Harbison <matt_harbison@yahoo.com>
parents:
21036
diff
changeset
|
2005 |
21825
3666331164bb
cmdutil: add copy-filtering support to duplicatecopies
Augie Fackler <raf@durin42.com>
parents:
21127
diff
changeset
|
2006 def duplicatecopies(repo, rev, fromrev, skiprev=None): |
3666331164bb
cmdutil: add copy-filtering support to duplicatecopies
Augie Fackler <raf@durin42.com>
parents:
21127
diff
changeset
|
2007 '''reproduce copies from fromrev to rev in the dirstate |
3666331164bb
cmdutil: add copy-filtering support to duplicatecopies
Augie Fackler <raf@durin42.com>
parents:
21127
diff
changeset
|
2008 |
3666331164bb
cmdutil: add copy-filtering support to duplicatecopies
Augie Fackler <raf@durin42.com>
parents:
21127
diff
changeset
|
2009 If skiprev is specified, it's a revision that should be used to |
3666331164bb
cmdutil: add copy-filtering support to duplicatecopies
Augie Fackler <raf@durin42.com>
parents:
21127
diff
changeset
|
2010 filter copy records. Any copies that occur between fromrev and |
3666331164bb
cmdutil: add copy-filtering support to duplicatecopies
Augie Fackler <raf@durin42.com>
parents:
21127
diff
changeset
|
2011 skiprev will not be duplicated, even if they appear in the set of |
3666331164bb
cmdutil: add copy-filtering support to duplicatecopies
Augie Fackler <raf@durin42.com>
parents:
21127
diff
changeset
|
2012 copies between fromrev and rev. |
3666331164bb
cmdutil: add copy-filtering support to duplicatecopies
Augie Fackler <raf@durin42.com>
parents:
21127
diff
changeset
|
2013 ''' |
3666331164bb
cmdutil: add copy-filtering support to duplicatecopies
Augie Fackler <raf@durin42.com>
parents:
21127
diff
changeset
|
2014 exclude = {} |
3666331164bb
cmdutil: add copy-filtering support to duplicatecopies
Augie Fackler <raf@durin42.com>
parents:
21127
diff
changeset
|
2015 if skiprev is not None: |
3666331164bb
cmdutil: add copy-filtering support to duplicatecopies
Augie Fackler <raf@durin42.com>
parents:
21127
diff
changeset
|
2016 exclude = copies.pathcopies(repo[fromrev], repo[skiprev]) |
18852
300844cb1a56
duplicatecopies: fix arg name and docstring
Siddharth Agarwal <sid0@fb.com>
parents:
18710
diff
changeset
|
2017 for dst, src in copies.pathcopies(repo[fromrev], repo[rev]).iteritems(): |
18853
78d760aa3607
duplicatecopies: do not mark items not in the dirstate as copies
Siddharth Agarwal <sid0@fb.com>
parents:
18852
diff
changeset
|
2018 # copies.pathcopies returns backward renames, so dst might not |
78d760aa3607
duplicatecopies: do not mark items not in the dirstate as copies
Siddharth Agarwal <sid0@fb.com>
parents:
18852
diff
changeset
|
2019 # actually be in the dirstate |
21825
3666331164bb
cmdutil: add copy-filtering support to duplicatecopies
Augie Fackler <raf@durin42.com>
parents:
21127
diff
changeset
|
2020 if dst in exclude: |
3666331164bb
cmdutil: add copy-filtering support to duplicatecopies
Augie Fackler <raf@durin42.com>
parents:
21127
diff
changeset
|
2021 continue |
18853
78d760aa3607
duplicatecopies: do not mark items not in the dirstate as copies
Siddharth Agarwal <sid0@fb.com>
parents:
18852
diff
changeset
|
2022 if repo.dirstate[dst] in "nma": |
78d760aa3607
duplicatecopies: do not mark items not in the dirstate as copies
Siddharth Agarwal <sid0@fb.com>
parents:
18852
diff
changeset
|
2023 repo.dirstate.copy(src, dst) |
15214
231aac5280ba
rebase: move updatedirstate into cmdutil so it can be shared
Matt Mackall <mpm@selenic.com>
parents:
14986
diff
changeset
|
2024 |
5034
c0417a319e39
commands: move commit to cmdutil as wrapper for commit-like functions
Bryan O'Sullivan <bos@serpentine.com>
parents:
4965
diff
changeset
|
2025 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
|
2026 '''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
|
2027 date = opts.get('date') |
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6112
diff
changeset
|
2028 if date: |
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6112
diff
changeset
|
2029 opts['date'] = util.parsedate(date) |
14635
217b7d83afc3
cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents:
14518
diff
changeset
|
2030 message = logmessage(ui, opts) |
5034
c0417a319e39
commands: move commit to cmdutil as wrapper for commit-like functions
Bryan O'Sullivan <bos@serpentine.com>
parents:
4965
diff
changeset
|
2031 |
5829
784073457a0f
cmdutil.commit: extract 'addremove' from opts carefully
Kirill Smelkov <kirr@mns.spb.ru>
parents:
5797
diff
changeset
|
2032 # 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
|
2033 # that doesn't support addremove |
784073457a0f
cmdutil.commit: extract 'addremove' from opts carefully
Kirill Smelkov <kirr@mns.spb.ru>
parents:
5797
diff
changeset
|
2034 if opts.get('addremove'): |
14321
003d63bb4fa5
scmutil: drop some aliases in cmdutil
Matt Mackall <mpm@selenic.com>
parents:
14320
diff
changeset
|
2035 scmutil.addremove(repo, pats, opts) |
5829
784073457a0f
cmdutil.commit: extract 'addremove' from opts carefully
Kirill Smelkov <kirr@mns.spb.ru>
parents:
5797
diff
changeset
|
2036 |
14671
35c2cc322ba8
scmutil: switch match users to supplying contexts
Matt Mackall <mpm@selenic.com>
parents:
14638
diff
changeset
|
2037 return commitfunc(ui, repo, message, |
35c2cc322ba8
scmutil: switch match users to supplying contexts
Matt Mackall <mpm@selenic.com>
parents:
14638
diff
changeset
|
2038 scmutil.match(repo[None], pats, opts), opts) |
8407
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2039 |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2040 def amend(ui, repo, commitfunc, old, extra, pats, opts): |
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2041 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
|
2042 base = old.p1() |
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2043 |
18197
153659e86a5f
amend: invalidate dirstate in case of failure (issue3670)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18006
diff
changeset
|
2044 wlock = lock = newid = None |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2045 try: |
17471
ad1561723dde
amend: lock the repository during the whole process
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17468
diff
changeset
|
2046 wlock = repo.wlock() |
ad1561723dde
amend: lock the repository during the whole process
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17468
diff
changeset
|
2047 lock = repo.lock() |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2048 tr = repo.transaction('amend') |
17049
2440822446ce
amend: disable hooks when creating intermediate commit (issue3501)
Idan Kamara <idankk86@gmail.com>
parents:
16678
diff
changeset
|
2049 try: |
17473
9732473aa24b
amend: use an explicit commit message for temporary amending commit
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17472
diff
changeset
|
2050 # See if we got a message from -m or -l, if not, open the editor |
9732473aa24b
amend: use an explicit commit message for temporary amending commit
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17472
diff
changeset
|
2051 # with the message of the changeset to amend |
9732473aa24b
amend: use an explicit commit message for temporary amending commit
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17472
diff
changeset
|
2052 message = logmessage(ui, opts) |
17863
034e55bbf7c0
amend: fix incompatibity between logfile and message option (issue3675)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17812
diff
changeset
|
2053 # ensure logfile does not conflict with later enforcement of the |
034e55bbf7c0
amend: fix incompatibity between logfile and message option (issue3675)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17812
diff
changeset
|
2054 # message. potential logfile content has been processed by |
034e55bbf7c0
amend: fix incompatibity between logfile and message option (issue3675)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17812
diff
changeset
|
2055 # `logmessage` anyway. |
034e55bbf7c0
amend: fix incompatibity between logfile and message option (issue3675)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17812
diff
changeset
|
2056 opts.pop('logfile') |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2057 # First, do a regular commit to record all changes in the working |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2058 # directory (if there are any) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2059 ui.callhooks = False |
18198
9b4adaef0db9
amend: prevent loss of bookmark on failed amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18197
diff
changeset
|
2060 currentbookmark = repo._bookmarkcurrent |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2061 try: |
18198
9b4adaef0db9
amend: prevent loss of bookmark on failed amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18197
diff
changeset
|
2062 repo._bookmarkcurrent = None |
17473
9732473aa24b
amend: use an explicit commit message for temporary amending commit
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17472
diff
changeset
|
2063 opts['message'] = 'temporary amend commit for %s' % old |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2064 node = commit(ui, repo, commitfunc, pats, opts) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2065 finally: |
18198
9b4adaef0db9
amend: prevent loss of bookmark on failed amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18197
diff
changeset
|
2066 repo._bookmarkcurrent = currentbookmark |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2067 ui.callhooks = True |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2068 ctx = repo[node] |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2069 |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2070 # Participating changesets: |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2071 # |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2072 # node/ctx o - new (intermediate) commit that contains changes |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2073 # | from working dir to go into amending commit |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2074 # | (or a workingctx if there were no changes) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2075 # | |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2076 # old o - changeset to amend |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2077 # | |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2078 # base o - parent of amending changeset |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2079 |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2080 # Update extra dict from amended commit (e.g. to preserve graft |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2081 # source) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2082 extra.update(old.extra()) |
16630
f30226b1a46a
amend: preserve extra dict (issue3430)
Idan Kamara <idankk86@gmail.com>
parents:
16553
diff
changeset
|
2083 |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2084 # Also update it from the intermediate commit or from the wctx |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2085 extra.update(ctx.extra()) |
16630
f30226b1a46a
amend: preserve extra dict (issue3430)
Idan Kamara <idankk86@gmail.com>
parents:
16553
diff
changeset
|
2086 |
18909
3a72c89a83ec
amend: support amending merge changesets (issue3778)
Brodie Rao <brodie@sf.io>
parents:
18853
diff
changeset
|
2087 if len(old.parents()) > 1: |
3a72c89a83ec
amend: support amending merge changesets (issue3778)
Brodie Rao <brodie@sf.io>
parents:
18853
diff
changeset
|
2088 # ctx.files() isn't reliable for merges, so fall back to the |
3a72c89a83ec
amend: support amending merge changesets (issue3778)
Brodie Rao <brodie@sf.io>
parents:
18853
diff
changeset
|
2089 # slower repo.status() method |
3a72c89a83ec
amend: support amending merge changesets (issue3778)
Brodie Rao <brodie@sf.io>
parents:
18853
diff
changeset
|
2090 files = set([fn for st in repo.status(base, old)[:3] |
3a72c89a83ec
amend: support amending merge changesets (issue3778)
Brodie Rao <brodie@sf.io>
parents:
18853
diff
changeset
|
2091 for fn in st]) |
3a72c89a83ec
amend: support amending merge changesets (issue3778)
Brodie Rao <brodie@sf.io>
parents:
18853
diff
changeset
|
2092 else: |
3a72c89a83ec
amend: support amending merge changesets (issue3778)
Brodie Rao <brodie@sf.io>
parents:
18853
diff
changeset
|
2093 files = set(old.files()) |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2094 |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2095 # Second, we use either the commit we just did, or if there were no |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2096 # changes the parent of the working directory as the version of the |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2097 # files in the final amend commit |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2098 if node: |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2099 ui.note(_('copying changeset %s to %s\n') % (ctx, base)) |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2100 |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2101 user = ctx.user() |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2102 date = ctx.date() |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2103 # Recompute copies (avoid recording a -> b -> a) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2104 copied = copies.pathcopies(base, ctx) |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2105 |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2106 # Prune files which were reverted by the updates: if old |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2107 # introduced file X and our intermediate commit, node, |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2108 # renamed that file, then those two files are the same and |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2109 # we can discard X from our list of files. Likewise if X |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2110 # was deleted, it's no longer relevant |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2111 files.update(ctx.files()) |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2112 |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2113 def samefile(f): |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2114 if f in ctx.manifest(): |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2115 a = ctx.filectx(f) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2116 if f in base.manifest(): |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2117 b = base.filectx(f) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2118 return (not a.cmp(b) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2119 and a.flags() == b.flags()) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2120 else: |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2121 return False |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2122 else: |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2123 return f not in base.manifest() |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2124 files = [f for f in files if not samefile(f)] |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2125 |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2126 def filectxfn(repo, ctx_, path): |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2127 try: |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2128 fctx = ctx[path] |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2129 flags = fctx.flags() |
21689
503bb3af70fe
memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents:
21579
diff
changeset
|
2130 mctx = context.memfilectx(repo, |
503bb3af70fe
memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents:
21579
diff
changeset
|
2131 fctx.path(), fctx.data(), |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2132 islink='l' in flags, |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2133 isexec='x' in flags, |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2134 copied=copied.get(path)) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2135 return mctx |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2136 except KeyError: |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
22278
diff
changeset
|
2137 return None |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2138 else: |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2139 ui.note(_('copying changeset %s to %s\n') % (old, base)) |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2140 |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2141 # Use version of files as in the old cset |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2142 def filectxfn(repo, ctx_, path): |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2143 try: |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2144 return old.filectx(path) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2145 except KeyError: |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
22278
diff
changeset
|
2146 return None |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2147 |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2148 user = opts.get('user') or old.user() |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2149 date = opts.get('date') or old.date() |
22249
f5ff18f65b73
commit: change "editform" to distinguish merge commits from other (--amend)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22248
diff
changeset
|
2150 editform = mergeeditform(old, 'commit.amend') |
22010
41e969cb9468
commit: pass 'editform' argument to 'cmdutil.getcommiteditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21999
diff
changeset
|
2151 editor = getcommiteditor(editform=editform, **opts) |
17473
9732473aa24b
amend: use an explicit commit message for temporary amending commit
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17472
diff
changeset
|
2152 if not message: |
22010
41e969cb9468
commit: pass 'editform' argument to 'cmdutil.getcommiteditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21999
diff
changeset
|
2153 editor = getcommiteditor(edit=True, editform=editform) |
17473
9732473aa24b
amend: use an explicit commit message for temporary amending commit
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17472
diff
changeset
|
2154 message = old.description() |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2155 |
17811
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2156 pureextra = extra.copy() |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2157 extra['amend_source'] = old.hex() |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2158 |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2159 new = context.memctx(repo, |
18909
3a72c89a83ec
amend: support amending merge changesets (issue3778)
Brodie Rao <brodie@sf.io>
parents:
18853
diff
changeset
|
2160 parents=[base.node(), old.p2().node()], |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2161 text=message, |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2162 files=files, |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2163 filectxfn=filectxfn, |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2164 user=user, |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2165 date=date, |
21240
1a833fcf5a14
amend: use "editor" argument for "memctx.__init__" to save commit message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21127
diff
changeset
|
2166 extra=extra, |
1a833fcf5a14
amend: use "editor" argument for "memctx.__init__" to save commit message
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21127
diff
changeset
|
2167 editor=editor) |
17811
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2168 |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2169 newdesc = changelog.stripdesc(new.description()) |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2170 if ((not node) |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2171 and newdesc == old.description() |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2172 and user == old.user() |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2173 and date == old.date() |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2174 and pureextra == old.extra()): |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2175 # nothing changed. continuing here would create a new node |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2176 # anyway because of the amend_source noise. |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2177 # |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2178 # This not what we expect from amend. |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2179 return old.node() |
a8aba2921456
amend: add noise in extra to avoid creating obsolescence cycle (issue3664)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17788
diff
changeset
|
2180 |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2181 ph = repo.ui.config('phases', 'new-commit', phases.draft) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2182 try: |
20700
b0153cb8b64e
commit: create new amend changeset as secret correctly for "--secret" option
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20072
diff
changeset
|
2183 if opts.get('secret'): |
b0153cb8b64e
commit: create new amend changeset as secret correctly for "--secret" option
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20072
diff
changeset
|
2184 commitphase = 'secret' |
b0153cb8b64e
commit: create new amend changeset as secret correctly for "--secret" option
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20072
diff
changeset
|
2185 else: |
b0153cb8b64e
commit: create new amend changeset as secret correctly for "--secret" option
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20072
diff
changeset
|
2186 commitphase = old.phase() |
20790
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
20773
diff
changeset
|
2187 repo.ui.setconfig('phases', 'new-commit', commitphase, 'amend') |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2188 newid = repo.commitctx(new) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2189 finally: |
20790
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
20773
diff
changeset
|
2190 repo.ui.setconfig('phases', 'new-commit', ph, 'amend') |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2191 if newid != old.node(): |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2192 # Reroute the working copy parent to the new changeset |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2193 repo.setparents(newid, nullid) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2194 |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2195 # Move bookmarks from old parent to amend commit |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2196 bms = repo.nodebookmarks(old.node()) |
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2197 if bms: |
17922
7f5dab94e48c
bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents:
17891
diff
changeset
|
2198 marks = repo._bookmarks |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2199 for bm in bms: |
17922
7f5dab94e48c
bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents:
17891
diff
changeset
|
2200 marks[bm] = newid |
7f5dab94e48c
bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents:
17891
diff
changeset
|
2201 marks.write() |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2202 #commit the whole amend process |
17475
63e45aee46d4
amend: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17473
diff
changeset
|
2203 if obsolete._enabled and newid != old.node(): |
63e45aee46d4
amend: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17473
diff
changeset
|
2204 # mark the new changeset as successor of the rewritten one |
63e45aee46d4
amend: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17473
diff
changeset
|
2205 new = repo[newid] |
63e45aee46d4
amend: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17473
diff
changeset
|
2206 obs = [(old, (new,))] |
63e45aee46d4
amend: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17473
diff
changeset
|
2207 if node: |
17812
578fcc22b469
amend: do a bare kill of temporary changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17811
diff
changeset
|
2208 obs.append((ctx, ())) |
17475
63e45aee46d4
amend: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17473
diff
changeset
|
2209 |
63e45aee46d4
amend: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17473
diff
changeset
|
2210 obsolete.createmarkers(repo, obs) |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2211 tr.close() |
17461
bacde764fba0
amend: preserve phase of amended revision (issue3602)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17391
diff
changeset
|
2212 finally: |
17472
965fbe04fd96
amend: wrap all commit operations in a single transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17471
diff
changeset
|
2213 tr.release() |
17475
63e45aee46d4
amend: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17473
diff
changeset
|
2214 if (not obsolete._enabled) and newid != old.node(): |
63e45aee46d4
amend: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17473
diff
changeset
|
2215 # Strip the intermediate commit (if there was one) and the amended |
63e45aee46d4
amend: add obsolete support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17473
diff
changeset
|
2216 # commit |
17471
ad1561723dde
amend: lock the repository during the whole process
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17468
diff
changeset
|
2217 if node: |
ad1561723dde
amend: lock the repository during the whole process
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17468
diff
changeset
|
2218 ui.note(_('stripping intermediate changeset %s\n') % ctx) |
ad1561723dde
amend: lock the repository during the whole process
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17468
diff
changeset
|
2219 ui.note(_('stripping amended changeset %s\n') % old) |
ad1561723dde
amend: lock the repository during the whole process
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17468
diff
changeset
|
2220 repair.strip(ui, repo, old.node(), topic='amend-backup') |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2221 finally: |
18197
153659e86a5f
amend: invalidate dirstate in case of failure (issue3670)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18006
diff
changeset
|
2222 if newid is None: |
153659e86a5f
amend: invalidate dirstate in case of failure (issue3670)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18006
diff
changeset
|
2223 repo.dirstate.invalidate() |
19024
ab04e87a5f3b
amend: fix unlocking order - first lock then wlock
Mads Kiilerich <madski@unity3d.com>
parents:
18991
diff
changeset
|
2224 lockmod.release(lock, wlock) |
16458
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2225 return newid |
55982f62651f
commit: add option to amend the working dir parent
Idan Kamara <idankk86@gmail.com>
parents:
16430
diff
changeset
|
2226 |
21999
6ce282ed801e
cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21998
diff
changeset
|
2227 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
|
2228 if ctx.description(): |
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2229 return ctx.description() |
21999
6ce282ed801e
cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21998
diff
changeset
|
2230 return commitforceeditor(repo, ctx, subs, editform=editform) |
8407
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2231 |
21999
6ce282ed801e
cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21998
diff
changeset
|
2232 def commitforceeditor(repo, ctx, subs, 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
|
2233 editform=''): |
21923
e582e20cd3e6
commiteditor: refactor default extramsg
Matt Mackall <mpm@selenic.com>
parents:
21878
diff
changeset
|
2234 if not extramsg: |
e582e20cd3e6
commiteditor: refactor default extramsg
Matt Mackall <mpm@selenic.com>
parents:
21878
diff
changeset
|
2235 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
|
2236 |
9d92b9d1e282
cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22011
diff
changeset
|
2237 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
|
2238 forms.insert(0, 'changeset') |
9d92b9d1e282
cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22011
diff
changeset
|
2239 while forms: |
9d92b9d1e282
cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22011
diff
changeset
|
2240 tmpl = repo.ui.config('committemplate', '.'.join(forms)) |
9d92b9d1e282
cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22011
diff
changeset
|
2241 if tmpl: |
9d92b9d1e282
cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22011
diff
changeset
|
2242 committext = buildcommittemplate(repo, ctx, subs, extramsg, tmpl) |
9d92b9d1e282
cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22011
diff
changeset
|
2243 break |
9d92b9d1e282
cmdutil: look commit template definition up by specified 'editform'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22011
diff
changeset
|
2244 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
|
2245 else: |
5375ba75df40
cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21923
diff
changeset
|
2246 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
|
2247 |
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2248 # run editor in the repository root |
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2249 olddir = os.getcwd() |
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2250 os.chdir(repo.root) |
22205
9fa429723f26
ui: invoke editor for committing with HGEDITFORM environment variable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22190
diff
changeset
|
2251 text = repo.ui.edit(committext, ctx.user(), ctx.extra(), editform=editform) |
21869
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2252 text = re.sub("(?m)^HG:.*(\n|$)", "", text) |
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2253 os.chdir(olddir) |
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2254 |
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2255 if finishdesc: |
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2256 text = finishdesc(text) |
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2257 if not text.strip(): |
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2258 raise util.Abort(_("empty commit message")) |
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2259 |
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2260 return text |
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2261 |
21924
5375ba75df40
cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21923
diff
changeset
|
2262 def buildcommittemplate(repo, ctx, subs, extramsg, tmpl): |
5375ba75df40
cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21923
diff
changeset
|
2263 ui = repo.ui |
5375ba75df40
cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21923
diff
changeset
|
2264 tmpl, mapfile = gettemplate(ui, tmpl, None) |
5375ba75df40
cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21923
diff
changeset
|
2265 |
5375ba75df40
cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21923
diff
changeset
|
2266 try: |
5375ba75df40
cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21923
diff
changeset
|
2267 t = changeset_templater(ui, repo, None, {}, tmpl, mapfile, False) |
5375ba75df40
cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21923
diff
changeset
|
2268 except SyntaxError, inst: |
5375ba75df40
cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21923
diff
changeset
|
2269 raise util.Abort(inst.args[0]) |
5375ba75df40
cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21923
diff
changeset
|
2270 |
22013
de5cee8ba088
cmdutil: use '[committemplate]' section like as map file for style definition
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22012
diff
changeset
|
2271 for k, v in repo.ui.configitems('committemplate'): |
de5cee8ba088
cmdutil: use '[committemplate]' section like as map file for style definition
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22012
diff
changeset
|
2272 if k != 'changeset': |
de5cee8ba088
cmdutil: use '[committemplate]' section like as map file for style definition
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22012
diff
changeset
|
2273 t.t.cache[k] = v |
de5cee8ba088
cmdutil: use '[committemplate]' section like as map file for style definition
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22012
diff
changeset
|
2274 |
21924
5375ba75df40
cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21923
diff
changeset
|
2275 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
|
2276 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
|
2277 |
5375ba75df40
cmdutil: make commit message shown in text editor customizable by template
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21923
diff
changeset
|
2278 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
|
2279 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
|
2280 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
|
2281 |
21869
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2282 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
|
2283 edittext = [] |
8707
0550dfe4fca1
commit: editor reads file lists from provided context
Matt Mackall <mpm@selenic.com>
parents:
8680
diff
changeset
|
2284 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
|
2285 if ctx.description(): |
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2286 edittext.append(ctx.description()) |
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2287 edittext.append("") |
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2288 edittext.append("") # Empty line between message and comments. |
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2289 edittext.append(_("HG: Enter commit message." |
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2290 " Lines beginning with 'HG:' are removed.")) |
21923
e582e20cd3e6
commiteditor: refactor default extramsg
Matt Mackall <mpm@selenic.com>
parents:
21878
diff
changeset
|
2291 edittext.append("HG: %s" % extramsg) |
8407
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2292 edittext.append("HG: --") |
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2293 edittext.append(_("HG: user: %s") % ctx.user()) |
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2294 if ctx.p2(): |
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2295 edittext.append(_("HG: branch merge")) |
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2296 if ctx.branch(): |
13047
6c375e07d673
branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents:
12973
diff
changeset
|
2297 edittext.append(_("HG: branch '%s'") % ctx.branch()) |
18538
94317c2d53b8
commit: show active bookmark in commit editor helper text
Antonio Zanardo <zanardo@gmail.com>
parents:
18364
diff
changeset
|
2298 if bookmarks.iscurrent(repo): |
94317c2d53b8
commit: show active bookmark in commit editor helper text
Antonio Zanardo <zanardo@gmail.com>
parents:
18364
diff
changeset
|
2299 edittext.append(_("HG: bookmark '%s'") % repo._bookmarkcurrent) |
8994
4a1187d3cb00
commit: report modified subrepos in commit editor
Matt Mackall <mpm@selenic.com>
parents:
8990
diff
changeset
|
2300 edittext.extend([_("HG: subrepo %s") % s for s in subs]) |
8407
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2301 edittext.extend([_("HG: added %s") % f for f in added]) |
8707
0550dfe4fca1
commit: editor reads file lists from provided context
Matt Mackall <mpm@selenic.com>
parents:
8680
diff
changeset
|
2302 edittext.extend([_("HG: changed %s") % f for f in modified]) |
8407
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2303 edittext.extend([_("HG: 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
|
2304 if not added and not modified and not removed: |
8407
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2305 edittext.append(_("HG: no files changed")) |
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2306 edittext.append("") |
223000a687b0
commit: move commit editor to cmdutil, pass as function
Matt Mackall <mpm@selenic.com>
parents:
8390
diff
changeset
|
2307 |
21869
e353fac7db26
cmdutil: separate building commit text from 'commitforceeditor'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21832
diff
changeset
|
2308 return "\n".join(edittext) |
14297
2daa5179e73f
commands: use a decorator to build table incrementally
Adrian Buehlmann <adrian@cadifra.com>
parents:
14291
diff
changeset
|
2309 |
18688
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2310 def commitstatus(repo, node, branch, bheads=None, opts={}): |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2311 ctx = repo[node] |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2312 parents = ctx.parents() |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2313 |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2314 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
|
2315 [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
|
2316 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
|
2317 # 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
|
2318 # 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
|
2319 # |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2320 # 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
|
2321 # N: null or no parent |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2322 # 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
|
2323 # 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
|
2324 # 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
|
2325 # 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
|
2326 # 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
|
2327 # 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
|
2328 # printed anyway. |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2329 # |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2330 # Par Msg Comment |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2331 # 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
|
2332 # |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2333 # 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
|
2334 # 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
|
2335 # H N n usual case |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2336 # |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2337 # 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
|
2338 # C B y branch merge |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2339 # 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
|
2340 # |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2341 # 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
|
2342 # 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
|
2343 # |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2344 # 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
|
2345 |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2346 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
|
2347 for r in parents: |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2348 if r.closesbranch() and r.branch() == branch: |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2349 repo.ui.status(_('reopening closed branch head %d\n') % r) |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2350 |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2351 if repo.ui.debugflag: |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2352 repo.ui.write(_('committed changeset %d:%s\n') % (int(ctx), ctx.hex())) |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2353 elif repo.ui.verbose: |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2354 repo.ui.write(_('committed changeset %d:%s\n') % (int(ctx), ctx)) |
79107fad06aa
commit: factor out status printing into a helper function
Kevin Bullock <kbullock@ringworld.org>
parents:
18648
diff
changeset
|
2355 |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2356 def revert(ui, repo, ctx, parents, *pats, **opts): |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2357 parent, p2 = parents |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2358 node = ctx.node() |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2359 |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2360 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
|
2361 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
|
2362 parent = p2 |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2363 if node == parent: |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2364 pmf = mf |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2365 else: |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2366 pmf = None |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2367 |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2368 # 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
|
2369 # so have to walk both. do not print errors if files exist in one |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2370 # but not other. |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2371 |
21575
8262c2a39ab8
revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21574
diff
changeset
|
2372 # `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
|
2373 # The mapping is in the form: |
8262c2a39ab8
revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21574
diff
changeset
|
2374 # <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
|
2375 names = {} |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2376 |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2377 wlock = repo.wlock() |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2378 try: |
21575
8262c2a39ab8
revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21574
diff
changeset
|
2379 ## filling of the `names` mapping |
8262c2a39ab8
revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21574
diff
changeset
|
2380 # 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
|
2381 |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2382 m = scmutil.match(repo[None], pats, opts) |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2383 m.bad = lambda x, y: False |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2384 for abs in repo.walk(m): |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2385 names[abs] = m.rel(abs), m.exact(abs) |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2386 |
21575
8262c2a39ab8
revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21574
diff
changeset
|
2387 # walk target manifest 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
|
2388 |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2389 def badfn(path, msg): |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2390 if path in names: |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2391 return |
16583
146a00c162a0
revert: don't re-create changeset context
Kevin Bullock <kbullock@ringworld.org>
parents:
16553
diff
changeset
|
2392 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
|
2393 return |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2394 path_ = path + '/' |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2395 for f in names: |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2396 if f.startswith(path_): |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2397 return |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2398 ui.warn("%s: %s\n" % (m.rel(path), msg)) |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2399 |
16583
146a00c162a0
revert: don't re-create changeset context
Kevin Bullock <kbullock@ringworld.org>
parents:
16553
diff
changeset
|
2400 m = scmutil.match(ctx, pats, opts) |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2401 m.bad = badfn |
16583
146a00c162a0
revert: don't re-create changeset context
Kevin Bullock <kbullock@ringworld.org>
parents:
16553
diff
changeset
|
2402 for abs in ctx.walk(m): |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2403 if abs not in names: |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2404 names[abs] = m.rel(abs), m.exact(abs) |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2405 |
16430
6883c2363f44
revert: add support for reverting subrepos without --no-backup and/or --all
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16429
diff
changeset
|
2406 # get the list of subrepos that must be reverted |
18364
6252b4f1c4b4
subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents:
18340
diff
changeset
|
2407 targetsubs = sorted(s for s in ctx.substate if m(s)) |
21575
8262c2a39ab8
revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21574
diff
changeset
|
2408 |
22155
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2409 # Find status of all file in `names`. |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2410 m = scmutil.matchfiles(repo, names) |
22155
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2411 |
22236
3c24fb96900f
revert: handle unknown files through status
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22235
diff
changeset
|
2412 changes = repo.status(node1=node, match=m, |
3c24fb96900f
revert: handle unknown files through status
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22235
diff
changeset
|
2413 unknown=True, ignored=True, clean=True) |
22155
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2414 modified = set(changes[0]) |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2415 added = set(changes[1]) |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2416 removed = set(changes[2]) |
22236
3c24fb96900f
revert: handle unknown files through status
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22235
diff
changeset
|
2417 _deleted = set(changes[3]) |
3c24fb96900f
revert: handle unknown files through status
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22235
diff
changeset
|
2418 unknown = set(changes[4]) |
3c24fb96900f
revert: handle unknown files through status
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22235
diff
changeset
|
2419 unknown.update(changes[5]) |
22186
a89bc7833e0d
revert: also track clean files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22185
diff
changeset
|
2420 clean = set(changes[6]) |
22185
afead12e724b
revert: triage "deleted" files into more appropriate categories
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22173
diff
changeset
|
2421 |
afead12e724b
revert: triage "deleted" files into more appropriate categories
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22173
diff
changeset
|
2422 # split between files known in target manifest and the others |
afead12e724b
revert: triage "deleted" files into more appropriate categories
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22173
diff
changeset
|
2423 smf = set(mf) |
afead12e724b
revert: triage "deleted" files into more appropriate categories
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22173
diff
changeset
|
2424 |
afead12e724b
revert: triage "deleted" files into more appropriate categories
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22173
diff
changeset
|
2425 # determine the exact nature of the deleted changesets |
afead12e724b
revert: triage "deleted" files into more appropriate categories
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22173
diff
changeset
|
2426 _deletedadded = _deleted - smf |
afead12e724b
revert: triage "deleted" files into more appropriate categories
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22173
diff
changeset
|
2427 _deletedmodified = _deleted - _deletedadded |
afead12e724b
revert: triage "deleted" files into more appropriate categories
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22173
diff
changeset
|
2428 added |= _deletedadded |
afead12e724b
revert: triage "deleted" files into more appropriate categories
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22173
diff
changeset
|
2429 modified |= _deletedmodified |
22155
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2430 |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2431 # We need to account for the state of file in the dirstate |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2432 # |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2433 # Even, when we revert agains something else than parent. this will |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2434 # slightly alter the behavior of revert (doing back up or not, delete |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2435 # or just forget etc) |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2436 if parent == node: |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2437 dsmodified = modified |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2438 dsadded = added |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2439 dsremoved = removed |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2440 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
|
2441 else: |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2442 changes = repo.status(node1=parent, match=m) |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2443 dsmodified = set(changes[0]) |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2444 dsadded = set(changes[1]) |
530390629842
revert: call status against revert target too
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22154
diff
changeset
|
2445 dsremoved = set(changes[2]) |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2446 |
22188
0ad619c5e1a4
revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22187
diff
changeset
|
2447 # 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
|
2448 clean |= dsremoved - removed |
0ad619c5e1a4
revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22187
diff
changeset
|
2449 dsremoved &= removed |
0ad619c5e1a4
revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22187
diff
changeset
|
2450 # 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
|
2451 removed -= dsremoved |
0ad619c5e1a4
revert: use "remove" information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22187
diff
changeset
|
2452 |
22190
55308ab8117c
revert: use modified information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22189
diff
changeset
|
2453 # tell newly modified apart. |
55308ab8117c
revert: use modified information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22189
diff
changeset
|
2454 dsmodified &= modified |
55308ab8117c
revert: use modified information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22189
diff
changeset
|
2455 dsmodified |= modified & dsadded # dirstate added may needs backup |
55308ab8117c
revert: use modified information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22189
diff
changeset
|
2456 modified -= dsmodified |
55308ab8117c
revert: use modified information from both statuses
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22189
diff
changeset
|
2457 |
22208
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2458 # There are three categories of added files |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2459 # |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2460 # 1. addition that just happened in the dirstate |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2461 # (should be forgotten) |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2462 # 2. file is added since target revision and has local changes |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2463 # (should be backed up and removed) |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2464 # 3. file is added since target revision and is clean |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2465 # (should be removed) |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2466 # |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2467 # However we do not need to split them yet. The current revert code |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2468 # will automatically recognize (1) when performing operation. And |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2469 # the backup system is currently unabled to handle (2). |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2470 # |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2471 # So we just put them all in the same group. |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2472 dsadded = added |
d3659b3795e9
revert: simplify handling of `added` files
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22205
diff
changeset
|
2473 |
22209
06fbd9518bc5
revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22208
diff
changeset
|
2474 # 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
|
2475 # 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
|
2476 if p2 != nullid: |
06fbd9518bc5
revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22208
diff
changeset
|
2477 if pmf is None: |
06fbd9518bc5
revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22208
diff
changeset
|
2478 # only need parent manifest in the merge case, |
06fbd9518bc5
revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22208
diff
changeset
|
2479 # so do not read by default |
06fbd9518bc5
revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22208
diff
changeset
|
2480 pmf = repo[parent].manifest() |
06fbd9518bc5
revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22208
diff
changeset
|
2481 mergeadd = dsmodified - set(pmf) |
06fbd9518bc5
revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22208
diff
changeset
|
2482 dsadded |= mergeadd |
06fbd9518bc5
revert: detect files added during a merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22208
diff
changeset
|
2483 dsmodified -= mergeadd |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2484 |
21575
8262c2a39ab8
revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21574
diff
changeset
|
2485 # 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
|
2486 cwd = repo.getcwd() |
22154
fc422de25773
revert: prefix variable names for dirstate status with "ds"
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22153
diff
changeset
|
2487 for f in dsadded: |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2488 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
|
2489 # 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
|
2490 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
|
2491 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
|
2492 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
|
2493 |
21575
8262c2a39ab8
revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21574
diff
changeset
|
2494 ## computation of the action to performs on `names` content. |
8262c2a39ab8
revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21574
diff
changeset
|
2495 |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2496 def removeforget(abs): |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2497 if repo.dirstate[abs] == 'a': |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2498 return _('forgetting %s\n') |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2499 return _('removing %s\n') |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2500 |
21575
8262c2a39ab8
revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21574
diff
changeset
|
2501 # 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
|
2502 # (<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
|
2503 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
|
2504 'add': ([], _('adding %s\n')), |
33395a7e5527
revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21575
diff
changeset
|
2505 'remove': ([], removeforget), |
22231
10d9e7908a3c
revert: use actions[...] in all disptable cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22230
diff
changeset
|
2506 '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
|
2507 '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
|
2508 '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
|
2509 } |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2510 |
22230
316ba2ddc034
revset: factorize backup decision
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22229
diff
changeset
|
2511 |
316ba2ddc034
revset: factorize backup decision
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22229
diff
changeset
|
2512 # should we do a backup? |
316ba2ddc034
revset: factorize backup decision
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22229
diff
changeset
|
2513 backup = not opts.get('no_backup') |
316ba2ddc034
revset: factorize backup decision
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22229
diff
changeset
|
2514 discard = False |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2515 |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2516 disptable = ( |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2517 # dispatch table: |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2518 # 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
|
2519 # action |
fc8bc2787528
revert: move manifest membership condition outside of the loop
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22013
diff
changeset
|
2520 # make backup |
22371
81ad62defef5
revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22370
diff
changeset
|
2521 |
81ad62defef5
revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22370
diff
changeset
|
2522 ## 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
|
2523 # 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
|
2524 (modified, actions['revert'], discard), |
22371
81ad62defef5
revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22370
diff
changeset
|
2525 # Modified compared to target, local change |
22372
8da5864dcfda
revert: add more padding in the dispatch list
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22371
diff
changeset
|
2526 (dsmodified, actions['revert'], backup), |
22371
81ad62defef5
revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22370
diff
changeset
|
2527 # Added since target |
22373
f6a1386d540e
revert: no backup for `dsadded` set
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22372
diff
changeset
|
2528 (dsadded, actions['remove'], discard), |
22371
81ad62defef5
revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22370
diff
changeset
|
2529 # Removed since target, before working copy parent |
22372
8da5864dcfda
revert: add more padding in the dispatch list
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22371
diff
changeset
|
2530 (removed, actions['add'], backup), |
22371
81ad62defef5
revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22370
diff
changeset
|
2531 # Removed since targe, marked as such in working copy parent |
22372
8da5864dcfda
revert: add more padding in the dispatch list
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22371
diff
changeset
|
2532 (dsremoved, actions['undelete'], backup), |
22371
81ad62defef5
revert: add documentation in the dispatch table
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22370
diff
changeset
|
2533 ## 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
|
2534 # 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
|
2535 (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
|
2536 # 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
|
2537 (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
|
2538 ) |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2539 |
22373
f6a1386d540e
revert: no backup for `dsadded` set
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22372
diff
changeset
|
2540 needdata = ('revert', 'add', 'undelete') |
22370
45e02cfad4bd
revert: add a way for external extensions to prefetch file data
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22305
diff
changeset
|
2541 _revertprefetch(repo, ctx, *[actions[name][0] for name in needdata]) |
45e02cfad4bd
revert: add a way for external extensions to prefetch file data
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22305
diff
changeset
|
2542 |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2543 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
|
2544 # 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
|
2545 target = repo.wjoin(abs) |
21575
8262c2a39ab8
revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21574
diff
changeset
|
2546 # 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
|
2547 # 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
|
2548 # 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
|
2549 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
|
2550 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
|
2551 continue |
22233
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2552 if xlist is not None: |
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2553 xlist.append(abs) |
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2554 if (dobackup and os.path.lexists(target) and |
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2555 abs in ctx and repo[None][abs].cmp(ctx[abs])): |
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2556 bakname = "%s.orig" % rel |
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2557 ui.note(_('saving current version of %s as %s\n') % |
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2558 (rel, bakname)) |
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2559 if not opts.get('dry_run'): |
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2560 util.rename(target, bakname) |
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2561 if ui.verbose or not exact: |
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2562 if not isinstance(msg, basestring): |
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2563 msg = msg(abs) |
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2564 ui.status(msg % rel) |
4ab61b24e20c
revert: simplify loop conditional
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22232
diff
changeset
|
2565 elif exact: |
22234
fe9fc29ac2d0
revert: add a message to noop action
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22233
diff
changeset
|
2566 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
|
2567 break |
21575
8262c2a39ab8
revert: add some inline comments
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21574
diff
changeset
|
2568 |
21576
33395a7e5527
revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21575
diff
changeset
|
2569 |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2570 if not opts.get('dry_run'): |
21576
33395a7e5527
revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21575
diff
changeset
|
2571 _performrevert(repo, parents, ctx, actions) |
19129
bd19587a3347
revert: ensure that copies and renames are honored (issue3920)
Bryan O'Sullivan <bryano@fb.com>
parents:
19024
diff
changeset
|
2572 |
16429
71dcce391a44
revert: add support for reverting subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16381
diff
changeset
|
2573 if targetsubs: |
71dcce391a44
revert: add support for reverting subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16381
diff
changeset
|
2574 # Revert the subrepos on the revert list |
71dcce391a44
revert: add support for reverting subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16381
diff
changeset
|
2575 for sub in targetsubs: |
71dcce391a44
revert: add support for reverting subrepos
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16381
diff
changeset
|
2576 ctx.sub(sub).revert(ui, ctx.substate[sub], *pats, **opts) |
16304
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2577 finally: |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2578 wlock.release() |
a740fa28d718
revert: move bulk of revert command from commands to cmdutil
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
16283
diff
changeset
|
2579 |
22370
45e02cfad4bd
revert: add a way for external extensions to prefetch file data
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22305
diff
changeset
|
2580 def _revertprefetch(repo, ctx, *files): |
45e02cfad4bd
revert: add a way for external extensions to prefetch file data
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22305
diff
changeset
|
2581 """Let extension changing the storage layer prefetch content""" |
45e02cfad4bd
revert: add a way for external extensions to prefetch file data
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22305
diff
changeset
|
2582 pass |
45e02cfad4bd
revert: add a way for external extensions to prefetch file data
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22305
diff
changeset
|
2583 |
21576
33395a7e5527
revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21575
diff
changeset
|
2584 def _performrevert(repo, parents, ctx, actions): |
33395a7e5527
revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21575
diff
changeset
|
2585 """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
|
2586 |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2587 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
|
2588 the imminent revert. |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2589 |
21024
7731a2281cf0
spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20790
diff
changeset
|
2590 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
|
2591 """ |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2592 parent, p2 = parents |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2593 node = ctx.node() |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2594 def checkout(f): |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2595 fc = ctx[f] |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2596 repo.wwrite(f, fc.data(), fc.flags()) |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2597 |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2598 audit_path = pathutil.pathauditor(repo.root) |
21576
33395a7e5527
revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21575
diff
changeset
|
2599 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
|
2600 if repo.dirstate[f] == 'a': |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2601 repo.dirstate.drop(f) |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2602 continue |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2603 audit_path(f) |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2604 try: |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2605 util.unlinkpath(repo.wjoin(f)) |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2606 except OSError: |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2607 pass |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2608 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
|
2609 |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2610 normal = None |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2611 if node == parent: |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2612 # 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
|
2613 # 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
|
2614 # 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
|
2615 if p2 != nullid: |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2616 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
|
2617 else: |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2618 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
|
2619 for f in 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
|
2620 checkout(f) |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2621 if normal: |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2622 normal(f) |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2623 |
21576
33395a7e5527
revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21575
diff
changeset
|
2624 for f in actions['add'][0]: |
20571
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2625 checkout(f) |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2626 repo.dirstate.add(f) |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2627 |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2628 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
|
2629 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
|
2630 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
|
2631 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
|
2632 checkout(f) |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2633 normal(f) |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2634 |
d4893e64f300
revert: extract actual revert in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20553
diff
changeset
|
2635 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
|
2636 |
21576
33395a7e5527
revert: group action into a single dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21575
diff
changeset
|
2637 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
|
2638 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
|
2639 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
|
2640 |
14297
2daa5179e73f
commands: use a decorator to build table incrementally
Adrian Buehlmann <adrian@cadifra.com>
parents:
14291
diff
changeset
|
2641 def command(table): |
21766
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2642 """Returns a function object to be used as a decorator for making commands. |
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2643 |
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2644 This function receives a command table as its argument. The table should |
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2645 be a dict. |
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2646 |
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2647 The returned function can be used as a decorator for adding commands |
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2648 to that command table. This function accepts multiple arguments to define |
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2649 a command. |
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2650 |
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2651 The first argument is the command name. |
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2652 |
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2653 The options argument is an iterable of tuples defining command arguments. |
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2654 See ``mercurial.fancyopts.fancyopts()`` for the format of each tuple. |
14297
2daa5179e73f
commands: use a decorator to build table incrementally
Adrian Buehlmann <adrian@cadifra.com>
parents:
14291
diff
changeset
|
2655 |
21766
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2656 The synopsis argument defines a short, one line summary of how to use the |
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2657 command. This shows up in the help output. |
21767
75a96326cecb
commands: add norepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21766
diff
changeset
|
2658 |
75a96326cecb
commands: add norepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21766
diff
changeset
|
2659 The norepo argument defines whether the command does not require a |
75a96326cecb
commands: add norepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21766
diff
changeset
|
2660 local repository. Most commands operate against a repository, thus the |
75a96326cecb
commands: add norepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21766
diff
changeset
|
2661 default is False. |
21774
b280d0b60bc3
cmdutil: add optionalrepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21767
diff
changeset
|
2662 |
b280d0b60bc3
cmdutil: add optionalrepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21767
diff
changeset
|
2663 The optionalrepo argument defines whether the command optionally requires |
b280d0b60bc3
cmdutil: add optionalrepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21767
diff
changeset
|
2664 a local repository. |
21777
17d1ac452127
cmdutil: support inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21774
diff
changeset
|
2665 |
17d1ac452127
cmdutil: support inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21774
diff
changeset
|
2666 The inferrepo argument defines whether to try to find a repository from the |
17d1ac452127
cmdutil: support inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21774
diff
changeset
|
2667 command line arguments. If True, arguments will be examined for potential |
17d1ac452127
cmdutil: support inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21774
diff
changeset
|
2668 repository locations. See ``findrepo()``. If a repository is found, it |
17d1ac452127
cmdutil: support inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21774
diff
changeset
|
2669 will be used. |
21766
a039e1f2326f
cmdutil: better document command()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
2670 """ |
21777
17d1ac452127
cmdutil: support inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21774
diff
changeset
|
2671 def cmd(name, options=(), synopsis=None, norepo=False, optionalrepo=False, |
17d1ac452127
cmdutil: support inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21774
diff
changeset
|
2672 inferrepo=False): |
14297
2daa5179e73f
commands: use a decorator to build table incrementally
Adrian Buehlmann <adrian@cadifra.com>
parents:
14291
diff
changeset
|
2673 def decorator(func): |
2daa5179e73f
commands: use a decorator to build table incrementally
Adrian Buehlmann <adrian@cadifra.com>
parents:
14291
diff
changeset
|
2674 if synopsis: |
18235
9807e7d596c3
cmdutil: make options argument optional
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18206
diff
changeset
|
2675 table[name] = func, list(options), synopsis |
14297
2daa5179e73f
commands: use a decorator to build table incrementally
Adrian Buehlmann <adrian@cadifra.com>
parents:
14291
diff
changeset
|
2676 else: |
18235
9807e7d596c3
cmdutil: make options argument optional
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18206
diff
changeset
|
2677 table[name] = func, list(options) |
21767
75a96326cecb
commands: add norepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21766
diff
changeset
|
2678 |
75a96326cecb
commands: add norepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21766
diff
changeset
|
2679 if norepo: |
75a96326cecb
commands: add norepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21766
diff
changeset
|
2680 # Avoid import cycle. |
75a96326cecb
commands: add norepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21766
diff
changeset
|
2681 import commands |
75a96326cecb
commands: add norepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21766
diff
changeset
|
2682 commands.norepo += ' %s' % ' '.join(parsealiases(name)) |
75a96326cecb
commands: add norepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21766
diff
changeset
|
2683 |
21774
b280d0b60bc3
cmdutil: add optionalrepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21767
diff
changeset
|
2684 if optionalrepo: |
b280d0b60bc3
cmdutil: add optionalrepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21767
diff
changeset
|
2685 import commands |
b280d0b60bc3
cmdutil: add optionalrepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21767
diff
changeset
|
2686 commands.optionalrepo += ' %s' % ' '.join(parsealiases(name)) |
b280d0b60bc3
cmdutil: add optionalrepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21767
diff
changeset
|
2687 |
21777
17d1ac452127
cmdutil: support inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21774
diff
changeset
|
2688 if inferrepo: |
17d1ac452127
cmdutil: support inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21774
diff
changeset
|
2689 import commands |
17d1ac452127
cmdutil: support inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21774
diff
changeset
|
2690 commands.inferrepo += ' %s' % ' '.join(parsealiases(name)) |
17d1ac452127
cmdutil: support inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21774
diff
changeset
|
2691 |
14297
2daa5179e73f
commands: use a decorator to build table incrementally
Adrian Buehlmann <adrian@cadifra.com>
parents:
14291
diff
changeset
|
2692 return func |
2daa5179e73f
commands: use a decorator to build table incrementally
Adrian Buehlmann <adrian@cadifra.com>
parents:
14291
diff
changeset
|
2693 return decorator |
2daa5179e73f
commands: use a decorator to build table incrementally
Adrian Buehlmann <adrian@cadifra.com>
parents:
14291
diff
changeset
|
2694 |
2daa5179e73f
commands: use a decorator to build table incrementally
Adrian Buehlmann <adrian@cadifra.com>
parents:
14291
diff
changeset
|
2695 return cmd |
19211
3bfd7f1e7485
summary: augment output with info from extensions
Bryan O'Sullivan <bryano@fb.com>
parents:
19129
diff
changeset
|
2696 |
21051
1004d3cd65fd
outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21047
diff
changeset
|
2697 # 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
|
2698 # 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
|
2699 # "findcommonoutgoing()" |
1004d3cd65fd
outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21047
diff
changeset
|
2700 outgoinghooks = util.hooks() |
1004d3cd65fd
outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21047
diff
changeset
|
2701 |
19211
3bfd7f1e7485
summary: augment output with info from extensions
Bryan O'Sullivan <bryano@fb.com>
parents:
19129
diff
changeset
|
2702 # 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
|
2703 summaryhooks = util.hooks() |
19474
894fd1a7c533
cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19293
diff
changeset
|
2704 |
21047
f0003f989e72
summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21041
diff
changeset
|
2705 # 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
|
2706 # |
f0003f989e72
summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21041
diff
changeset
|
2707 # 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
|
2708 # (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
|
2709 # |
f0003f989e72
summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21041
diff
changeset
|
2710 # 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
|
2711 # - (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
|
2712 # - (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
|
2713 summaryremotehooks = util.hooks() |
f0003f989e72
summary: introduce "summaryremotehooks" to avoid redundant incoming/outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21041
diff
changeset
|
2714 |
19474
894fd1a7c533
cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19293
diff
changeset
|
2715 # 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
|
2716 # 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
|
2717 # note: bisect is intentionally excluded |
19496
607191a45f8c
checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents:
19482
diff
changeset
|
2718 # (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
|
2719 unfinishedstates = [ |
19496
607191a45f8c
checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents:
19482
diff
changeset
|
2720 ('graftstate', True, False, _('graft in progress'), |
19482
499fc471296b
update: add tracking of interrupted updates (issue3113)
Matt Mackall <mpm@selenic.com>
parents:
19474
diff
changeset
|
2721 _("use 'hg graft --continue' or 'hg update' to abort")), |
19496
607191a45f8c
checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents:
19482
diff
changeset
|
2722 ('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
|
2723 _("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
|
2724 ] |
894fd1a7c533
cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19293
diff
changeset
|
2725 |
19496
607191a45f8c
checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents:
19482
diff
changeset
|
2726 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
|
2727 '''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
|
2728 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
|
2729 bailifchanged(). |
894fd1a7c533
cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19293
diff
changeset
|
2730 ''' |
19496
607191a45f8c
checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents:
19482
diff
changeset
|
2731 for f, clearable, allowcommit, msg, hint in unfinishedstates: |
607191a45f8c
checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents:
19482
diff
changeset
|
2732 if commit and allowcommit: |
607191a45f8c
checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents:
19482
diff
changeset
|
2733 continue |
19474
894fd1a7c533
cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19293
diff
changeset
|
2734 if repo.vfs.exists(f): |
894fd1a7c533
cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19293
diff
changeset
|
2735 raise util.Abort(msg, hint=hint) |
894fd1a7c533
cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19293
diff
changeset
|
2736 |
894fd1a7c533
cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19293
diff
changeset
|
2737 def clearunfinished(repo): |
894fd1a7c533
cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19293
diff
changeset
|
2738 '''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
|
2739 that are clearable. |
894fd1a7c533
cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19293
diff
changeset
|
2740 ''' |
19496
607191a45f8c
checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents:
19482
diff
changeset
|
2741 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
|
2742 if not clearable and repo.vfs.exists(f): |
894fd1a7c533
cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19293
diff
changeset
|
2743 raise util.Abort(msg, hint=hint) |
19496
607191a45f8c
checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents:
19482
diff
changeset
|
2744 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
|
2745 if clearable and repo.vfs.exists(f): |
894fd1a7c533
cmdutil: core functionality to block during multistep commands (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19293
diff
changeset
|
2746 util.unlink(repo.join(f)) |