Mercurial > hgsubversion
comparison hg_delta_editor.py @ 167:3cd6a7354207
fetch: Add support for an authormap which can rename authors, intended for
repository conversion.
author | Graham Booker <gbooker@cod3r.com> |
---|---|
date | Tue, 30 Dec 2008 20:13:32 -0600 |
parents | 2a4b7a86af93 |
children | 4f26fa049452 |
comparison
equal
deleted
inserted
replaced
166:db88e528e8e6 | 167:3cd6a7354207 |
---|---|
58 f.close() | 58 f.close() |
59 self.revmap[revnum, branch] = node_hash | 59 self.revmap[revnum, branch] = node_hash |
60 | 60 |
61 def __init__(self, path=None, repo=None, ui_=None, | 61 def __init__(self, path=None, repo=None, ui_=None, |
62 subdir='', author_host='', | 62 subdir='', author_host='', |
63 tag_locations=['tags']): | 63 tag_locations=['tags'], |
64 authors=None): | |
64 """path is the path to the target hg repo. | 65 """path is the path to the target hg repo. |
65 | 66 |
66 subdir is the subdirectory of the edits *on the svn server*. | 67 subdir is the subdirectory of the edits *on the svn server*. |
67 It is needed for stripping paths off in certain cases. | 68 It is needed for stripping paths off in certain cases. |
68 """ | 69 """ |
103 pickle_atomic(self.tag_locations, self.tag_locations_file, | 104 pickle_atomic(self.tag_locations, self.tag_locations_file, |
104 self.meta_data_dir) | 105 self.meta_data_dir) |
105 | 106 |
106 self.clear_current_info() | 107 self.clear_current_info() |
107 self.author_host = author_host | 108 self.author_host = author_host |
109 self.authors = {} | |
110 if os.path.exists(self.authors_file): | |
111 self.readauthors(self.authors_file) | |
112 if authors and os.path.exists(authors): | |
113 self.readauthors(authors) | |
114 if self.authors: | |
115 self.writeauthors() | |
108 | 116 |
109 def __setup_repo(self, repo_path): | 117 def __setup_repo(self, repo_path): |
110 """Verify the repo is going to work out for us. | 118 """Verify the repo is going to work out for us. |
111 | 119 |
112 This method will fail an assertion if the repo exists but doesn't have | 120 This method will fail an assertion if the repo exists but doesn't have |
386 current_ctx = context.memctx(self.repo, | 394 current_ctx = context.memctx(self.repo, |
387 parents, | 395 parents, |
388 rev.message or ' ', | 396 rev.message or ' ', |
389 files, | 397 files, |
390 del_all_files, | 398 del_all_files, |
391 '%s%s' % (rev.author, | 399 self.authorforsvnauthor(rev.author), |
392 self.author_host), | |
393 date, | 400 date, |
394 {'branch': 'closed-branches'}) | 401 {'branch': 'closed-branches'}) |
395 new_hash = self.repo.commitctx(current_ctx) | 402 new_hash = self.repo.commitctx(current_ctx) |
396 self.ui.status('Marked branch %s as closed.\n' % (branch or | 403 self.ui.status('Marked branch %s as closed.\n' % (branch or |
397 'default')) | 404 'default')) |
435 current_ctx = context.memctx(self.repo, | 442 current_ctx = context.memctx(self.repo, |
436 parents, | 443 parents, |
437 rev.message or '...', | 444 rev.message or '...', |
438 files.keys(), | 445 files.keys(), |
439 filectxfn, | 446 filectxfn, |
440 '%s%s' %(rev.author, self.author_host), | 447 self.authorforsvnauthor(rev.author), |
441 date, | 448 date, |
442 extra) | 449 extra) |
443 new_hash = self.repo.commitctx(current_ctx) | 450 new_hash = self.repo.commitctx(current_ctx) |
444 self.ui.status('committed as %s on branch %s\n' % | 451 self.ui.status('committed as %s on branch %s\n' % |
445 (node.hex(new_hash), (branch or 'default'))) | 452 (node.hex(new_hash), (branch or 'default'))) |
462 current_ctx = context.memctx(self.repo, | 469 current_ctx = context.memctx(self.repo, |
463 (ha, node.nullid), | 470 (ha, node.nullid), |
464 rev.message or ' ', | 471 rev.message or ' ', |
465 [], | 472 [], |
466 del_all_files, | 473 del_all_files, |
467 '%s%s' % (rev.author, | 474 self.authorforsvnauthor(rev.author), |
468 self.author_host), | |
469 date, | 475 date, |
470 extra) | 476 extra) |
471 new_hash = self.repo.commitctx(current_ctx) | 477 new_hash = self.repo.commitctx(current_ctx) |
472 self.ui.status('committed as %s on branch %s\n' % | 478 self.ui.status('committed as %s on branch %s\n' % |
473 (node.hex(new_hash), (branch or 'default'))) | 479 (node.hex(new_hash), (branch or 'default'))) |
474 if (rev.revnum, branch) not in self.revmap: | 480 if (rev.revnum, branch) not in self.revmap: |
475 self.add_to_revmap(rev.revnum, branch, new_hash) | 481 self.add_to_revmap(rev.revnum, branch, new_hash) |
476 self.clear_current_info() | 482 self.clear_current_info() |
477 | 483 |
484 def authorforsvnauthor(self, author): | |
485 if(author in self.authors): | |
486 return self.authors[author] | |
487 return '%s%s' %(author, self.author_host) | |
488 | |
489 def readauthors(self, authorfile): | |
490 self.ui.status( | |
491 ('Reading authormap %s\n') | |
492 % authorfile) | |
493 f = open(authorfile, 'r') | |
494 for line in f: | |
495 if line.strip() == '': | |
496 continue | |
497 try: | |
498 srcauth, dstauth = line.split('=', 1) | |
499 srcauth = srcauth.strip() | |
500 dstauth = dstauth.strip() | |
501 if srcauth in self.authors and dstauth != self.authors[srcauth]: | |
502 self.ui.status( | |
503 ('Overriding mapping for author %s, was %s, now %s\n') | |
504 % (srcauth, self.authors[srcauth], dstauth)) | |
505 else: | |
506 self.ui.debug(('Mapping author %s to %s\n') | |
507 % (srcauth, dstauth)) | |
508 self.authors[srcauth] = dstauth | |
509 except IndexError: | |
510 self.ui.warn( | |
511 ('Ignoring bad line in author map file %s: %s\n') | |
512 % (authorfile, line.rstrip())) | |
513 f.close() | |
514 | |
515 def writeauthors(self): | |
516 f = open(self.authors_file, 'w+') | |
517 self.ui.status( | |
518 ('Writing author map file %s\n') | |
519 % self.authors_file) | |
520 for author in self.authors: | |
521 f.write("%s=%s\n" % (author, self.authors[author])) | |
522 f.close() | |
523 | |
478 @property | 524 @property |
479 def meta_data_dir(self): | 525 def meta_data_dir(self): |
480 return os.path.join(self.path, '.hg', 'svn') | 526 return os.path.join(self.path, '.hg', 'svn') |
481 | 527 |
482 def meta_file_named(self, name): | 528 def meta_file_named(self, name): |
512 | 558 |
513 @property | 559 @property |
514 def url(self): | 560 def url(self): |
515 return open(self.svn_url_file).read() | 561 return open(self.svn_url_file).read() |
516 | 562 |
563 @property | |
564 def authors_file(self): | |
565 return self.meta_file_named('authors') | |
566 | |
517 @stash_exception_on_self | 567 @stash_exception_on_self |
518 def delete_entry(self, path, revision_bogus, parent_baton, pool=None): | 568 def delete_entry(self, path, revision_bogus, parent_baton, pool=None): |
519 br_path, branch = self._path_and_branch_for_path(path) | 569 br_path, branch = self._path_and_branch_for_path(path) |
520 if br_path == '': | 570 if br_path == '': |
521 self.branches_to_delete.add(branch) | 571 self.branches_to_delete.add(branch) |