annotate hgext/mq.py @ 2323:c58a403aa830

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