aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'cvs2svn_lib/project.py')
-rw-r--r--cvs2svn_lib/project.py219
1 files changed, 0 insertions, 219 deletions
diff --git a/cvs2svn_lib/project.py b/cvs2svn_lib/project.py
deleted file mode 100644
index 0fe92df..0000000
--- a/cvs2svn_lib/project.py
+++ /dev/null
@@ -1,219 +0,0 @@
-# (Be in -*- python -*- mode.)
-#
-# ====================================================================
-# Copyright (c) 2000-2008 CollabNet. All rights reserved.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at http://subversion.tigris.org/license-1.html.
-# If newer versions of this license are posted there, you may use a
-# newer version instead, at your option.
-#
-# This software consists of voluntary contributions made by many
-# individuals. For exact contribution history, see the revision
-# history and logs, available at http://cvs2svn.tigris.org/.
-# ====================================================================
-
-"""This module contains database facilities used by cvs2svn."""
-
-
-import re
-import os
-import cPickle
-
-from cvs2svn_lib.context import Ctx
-from cvs2svn_lib.common import FatalError
-from cvs2svn_lib.common import IllegalSVNPathError
-from cvs2svn_lib.common import normalize_svn_path
-from cvs2svn_lib.common import verify_paths_disjoint
-from cvs2svn_lib.symbol_transform import CompoundSymbolTransform
-
-
-class FileInAndOutOfAtticException(Exception):
- def __init__(self, non_attic_path, attic_path):
- Exception.__init__(
- self,
- "A CVS repository cannot contain both %s and %s"
- % (non_attic_path, attic_path))
-
- self.non_attic_path = non_attic_path
- self.attic_path = attic_path
-
-
-def normalize_ttb_path(opt, path, allow_empty=False):
- try:
- return normalize_svn_path(path, allow_empty)
- except IllegalSVNPathError, e:
- raise FatalError('Problem with %s: %s' % (opt, e,))
-
-
-class Project(object):
- """A project within a CVS repository."""
-
- def __init__(
- self, id, project_cvs_repos_path,
- initial_directories=[],
- symbol_transforms=None,
- ):
- """Create a new Project record.
-
- ID is a unique id for this project. PROJECT_CVS_REPOS_PATH is the
- main CVS directory for this project (within the filesystem).
-
- INITIAL_DIRECTORIES is an iterable of all SVN directories that
- should be created when the project is first created. Normally,
- this should include the trunk, branches, and tags directory.
-
- SYMBOL_TRANSFORMS is an iterable of SymbolTransform instances
- which will be used to transform any symbol names within this
- project."""
-
- self.id = id
-
- self.project_cvs_repos_path = os.path.normpath(project_cvs_repos_path)
- if not os.path.isdir(self.project_cvs_repos_path):
- raise FatalError("The specified CVS repository path '%s' is not an "
- "existing directory." % self.project_cvs_repos_path)
-
- self.cvs_repository_root, self.cvs_module = \
- self.determine_repository_root(
- os.path.abspath(self.project_cvs_repos_path))
-
- # A regexp matching project_cvs_repos_path plus an optional separator:
- self.project_prefix_re = re.compile(
- r'^' + re.escape(self.project_cvs_repos_path)
- + r'(' + re.escape(os.sep) + r'|$)')
-
- # The SVN directories to add when the project is first created:
- self._initial_directories = []
-
- for path in initial_directories:
- try:
- path = normalize_svn_path(path, False)
- except IllegalSVNPathError, e:
- raise FatalError(
- 'Initial directory %r is not a legal SVN path: %s'
- % (path, e,)
- )
- self._initial_directories.append(path)
-
- verify_paths_disjoint(*self._initial_directories)
-
- # A list of transformation rules (regexp, replacement) applied to
- # symbol names in this project.
- if symbol_transforms is None:
- symbol_transforms = []
-
- self.symbol_transform = CompoundSymbolTransform(symbol_transforms)
-
- # The ID of the Trunk instance for this Project. This member is
- # filled in during CollectRevsPass.
- self.trunk_id = None
-
- # The ID of the CVSDirectory representing the root directory of
- # this project. This member is filled in during CollectRevsPass.
- self.root_cvs_directory_id = None
-
- def __eq__(self, other):
- return self.id == other.id
-
- def __cmp__(self, other):
- return cmp(self.cvs_module, other.cvs_module) \
- or cmp(self.id, other.id)
-
- def __hash__(self):
- return self.id
-
- @staticmethod
- def determine_repository_root(path):
- """Ascend above the specified PATH if necessary to find the
- cvs_repository_root (a directory containing a CVSROOT directory)
- and the cvs_module (the path of the conversion root within the cvs
- repository). Return the root path and the module path of this
- project relative to the root.
-
- NB: cvs_module must be seperated by '/', *not* by os.sep."""
-
- def is_cvs_repository_root(path):
- return os.path.isdir(os.path.join(path, 'CVSROOT'))
-
- original_path = path
- cvs_module = ''
- while not is_cvs_repository_root(path):
- # Step up one directory:
- prev_path = path
- path, module_component = os.path.split(path)
- if path == prev_path:
- # Hit the root (of the drive, on Windows) without finding a
- # CVSROOT dir.
- raise FatalError(
- "the path '%s' is not a CVS repository, nor a path "
- "within a CVS repository. A CVS repository contains "
- "a CVSROOT directory within its root directory."
- % (original_path,))
-
- cvs_module = module_component + "/" + cvs_module
-
- return path, cvs_module
-
- def transform_symbol(self, cvs_file, symbol_name, revision):
- """Transform the symbol SYMBOL_NAME.
-
- SYMBOL_NAME refers to revision number REVISION in CVS_FILE.
- REVISION is the CVS revision number as a string, with zeros
- removed (e.g., '1.7' or '1.7.2'). Use the renaming rules
- specified with --symbol-transform to possibly rename the symbol.
- Return the transformed symbol name, the original name if it should
- not be transformed, or None if the symbol should be omitted from
- the conversion."""
-
- return self.symbol_transform.transform(cvs_file, symbol_name, revision)
-
- def get_trunk(self):
- """Return the Trunk instance for this project.
-
- This method can only be called after self.trunk_id has been
- initialized in CollectRevsPass."""
-
- return Ctx()._symbol_db.get_symbol(self.trunk_id)
-
- def get_root_cvs_directory(self):
- """Return the root CVSDirectory instance for this project.
-
- This method can only be called after self.root_cvs_directory_id
- has been initialized in CollectRevsPass."""
-
- return Ctx()._cvs_file_db.get_file(self.root_cvs_directory_id)
-
- def get_initial_directories(self):
- """Generate the project's initial SVN directories.
-
- Yield as strings the SVN paths of directories that should be
- created when the project is first created."""
-
- # Yield the path of the Trunk symbol for this project (which might
- # differ from the one passed to the --trunk option because of
- # SymbolStrategyRules). The trunk path might be '' during a
- # trunk-only conversion, but that is OK because DumpfileDelegate
- # considers that directory to exist already and will therefore
- # ignore it:
- yield self.get_trunk().base_path
-
- for path in self._initial_directories:
- yield path
-
- def __str__(self):
- return self.project_cvs_repos_path
-
-
-def read_projects(filename):
- retval = {}
- for project in cPickle.load(open(filename, 'rb')):
- retval[project.id] = project
- return retval
-
-
-def write_projects(filename):
- cPickle.dump(Ctx()._projects.values(), open(filename, 'wb'), -1)
-
-