# HG changeset patch # User Patrick Mezard # Date 1263659109 -3600 # Node ID ef288fb7f2fe0a50700a5eb5f422636b3347834c # Parent f089f46729ee0cce93fc5c1ecd57a3f19fc847cc svnmeta: is_path_tag() is really get_path_tag() Enforce that returned tags are non-empty. diff --git a/hgsubversion/editor.py b/hgsubversion/editor.py --- a/hgsubversion/editor.py +++ b/hgsubversion/editor.py @@ -193,7 +193,7 @@ class HgEditor(delta.Editor): if not fpath: return if (branch not in self.meta.branches and - not self.meta.is_path_tag(self.meta.remotename(branch))): + not self.meta.get_path_tag(self.meta.remotename(branch))): # we know this branch will exist now, because it has at least one file. Rock. self.meta.branches[branch] = None, 0, self.current.rev.revnum self.current.file = path @@ -235,12 +235,12 @@ class HgEditor(delta.Editor): if br_path is None or not copyfrom_path: return path if copyfrom_path: - tag = self.meta.is_path_tag(copyfrom_path) + tag = self.meta.get_path_tag(copyfrom_path) if tag not in self.meta.tags: tag = None - if not self.meta.is_path_valid(copyfrom_path) and not tag: - self.current.missing.add('%s/' % path) - return path + if not self.meta.is_path_valid(copyfrom_path): + self.current.missing.add('%s/' % path) + return path if tag: ci = self.meta.repo[self.meta.tags[tag]].extra()['convert_revision'] source_rev, source_branch, = self.meta.parse_converted_revision(ci) diff --git a/hgsubversion/replay.py b/hgsubversion/replay.py --- a/hgsubversion/replay.py +++ b/hgsubversion/replay.py @@ -128,12 +128,14 @@ def convert_rev(ui, meta, svn, r, tbdelt continue extra = meta.genextra(rev.revnum, branch) - tag = False + tag = None if branch is not None: - tag = meta.is_path_tag(meta.remotename(branch)) - if (not (tag and tag in meta.tags) and - (branch not in meta.branches - and branch not in meta.repo.branchtags())): + # New regular tag without modifications, it will be committed by + # svnmeta.committag(), we can skip the whole branch for now + tag = meta.get_path_tag(meta.remotename(branch)) + if (tag and tag not in meta.tags and + branch not in meta.branches + and branch not in meta.repo.branchtags()): continue parentctx = meta.repo.changectx(parents[0]) diff --git a/hgsubversion/stupid.py b/hgsubversion/stupid.py --- a/hgsubversion/stupid.py +++ b/hgsubversion/stupid.py @@ -469,7 +469,7 @@ def branches_in_paths(meta, tbdelta, pat relpath, branch, branchpath = meta.split_branch_path(p) if relpath is not None: branches[branch] = branchpath - elif paths[p].action == 'D' and not meta.is_path_tag(p): + elif paths[p].action == 'D' and not meta.get_path_tag(p): ln = meta.localname(p) # must check in branches_to_delete as well, because this runs after we # already updated the branch map @@ -552,7 +552,7 @@ def convert_rev(ui, meta, svn, r, tbdelt deleted_branches = {} for p in r.paths: - if meta.is_path_tag(p): + if meta.get_path_tag(p): continue branch = meta.localname(p) if not (r.paths[p].action == 'R' and branch in meta.branches): @@ -618,9 +618,7 @@ def convert_rev(ui, meta, svn, r, tbdelt extra = meta.genextra(r.revnum, b) - tag = False - tag = meta.is_path_tag(meta.remotename(b)) - + tag = meta.get_path_tag(meta.remotename(b)) if tag: if parentctx.node() == node.nullid: continue @@ -642,7 +640,7 @@ def convert_rev(ui, meta, svn, r, tbdelt branch = extra.get('branch', None) if not tag: if (not branch in meta.branches - and not meta.is_path_tag(meta.remotename(branch))): + and not meta.get_path_tag(meta.remotename(branch))): meta.branches[branch] = None, 0, r.revnum meta.revmap[r.revnum, b] = ha else: diff --git a/hgsubversion/svnmeta.py b/hgsubversion/svnmeta.py --- a/hgsubversion/svnmeta.py +++ b/hgsubversion/svnmeta.py @@ -229,23 +229,21 @@ class SVNMeta(object): path = path[1:] return path - def is_path_tag(self, path): - """If path could represent the path to a tag, returns the potential tag - name. Otherwise, returns False. + def get_path_tag(self, path): + """If path could represent the path to a tag, returns the + potential (non-empty) tag name. Otherwise, returns None Note that it's only a tag if it was copied from the path '' in a branch (or tag) we have, for our purposes. """ - if self.layout == 'single': - return False - path = self.normalize(path) - for tagspath in self.tag_locations: - onpath = path.startswith(tagspath) - longer = len(path) > len('%s/' % tagspath) - if path and onpath and longer: - tag, subpath = path[len(tagspath) + 1:], '' - return tag - return False + if self.layout != 'single': + path = self.normalize(path) + for tagspath in self.tag_locations: + if path.startswith(tagspath + '/'): + tag = path[len(tagspath) + 1:] + if tag: + return tag + return None def split_branch_path(self, path, existing=True): """Figure out which branch inside our repo this path represents, and @@ -260,8 +258,8 @@ class SVNMeta(object): path = self.normalize(path) if self.layout == 'single': return (path, None, '') - if self.is_path_tag(path): - tag = self.is_path_tag(path) + tag = self.get_path_tag(path) + if tag: matched = [t for t in self.tags.iterkeys() if tag.startswith(t+'/')] if not matched: return None, None, None @@ -299,10 +297,10 @@ class SVNMeta(object): def _determine_parent_branch(self, p, src_path, src_rev, revnum): if src_path is not None: src_file, src_branch = self.split_branch_path(src_path)[:2] - src_tag = self.is_path_tag(src_path) - if src_tag != False or src_file == '': # case 2 + src_tag = self.get_path_tag(src_path) + if src_tag or src_file == '': ln = self.localname(p) - if src_tag != False and src_tag in self.tags: + if src_tag and src_tag in self.tags: ci = self.repo[self.tags[src_tag]].extra()['convert_revision'] src_rev, src_branch, = self.parse_converted_revision(ci) return {ln: (src_branch, src_rev, revnum)} @@ -350,7 +348,7 @@ class SVNMeta(object): def get_parent_revision(self, number, branch): '''Get the parent revision hash for a commit on a specific branch. ''' - tag = self.is_path_tag(self.remotename(branch)) + tag = self.get_path_tag(self.remotename(branch)) limitedtags = maps.TagMap(self.repo, endrev=number-1) if tag and tag in limitedtags: ha = limitedtags[tag] @@ -384,8 +382,8 @@ class SVNMeta(object): self.closebranches = set() tags_to_delete = set() for p in sorted(paths): - t_name = self.is_path_tag(p) - if t_name != False: + t_name = self.get_path_tag(p) + if t_name: src_p, src_rev = paths[p].copyfrom_path, paths[p].copyfrom_rev # if you commit to a tag, I'm calling you stupid and ignoring # you. @@ -393,7 +391,7 @@ class SVNMeta(object): file, branch = self.split_branch_path(src_p)[:2] if file is None: # some crazy people make tags from other tags - from_tag = self.is_path_tag(src_p) + from_tag = self.get_path_tag(src_p) if not from_tag: continue if from_tag in self.tags: @@ -527,7 +525,7 @@ class SVNMeta(object): branches.setdefault(branch, []).append(('rm', tag, None)) for b, tags in branches.iteritems(): - fromtag = self.is_path_tag(self.remotename(b)) + fromtag = self.get_path_tag(self.remotename(b)) # modify parent's .hgtags source parent = self.repo[self.get_parent_revision(rev.revnum, b)] if '.hgtags' not in parent: