# HG changeset patch # User Dirkjan Ochtman # Date 1243699864 18000 # Node ID 7e9269555e72866b073c142ee603ea2de26ffe5e # Parent 9327e93256450c6991904654fc4b028bf51f8b35 Move HgChangeReceiver.branches_in_paths() to the stupid module. diff --git a/hgsubversion/hg_delta_editor.py b/hgsubversion/hg_delta_editor.py --- a/hgsubversion/hg_delta_editor.py +++ b/hgsubversion/hg_delta_editor.py @@ -215,69 +215,6 @@ class HgChangeReceiver(delta.Editor): pickle_atomic(self.branches, self.branch_info_file, self.meta_data_dir) pickle_atomic(self.tags, self.tag_info_file, self.meta_data_dir) - def branches_in_paths(self, paths, revnum, checkpath, listdir): - '''Given a list of paths, return mapping of all branches touched - to their branch path. - ''' - branches = {} - paths_need_discovery = [] - for p in paths: - relpath, branch, branchpath = self._split_branch_path(p) - if relpath is not None: - branches[branch] = branchpath - elif paths[p].action == 'D' and not self._is_path_tag(p): - ln = self._localname(p) - # must check in branches_to_delete as well, because this runs after we - # already updated the branch map - if ln in self.branches or ln in self.branches_to_delete: - branches[self._localname(p)] = p - else: - paths_need_discovery.append(p) - if paths_need_discovery: - paths_need_discovery = [(len(p), p) for p in paths_need_discovery] - paths_need_discovery.sort() - paths_need_discovery = [p[1] for p in paths_need_discovery] - actually_files = [] - while paths_need_discovery: - p = paths_need_discovery.pop(0) - path_could_be_file = True - ind = 0 - while ind < len(paths_need_discovery) and not paths_need_discovery: - if op.startswith(p): - path_could_be_file = False - ind += 1 - if path_could_be_file: - if checkpath(p, revnum) == 'f': - actually_files.append(p) - # if there's a copyfrom_path and there were files inside that copyfrom, - # we need to detect those branches. It's a little thorny and slow, but - # seems to be the best option. - elif paths[p].copyfrom_path and not p.startswith('tags/'): - paths_need_discovery.extend(['%s/%s' % (p,x[0]) - for x in listdir(p, revnum) - if x[1] == 'f']) - if actually_files: - filepaths = [p.split('/') for p in actually_files] - filepaths = [(len(p), p) for p in filepaths] - filepaths.sort() - filepaths = [p[1] for p in filepaths] - while filepaths: - path = filepaths.pop(0) - parentdir = '/'.join(path[:-1]) - filepaths = [p for p in filepaths if not '/'.join(p).startswith(parentdir)] - branchpath = self._normalize_path(parentdir) - if branchpath.startswith('tags/'): - continue - branchname = self._localname(branchpath) - if branchpath.startswith('trunk/'): - branches[self._localname('trunk')] = 'trunk' - continue - if branchname and branchname.startswith('../'): - continue - branches[branchname] = branchpath - - return branches - def _path_and_branch_for_path(self, path, existing=True): return self._split_branch_path(path, existing=existing)[:2] diff --git a/hgsubversion/stupid.py b/hgsubversion/stupid.py --- a/hgsubversion/stupid.py +++ b/hgsubversion/stupid.py @@ -441,11 +441,80 @@ def checkbranch(hg_editor, r, branch): return None return branchtip +def branches_in_paths(hge, paths, revnum, checkpath, listdir): + '''Given a list of paths, return mapping of all branches touched + to their branch path. + ''' + branches = {} + paths_need_discovery = [] + for p in paths: + relpath, branch, branchpath = hge._split_branch_path(p) + if relpath is not None: + branches[branch] = branchpath + elif paths[p].action == 'D' and not hge._is_path_tag(p): + ln = hge._localname(p) + # must check in branches_to_delete as well, because this runs after we + # already updated the branch map + if ln in hge.branches or ln in hge.branches_to_delete: + branches[ln] = p + else: + paths_need_discovery.append(p) + + if not paths_need_discovery: + return branches + + paths_need_discovery = [(len(p), p) for p in paths_need_discovery] + paths_need_discovery.sort() + paths_need_discovery = [p[1] for p in paths_need_discovery] + actually_files = [] + while paths_need_discovery: + p = paths_need_discovery.pop(0) + path_could_be_file = True + ind = 0 + while ind < len(paths_need_discovery) and not paths_need_discovery: + if op.startswith(p): + path_could_be_file = False + ind += 1 + if path_could_be_file: + if checkpath(p, revnum) == 'f': + actually_files.append(p) + # if there's a copyfrom_path and there were files inside that copyfrom, + # we need to detect those branches. It's a little thorny and slow, but + # seems to be the best option. + elif paths[p].copyfrom_path and not p.startswith('tags/'): + paths_need_discovery.extend(['%s/%s' % (p,x[0]) + for x in listdir(p, revnum) + if x[1] == 'f']) + + if not actually_files: + continue + + filepaths = [p.split('/') for p in actually_files] + filepaths = [(len(p), p) for p in filepaths] + filepaths.sort() + filepaths = [p[1] for p in filepaths] + while filepaths: + path = filepaths.pop(0) + parentdir = '/'.join(path[:-1]) + filepaths = [p for p in filepaths if not '/'.join(p).startswith(parentdir)] + branchpath = hge._normalize_path(parentdir) + if branchpath.startswith('tags/'): + continue + branchname = hge._localname(branchpath) + if branchpath.startswith('trunk/'): + branches[hge._localname('trunk')] = 'trunk' + continue + if branchname and branchname.startswith('../'): + continue + branches[branchname] = branchpath + + return branches + def convert_rev(ui, hg_editor, svn, r, tbdelta): # this server fails at replay hg_editor.save_tbdelta(tbdelta) - branches = hg_editor.branches_in_paths(r.paths, r.revnum, svn.checkpath, svn.list_files) + branches = branches_in_paths(hg_editor, r.paths, r.revnum, svn.checkpath, svn.list_files) brpaths = branches.values() bad_branch_paths = {} for br, bp in branches.iteritems():