annotate hgext/mq.py @ 2079:ee96ca273f32

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