Mercurial > hgsubversion
comparison push_cmd.py @ 9:9eb6bf2be1e7
Fix adding files that require new directories.
| author | Augie Fackler <durin42@gmail.com> |
|---|---|
| date | Mon, 06 Oct 2008 11:01:46 -0500 |
| parents | 1a5bb173170b |
| children | dfdc078661db |
comparison
equal
deleted
inserted
replaced
| 8:c89f53103502 | 9:9eb6bf2be1e7 |
|---|---|
| 12 @util.register_subcommand('push') | 12 @util.register_subcommand('push') |
| 13 @util.register_subcommand('dcommit') # for git expats | 13 @util.register_subcommand('dcommit') # for git expats |
| 14 def push_revisions_to_subversion(ui, repo, hg_repo_path, svn_url, **opts): | 14 def push_revisions_to_subversion(ui, repo, hg_repo_path, svn_url, **opts): |
| 15 """Push revisions starting at a specified head back to Subversion. | 15 """Push revisions starting at a specified head back to Subversion. |
| 16 """ | 16 """ |
| 17 #assert False # safety while the command is partially implemented. | |
| 18 hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, | 17 hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, |
| 19 ui_=ui) | 18 ui_=ui) |
| 20 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), | 19 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), |
| 21 hge.revmap.iterkeys())) | 20 hge.revmap.iterkeys())) |
| 22 # Strategy: | 21 # Strategy: |
| 64 hge.revmap.iterkeys())) | 63 hge.revmap.iterkeys())) |
| 65 outgoing = utility_commands.outgoing_revisions(ui, repo, hge, | 64 outgoing = utility_commands.outgoing_revisions(ui, repo, hge, |
| 66 svn_commit_hashes) | 65 svn_commit_hashes) |
| 67 return 0 | 66 return 0 |
| 68 | 67 |
| 68 class PrefixMatch(object): | |
| 69 def __init__(self, prefix): | |
| 70 self.p = prefix | |
| 71 | |
| 72 def files(self): | |
| 73 return [] | |
| 74 | |
| 75 def __call__(self, fn): | |
| 76 return fn.startswith(self.p) | |
| 69 | 77 |
| 70 def commit_from_rev(ui, repo, rev_ctx, hg_editor, svn_url, base_revision): | 78 def commit_from_rev(ui, repo, rev_ctx, hg_editor, svn_url, base_revision): |
| 71 """Build and send a commit from Mercurial to Subversion. | 79 """Build and send a commit from Mercurial to Subversion. |
| 72 """ | 80 """ |
| 73 target_files = [] | 81 target_files = [] |
| 74 file_data = {} | 82 file_data = {} |
| 83 svn = svnwrap.SubversionRepo(svn_url, username=merc_util.getuser()) | |
| 84 parent = rev_ctx.parents()[0] | |
| 85 parent_branch = rev_ctx.parents()[0].branch() | |
| 86 branch_path = 'trunk' | |
| 87 | |
| 88 if parent_branch and parent_branch != 'default': | |
| 89 branch_path = 'branches/%s' % parent_branch | |
| 90 | |
| 91 added_dirs = [] | |
| 75 for file in rev_ctx.files(): | 92 for file in rev_ctx.files(): |
| 76 parent = rev_ctx.parents()[0] | |
| 77 new_data = base_data = '' | 93 new_data = base_data = '' |
| 78 action = '' | 94 action = '' |
| 79 if file in rev_ctx: | 95 if file in rev_ctx: |
| 80 new_data = rev_ctx.filectx(file).data() | 96 new_data = rev_ctx.filectx(file).data() |
| 81 if file not in parent: | 97 if file not in parent: |
| 82 target_files.append(file) | 98 target_files.append(file) |
| 83 action = 'add' | 99 action = 'add' |
| 100 dirname = '/'.join(file.split('/')[:-1] + ['']) | |
| 101 # check for new directories | |
| 102 if not list(parent.walk(PrefixMatch(dirname))): | |
| 103 # check and see if the dir exists svn-side. | |
| 104 try: | |
| 105 assert svn.list_dir('%s/%s' % (branch_path, dirname)) | |
| 106 except core.SubversionException, e: | |
| 107 # dir must not exist | |
| 108 added_dirs.append(dirname[:-1]) | |
| 84 # TODO check for mime-type autoprops here | 109 # TODO check for mime-type autoprops here |
| 85 # TODO check for directory adds here | 110 # TODO check for directory adds here |
| 86 else: | 111 else: |
| 87 target_files.append(file) | 112 target_files.append(file) |
| 88 base_data = parent.filectx(file).data() | 113 base_data = parent.filectx(file).data() |
| 92 base_data = parent.filectx(file).data() | 117 base_data = parent.filectx(file).data() |
| 93 action = 'delete' | 118 action = 'delete' |
| 94 file_data[file] = base_data, new_data, action | 119 file_data[file] = base_data, new_data, action |
| 95 | 120 |
| 96 # TODO check for directory deletes here | 121 # TODO check for directory deletes here |
| 97 svn = svnwrap.SubversionRepo(svn_url, username=merc_util.getuser()) | |
| 98 parent_branch = rev_ctx.parents()[0].branch() | |
| 99 branch_path = 'trunk' | |
| 100 if parent_branch and parent_branch != 'default': | |
| 101 branch_path = 'branches/%s' % parent_branch | |
| 102 new_target_files = ['%s/%s' % (branch_path, f) for f in target_files] | 122 new_target_files = ['%s/%s' % (branch_path, f) for f in target_files] |
| 103 for tf, ntf in zip(target_files, new_target_files): | 123 for tf, ntf in zip(target_files, new_target_files): |
| 104 if tf in file_data: | 124 if tf in file_data: |
| 105 file_data[ntf] = file_data[tf] | 125 file_data[ntf] = file_data[tf] |
| 106 del file_data[tf] | 126 del file_data[tf] |
| 127 added_dirs = ['%s/%s' % (branch_path, f) for f in added_dirs] | |
| 128 new_target_files += added_dirs | |
| 107 try: | 129 try: |
| 108 svn.commit(new_target_files, rev_ctx.description(), file_data, | 130 svn.commit(new_target_files, rev_ctx.description(), file_data, |
| 109 base_revision, set([])) | 131 base_revision, set(added_dirs)) |
| 110 except core.SubversionException, e: | 132 except core.SubversionException, e: |
| 111 if hasattr(e, 'apr_err') and e.apr_err == 160028: | 133 if hasattr(e, 'apr_err') and e.apr_err == 160028: |
| 112 raise merc_util.Abort('Base text was out of date, maybe rebase?') | 134 raise merc_util.Abort('Base text was out of date, maybe rebase?') |
| 113 else: | 135 else: |
| 114 raise | 136 raise |
