annotate hgext/mq.py @ 2473:30c267cb4c2f

change some repo messages in small ways. move "pushing" and "pulling" after repo create so error message and exit happens before messages printed. fix sshrepo parse error message.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Wed, 21 Jun 2006 09:15:42 -0700
parents 7c2623aedeb4
children 2785aeb51be4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1 # queue.py - patch queues for mercurial
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
2 #
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
3 # Copyright 2005 Chris Mason <mason@suse.com>
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
4 #
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
5 # This software may be used and distributed according to the terms
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
6 # of the GNU General Public License, incorporated herein by reference.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
7
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
8 from mercurial.demandload import *
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
9 demandload(globals(), "os sys re struct traceback errno bz2")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
10 from mercurial.i18n import gettext as _
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
11 from mercurial import ui, hg, revlog, commands, util
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
12
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
13 versionstr = "0.45"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
14
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
15 repomap = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
16
2047
ebf1ecb5f4e8 Register qversion as a non repository related command
Edouard Gomez <ed.gomez@free.fr>
parents: 1863
diff changeset
17 commands.norepo += " qversion"
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
18 class queue:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
19 def __init__(self, ui, path, patchdir=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
20 self.basepath = path
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
21 if patchdir:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
22 self.path = patchdir
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
23 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
24 self.path = os.path.join(path, "patches")
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
25 self.opener = util.opener(self.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
26 self.ui = ui
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
27 self.applied = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
28 self.full_series = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
29 self.applied_dirty = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
30 self.series_dirty = 0
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
31 self.series_path = "series"
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
32 self.status_path = "status"
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
33
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
34 if os.path.exists(os.path.join(self.path, self.series_path)):
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
35 self.full_series = self.opener(self.series_path).read().splitlines()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
36 self.read_series(self.full_series)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
37
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
38 if os.path.exists(os.path.join(self.path, self.status_path)):
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
39 self.applied = self.opener(self.status_path).read().splitlines()
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
40
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
41 def find_series(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
42 pre = re.compile("(\s*)([^#]+)")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
43 index = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
44 for l in self.full_series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
45 m = pre.match(l)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
46 if m:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
47 s = m.group(2)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
48 s = s.rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
49 if s == patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
50 return index
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
51 index += 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
52 return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
53
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
54 def read_series(self, list):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
55 def matcher(list):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
56 pre = re.compile("(\s*)([^#]+)")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
57 for l in list:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
58 m = pre.match(l)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
59 if m:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
60 s = m.group(2)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
61 s = s.rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
62 if len(s) > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
63 yield s
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
64 self.series = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
65 self.series = [ x for x in matcher(list) ]
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
66
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
67 def save_dirty(self):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
68 if self.applied_dirty:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
69 if len(self.applied) > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
70 nl = "\n"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
71 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
72 nl = ""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
73 f = self.opener(self.status_path, "w")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
74 f.write("\n".join(self.applied) + nl)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
75 if self.series_dirty:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
76 if len(self.full_series) > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
77 nl = "\n"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
78 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
79 nl = ""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
80 f = self.opener(self.series_path, "w")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
81 f.write("\n".join(self.full_series) + nl)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
82
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
83 def readheaders(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
84 def eatdiff(lines):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
85 while lines:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
86 l = lines[-1]
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
87 if (l.startswith("diff -") or
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
88 l.startswith("Index:") or
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
89 l.startswith("===========")):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
90 del lines[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
91 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
92 break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
93 def eatempty(lines):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
94 while lines:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
95 l = lines[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
96 if re.match('\s*$', l):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
97 del lines[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
98 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
99 break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
100
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
101 pf = os.path.join(self.path, patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
102 message = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
103 comments = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
104 user = None
2299
dacf718e1d48 Add timestamp field to export format. Make import and mq use it.
Danek Duvall <danek.duvall@sun.com>
parents: 2270
diff changeset
105 date = None
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
106 format = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
107 subject = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
108 diffstart = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
109
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
110 for line in file(pf):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
111 line = line.rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
112 if diffstart:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
113 if line.startswith('+++ '):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
114 diffstart = 2
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
115 break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
116 if line.startswith("--- "):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
117 diffstart = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
118 continue
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
119 elif format == "hgpatch":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
120 # parse values when importing the result of an hg export
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
121 if line.startswith("# User "):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
122 user = line[7:]
2300
52b9b6751b2c Use "# Date" instead of "# Timestamp" for dated export/import of patches.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2299
diff changeset
123 elif line.startswith("# Date "):
52b9b6751b2c Use "# Date" instead of "# Timestamp" for dated export/import of patches.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2299
diff changeset
124 date = line[7:]
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
125 elif not line.startswith("# ") and line:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
126 message.append(line)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
127 format = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
128 elif line == '# HG changeset patch':
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
129 format = "hgpatch"
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
130 elif (format != "tagdone" and (line.startswith("Subject: ") or
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
131 line.startswith("subject: "))):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
132 subject = line[9:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
133 format = "tag"
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
134 elif (format != "tagdone" and (line.startswith("From: ") or
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
135 line.startswith("from: "))):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
136 user = line[6:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
137 format = "tag"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
138 elif format == "tag" and line == "":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
139 # when looking for tags (subject: from: etc) they
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
140 # end once you find a blank line in the source
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
141 format = "tagdone"
2301
7c2623aedeb4 Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2300
diff changeset
142 elif message or line:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
143 message.append(line)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
144 comments.append(line)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
145
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
146 eatdiff(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
147 eatdiff(comments)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
148 eatempty(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
149 eatempty(comments)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
150
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
151 # make sure message isn't empty
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
152 if format and format.startswith("tag") and subject:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
153 message.insert(0, "")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
154 message.insert(0, subject)
2299
dacf718e1d48 Add timestamp field to export format. Make import and mq use it.
Danek Duvall <danek.duvall@sun.com>
parents: 2270
diff changeset
155 return (message, comments, user, date, diffstart > 1)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
156
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
157 def mergeone(self, repo, mergeq, head, patch, rev, wlock):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
158 # first try just applying the patch
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
159 (err, n) = self.apply(repo, [ patch ], update_status=False,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
160 strict=True, merge=rev, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
161
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
162 if err == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
163 return (err, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
164
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
165 if n is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
166 self.ui.warn("apply failed for patch %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
167 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
168
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
169 self.ui.warn("patch didn't work out, merging %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
170
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
171 # apply failed, strip away that rev and merge.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
172 repo.update(head, allow=False, force=True, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
173 self.strip(repo, n, update=False, backup='strip', wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
174
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
175 c = repo.changelog.read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
176 ret = repo.update(rev, allow=True, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
177 if ret:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
178 self.ui.warn("update returned %d\n" % ret)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
179 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
180 n = repo.commit(None, c[4], c[1], force=1, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
181 if n == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
182 self.ui.warn("repo commit failed\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
183 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
184 try:
2299
dacf718e1d48 Add timestamp field to export format. Make import and mq use it.
Danek Duvall <danek.duvall@sun.com>
parents: 2270
diff changeset
185 message, comments, user, date, patchfound = mergeq.readheaders(patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
186 except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
187 self.ui.warn("Unable to read %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
188 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
189
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
190 patchf = self.opener(patch, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
191 if comments:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
192 comments = "\n".join(comments) + '\n\n'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
193 patchf.write(comments)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
194 commands.dodiff(patchf, self.ui, repo, head, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
195 patchf.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
196 return (0, n)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
197
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
198 def qparents(self, repo, rev=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
199 if rev is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
200 (p1, p2) = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
201 if p2 == revlog.nullid:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
202 return p1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
203 if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
204 return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
205 (top, patch) = self.applied[-1].split(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
206 top = revlog.bin(top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
207 return top
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
208 pp = repo.changelog.parents(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
209 if pp[1] != revlog.nullid:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
210 arevs = [ x.split(':')[0] for x in self.applied ]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
211 p0 = revlog.hex(pp[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
212 p1 = revlog.hex(pp[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
213 if p0 in arevs:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
214 return pp[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
215 if p1 in arevs:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
216 return pp[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
217 return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
218 return pp[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
219
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
220 def mergepatch(self, repo, mergeq, series, wlock):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
221 if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
222 # each of the patches merged in will have two parents. This
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
223 # can confuse the qrefresh, qdiff, and strip code because it
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
224 # needs to know which parent is actually in the patch queue.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
225 # so, we insert a merge marker with only one parent. This way
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
226 # the first patch in the queue is never a merge patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
227 #
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
228 pname = ".hg.patches.merge.marker"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
229 n = repo.commit(None, '[mq]: merge marker', user=None, force=1,
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
230 wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
231 self.applied.append(revlog.hex(n) + ":" + pname)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
232 self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
233
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
234 head = self.qparents(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
235
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
236 for patch in series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
237 patch = mergeq.lookup(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
238 if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
239 self.ui.warn("patch %s does not exist\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
240 return (1, None)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
241
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
242 info = mergeq.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
243 if not info:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
244 self.ui.warn("patch %s is not applied\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
245 return (1, None)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
246 rev = revlog.bin(info[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
247 (err, head) = self.mergeone(repo, mergeq, head, patch, rev, wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
248 if head:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
249 self.applied.append(revlog.hex(head) + ":" + patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
250 self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
251 if err:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
252 return (err, head)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
253 return (0, head)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
254
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
255 def apply(self, repo, series, list=False, update_status=True,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
256 strict=False, patchdir=None, merge=None, wlock=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
257 # TODO unify with commands.py
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
258 if not patchdir:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
259 patchdir = self.path
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
260 pwd = os.getcwd()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
261 os.chdir(repo.root)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
262 err = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
263 if not wlock:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
264 wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
265 lock = repo.lock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
266 tr = repo.transaction()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
267 n = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
268 for patch in series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
269 self.ui.warn("applying %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
270 pf = os.path.join(patchdir, patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
271
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
272 try:
2299
dacf718e1d48 Add timestamp field to export format. Make import and mq use it.
Danek Duvall <danek.duvall@sun.com>
parents: 2270
diff changeset
273 message, comments, user, date, patchfound = self.readheaders(patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
274 except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
275 self.ui.warn("Unable to read %s\n" % pf)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
276 err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
277 break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
278
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
279 if not message:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
280 message = "imported patch %s\n" % patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
281 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
282 if list:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
283 message.append("\nimported patch %s" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
284 message = '\n'.join(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
285
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
286 try:
2270
afd7c4ec000f Fix issue240: mq: qpush fails on Solaris
Danek Duvall <danek.duvall@sun.com>
parents: 2185
diff changeset
287 pp = util.find_in_path('gpatch', os.environ.get('PATH', ''), 'patch')
afd7c4ec000f Fix issue240: mq: qpush fails on Solaris
Danek Duvall <danek.duvall@sun.com>
parents: 2185
diff changeset
288 f = os.popen("%s -p1 --no-backup-if-mismatch < '%s'" % (pp, pf))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
289 except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
290 self.ui.warn("patch failed, unable to continue (try -v)\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
291 err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
292 break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
293 files = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
294 fuzz = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
295 for l in f:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
296 l = l.rstrip('\r\n');
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
297 if self.ui.verbose:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
298 self.ui.warn(l + "\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
299 if l[:14] == 'patching file ':
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
300 pf = os.path.normpath(l[14:])
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
301 # when patch finds a space in the file name, it puts
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
302 # single quotes around the filename. strip them off
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
303 if pf[0] == "'" and pf[-1] == "'":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
304 pf = pf[1:-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
305 if pf not in files:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
306 files.append(pf)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
307 printed_file = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
308 file_str = l
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
309 elif l.find('with fuzz') >= 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
310 if not printed_file:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
311 self.ui.warn(file_str + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
312 printed_file = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
313 self.ui.warn(l + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
314 fuzz = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
315 elif l.find('saving rejects to file') >= 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
316 self.ui.warn(l + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
317 elif l.find('FAILED') >= 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
318 if not printed_file:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
319 self.ui.warn(file_str + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
320 printed_file = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
321 self.ui.warn(l + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
322 patcherr = f.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
323
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
324 if merge and len(files) > 0:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
325 # Mark as merged and update dirstate parent info
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
326 repo.dirstate.update(repo.dirstate.filterfiles(files), 'm')
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
327 p1, p2 = repo.dirstate.parents()
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
328 repo.dirstate.setparents(p1, merge)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
329 if len(files) > 0:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
330 commands.addremove_lock(self.ui, repo, files,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
331 opts={}, wlock=wlock)
2299
dacf718e1d48 Add timestamp field to export format. Make import and mq use it.
Danek Duvall <danek.duvall@sun.com>
parents: 2270
diff changeset
332 n = repo.commit(files, message, user, date, force=1, lock=lock,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
333 wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
334
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
335 if n == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
336 self.ui.warn("repo commit failed\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
337 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
338
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
339 if update_status:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
340 self.applied.append(revlog.hex(n) + ":" + patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
341
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
342 if patcherr:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
343 if not patchfound:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
344 self.ui.warn("patch %s is empty\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
345 err = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
346 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
347 self.ui.warn("patch failed, rejects left in working dir\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
348 err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
349 break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
350
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
351 if fuzz and strict:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
352 self.ui.warn("fuzz found when applying patch, stopping\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
353 err = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
354 break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
355 tr.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
356 os.chdir(pwd)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
357 return (err, n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
358
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
359 def delete(self, repo, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
360 patch = self.lookup(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
361 info = self.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
362 if info:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
363 self.ui.warn("cannot delete applied patch %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
364 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
365 if patch not in self.series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
366 self.ui.warn("patch %s not in series file\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
367 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
368 i = self.find_series(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
369 del self.full_series[i]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
370 self.read_series(self.full_series)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
371 self.series_dirty = 1
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
372
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
373 def check_toppatch(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
374 if len(self.applied) > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
375 (top, patch) = self.applied[-1].split(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
376 top = revlog.bin(top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
377 pp = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
378 if top not in pp:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
379 self.ui.warn("queue top not at dirstate parents. top %s dirstate %s %s\n" %( revlog.short(top), revlog.short(pp[0]), revlog.short(pp[1])))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
380 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
381 return top
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
382 return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
383 def check_localchanges(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
384 (c, a, r, d, u) = repo.changes(None, None)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
385 if c or a or d or r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
386 self.ui.write("Local changes found, refresh first\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
387 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
388 def new(self, repo, patch, msg=None, force=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
389 if not force:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
390 self.check_localchanges(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
391 self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
392 wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
393 insert = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
394 if msg:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
395 n = repo.commit([], "[mq]: %s" % msg, force=True, wlock=wlock)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
396 else:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
397 n = repo.commit([],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
398 "New patch: %s" % patch, force=True, wlock=wlock)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
399 if n == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
400 self.ui.warn("repo commit failed\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
401 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
402 self.full_series[insert:insert] = [patch]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
403 self.applied.append(revlog.hex(n) + ":" + patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
404 self.read_series(self.full_series)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
405 self.series_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
406 self.applied_dirty = 1
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
407 p = self.opener(patch, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
408 if msg:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
409 msg = msg + "\n"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
410 p.write(msg)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
411 p.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
412 wlock = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
413 r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
414 if r: r.add([patch])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
415
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
416 def strip(self, repo, rev, update=True, backup="all", wlock=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
417 def limitheads(chlog, stop):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
418 """return the list of all nodes that have no children"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
419 p = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
420 h = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
421 stoprev = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
422 if stop in chlog.nodemap:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
423 stoprev = chlog.rev(stop)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
424
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
425 for r in range(chlog.count() - 1, -1, -1):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
426 n = chlog.node(r)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
427 if n not in p:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
428 h.append(n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
429 if n == stop:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
430 break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
431 if r < stoprev:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
432 break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
433 for pn in chlog.parents(n):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
434 p[pn] = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
435 return h
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
436
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
437 def bundle(cg):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
438 backupdir = repo.join("strip-backup")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
439 if not os.path.isdir(backupdir):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
440 os.mkdir(backupdir)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
441 name = os.path.join(backupdir, "%s" % revlog.short(rev))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
442 name = savename(name)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
443 self.ui.warn("saving bundle to %s\n" % name)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
444 # TODO, exclusive open
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
445 f = open(name, "wb")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
446 try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
447 f.write("HG10")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
448 z = bz2.BZ2Compressor(9)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
449 while 1:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
450 chunk = cg.read(4096)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
451 if not chunk:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
452 break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
453 f.write(z.compress(chunk))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
454 f.write(z.flush())
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
455 except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
456 os.unlink(name)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
457 raise
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
458 f.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
459 return name
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
460
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
461 def stripall(rev, revnum):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
462 cl = repo.changelog
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
463 c = cl.read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
464 mm = repo.manifest.read(c[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
465 seen = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
466
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
467 for x in xrange(revnum, cl.count()):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
468 c = cl.read(cl.node(x))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
469 for f in c[3]:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
470 if f in seen:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
471 continue
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
472 seen[f] = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
473 if f in mm:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
474 filerev = mm[f]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
475 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
476 filerev = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
477 seen[f] = filerev
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
478 # we go in two steps here so the strip loop happens in a
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
479 # sensible order. When stripping many files, this helps keep
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
480 # our disk access patterns under control.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
481 list = seen.keys()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
482 list.sort()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
483 for f in list:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
484 ff = repo.file(f)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
485 filerev = seen[f]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
486 if filerev != 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
487 if filerev in ff.nodemap:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
488 filerev = ff.rev(filerev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
489 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
490 filerev = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
491 ff.strip(filerev, revnum)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
492
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
493 if not wlock:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
494 wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
495 lock = repo.lock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
496 chlog = repo.changelog
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
497 # TODO delete the undo files, and handle undo of merge sets
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
498 pp = chlog.parents(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
499 revnum = chlog.rev(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
500
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
501 if update:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
502 urev = self.qparents(repo, rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
503 repo.update(urev, allow=False, force=True, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
504 repo.dirstate.write()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
505
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
506 # save is a list of all the branches we are truncating away
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
507 # that we actually want to keep. changegroup will be used
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
508 # to preserve them and add them back after the truncate
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
509 saveheads = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
510 savebases = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
511
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
512 tip = chlog.tip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
513 heads = limitheads(chlog, rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
514 seen = {}
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
515
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
516 # search through all the heads, finding those where the revision
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
517 # we want to strip away is an ancestor. Also look for merges
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
518 # that might be turned into new heads by the strip.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
519 while heads:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
520 h = heads.pop()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
521 n = h
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
522 while True:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
523 seen[n] = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
524 pp = chlog.parents(n)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
525 if pp[1] != revlog.nullid and chlog.rev(pp[1]) > revnum:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
526 if pp[1] not in seen:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
527 heads.append(pp[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
528 if pp[0] == revlog.nullid:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
529 break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
530 if chlog.rev(pp[0]) < revnum:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
531 break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
532 n = pp[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
533 if n == rev:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
534 break
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
535 r = chlog.reachable(h, rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
536 if rev not in r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
537 saveheads.append(h)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
538 for x in r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
539 if chlog.rev(x) > revnum:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
540 savebases[x] = 1
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
541
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
542 # create a changegroup for all the branches we need to keep
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
543 if backup is "all":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
544 backupch = repo.changegroupsubset([rev], chlog.heads(), 'strip')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
545 bundle(backupch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
546 if saveheads:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
547 backupch = repo.changegroupsubset(savebases.keys(), saveheads, 'strip')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
548 chgrpfile = bundle(backupch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
549
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
550 stripall(rev, revnum)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
551
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
552 change = chlog.read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
553 repo.manifest.strip(repo.manifest.rev(change[0]), revnum)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
554 chlog.strip(revnum, revnum)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
555 if saveheads:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
556 self.ui.status("adding branch\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
557 commands.unbundle(self.ui, repo, chgrpfile, update=False)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
558 if backup is not "strip":
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
559 os.unlink(chgrpfile)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
560
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
561 def isapplied(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
562 """returns (index, rev, patch)"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
563 for i in xrange(len(self.applied)):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
564 p = self.applied[i]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
565 a = p.split(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
566 if a[1] == patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
567 return (i, a[0], a[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
568 return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
569
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
570 def lookup(self, patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
571 if patch == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
572 return None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
573 if patch in self.series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
574 return patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
575 if not os.path.isfile(os.path.join(self.path, patch)):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
576 try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
577 sno = int(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
578 except(ValueError, OverflowError):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
579 self.ui.warn("patch %s not in series\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
580 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
581 if sno >= len(self.series):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
582 self.ui.warn("patch number %d is out of range\n" % sno)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
583 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
584 patch = self.series[sno]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
585 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
586 self.ui.warn("patch %s not in series\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
587 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
588 return patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
589
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
590 def push(self, repo, patch=None, force=False, list=False,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
591 mergeq=None, wlock=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
592 if not wlock:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
593 wlock = repo.wlock()
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
594 patch = self.lookup(patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
595 if patch and self.isapplied(patch):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
596 self.ui.warn("patch %s is already applied\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
597 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
598 if self.series_end() == len(self.series):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
599 self.ui.warn("File series fully applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
600 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
601 if not force:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
602 self.check_localchanges(repo)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
603
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
604 self.applied_dirty = 1;
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
605 start = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
606 if start > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
607 self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
608 if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
609 patch = self.series[start]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
610 end = start + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
611 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
612 end = self.series.index(patch, start) + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
613 s = self.series[start:end]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
614 if mergeq:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
615 ret = self.mergepatch(repo, mergeq, s, wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
616 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
617 ret = self.apply(repo, s, list, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
618 top = self.applied[-1].split(':')[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
619 if ret[0]:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
620 self.ui.write("Errors during apply, please fix and refresh %s\n" %
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
621 top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
622 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
623 self.ui.write("Now at: %s\n" % top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
624 return ret[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
625
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
626 def pop(self, repo, patch=None, force=False, update=True, wlock=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
627 def getfile(f, rev):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
628 t = repo.file(f).read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
629 try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
630 repo.wfile(f, "w").write(t)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
631 except IOError:
2086
8742352db413 mq: do not fail if directory to create exists
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2047
diff changeset
632 try:
8742352db413 mq: do not fail if directory to create exists
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2047
diff changeset
633 os.makedirs(os.path.dirname(repo.wjoin(f)))
8742352db413 mq: do not fail if directory to create exists
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2047
diff changeset
634 except OSError, err:
8742352db413 mq: do not fail if directory to create exists
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2047
diff changeset
635 if err.errno != errno.EEXIST: raise
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
636 repo.wfile(f, "w").write(t)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
637
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
638 if not wlock:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
639 wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
640 if patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
641 # index, rev, patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
642 info = self.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
643 if not info:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
644 patch = self.lookup(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
645 info = self.isapplied(patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
646 if not info:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
647 self.ui.warn("patch %s is not applied\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
648 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
649 if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
650 self.ui.warn("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
651 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
652
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
653 if not update:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
654 parents = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
655 rr = [ revlog.bin(x.split(':')[0]) for x in self.applied ]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
656 for p in parents:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
657 if p in rr:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
658 self.ui.warn("qpop: forcing dirstate update\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
659 update = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
660
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
661 if not force and update:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
662 self.check_localchanges(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
663
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
664 self.applied_dirty = 1;
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
665 end = len(self.applied)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
666 if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
667 info = [len(self.applied) - 1] + self.applied[-1].split(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
668 start = info[0]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
669 rev = revlog.bin(info[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
670
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
671 # we know there are no local changes, so we can make a simplified
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
672 # form of hg.update.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
673 if update:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
674 top = self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
675 qp = self.qparents(repo, rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
676 changes = repo.changelog.read(qp)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
677 mf1 = repo.manifest.readflags(changes[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
678 mmap = repo.manifest.read(changes[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
679 (c, a, r, d, u) = repo.changes(qp, top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
680 if d:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
681 raise util.Abort("deletions found between repo revs")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
682 for f in c:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
683 getfile(f, mmap[f])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
684 for f in r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
685 getfile(f, mmap[f])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
686 util.set_exec(repo.wjoin(f), mf1[f])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
687 repo.dirstate.update(c + r, 'n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
688 for f in a:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
689 try: os.unlink(repo.wjoin(f))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
690 except: raise
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
691 try: os.removedirs(os.path.dirname(repo.wjoin(f)))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
692 except: pass
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
693 if a:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
694 repo.dirstate.forget(a)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
695 repo.dirstate.setparents(qp, revlog.nullid)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
696 self.strip(repo, rev, update=False, backup='strip', wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
697 del self.applied[start:end]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
698 if len(self.applied):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
699 self.ui.write("Now at: %s\n" % self.applied[-1].split(':')[1])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
700 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
701 self.ui.write("Patch queue now empty\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
702
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
703 def diff(self, repo, files):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
704 top = self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
705 if not top:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
706 self.ui.write("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
707 return
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
708 qp = self.qparents(repo, top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
709 commands.dodiff(sys.stdout, self.ui, repo, qp, None, files)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
710
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
711 def refresh(self, repo, short=False):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
712 if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
713 self.ui.write("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
714 return
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
715 wlock = repo.wlock()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
716 self.check_toppatch(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
717 qp = self.qparents(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
718 (top, patch) = self.applied[-1].split(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
719 top = revlog.bin(top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
720 cparents = repo.changelog.parents(top)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
721 patchparent = self.qparents(repo, top)
2299
dacf718e1d48 Add timestamp field to export format. Make import and mq use it.
Danek Duvall <danek.duvall@sun.com>
parents: 2270
diff changeset
722 message, comments, user, date, patchfound = self.readheaders(patch)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
723
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
724 patchf = self.opener(patch, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
725 if comments:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
726 comments = "\n".join(comments) + '\n\n'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
727 patchf.write(comments)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
728
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
729 tip = repo.changelog.tip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
730 if top == tip:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
731 # if the top of our patch queue is also the tip, there is an
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
732 # optimization here. We update the dirstate in place and strip
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
733 # off the tip commit. Then just commit the current directory
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
734 # tree. We can also send repo.commit the list of files
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
735 # changed to speed up the diff
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
736 #
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
737 # in short mode, we only diff the files included in the
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
738 # patch already
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
739 #
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
740 # this should really read:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
741 #(cc, dd, aa, aa2, uu) = repo.changes(tip, patchparent)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
742 # but we do it backwards to take advantage of manifest/chlog
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
743 # caching against the next repo.changes call
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
744 #
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
745 (cc, aa, dd, aa2, uu) = repo.changes(patchparent, tip)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
746 if short:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
747 filelist = cc + aa + dd
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
748 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
749 filelist = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
750 (c, a, r, d, u) = repo.changes(None, None, filelist)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
751
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
752 # we might end up with files that were added between tip and
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
753 # the dirstate parent, but then changed in the local dirstate.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
754 # in this case, we want them to only show up in the added section
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
755 for x in c:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
756 if x not in aa:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
757 cc.append(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
758 # we might end up with files added by the local dirstate that
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
759 # were deleted by the patch. In this case, they should only
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
760 # show up in the changed section.
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
761 for x in a:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
762 if x in dd:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
763 del dd[dd.index(x)]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
764 cc.append(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
765 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
766 aa.append(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
767 # make sure any files deleted in the local dirstate
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
768 # are not in the add or change column of the patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
769 forget = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
770 for x in d + r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
771 if x in aa:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
772 del aa[aa.index(x)]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
773 forget.append(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
774 continue
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
775 elif x in cc:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
776 del cc[cc.index(x)]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
777 dd.append(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
778
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
779 c = list(util.unique(cc))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
780 r = list(util.unique(dd))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
781 a = list(util.unique(aa))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
782 filelist = list(util.unique(c + r + a ))
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
783 commands.dodiff(patchf, self.ui, repo, patchparent, None,
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
784 filelist, changes=(c, a, r, [], u))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
785 patchf.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
786
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
787 changes = repo.changelog.read(tip)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
788 repo.dirstate.setparents(*cparents)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
789 repo.dirstate.update(a, 'a')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
790 repo.dirstate.update(r, 'r')
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
791 repo.dirstate.update(c, 'n')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
792 repo.dirstate.forget(forget)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
793
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
794 if not message:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
795 message = "patch queue: %s\n" % patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
796 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
797 message = "\n".join(message)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
798 self.strip(repo, top, update=False, backup='strip', wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
799 n = repo.commit(filelist, message, changes[1], force=1, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
800 self.applied[-1] = revlog.hex(n) + ':' + patch
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
801 self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
802 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
803 commands.dodiff(patchf, self.ui, repo, patchparent, None)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
804 patchf.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
805 self.pop(repo, force=True, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
806 self.push(repo, force=True, wlock=wlock)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
807
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
808 def init(self, repo, create=False):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
809 if os.path.isdir(self.path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
810 raise util.Abort("patch queue directory already exists")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
811 os.mkdir(self.path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
812 if create:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
813 return self.qrepo(create=True)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
814
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
815 def unapplied(self, repo, patch=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
816 if patch and patch not in self.series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
817 self.ui.warn("%s not in the series file\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
818 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
819 if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
820 start = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
821 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
822 start = self.series.index(patch) + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
823 for p in self.series[start:]:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
824 self.ui.write("%s\n" % p)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
825
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
826 def qseries(self, repo, missing=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
827 start = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
828 if not missing:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
829 for p in self.series[:start]:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
830 if self.ui.verbose:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
831 self.ui.write("%d A " % self.series.index(p))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
832 self.ui.write("%s\n" % p)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
833 for p in self.series[start:]:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
834 if self.ui.verbose:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
835 self.ui.write("%d U " % self.series.index(p))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
836 self.ui.write("%s\n" % p)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
837 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
838 list = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
839 for root, dirs, files in os.walk(self.path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
840 d = root[len(self.path) + 1:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
841 for f in files:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
842 fl = os.path.join(d, f)
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
843 if (fl not in self.series and
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
844 fl not in (self.status_path, self.series_path)
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
845 and not fl.startswith('.')):
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
846 list.append(fl)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
847 list.sort()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
848 if list:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
849 for x in list:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
850 if self.ui.verbose:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
851 self.ui.write("D ")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
852 self.ui.write("%s\n" % x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
853
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
854 def issaveline(self, l):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
855 name = l.split(':')[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
856 if name == '.hg.patches.save.line':
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
857 return True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
858
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
859 def qrepo(self, create=False):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
860 if create or os.path.isdir(os.path.join(self.path, ".hg")):
1839
876e4e6ad82b Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1810
diff changeset
861 return hg.repository(self.ui, path=self.path, create=create)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
862
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
863 def restore(self, repo, rev, delete=None, qupdate=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
864 c = repo.changelog.read(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
865 desc = c[4].strip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
866 lines = desc.splitlines()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
867 i = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
868 datastart = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
869 series = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
870 applied = []
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
871 qpp = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
872 for i in xrange(0, len(lines)):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
873 if lines[i] == 'Patch Data:':
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
874 datastart = i + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
875 elif lines[i].startswith('Dirstate:'):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
876 l = lines[i].rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
877 l = l[10:].split(' ')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
878 qpp = [ hg.bin(x) for x in l ]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
879 elif datastart != None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
880 l = lines[i].rstrip()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
881 index = l.index(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
882 id = l[:index]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
883 file = l[index + 1:]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
884 if id:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
885 applied.append(l)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
886 series.append(file)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
887 if datastart == None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
888 self.ui.warn("No saved patch data found\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
889 return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
890 self.ui.warn("restoring status: %s\n" % lines[0])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
891 self.full_series = series
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
892 self.applied = applied
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
893 self.read_series(self.full_series)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
894 self.series_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
895 self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
896 heads = repo.changelog.heads()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
897 if delete:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
898 if rev not in heads:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
899 self.ui.warn("save entry has children, leaving it alone\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
900 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
901 self.ui.warn("removing save entry %s\n" % hg.short(rev))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
902 pp = repo.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
903 if rev in pp:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
904 update = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
905 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
906 update = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
907 self.strip(repo, rev, update=update, backup='strip')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
908 if qpp:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
909 self.ui.warn("saved queue repository parents: %s %s\n" %
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
910 (hg.short(qpp[0]), hg.short(qpp[1])))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
911 if qupdate:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
912 print "queue directory updating"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
913 r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
914 if not r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
915 self.ui.warn("Unable to load queue repository\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
916 return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
917 r.update(qpp[0], allow=False, force=True)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
918
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
919 def save(self, repo, msg=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
920 if len(self.applied) == 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
921 self.ui.warn("save: no patches applied, exiting\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
922 return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
923 if self.issaveline(self.applied[-1]):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
924 self.ui.warn("status is already saved\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
925 return 1
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
926
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
927 ar = [ ':' + x for x in self.full_series ]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
928 if not msg:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
929 msg = "hg patches saved state"
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
930 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
931 msg = "hg patches: " + msg.rstrip('\r\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
932 r = self.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
933 if r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
934 pp = r.dirstate.parents()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
935 msg += "\nDirstate: %s %s" % (hg.hex(pp[0]), hg.hex(pp[1]))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
936 msg += "\n\nPatch Data:\n"
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
937 text = msg + "\n".join(self.applied) + '\n' + (ar and "\n".join(ar)
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
938 + '\n' or "")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
939 n = repo.commit(None, text, user=None, force=1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
940 if not n:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
941 self.ui.warn("repo commit failed\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
942 return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
943 self.applied.append(revlog.hex(n) + ":" + '.hg.patches.save.line')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
944 self.applied_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
945
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
946 def series_end(self):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
947 end = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
948 if len(self.applied) > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
949 (top, p) = self.applied[-1].split(':')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
950 try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
951 end = self.series.index(p)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
952 except ValueError:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
953 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
954 return end + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
955 return end
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
956
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
957 def qapplied(self, repo, patch=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
958 if patch and patch not in self.series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
959 self.ui.warn("%s not in the series file\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
960 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
961 if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
962 end = len(self.applied)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
963 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
964 end = self.series.index(patch) + 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
965 for x in xrange(end):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
966 p = self.appliedname(x)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
967 self.ui.write("%s\n" % p)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
968
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
969 def appliedname(self, index):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
970 p = self.applied[index]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
971 if not self.ui.verbose:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
972 p = p.split(':')[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
973 return p
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
974
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
975 def top(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
976 if len(self.applied):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
977 p = self.appliedname(-1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
978 self.ui.write(p + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
979 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
980 self.ui.write("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
981
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
982 def next(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
983 end = self.series_end()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
984 if end == len(self.series):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
985 self.ui.write("All patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
986 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
987 self.ui.write(self.series[end] + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
988
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
989 def prev(self, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
990 if len(self.applied) > 1:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
991 p = self.appliedname(-2)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
992 self.ui.write(p + '\n')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
993 elif len(self.applied) == 1:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
994 self.ui.write("Only one patch applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
995 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
996 self.ui.write("No patches applied\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
997
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
998 def qimport(self, repo, files, patch=None, existing=None, force=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
999 if len(files) > 1 and patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1000 self.ui.warn("-n option not valid when importing multiple files\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1001 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1002 i = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1003 for filename in files:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1004 if existing:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1005 if not patch:
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1006 patch = filename
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1007 if not os.path.isfile(os.path.join(self.path, patch)):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1008 self.ui.warn("patch %s does not exist\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1009 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1010 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1011 try:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1012 text = file(filename).read()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1013 except IOError:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1014 self.ui.warn("Unable to read %s\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1015 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1016 if not patch:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1017 patch = os.path.split(filename)[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1018 if not force and os.path.isfile(os.path.join(self.path, patch)):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1019 self.ui.warn("patch %s already exists\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1020 sys.exit(1)
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
1021 patchf = self.opener(patch, "w")
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1022 patchf.write(text)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1023 if patch in self.series:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1024 self.ui.warn("patch %s is already in the series file\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1025 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1026 index = self.series_end() + i
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1027 self.full_series[index:index] = [patch]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1028 self.read_series(self.full_series)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1029 self.ui.warn("adding %s to series file\n" % patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1030 i += 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1031 patch = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1032 self.series_dirty = 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1033
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1034 def delete(ui, repo, patch, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1035 """remove a patch from the series file"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1036 q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1037 q.delete(repo, patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1038 q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1039 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1040
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1041 def applied(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1042 """print the patches already applied"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1043 repomap[repo].qapplied(repo, patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1044 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1045
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1046 def unapplied(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1047 """print the patches not yet applied"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1048 repomap[repo].unapplied(repo, patch)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1049 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1050
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1051 def qimport(ui, repo, *filename, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1052 """import a patch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1053 q = repomap[repo]
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1054 q.qimport(repo, filename, patch=opts['name'],
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1055 existing=opts['existing'], force=opts['force'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1056 q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1057 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1058
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1059 def init(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1060 """init a new queue repository"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1061 q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1062 r = q.init(repo, create=opts['create_repo'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1063 q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1064 if r:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1065 fp = r.wopener('.hgignore', 'w')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1066 print >> fp, 'syntax: glob'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1067 print >> fp, 'status'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1068 fp.close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1069 r.wopener('series', 'w').close()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1070 r.add(['.hgignore', 'series'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1071 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1072
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1073 def commit(ui, repo, *pats, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1074 q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1075 r = q.qrepo()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1076 if not r: raise util.Abort('no queue repository')
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1077 commands.commit(r.ui, r, *pats, **opts)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1078
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1079 def series(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1080 """print the entire series file"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1081 repomap[repo].qseries(repo, missing=opts['missing'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1082 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1083
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1084 def top(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1085 """print the name of the current patch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1086 repomap[repo].top(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1087 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1088
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1089 def next(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1090 """print the name of the next patch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1091 repomap[repo].next(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1092 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1093
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1094 def prev(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1095 """print the name of the previous patch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1096 repomap[repo].prev(repo)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1097 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1098
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1099 def new(ui, repo, patch, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1100 """create a new patch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1101 q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1102 q.new(repo, patch, msg=opts['message'], force=opts['force'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1103 q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1104 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1105
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1106 def refresh(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1107 """update the current patch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1108 q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1109 q.refresh(repo, short=opts['short'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1110 q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1111 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1112
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1113 def diff(ui, repo, *files, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1114 """diff of the current patch"""
2097
4d2c2597876f Fix hg qdiff <file>
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2086
diff changeset
1115 # deep in the dirstate code, the walkhelper method wants a list, not a tuple
4d2c2597876f Fix hg qdiff <file>
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2086
diff changeset
1116 repomap[repo].diff(repo, list(files))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1117 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1118
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1119 def lastsavename(path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1120 (dir, base) = os.path.split(path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1121 names = os.listdir(dir)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1122 namere = re.compile("%s.([0-9]+)" % base)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1123 max = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1124 maxname = None
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1125 for f in names:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1126 m = namere.match(f)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1127 if m:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1128 index = int(m.group(1))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1129 if max == None or index > max:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1130 max = index
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1131 maxname = f
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1132 if maxname:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1133 return (os.path.join(dir, maxname), max)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1134 return (None, None)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1135
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1136 def savename(path):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1137 (last, index) = lastsavename(path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1138 if last is None:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1139 index = 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1140 newpath = path + ".%d" % (index + 1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1141 return newpath
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1142
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1143 def push(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1144 """push the next patch onto the stack"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1145 q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1146 mergeq = None
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1147
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1148 if opts['all']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1149 patch = q.series[-1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1150 if opts['merge']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1151 if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1152 newpath = opts['name']
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1153 else:
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1154 newpath, i = lastsavename(q.path)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1155 if not newpath:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1156 ui.warn("no saved queues found, please use -n\n")
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1157 return 1
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1158 mergeq = queue(ui, repo.join(""), newpath)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1159 ui.warn("merging with queue at: %s\n" % mergeq.path)
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1160 ret = q.push(repo, patch, force=opts['force'], list=opts['list'],
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1161 mergeq=mergeq)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1162 q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1163 return ret
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1164
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1165 def pop(ui, repo, patch=None, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1166 """pop the current patch off the stack"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1167 localupdate = True
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1168 if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1169 q = queue(ui, repo.join(""), repo.join(opts['name']))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1170 ui.warn('using patch queue: %s\n' % q.path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1171 localupdate = False
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1172 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1173 q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1174 if opts['all'] and len(q.applied) > 0:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1175 patch = q.applied[0].split(':')[1]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1176 q.pop(repo, patch, force=opts['force'], update=localupdate)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1177 q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1178 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1179
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1180 def restore(ui, repo, rev, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1181 """restore the queue state saved by a rev"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1182 rev = repo.lookup(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1183 q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1184 q.restore(repo, rev, delete=opts['delete'],
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1185 qupdate=opts['update'])
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1186 q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1187 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1188
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1189 def save(ui, repo, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1190 """save current queue state"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1191 q = repomap[repo]
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1192 ret = q.save(repo, msg=opts['message'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1193 if ret:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1194 return ret
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1195 q.save_dirty()
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1196 if opts['copy']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1197 path = q.path
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1198 if opts['name']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1199 newpath = os.path.join(q.basepath, opts['name'])
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1200 if os.path.exists(newpath):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1201 if not os.path.isdir(newpath):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1202 ui.warn("destination %s exists and is not a directory\n" %
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1203 newpath)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1204 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1205 if not opts['force']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1206 ui.warn("destination %s exists, use -f to force\n" %
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1207 newpath)
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1208 sys.exit(1)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1209 else:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1210 newpath = savename(path)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1211 ui.warn("copy %s to %s\n" % (path, newpath))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1212 util.copyfiles(path, newpath)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1213 if opts['empty']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1214 try:
1852
fdf9cbf56ec7 Fix mq's usage of opener, which don't allow absolute paths now.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1839
diff changeset
1215 os.unlink(os.path.join(q.path, q.status_path))
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1216 except:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1217 pass
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1218 return 0
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1219
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1220 def strip(ui, repo, rev, **opts):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1221 """strip a revision and all later revs on the same branch"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1222 rev = repo.lookup(rev)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1223 backup = 'all'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1224 if opts['backup']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1225 backup = 'strip'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1226 elif opts['nobackup']:
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1227 backup = 'none'
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1228 repomap[repo].strip(repo, rev, backup=backup)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1229 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1230
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1231 def version(ui, q=None):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1232 """print the version number"""
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1233 ui.write("mq version %s\n" % versionstr)
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1234 return 0
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1235
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1236 def reposetup(ui, repo):
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1237 repomap[repo] = queue(ui, repo.join(""))
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1238
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1239 cmdtable = {
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1240 "qapplied": (applied, [], 'hg qapplied [PATCH]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1241 "qcommit|qci":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1242 (commit,
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1243 commands.table["^commit|ci"][1],
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1244 'hg qcommit [OPTION]... [FILE]...'),
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1245 "^qdiff": (diff, [], 'hg qdiff [FILE]...'),
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1246 "qdelete": (delete, [], 'hg qdelete PATCH'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1247 "^qimport":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1248 (qimport,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1249 [('e', 'existing', None, 'import file in patch dir'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1250 ('n', 'name', '', 'patch file name'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1251 ('f', 'force', None, 'overwrite existing files')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1252 'hg qimport [-e] [-n NAME] [-f] FILE...'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1253 "^qinit":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1254 (init,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1255 [('c', 'create-repo', None, 'create patch repository')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1256 'hg qinit [-c]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1257 "qnew":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1258 (new,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1259 [('m', 'message', '', 'commit message'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1260 ('f', 'force', None, 'force')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1261 'hg qnew [-m TEXT] [-f] PATCH'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1262 "qnext": (next, [], 'hg qnext'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1263 "qprev": (prev, [], 'hg qprev'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1264 "^qpop":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1265 (pop,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1266 [('a', 'all', None, 'pop all patches'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1267 ('n', 'name', '', 'queue name to pop'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1268 ('f', 'force', None, 'forget any local changes')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1269 'hg qpop [-a] [-n NAME] [-f] [PATCH | INDEX]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1270 "^qpush":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1271 (push,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1272 [('f', 'force', None, 'apply if the patch has rejects'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1273 ('l', 'list', None, 'list patch name in commit text'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1274 ('a', 'all', None, 'apply all patches'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1275 ('m', 'merge', None, 'merge from another queue'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1276 ('n', 'name', '', 'merge queue name')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1277 'hg qpush [-f] [-l] [-a] [-m] [-n NAME] [PATCH | INDEX]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1278 "^qrefresh":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1279 (refresh,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1280 [('s', 'short', None, 'short refresh')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1281 'hg qrefresh [-s]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1282 "qrestore":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1283 (restore,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1284 [('d', 'delete', None, 'delete save entry'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1285 ('u', 'update', None, 'update queue working dir')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1286 'hg qrestore [-d] [-u] REV'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1287 "qsave":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1288 (save,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1289 [('m', 'message', '', 'commit message'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1290 ('c', 'copy', None, 'copy patch directory'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1291 ('n', 'name', '', 'copy directory name'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1292 ('e', 'empty', None, 'clear queue status file'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1293 ('f', 'force', None, 'force copy')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1294 'hg qsave [-m TEXT] [-c] [-n NAME] [-e] [-f]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1295 "qseries":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1296 (series,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1297 [('m', 'missing', None, 'print patches not in series')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1298 'hg qseries [-m]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1299 "^strip":
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1300 (strip,
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1301 [('f', 'force', None, 'force multi-head removal'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1302 ('b', 'backup', None, 'bundle unrelated changesets'),
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1303 ('n', 'nobackup', None, 'no backups')],
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1304 'hg strip [-f] [-b] [-n] REV'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1305 "qtop": (top, [], 'hg qtop'),
2185
5acd648770d0 Better help for mq: Corrected synopses, get qcommit options from commands.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2097
diff changeset
1306 "qunapplied": (unapplied, [], 'hg qunapplied [PATCH]'),
1810
7596611ab3d5 Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1808
diff changeset
1307 "qversion": (version, [], 'hg qversion')
1808
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1308 }
7036cd7f770d Add mq extension
mason@suse.com
parents:
diff changeset
1309