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 |
|
|
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