##// END OF EJS Templates
convert: svn: add an early return to move most changeset parsing out an indent level
Brendan Cully -
r4788:62e1b641 default
parent child Browse files
Show More
@@ -218,207 +218,209 b' class convert_svn(converter_source):'
218 218 copies = {}
219 219 entries = []
220 220 self.ui.debug("Parsing revision %d\n" % revnum)
221 if orig_paths is not None:
222 rev = self.rev(revnum)
223 try:
224 branch = self.module.split("/")[-1]
225 if branch == 'trunk':
226 branch = ''
227 except IndexError:
228 branch = None
221 if orig_paths is None:
222 return
223
224 rev = self.rev(revnum)
225 try:
226 branch = self.module.split("/")[-1]
227 if branch == 'trunk':
228 branch = ''
229 except IndexError:
230 branch = None
229 231
230 for path in orig_paths:
231 # self.ui.write("path %s\n" % path)
232 if path == self.module: # Follow branching back in history
233 ent = orig_paths[path]
234 if ent:
235 if ent.copyfrom_path:
236 self.modulemap[ent.copyfrom_rev] = ent.copyfrom_path
237 else:
238 self.ui.debug("No copyfrom path, don't know what to do.\n")
239 # Maybe it was added and there is no more history.
240 entrypath = get_entry_from_path(path, module=self.module)
241 # self.ui.write("entrypath %s\n" % entrypath)
242 if entrypath is None:
243 # Outside our area of interest
244 self.ui.debug("boring@%s: %s\n" % (revnum, path))
245 continue
246 entry = entrypath.decode(self.encoding)
232 for path in orig_paths:
233 # self.ui.write("path %s\n" % path)
234 if path == self.module: # Follow branching back in history
247 235 ent = orig_paths[path]
248 if not entrypath:
249 # TODO: branch creation event
250 pass
236 if ent:
237 if ent.copyfrom_path:
238 self.modulemap[ent.copyfrom_rev] = ent.copyfrom_path
239 else:
240 self.ui.debug("No copyfrom path, don't know what to do.\n")
241 # Maybe it was added and there is no more history.
242 entrypath = get_entry_from_path(path, module=self.module)
243 # self.ui.write("entrypath %s\n" % entrypath)
244 if entrypath is None:
245 # Outside our area of interest
246 self.ui.debug("boring@%s: %s\n" % (revnum, path))
247 continue
248 entry = entrypath.decode(self.encoding)
249 ent = orig_paths[path]
250 if not entrypath:
251 # TODO: branch creation event
252 pass
251 253
252 kind = svn.ra.check_path(self.ra, entrypath, revnum)
253 if kind == svn.core.svn_node_file:
254 if ent.copyfrom_path:
255 copyfrom_path = get_entry_from_path(ent.copyfrom_path)
256 if copyfrom_path:
257 self.ui.debug("Copied to %s from %s@%s\n" % (entry, copyfrom_path, ent.copyfrom_rev))
258 # It's probably important for hg that the source
259 # exists in the revision's parent, not just the
260 # ent.copyfrom_rev
261 fromkind = svn.ra.check_path(self.ra, copyfrom_path, ent.copyfrom_rev)
262 if fromkind != 0:
263 copies[self.recode(entry)] = self.recode(copyfrom_path)
264 entries.append(self.recode(entry))
265 elif kind == 0: # gone, but had better be a deleted *file*
266 self.ui.debug("gone from %s\n" % ent.copyfrom_rev)
267
268 fromrev = revnum - 1
269 # might always need to be revnum - 1 in these 3 lines?
270 old_module = self.modulemap.get(fromrev, self.module)
271 basepath = old_module + "/" + get_entry_from_path(path, module=self.module)
272 entrypath = old_module + "/" + get_entry_from_path(path, module=self.module)
254 kind = svn.ra.check_path(self.ra, entrypath, revnum)
255 if kind == svn.core.svn_node_file:
256 if ent.copyfrom_path:
257 copyfrom_path = get_entry_from_path(ent.copyfrom_path)
258 if copyfrom_path:
259 self.ui.debug("Copied to %s from %s@%s\n" % (entry, copyfrom_path, ent.copyfrom_rev))
260 # It's probably important for hg that the source
261 # exists in the revision's parent, not just the
262 # ent.copyfrom_rev
263 fromkind = svn.ra.check_path(self.ra, copyfrom_path, ent.copyfrom_rev)
264 if fromkind != 0:
265 copies[self.recode(entry)] = self.recode(copyfrom_path)
266 entries.append(self.recode(entry))
267 elif kind == 0: # gone, but had better be a deleted *file*
268 self.ui.debug("gone from %s\n" % ent.copyfrom_rev)
273 269
274 def lookup_parts(p):
275 rc = None
276 parts = p.split("/")
277 for i in range(len(parts)):
278 part = "/".join(parts[:i])
279 info = part, copyfrom.get(part, None)
280 if info[1] is not None:
281 self.ui.debug("Found parent directory %s\n" % info)
282 rc = info
283 return rc
270 fromrev = revnum - 1
271 # might always need to be revnum - 1 in these 3 lines?
272 old_module = self.modulemap.get(fromrev, self.module)
273 basepath = old_module + "/" + get_entry_from_path(path, module=self.module)
274 entrypath = old_module + "/" + get_entry_from_path(path, module=self.module)
284 275
285 self.ui.debug("base, entry %s %s\n" % (basepath, entrypath))
276 def lookup_parts(p):
277 rc = None
278 parts = p.split("/")
279 for i in range(len(parts)):
280 part = "/".join(parts[:i])
281 info = part, copyfrom.get(part, None)
282 if info[1] is not None:
283 self.ui.debug("Found parent directory %s\n" % info)
284 rc = info
285 return rc
286
287 self.ui.debug("base, entry %s %s\n" % (basepath, entrypath))
288
289 frompath, froment = lookup_parts(entrypath) or (None, revnum - 1)
286 290
287 frompath, froment = lookup_parts(entrypath) or (None, revnum - 1)
291 # need to remove fragment from lookup_parts and replace with copyfrom_path
292 if frompath is not None:
293 self.ui.debug("munge-o-matic\n")
294 self.ui.debug(entrypath + '\n')
295 self.ui.debug(entrypath[len(frompath):] + '\n')
296 entrypath = froment.copyfrom_path + entrypath[len(frompath):]
297 fromrev = froment.copyfrom_rev
298 self.ui.debug("Info: %s %s %s %s\n" % (frompath, froment, ent, entrypath))
288 299
289 # need to remove fragment from lookup_parts and replace with copyfrom_path
290 if frompath is not None:
291 self.ui.debug("munge-o-matic\n")
292 self.ui.debug(entrypath + '\n')
293 self.ui.debug(entrypath[len(frompath):] + '\n')
294 entrypath = froment.copyfrom_path + entrypath[len(frompath):]
295 fromrev = froment.copyfrom_rev
296 self.ui.debug("Info: %s %s %s %s\n" % (frompath, froment, ent, entrypath))
297
298 fromkind = svn.ra.check_path(self.ra, entrypath, fromrev)
299 if fromkind == svn.core.svn_node_file: # a deleted file
300 entries.append(self.recode(entry))
300 fromkind = svn.ra.check_path(self.ra, entrypath, fromrev)
301 if fromkind == svn.core.svn_node_file: # a deleted file
302 entries.append(self.recode(entry))
303 else:
304 # print "Deleted/moved non-file:", revnum, path, ent
305 # children = self._find_children(path, revnum - 1)
306 # print "find children %s@%d from %d action %s" % (path, revnum, ent.copyfrom_rev, ent.action)
307 # Sometimes this is tricky. For example: in
308 # The Subversion Repository revision 6940 a dir
309 # was copied and one of its files was deleted
310 # from the new location in the same commit. This
311 # code can't deal with that yet.
312 if ent.action == 'C':
313 children = self._find_children(path, fromrev)
301 314 else:
302 # print "Deleted/moved non-file:", revnum, path, ent
303 # children = self._find_children(path, revnum - 1)
304 # print "find children %s@%d from %d action %s" % (path, revnum, ent.copyfrom_rev, ent.action)
305 # Sometimes this is tricky. For example: in
306 # The Subversion Repository revision 6940 a dir
307 # was copied and one of its files was deleted
308 # from the new location in the same commit. This
309 # code can't deal with that yet.
310 if ent.action == 'C':
311 children = self._find_children(path, fromrev)
312 else:
313 oroot = entrypath.strip('/')
314 nroot = path.strip('/')
315 children = self._find_children(oroot, fromrev)
316 children = [s.replace(oroot,nroot) for s in children]
317 # Mark all [files, not directories] as deleted.
318 for child in children:
319 # Can we move a child directory and its
320 # parent in the same commit? (probably can). Could
321 # cause problems if instead of revnum -1,
322 # we have to look in (copyfrom_path, revnum - 1)
323 entrypath = get_entry_from_path("/" + child, module=old_module)
324 if entrypath:
325 entry = self.recode(entrypath.decode(self.encoding))
326 if entry in copies:
327 # deleted file within a copy
328 del copies[entry]
329 else:
330 entries.append(entry)
331 elif kind == svn.core.svn_node_dir:
332 # Should probably synthesize normal file entries
333 # and handle as above to clean up copy/rename handling.
334
335 # If the directory just had a prop change,
336 # then we shouldn't need to look for its children.
337 # Also this could create duplicate entries. Not sure
338 # whether this will matter. Maybe should make entries a set.
339 # print "Changed directory", revnum, path, ent.action, ent.copyfrom_path, ent.copyfrom_rev
340 # This will fail if a directory was copied
341 # from another branch and then some of its files
342 # were deleted in the same transaction.
343 children = self._find_children(path, revnum)
344 children.sort()
315 oroot = entrypath.strip('/')
316 nroot = path.strip('/')
317 children = self._find_children(oroot, fromrev)
318 children = [s.replace(oroot,nroot) for s in children]
319 # Mark all [files, not directories] as deleted.
345 320 for child in children:
346 321 # Can we move a child directory and its
347 322 # parent in the same commit? (probably can). Could
348 323 # cause problems if instead of revnum -1,
349 324 # we have to look in (copyfrom_path, revnum - 1)
350 entrypath = get_entry_from_path("/" + child, module=self.module)
351 # print child, self.module, entrypath
325 entrypath = get_entry_from_path("/" + child, module=old_module)
352 326 if entrypath:
353 # Need to filter out directories here...
354 kind = svn.ra.check_path(self.ra, entrypath, revnum)
355 if kind != svn.core.svn_node_dir:
356 entries.append(self.recode(entrypath))
357
358 # Copies here (must copy all from source)
359 # Probably not a real problem for us if
360 # source does not exist
327 entry = self.recode(entrypath.decode(self.encoding))
328 if entry in copies:
329 # deleted file within a copy
330 del copies[entry]
331 else:
332 entries.append(entry)
333 elif kind == svn.core.svn_node_dir:
334 # Should probably synthesize normal file entries
335 # and handle as above to clean up copy/rename handling.
361 336
362 # Can do this with the copy command "hg copy"
363 # if ent.copyfrom_path:
364 # copyfrom_entry = get_entry_from_path(ent.copyfrom_path.decode(self.encoding),
365 # module=self.module)
366 # copyto_entry = entrypath
367 #
368 # print "copy directory", copyfrom_entry, 'to', copyto_entry
369 #
370 # copies.append((copyfrom_entry, copyto_entry))
371
372 if ent.copyfrom_path:
373 copyfrom_path = ent.copyfrom_path.decode(self.encoding)
374 copyfrom_entry = get_entry_from_path(copyfrom_path, module=self.module)
375 if copyfrom_entry:
376 copyfrom[path] = ent
377 self.ui.debug("mark %s came from %s\n" % (path, copyfrom[path]))
337 # If the directory just had a prop change,
338 # then we shouldn't need to look for its children.
339 # Also this could create duplicate entries. Not sure
340 # whether this will matter. Maybe should make entries a set.
341 # print "Changed directory", revnum, path, ent.action, ent.copyfrom_path, ent.copyfrom_rev
342 # This will fail if a directory was copied
343 # from another branch and then some of its files
344 # were deleted in the same transaction.
345 children = self._find_children(path, revnum)
346 children.sort()
347 for child in children:
348 # Can we move a child directory and its
349 # parent in the same commit? (probably can). Could
350 # cause problems if instead of revnum -1,
351 # we have to look in (copyfrom_path, revnum - 1)
352 entrypath = get_entry_from_path("/" + child, module=self.module)
353 # print child, self.module, entrypath
354 if entrypath:
355 # Need to filter out directories here...
356 kind = svn.ra.check_path(self.ra, entrypath, revnum)
357 if kind != svn.core.svn_node_dir:
358 entries.append(self.recode(entrypath))
359
360 # Copies here (must copy all from source)
361 # Probably not a real problem for us if
362 # source does not exist
363
364 # Can do this with the copy command "hg copy"
365 # if ent.copyfrom_path:
366 # copyfrom_entry = get_entry_from_path(ent.copyfrom_path.decode(self.encoding),
367 # module=self.module)
368 # copyto_entry = entrypath
369 #
370 # print "copy directory", copyfrom_entry, 'to', copyto_entry
371 #
372 # copies.append((copyfrom_entry, copyto_entry))
378 373
379 # Good, /probably/ a regular copy. Really should check
380 # to see whether the parent revision actually contains
381 # the directory in question.
382 children = self._find_children(self.recode(copyfrom_path), ent.copyfrom_rev)
383 children.sort()
384 for child in children:
385 entrypath = get_entry_from_path("/" + child, module=self.module)
386 if entrypath:
387 entry = entrypath.decode(self.encoding)
388 # print "COPY COPY From", copyfrom_entry, entry
389 copyto_path = path + entry[len(copyfrom_entry):]
390 copyto_entry = get_entry_from_path(copyto_path, module=self.module)
391 # print "COPY", entry, "COPY To", copyto_entry
392 copies[self.recode(copyto_entry)] = self.recode(entry)
393 # copy from quux splort/quuxfile
394
395 self.modulemap[revnum] = self.module # track backwards in time
396 # a list of (filename, id) where id lets us retrieve the file.
397 # eg in git, id is the object hash. for svn it'll be the
398 self.files[rev] = zip(entries, [rev] * len(entries))
399 if not entries:
400 return
374 if ent.copyfrom_path:
375 copyfrom_path = ent.copyfrom_path.decode(self.encoding)
376 copyfrom_entry = get_entry_from_path(copyfrom_path, module=self.module)
377 if copyfrom_entry:
378 copyfrom[path] = ent
379 self.ui.debug("mark %s came from %s\n" % (path, copyfrom[path]))
380
381 # Good, /probably/ a regular copy. Really should check
382 # to see whether the parent revision actually contains
383 # the directory in question.
384 children = self._find_children(self.recode(copyfrom_path), ent.copyfrom_rev)
385 children.sort()
386 for child in children:
387 entrypath = get_entry_from_path("/" + child, module=self.module)
388 if entrypath:
389 entry = entrypath.decode(self.encoding)
390 # print "COPY COPY From", copyfrom_entry, entry
391 copyto_path = path + entry[len(copyfrom_entry):]
392 copyto_entry = get_entry_from_path(copyto_path, module=self.module)
393 # print "COPY", entry, "COPY To", copyto_entry
394 copies[self.recode(copyto_entry)] = self.recode(entry)
395 # copy from quux splort/quuxfile
401 396
402 # Example SVN datetime. Includes microseconds.
403 # ISO-8601 conformant
404 # '2007-01-04T17:35:00.902377Z'
405 date = util.parsedate(date[:18] + " UTC", ["%Y-%m-%dT%H:%M:%S"])
397 self.modulemap[revnum] = self.module # track backwards in time
398 # a list of (filename, id) where id lets us retrieve the file.
399 # eg in git, id is the object hash. for svn it'll be the
400 self.files[rev] = zip(entries, [rev] * len(entries))
401 if not entries:
402 return
406 403
407 log = message and self.recode(message)
408 author = author and self.recode(author) or ''
404 # Example SVN datetime. Includes microseconds.
405 # ISO-8601 conformant
406 # '2007-01-04T17:35:00.902377Z'
407 date = util.parsedate(date[:18] + " UTC", ["%Y-%m-%dT%H:%M:%S"])
409 408
410 cset = commit(author=author,
411 date=util.datestr(date),
412 desc=log,
413 parents=[],
414 copies=copies,
415 branch=branch)
409 log = message and self.recode(message)
410 author = author and self.recode(author) or ''
416 411
417 if self.child_cset and self.child_rev != rev:
418 self.child_cset.parents = [rev]
419 self.commits[self.child_rev] = self.child_cset
420 self.child_cset = cset
421 self.child_rev = rev
412 cset = commit(author=author,
413 date=util.datestr(date),
414 desc=log,
415 parents=[],
416 copies=copies,
417 branch=branch)
418
419 if self.child_cset and self.child_rev != rev:
420 self.child_cset.parents = [rev]
421 self.commits[self.child_rev] = self.child_cset
422 self.child_cset = cset
423 self.child_rev = rev
422 424
423 425 try:
424 426 discover_changed_paths = True
General Comments 0
You need to be logged in to leave comments. Login now