示例#1
0
  def __init__(self, revision_recorder, stats_keeper):
    self.revision_recorder = revision_recorder
    self._cvs_item_store = NewCVSItemStore(
        artifact_manager.get_temp_file(config.CVS_ITEMS_STORE))
    self.metadata_db = MetadataDatabase(
        artifact_manager.get_temp_file(config.METADATA_STORE),
        artifact_manager.get_temp_file(config.METADATA_INDEX_TABLE),
        DB_OPEN_NEW,
        )
    self.metadata_logger = MetadataLogger(self.metadata_db)
    self.fatal_errors = []
    self.num_files = 0
    self.symbol_stats = SymbolStatisticsCollector()
    self.stats_keeper = stats_keeper

    # Key generator for CVSFiles:
    self.file_key_generator = KeyGenerator()

    # Key generator for CVSItems:
    self.item_key_generator = KeyGenerator()

    # Key generator for Symbols:
    self.symbol_key_generator = KeyGenerator()

    self.revision_recorder.start()
示例#2
0
  def __init__(self, stats_keeper):
    self._cvs_item_store = NewCVSItemStore(
        artifact_manager.get_temp_file(config.CVS_ITEMS_STORE))
    self.metadata_db = MetadataDatabase(
        artifact_manager.get_temp_file(config.METADATA_STORE),
        artifact_manager.get_temp_file(config.METADATA_INDEX_TABLE),
        DB_OPEN_NEW,
        )
    self.metadata_logger = MetadataLogger(self.metadata_db)
    self.fatal_errors = []
    self.num_files = 0
    self.symbol_stats = SymbolStatisticsCollector()
    self.stats_keeper = stats_keeper

    # Key generator for CVSItems:
    self.item_key_generator = KeyGenerator()

    # Key generator for Symbols:
    self.symbol_key_generator = KeyGenerator()
示例#3
0
def prime_ctx():
    def rf(filename):
        artifact_manager.register_temp_file(filename, None)

    from cvs2svn_lib.common import DB_OPEN_READ
    from cvs2svn_lib.symbol_database import SymbolDatabase
    from cvs2svn_lib.cvs_path_database import CVSPathDatabase
    rf(config.CVS_PATHS_DB)
    rf(config.SYMBOL_DB)
    from cvs2svn_lib.cvs_item_database import OldCVSItemStore
    from cvs2svn_lib.metadata_database import MetadataDatabase
    rf(config.METADATA_DB)
    rf(config.CVS_ITEMS_STORE)
    rf(config.CVS_ITEMS_FILTERED_STORE)
    rf(config.CVS_ITEMS_FILTERED_INDEX_TABLE)
    artifact_manager.pass_started(None)

    Ctx()._projects = ProjectList()
    Ctx()._symbol_db = SymbolDatabase()
    Ctx()._cvs_path_db = CVSPathDatabase(DB_OPEN_READ)
    Ctx()._cvs_items_db = OldCVSItemStore(
        artifact_manager.get_temp_file(config.CVS_ITEMS_STORE))
    Ctx()._metadata_db = MetadataDatabase(DB_OPEN_READ)
