Mercurial > hg
comparison hgext/convert/subversion.py @ 5132:78eb03cbe535
Automated merge with http://hg.intevation.org/mercurial/crew
author | Bryan O'Sullivan <bos@serpentine.com> |
---|---|
date | Mon, 06 Aug 2007 14:17:05 -0700 |
parents | 462cc56d898f 39b6eaee6fd7 |
children | 9cda2315c7a9 |
comparison
equal
deleted
inserted
replaced
5131:2f9edf6bae95 | 5132:78eb03cbe535 |
---|---|
22 # e.g. SVN 1.5 or backports. Thanks to the bzr folks for enhancing | 22 # e.g. SVN 1.5 or backports. Thanks to the bzr folks for enhancing |
23 # these bindings. | 23 # these bindings. |
24 | 24 |
25 from cStringIO import StringIO | 25 from cStringIO import StringIO |
26 | 26 |
27 from common import NoRepo, commit, converter_source | 27 from common import NoRepo, commit, converter_source, encodeargs |
28 | 28 |
29 try: | 29 try: |
30 from svn.core import SubversionException, Pool | 30 from svn.core import SubversionException, Pool |
31 import svn | 31 import svn |
32 import svn.client | 32 import svn.client |
55 class changedpath(object): | 55 class changedpath(object): |
56 def __init__(self, p): | 56 def __init__(self, p): |
57 self.copyfrom_path = p.copyfrom_path | 57 self.copyfrom_path = p.copyfrom_path |
58 self.copyfrom_rev = p.copyfrom_rev | 58 self.copyfrom_rev = p.copyfrom_rev |
59 self.action = p.action | 59 self.action = p.action |
60 | |
61 def get_log_child(fp, url, paths, start, end, limit=0, discover_changed_paths=True, | |
62 strict_node_history=False): | |
63 protocol = -1 | |
64 def receiver(orig_paths, revnum, author, date, message, pool): | |
65 if orig_paths is not None: | |
66 for k, v in orig_paths.iteritems(): | |
67 orig_paths[k] = changedpath(v) | |
68 pickle.dump((orig_paths, revnum, author, date, message), | |
69 fp, protocol) | |
70 | |
71 try: | |
72 # Use an ra of our own so that our parent can consume | |
73 # our results without confusing the server. | |
74 t = transport.SvnRaTransport(url=url) | |
75 svn.ra.get_log(t.ra, paths, start, end, limit, | |
76 discover_changed_paths, | |
77 strict_node_history, | |
78 receiver) | |
79 except SubversionException, (_, num): | |
80 pickle.dump(num, fp, protocol) | |
81 else: | |
82 pickle.dump(None, fp, protocol) | |
83 fp.close() | |
60 | 84 |
61 # SVN conversion code stolen from bzr-svn and tailor | 85 # SVN conversion code stolen from bzr-svn and tailor |
62 class convert_svn(converter_source): | 86 class convert_svn(converter_source): |
63 def __init__(self, ui, url, rev=None): | 87 def __init__(self, ui, url, rev=None): |
64 super(convert_svn, self).__init__(ui, url, rev=rev) | 88 super(convert_svn, self).__init__(ui, url, rev=rev) |
194 del self.commits[rev] | 218 del self.commits[rev] |
195 return commit | 219 return commit |
196 | 220 |
197 def get_log(self, paths, start, end, limit=0, discover_changed_paths=True, | 221 def get_log(self, paths, start, end, limit=0, discover_changed_paths=True, |
198 strict_node_history=False): | 222 strict_node_history=False): |
199 '''wrapper for svn.ra.get_log. | |
200 on a large repository, svn.ra.get_log pins huge amounts of | |
201 memory that cannot be recovered. work around it by forking | |
202 and writing results over a pipe.''' | |
203 | |
204 def child(fp): | |
205 protocol = -1 | |
206 def receiver(orig_paths, revnum, author, date, message, pool): | |
207 if orig_paths is not None: | |
208 for k, v in orig_paths.iteritems(): | |
209 orig_paths[k] = changedpath(v) | |
210 pickle.dump((orig_paths, revnum, author, date, message), | |
211 fp, protocol) | |
212 | |
213 try: | |
214 # Use an ra of our own so that our parent can consume | |
215 # our results without confusing the server. | |
216 t = transport.SvnRaTransport(url=self.url) | |
217 svn.ra.get_log(t.ra, paths, start, end, limit, | |
218 discover_changed_paths, | |
219 strict_node_history, | |
220 receiver) | |
221 except SubversionException, (_, num): | |
222 self.ui.print_exc() | |
223 pickle.dump(num, fp, protocol) | |
224 else: | |
225 pickle.dump(None, fp, protocol) | |
226 fp.close() | |
227 | 223 |
228 def parent(fp): | 224 def parent(fp): |
229 while True: | 225 while True: |
230 entry = pickle.load(fp) | 226 entry = pickle.load(fp) |
231 try: | 227 try: |
233 except: | 229 except: |
234 if entry is None: | 230 if entry is None: |
235 break | 231 break |
236 raise SubversionException("child raised exception", entry) | 232 raise SubversionException("child raised exception", entry) |
237 yield entry | 233 yield entry |
238 | 234 |
239 rfd, wfd = os.pipe() | 235 args = [self.url, paths, start, end, limit, discover_changed_paths, |
240 pid = os.fork() | 236 strict_node_history] |
241 if pid: | 237 arg = encodeargs(args) |
242 os.close(wfd) | 238 hgexe = util.hgexecutable() |
243 for p in parent(os.fdopen(rfd, 'rb')): | 239 cmd = '"%s "debug-svn-log""' % util.shellquote(hgexe) |
244 yield p | 240 stdin, stdout = os.popen2(cmd, 'b') |
245 ret = os.waitpid(pid, 0)[1] | 241 |
246 if ret: | 242 stdin.write(arg) |
247 raise util.Abort(_('get_log %s') % util.explain_exit(ret)) | 243 stdin.close() |
248 else: | 244 |
249 os.close(rfd) | 245 for p in parent(stdout): |
250 child(os.fdopen(wfd, 'wb')) | 246 yield p |
251 os._exit(0) | |
252 | 247 |
253 def gettags(self): | 248 def gettags(self): |
254 tags = {} | 249 tags = {} |
255 start = self.revnum(self.head) | 250 start = self.revnum(self.head) |
256 try: | 251 try: |