##// END OF EJS Templates
convert: optimize convert of files that are unmodified from p2 in merges...
Mads Kiilerich -
r24395:216fa1ba default
parent child Browse files
Show More
@@ -143,7 +143,8 b' class bzr_source(converter_source):'
143 parentids = self._parentids.pop(version)
143 parentids = self._parentids.pop(version)
144 # only diff against first parent id
144 # only diff against first parent id
145 prevtree = self.sourcerepo.revision_tree(parentids[0])
145 prevtree = self.sourcerepo.revision_tree(parentids[0])
146 return self._gettreechanges(self._revtree, prevtree)
146 files, changes = self._gettreechanges(self._revtree, prevtree)
147 return files, changes, set()
147
148
148 def getcommit(self, version):
149 def getcommit(self, version):
149 rev = self.sourcerepo.get_revision(version)
150 rev = self.sourcerepo.get_revision(version)
@@ -97,7 +97,7 b' class converter_source(object):'
97 raise NotImplementedError
97 raise NotImplementedError
98
98
99 def getchanges(self, version, full):
99 def getchanges(self, version, full):
100 """Returns a tuple of (files, copies).
100 """Returns a tuple of (files, copies, cleanp2).
101
101
102 files is a sorted list of (filename, id) tuples for all files
102 files is a sorted list of (filename, id) tuples for all files
103 changed between version and its first parent returned by
103 changed between version and its first parent returned by
@@ -105,6 +105,10 b' class converter_source(object):'
105 id is the source revision id of the file.
105 id is the source revision id of the file.
106
106
107 copies is a dictionary of dest: source
107 copies is a dictionary of dest: source
108
109 cleanp2 is the set of files filenames that are clean against p2.
110 (Files that are clean against p1 are already not in files (unless
111 full). This makes it possible to handle p2 clean files similarly.)
108 """
112 """
109 raise NotImplementedError
113 raise NotImplementedError
110
114
@@ -215,7 +219,8 b' class converter_sink(object):'
215 mapping equivalent authors identifiers for each system."""
219 mapping equivalent authors identifiers for each system."""
216 return None
220 return None
217
221
218 def putcommit(self, files, copies, parents, commit, source, revmap, full):
222 def putcommit(self, files, copies, parents, commit, source, revmap, full,
223 cleanp2):
219 """Create a revision with all changed files listed in 'files'
224 """Create a revision with all changed files listed in 'files'
220 and having listed parents. 'commit' is a commit object
225 and having listed parents. 'commit' is a commit object
221 containing at a minimum the author, date, and message for this
226 containing at a minimum the author, date, and message for this
@@ -225,6 +230,8 b' class converter_sink(object):'
225 of source revisions to converted revisions. Only getfile() and
230 of source revisions to converted revisions. Only getfile() and
226 lookuprev() should be called on 'source'. 'full' means that 'files'
231 lookuprev() should be called on 'source'. 'full' means that 'files'
227 is complete and all other files should be removed.
232 is complete and all other files should be removed.
233 'cleanp2' is a set of the filenames that are unchanged from p2
234 (only in the common merge case where there two parents).
228
235
229 Note that the sink repository is not told to update itself to
236 Note that the sink repository is not told to update itself to
230 a particular revision (or even what that revision would be)
237 a particular revision (or even what that revision would be)
@@ -397,7 +397,7 b' class converter(object):'
397 dest = self.map[changes]
397 dest = self.map[changes]
398 self.map[rev] = dest
398 self.map[rev] = dest
399 return
399 return
400 files, copies = changes
400 files, copies, cleanp2 = changes
401 pbranches = []
401 pbranches = []
402 if commit.parents:
402 if commit.parents:
403 for prev in commit.parents:
403 for prev in commit.parents:
@@ -413,6 +413,8 b' class converter(object):'
413 parents = [self.map.get(p, p) for p in parents]
413 parents = [self.map.get(p, p) for p in parents]
414 except KeyError:
414 except KeyError:
415 parents = [b[0] for b in pbranches]
415 parents = [b[0] for b in pbranches]
416 if len(pbranches) != 2:
417 cleanp2 = set()
416 if len(parents) < 3:
418 if len(parents) < 3:
417 source = progresssource(self.ui, self.source, len(files))
419 source = progresssource(self.ui, self.source, len(files))
418 else:
420 else:
@@ -423,7 +425,7 b' class converter(object):'
423 source = progresssource(self.ui, self.source,
425 source = progresssource(self.ui, self.source,
424 len(files) * (len(parents) - 1))
426 len(files) * (len(parents) - 1))
425 newnode = self.dest.putcommit(files, copies, parents, commit,
427 newnode = self.dest.putcommit(files, copies, parents, commit,
426 source, self.map, full)
428 source, self.map, full, cleanp2)
427 source.close()
429 source.close()
428 self.source.converted(rev, newnode)
430 self.source.converted(rev, newnode)
429 self.map[rev] = newnode
431 self.map[rev] = newnode
@@ -262,7 +262,7 b' class convert_cvs(converter_source):'
262 if full:
262 if full:
263 raise util.Abort(_("convert from cvs do not support --full"))
263 raise util.Abort(_("convert from cvs do not support --full"))
264 self._parse()
264 self._parse()
265 return sorted(self.files[rev].iteritems()), {}
265 return sorted(self.files[rev].iteritems()), {}, set()
266
266
267 def getcommit(self, rev):
267 def getcommit(self, rev):
268 self._parse()
268 self._parse()
@@ -188,7 +188,7 b' class darcs_source(converter_source, com'
188 changes.append((elt.text.strip(), rev))
188 changes.append((elt.text.strip(), rev))
189 self.pull(rev)
189 self.pull(rev)
190 self.lastrev = rev
190 self.lastrev = rev
191 return sorted(changes), copies
191 return sorted(changes), copies, set()
192
192
193 def getfile(self, name, rev):
193 def getfile(self, name, rev):
194 if rev != self.lastrev:
194 if rev != self.lastrev:
@@ -384,12 +384,15 b' class filemap_source(converter_source):'
384 # Get the real changes and do the filtering/mapping. To be
384 # Get the real changes and do the filtering/mapping. To be
385 # able to get the files later on in getfile, we hide the
385 # able to get the files later on in getfile, we hide the
386 # original filename in the rev part of the return value.
386 # original filename in the rev part of the return value.
387 changes, copies = self.base.getchanges(rev, full)
387 changes, copies, cleanp2 = self.base.getchanges(rev, full)
388 files = {}
388 files = {}
389 ncleanp2 = set(cleanp2)
389 for f, r in changes:
390 for f, r in changes:
390 newf = self.filemapper(f)
391 newf = self.filemapper(f)
391 if newf and (newf != f or newf not in files):
392 if newf and (newf != f or newf not in files):
392 files[newf] = (f, r)
393 files[newf] = (f, r)
394 if newf != f:
395 ncleanp2.discard(f)
393 files = sorted(files.items())
396 files = sorted(files.items())
394
397
395 ncopies = {}
398 ncopies = {}
@@ -400,7 +403,7 b' class filemap_source(converter_source):'
400 if newsource:
403 if newsource:
401 ncopies[newc] = newsource
404 ncopies[newc] = newsource
402
405
403 return files, ncopies
406 return files, ncopies, ncleanp2
404
407
405 def getfile(self, name, rev):
408 def getfile(self, name, rev):
406 realname, realrev = rev
409 realname, realrev = rev
@@ -264,7 +264,7 b' class convert_git(converter_source):'
264 else:
264 else:
265 self.retrievegitmodules(version)
265 self.retrievegitmodules(version)
266 changes.append(('.hgsubstate', ''))
266 changes.append(('.hgsubstate', ''))
267 return (changes, copies)
267 return (changes, copies, set())
268
268
269 def getcommit(self, version):
269 def getcommit(self, version):
270 c = self.catfile(version, "commit") # read the commit hash
270 c = self.catfile(version, "commit") # read the commit hash
@@ -171,7 +171,7 b' class gnuarch_source(converter_source, c'
171 copies.update(cps)
171 copies.update(cps)
172
172
173 self.lastrev = rev
173 self.lastrev = rev
174 return sorted(set(changes)), copies
174 return sorted(set(changes)), copies, set()
175
175
176 def getcommit(self, rev):
176 def getcommit(self, rev):
177 changes = self.changes[rev]
177 changes = self.changes[rev]
@@ -132,9 +132,14 b' class mercurial_sink(converter_sink):'
132 fp.write('%s %s\n' % (revid, s[1]))
132 fp.write('%s %s\n' % (revid, s[1]))
133 return fp.getvalue()
133 return fp.getvalue()
134
134
135 def putcommit(self, files, copies, parents, commit, source, revmap, full):
135 def putcommit(self, files, copies, parents, commit, source, revmap, full,
136 cleanp2):
136 files = dict(files)
137 files = dict(files)
138
137 def getfilectx(repo, memctx, f):
139 def getfilectx(repo, memctx, f):
140 if p2ctx and f in cleanp2 and f not in copies:
141 self.ui.debug('reusing %s from p2\n' % f)
142 return p2ctx[f]
138 try:
143 try:
139 v = files[f]
144 v = files[f]
140 except KeyError:
145 except KeyError:
@@ -199,6 +204,9 b' class mercurial_sink(converter_sink):'
199 while parents:
204 while parents:
200 p1 = p2
205 p1 = p2
201 p2 = parents.pop(0)
206 p2 = parents.pop(0)
207 p2ctx = None
208 if p2 != nullid:
209 p2ctx = self.repo[p2]
202 fileset = set(files)
210 fileset = set(files)
203 if full:
211 if full:
204 fileset.update(self.repo[p1])
212 fileset.update(self.repo[p1])
@@ -382,9 +390,13 b' class mercurial_source(converter_source)'
382 # getcopies() is also run for roots and before filtering so missing
390 # getcopies() is also run for roots and before filtering so missing
383 # revlogs are detected early
391 # revlogs are detected early
384 copies = self.getcopies(ctx, parents, copyfiles)
392 copies = self.getcopies(ctx, parents, copyfiles)
393 cleanp2 = set()
394 if len(parents) == 2:
395 cleanp2.update(self.repo.status(parents[1].node(), ctx.node(),
396 clean=True).clean)
385 changes = [(f, rev) for f in files if f not in self.ignored]
397 changes = [(f, rev) for f in files if f not in self.ignored]
386 changes.sort()
398 changes.sort()
387 return changes, copies
399 return changes, copies, cleanp2
388
400
389 def getcopies(self, ctx, parents, files):
401 def getcopies(self, ctx, parents, files):
390 copies = {}
402 copies = {}
@@ -280,7 +280,7 b' class monotone_source(converter_source, '
280 for fromfile in renamed.values():
280 for fromfile in renamed.values():
281 files[fromfile] = rev
281 files[fromfile] = rev
282
282
283 return (files.items(), copies)
283 return (files.items(), copies, set())
284
284
285 def getfile(self, name, rev):
285 def getfile(self, name, rev):
286 if not self.mtnisfile(name, rev):
286 if not self.mtnisfile(name, rev):
@@ -195,7 +195,7 b' class p4_source(converter_source):'
195 def getchanges(self, rev, full):
195 def getchanges(self, rev, full):
196 if full:
196 if full:
197 raise util.Abort(_("convert from p4 do not support --full"))
197 raise util.Abort(_("convert from p4 do not support --full"))
198 return self.files[rev], {}
198 return self.files[rev], {}, set()
199
199
200 def getcommit(self, rev):
200 def getcommit(self, rev):
201 return self.changeset[rev]
201 return self.changeset[rev]
@@ -474,7 +474,7 b' class svn_source(converter_source):'
474 (files, copies) = self._getchanges(rev, full)
474 (files, copies) = self._getchanges(rev, full)
475 # caller caches the result, so free it here to release memory
475 # caller caches the result, so free it here to release memory
476 del self.paths[rev]
476 del self.paths[rev]
477 return (files, copies)
477 return (files, copies, set())
478
478
479 def getchangedfiles(self, rev, i):
479 def getchangedfiles(self, rev, i):
480 # called from filemap - cache computed values for reuse in getchanges
480 # called from filemap - cache computed values for reuse in getchanges
@@ -1240,7 +1240,8 b' class svn_sink(converter_sink, commandli'
1240 def revid(self, rev):
1240 def revid(self, rev):
1241 return u"svn:%s@%s" % (self.uuid, rev)
1241 return u"svn:%s@%s" % (self.uuid, rev)
1242
1242
1243 def putcommit(self, files, copies, parents, commit, source, revmap, full):
1243 def putcommit(self, files, copies, parents, commit, source, revmap, full,
1244 cleanp2):
1244 for parent in parents:
1245 for parent in parents:
1245 try:
1246 try:
1246 return self.revid(self.childmap[parent])
1247 return self.revid(self.childmap[parent])
General Comments 0
You need to be logged in to leave comments. Login now