comparison hgext/convert/cvs.py @ 8048:d22432bdcba1

convert/cvs: delay CVS log parsing after initialization (issue1581/2) Source and destination constructors should be fast so configurations issues are hit quickly, including authentication and filemap/authormap/splicemap issues. Delaying might be a problem if the remove side disconnects idle connections while the log is being read. It did not happen when converting openafs repository, where log retrieval took at least 10mn.
author Patrick Mezard <pmezard@gmail.com>
date Sat, 11 Apr 2009 21:17:11 +0200
parents d812029cda85
children 6584953be356
comparison
equal deleted inserted replaced
8047:04c62275cbc7 8048:d22432bdcba1
22 self.builtin = cvspsexe == 'builtin' 22 self.builtin = cvspsexe == 'builtin'
23 23
24 if not self.builtin: 24 if not self.builtin:
25 checktool(cvspsexe) 25 checktool(cvspsexe)
26 26
27 self.changeset = {} 27 self.changeset = None
28 self.files = {} 28 self.files = {}
29 self.tags = {} 29 self.tags = {}
30 self.lastbranch = {} 30 self.lastbranch = {}
31 self.parent = {} 31 self.parent = {}
32 self.socket = None 32 self.socket = None
33 self.cvsroot = file(os.path.join(cvs, "Root")).read()[:-1] 33 self.cvsroot = file(os.path.join(cvs, "Root")).read()[:-1]
34 self.cvsrepo = file(os.path.join(cvs, "Repository")).read()[:-1] 34 self.cvsrepo = file(os.path.join(cvs, "Repository")).read()[:-1]
35 self.encoding = locale.getpreferredencoding() 35 self.encoding = locale.getpreferredencoding()
36 36
37 self._parse(ui)
38 self._connect() 37 self._connect()
39 38
40 def _parse(self, ui): 39 def _parse(self):
41 if self.changeset: 40 if self.changeset is not None:
42 return 41 return
42 self.changeset = {}
43 43
44 maxrev = 0 44 maxrev = 0
45 cmd = self.cmd 45 cmd = self.cmd
46 if self.rev: 46 if self.rev:
47 # TODO: handle tags 47 # TODO: handle tags
63 state = 0 63 state = 0
64 filerevids = {} 64 filerevids = {}
65 65
66 if self.builtin: 66 if self.builtin:
67 # builtin cvsps code 67 # builtin cvsps code
68 ui.status(_('using builtin cvsps\n')) 68 self.ui.status(_('using builtin cvsps\n'))
69 69
70 db = cvsps.createlog(ui, cache='update') 70 db = cvsps.createlog(self.ui, cache='update')
71 db = cvsps.createchangeset(ui, db, 71 db = cvsps.createchangeset(self.ui, db,
72 fuzz=int(ui.config('convert', 'cvsps.fuzz', 60)), 72 fuzz=int(self.ui.config('convert', 'cvsps.fuzz', 60)),
73 mergeto=ui.config('convert', 'cvsps.mergeto', None), 73 mergeto=self.ui.config('convert', 'cvsps.mergeto', None),
74 mergefrom=ui.config('convert', 'cvsps.mergefrom', None)) 74 mergefrom=self.ui.config('convert', 'cvsps.mergefrom', None))
75 75
76 for cs in db: 76 for cs in db:
77 if maxrev and cs.id>maxrev: 77 if maxrev and cs.id>maxrev:
78 break 78 break
79 id = str(cs.id) 79 id = str(cs.id)
276 self.writep.write("UseUnchanged\n") 276 self.writep.write("UseUnchanged\n")
277 self.writep.flush() 277 self.writep.flush()
278 r = self.readp.readline() 278 r = self.readp.readline()
279 279
280 def getheads(self): 280 def getheads(self):
281 self._parse()
281 return self.heads 282 return self.heads
282 283
283 def _getfile(self, name, rev): 284 def _getfile(self, name, rev):
284 285
285 def chunkedread(fp, count): 286 def chunkedread(fp, count):
330 self.readp.readline() 331 self.readp.readline()
331 else: 332 else:
332 raise util.Abort(_("unknown CVS response: %s") % line) 333 raise util.Abort(_("unknown CVS response: %s") % line)
333 334
334 def getfile(self, file, rev): 335 def getfile(self, file, rev):
336 self._parse()
335 data, mode = self._getfile(file, rev) 337 data, mode = self._getfile(file, rev)
336 self.modecache[(file, rev)] = mode 338 self.modecache[(file, rev)] = mode
337 return data 339 return data
338 340
339 def getmode(self, file, rev): 341 def getmode(self, file, rev):
340 return self.modecache[(file, rev)] 342 return self.modecache[(file, rev)]
341 343
342 def getchanges(self, rev): 344 def getchanges(self, rev):
345 self._parse()
343 self.modecache = {} 346 self.modecache = {}
344 return util.sort(self.files[rev].items()), {} 347 return util.sort(self.files[rev].items()), {}
345 348
346 def getcommit(self, rev): 349 def getcommit(self, rev):
350 self._parse()
347 return self.changeset[rev] 351 return self.changeset[rev]
348 352
349 def gettags(self): 353 def gettags(self):
354 self._parse()
350 return self.tags 355 return self.tags
351 356
352 def getchangedfiles(self, rev, i): 357 def getchangedfiles(self, rev, i):
358 self._parse()
353 return util.sort(self.files[rev].keys()) 359 return util.sort(self.files[rev].keys())