示例#4
0
class CollectData:
  """Repository for data collected by parsing the CVS repository files.

  This class manages the databases into which information collected
  from the CVS repository is stored.  The data are stored into this
  class by _FileDataCollector instances, one of which is created for
  each file to be parsed."""

  def __init__(self, stats_keeper):
    self._cvs_item_store = NewCVSItemStore(
        artifact_manager.get_temp_file(config.CVS_ITEMS_STORE))
    self.metadata_db = MetadataDatabase(
        artifact_manager.get_temp_file(config.METADATA_STORE),
        artifact_manager.get_temp_file(config.METADATA_INDEX_TABLE),
        DB_OPEN_NEW,
        )
    self.metadata_logger = MetadataLogger(self.metadata_db)
    self.fatal_errors = []
    self.num_files = 0
    self.symbol_stats = SymbolStatisticsCollector()
    self.stats_keeper = stats_keeper

    # Key generator for CVSItems:
    self.item_key_generator = KeyGenerator()

    # Key generator for Symbols:
    self.symbol_key_generator = KeyGenerator()

  def record_fatal_error(self, err):
    """Record that fatal error ERR was found.

    ERR is a string (without trailing newline) describing the error.
    Output the error to stderr immediately, and record a copy to be
    output again in a summary at the end of CollectRevsPass."""

    err = '%s: %s' % (error_prefix, err,)
    logger.error(err + '\n')
    self.fatal_errors.append(err)

  def add_cvs_directory(self, cvs_directory):
    """Record CVS_DIRECTORY."""

    Ctx()._cvs_path_db.log_path(cvs_directory)

  def add_cvs_file_items(self, cvs_file_items):
    """Record the information from CVS_FILE_ITEMS.

    Store the CVSFile to _cvs_path_db under its persistent id, store
    the CVSItems, and record the CVSItems to self.stats_keeper."""

    Ctx()._cvs_path_db.log_path(cvs_file_items.cvs_file)
    self._cvs_item_store.add(cvs_file_items)

    self.stats_keeper.record_cvs_file(cvs_file_items.cvs_file)
    for cvs_item in cvs_file_items.values():
      self.stats_keeper.record_cvs_item(cvs_item)

  def register_trunk(self, trunk):
    """Create a symbol statistics record for the specified trunk LOD."""

    # This causes a record to spring into existence:
    self.symbol_stats[trunk]

  def _process_cvs_file_items(self, cvs_file_items):
    """Process the CVSFileItems from one CVSFile."""

    # Remove an initial delete on trunk if it is not needed:
    cvs_file_items.remove_unneeded_initial_trunk_delete(self.metadata_db)

    # Remove initial branch deletes that are not needed:
    cvs_file_items.remove_initial_branch_deletes(self.metadata_db)

    # If this is a --trunk-only conversion, discard all branches and
    # tags, then draft any non-trunk default branch revisions to
    # trunk:
    if Ctx().trunk_only:
      cvs_file_items.exclude_non_trunk()

    cvs_file_items.check_link_consistency()

    self.add_cvs_file_items(cvs_file_items)
    self.symbol_stats.register(cvs_file_items)

  def process_project(self, project, cvs_paths):
    pdc = _ProjectDataCollector(self, project)

    found_rcs_file = False
    for cvs_path in cvs_paths:
      if isinstance(cvs_path, CVSDirectory):
        self.add_cvs_directory(cvs_path)
      else:
        cvs_file_items = pdc.process_file(cvs_path)
        self._process_cvs_file_items(cvs_file_items)
        found_rcs_file = True

    if not found_rcs_file:
      self.record_fatal_error(
          'No RCS files found under %r!\n'
          'Are you absolutely certain you are pointing cvs2svn\n'
          'at a CVS repository?\n'
          % (project.project_cvs_repos_path,)
          )

    pdc.summarize_symbol_transforms()

    self.num_files += pdc.num_files
    logger.verbose('Processed', self.num_files, 'files')

  def _register_empty_subdirectories(self):
    """Set the CVSDirectory.empty_subdirectory_id members."""

    directories = set(
        path
        for path in Ctx()._cvs_path_db.itervalues()
        if isinstance(path, CVSDirectory)
        )
    for path in Ctx()._cvs_path_db.itervalues():
      if isinstance(path, CVSFile):
        directory = path.parent_directory
        while directory is not None and directory in directories:
          directories.remove(directory)
          directory = directory.parent_directory
    for directory in directories:
      if directory.parent_directory is not None:
        directory.parent_directory.empty_subdirectory_ids.append(directory.id)

  def close(self):
    """Close the data structures associated with this instance.

    Return a list of fatal errors encountered while processing input.
    Each list entry is a string describing one fatal error."""

    self.symbol_stats.purge_ghost_symbols()
    self.symbol_stats.close()
    self.symbol_stats = None
    self.metadata_logger = None
    self.metadata_db.close()
    self.metadata_db = None
    self._cvs_item_store.close()
    self._cvs_item_store = None
    self._register_empty_subdirectories()
    retval = self.fatal_errors
    self.fatal_errors = None
    return retval
