# HG changeset patch # User Patrick Mezard # Date 1199228240 -3600 # Node ID c1244685425a7405d94a2774592b749f89a21ca5 # Parent 0d583ade58178bdce652353f99316f446d96d3a2 convert: fix parents of last fetched svn revision diff -r 0d583ade5817 -r c1244685425a hgext/convert/subversion.py --- a/hgext/convert/subversion.py Thu Jan 17 23:46:56 2008 +0100 +++ b/hgext/convert/subversion.py Tue Jan 01 23:57:20 2008 +0100 @@ -258,7 +258,7 @@ self.module = module self.reparent(module) stop = self.lastrevs.get(module, 0) - self._fetch_revisions(from_revnum=revnum, to_revnum=stop) + self._fetch_revisions(revnum, stop) commit = self.commits[rev] # caller caches the result, so free it here to release memory del self.commits[rev] @@ -571,7 +571,10 @@ return (entries, copies) - def _fetch_revisions(self, from_revnum = 0, to_revnum = 347): + def _fetch_revisions(self, from_revnum, to_revnum): + if from_revnum < to_revnum: + from_revnum, to_revnum = to_revnum, from_revnum + self.child_cset = None def parselogentry(orig_paths, revnum, author, date, message): self.ui.debug("parsing revision %d (%d changes)\n" % @@ -585,9 +588,9 @@ rev = self.revid(revnum) # branch log might return entries for a parent we already have - if (rev in self.commits or - (revnum < self.lastrevs.get(self.module, 0))): - return + + if (rev in self.commits or revnum < to_revnum): + return None parents = [] # check whether this revision is the start of a branch @@ -642,20 +645,36 @@ if self.child_cset and not self.child_cset.parents: self.child_cset.parents = [rev] self.child_cset = cset + return cset self.ui.note('fetching revision log for "%s" from %d to %d\n' % (self.module, from_revnum, to_revnum)) try: + firstcset = None for entry in self.get_log([self.module], from_revnum, to_revnum): - orig_paths, revnum, author, date, message = entry + paths, revnum, author, date, message = entry if self.is_blacklisted(revnum): self.ui.note('skipping blacklisted revision %d\n' % revnum) continue - if orig_paths is None: + if paths is None: self.ui.debug('revision %d has no entries\n' % revnum) continue - parselogentry(orig_paths, revnum, author, date, message) + cset = parselogentry(paths, revnum, author, date, message) + if cset: + firstcset = cset + + if firstcset and not firstcset.parents: + # The first revision of the sequence (the last fetched one) + # has invalid parents if not a branch root. Find the parent + # revision now, if any. + try: + firstrevnum = self.revnum(firstcset.rev) + if firstrevnum > 1: + latest = self.latest(self.module, firstrevnum - 1) + firstcset.parents.append(self.revid(latest)) + except util.Abort: + pass except SubversionException, (inst, num): if num == svn.core.SVN_ERR_FS_NO_SUCH_REVISION: raise NoSuchRevision(branch=self,