From 9bf12835c1b5c153bf578c5ac8f64ee0c348c0dc Mon Sep 17 00:00:00 2001 From: mhagger Date: Sun, 21 Mar 2010 21:29:00 +0000 Subject: [PATCH] Add a new SubtreeSymbolTransform. Patch by: Jon Foster This wraps another SymbolTransform and limits it to only apply within a certain directory; e.g., SubtreeSymbolTransform('myrepo/some_module', RegexpSymbolTransform('.*-br', r'\1-branch')) will only do the regexp transform within the specified module. This allows more powerful transforms than the existing SubtreeSymbolMapper. git-svn-id: http://cvs2svn.tigris.org/svn/cvs2svn/trunk@5079 be7e6eca-30d4-0310-a8e5-ac0d63af7087 --- cvs2svn_lib/symbol_transform.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/cvs2svn_lib/symbol_transform.py b/cvs2svn_lib/symbol_transform.py index a4995b87..de4733af 100644 --- a/cvs2svn_lib/symbol_transform.py +++ b/cvs2svn_lib/symbol_transform.py @@ -234,3 +234,34 @@ class IgnoreSymbolTransform(SymbolTransform): return symbol_name +class SubtreeSymbolTransform(SymbolTransform): + """A wrapper around another SymbolTransform, that limits it to a + specified subtree.""" + + def __init__(self, cvs_path, inner_symbol_transform): + """Constructor. + + CVS_PATH is the path in the repository. INNER_SYMBOL_TRANSFORM is + the SymbolTransform to wrap.""" + + assert type(cvs_path) == str + self.__subtree = os.path.normcase(os.path.normpath(cvs_path)) + self.__inner = inner_symbol_transform + + def __does_rule_apply_to(self, cvs_file): + cvs_path = os.path.normcase(os.path.normpath(cvs_file.filename)) + while cvs_path != self.__subtree: + new_cvs_path = os.path.dirname(cvs_path) + if new_cvs_path == cvs_path: + return False + cvs_path = new_cvs_path + return True + + def transform(self, cvs_file, symbol_name, revision): + if self.__does_rule_apply_to(cvs_file): + return self.__inner.transform(cvs_file, symbol_name, revision) + else: + # Rule does not apply to that path; return symbol name unaltered. + return symbol_name + + -- 2.11.4.GIT