示例#5
0
class CollectData:
    """Repository for data collected by parsing the CVS repository files.

  This class manages the databases into which information collected
  from the CVS repository is stored.  The data are stored into this
  class by _FileDataCollector instances, one of which is created for
  each file to be parsed."""
    def __init__(self, stats_keeper):
        self._cvs_item_store = NewCVSItemStore(
            artifact_manager.get_temp_file(config.CVS_ITEMS_STORE))
        self.metadata_db = MetadataDatabase(
            artifact_manager.get_temp_file(config.METADATA_STORE),
            artifact_manager.get_temp_file(config.METADATA_INDEX_TABLE),
            DB_OPEN_NEW,
        )
        self.metadata_logger = MetadataLogger(self.metadata_db)
        self.fatal_errors = []
        self.num_files = 0
        self.symbol_stats = SymbolStatisticsCollector()
        self.stats_keeper = stats_keeper

        # Key generator for CVSItems:
        self.item_key_generator = KeyGenerator()

        # Key generator for Symbols:
        self.symbol_key_generator = KeyGenerator()

    def record_fatal_error(self, err):
        """Record that fatal error ERR was found.

    ERR is a string (without trailing newline) describing the error.
    Output the error to stderr immediately, and record a copy to be
    output again in a summary at the end of CollectRevsPass."""

        err = '%s: %s' % (
            error_prefix,
            err,
        )
        logger.error(err + '\n')
        self.fatal_errors.append(err)

    def add_cvs_directory(self, cvs_directory):
        """Record CVS_DIRECTORY."""

        Ctx()._cvs_path_db.log_path(cvs_directory)

    def add_cvs_file_items(self, cvs_file_items):
        """Record the information from CVS_FILE_ITEMS.

    Store the CVSFile to _cvs_path_db under its persistent id, store
    the CVSItems, and record the CVSItems to self.stats_keeper."""

        Ctx()._cvs_path_db.log_path(cvs_file_items.cvs_file)
        self._cvs_item_store.add(cvs_file_items)

        self.stats_keeper.record_cvs_file(cvs_file_items.cvs_file)
        for cvs_item in cvs_file_items.values():
            self.stats_keeper.record_cvs_item(cvs_item)

    def register_trunk(self, trunk):
        """Create a symbol statistics record for the specified trunk LOD."""

        # This causes a record to spring into existence:
        self.symbol_stats[trunk]

    def _process_cvs_file_items(self, cvs_file_items):
        """Process the CVSFileItems from one CVSFile."""

        # Remove an initial delete on trunk if it is not needed:
        cvs_file_items.remove_unneeded_initial_trunk_delete(self.metadata_db)

        # Remove initial branch deletes that are not needed:
        cvs_file_items.remove_initial_branch_deletes(self.metadata_db)

        # If this is a --trunk-only conversion, discard all branches and
        # tags, then draft any non-trunk default branch revisions to
        # trunk:
        if Ctx().trunk_only:
            cvs_file_items.exclude_non_trunk()

        cvs_file_items.check_link_consistency()

        self.add_cvs_file_items(cvs_file_items)
        self.symbol_stats.register(cvs_file_items)

    def process_project(self, project, cvs_paths):
        pdc = _ProjectDataCollector(self, project)

        found_rcs_file = False
        for cvs_path in cvs_paths:
            if isinstance(cvs_path, CVSDirectory):
                self.add_cvs_directory(cvs_path)
            else:
                cvs_file_items = pdc.process_file(cvs_path)
                self._process_cvs_file_items(cvs_file_items)
                found_rcs_file = True

        if not found_rcs_file:
            self.record_fatal_error(
                'No RCS files found under %r!\n'
                'Are you absolutely certain you are pointing cvs2svn\n'
                'at a CVS repository?\n' % (project.project_cvs_repos_path, ))

        pdc.summarize_symbol_transforms()

        self.num_files += pdc.num_files
        logger.verbose('Processed', self.num_files, 'files')

    def _register_empty_subdirectories(self):
        """Set the CVSDirectory.empty_subdirectory_id members."""

        directories = set(path for path in Ctx()._cvs_path_db.itervalues()
                          if isinstance(path, CVSDirectory))
        for path in Ctx()._cvs_path_db.itervalues():
            if isinstance(path, CVSFile):
                directory = path.parent_directory
                while directory is not None and directory in directories:
                    directories.remove(directory)
                    directory = directory.parent_directory
        for directory in directories:
            if directory.parent_directory is not None:
                directory.parent_directory.empty_subdirectory_ids.append(
                    directory.id)

    def close(self):
        """Close the data structures associated with this instance.

    Return a list of fatal errors encountered while processing input.
    Each list entry is a string describing one fatal error."""

        self.symbol_stats.purge_ghost_symbols()
        self.symbol_stats.close()
        self.symbol_stats = None
        self.metadata_logger = None
        self.metadata_db.close()
        self.metadata_db = None
        self._cvs_item_store.close()
        self._cvs_item_store = None
        self._register_empty_subdirectories()
        retval = self.fatal_errors
        self.fatal_errors = None
        return retval