aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'cvs2svn_lib/artifact_manager.py')
-rw-r--r--cvs2svn_lib/artifact_manager.py256
1 files changed, 0 insertions, 256 deletions
diff --git a/cvs2svn_lib/artifact_manager.py b/cvs2svn_lib/artifact_manager.py
deleted file mode 100644
index 08f0ec7..0000000
--- a/cvs2svn_lib/artifact_manager.py
+++ /dev/null
@@ -1,256 +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 manages the artifacts produced by conversion passes."""
-
-
-from cvs2svn_lib.log import Log
-from cvs2svn_lib.artifact import TempFile
-
-
-class ArtifactNotActiveError(Exception):
- """An artifact was requested when no passes that have registered
- that they need it are active."""
-
- def __init__(self, artifact_name):
- Exception.__init__(
- self, 'Artifact %s is not currently active' % artifact_name)
-
-
-class ArtifactManager:
- """Manage artifacts that are created by one pass but needed by others.
-
- This class is responsible for cleaning up artifacts once they are no
- longer needed. The trick is that cvs2svn can be run pass by pass,
- so not all passes might be executed during a specific program run.
-
- To use this class:
-
- - Call artifact_manager.set_artifact(name, artifact) once for each
- known artifact.
-
- - Call artifact_manager.creates(which_pass, artifact) to indicate
- that WHICH_PASS is the pass that creates ARTIFACT.
-
- - Call artifact_manager.uses(which_pass, artifact) to indicate that
- WHICH_PASS needs to use ARTIFACT.
-
- There are also helper methods register_temp_file(),
- register_artifact_needed(), and register_temp_file_needed() which
- combine some useful operations.
-
- Then, in pass order:
-
- - Call pass_skipped() for any passes that were already executed
- during a previous cvs2svn run.
-
- - Call pass_started() when a pass is about to start execution.
-
- - If a pass that has been started will be continued during the next
- program run, then call pass_continued().
-
- - If a pass that has been started finishes execution, call
- pass_done(), to allow any artifacts that won't be needed anymore
- to be cleaned up.
-
- - Call pass_deferred() for any passes that have been deferred to a
- future cvs2svn run.
-
- Finally:
-
- - Call check_clean() to verify that all artifacts have been
- accounted for."""
-
- def __init__(self):
- # A map { artifact_name : artifact } of known artifacts.
- self._artifacts = { }
-
- # A map { pass : set_of_artifacts }, where set_of_artifacts is a
- # set of artifacts needed by the pass.
- self._pass_needs = { }
-
- # A set of passes that are currently being executed.
- self._active_passes = set()
-
- def set_artifact(self, name, artifact):
- """Add ARTIFACT to the list of artifacts that we manage.
-
- Store it under NAME."""
-
- assert name not in self._artifacts
- self._artifacts[name] = artifact
-
- def get_artifact(self, name):
- """Return the artifact with the specified name.
-
- If the artifact does not currently exist, raise a KeyError. If it
- is not registered as being needed by one of the active passes,
- raise an ArtifactNotActiveError."""
-
- artifact = self._artifacts[name]
- for active_pass in self._active_passes:
- if artifact in self._pass_needs[active_pass]:
- # OK
- return artifact
- else:
- raise ArtifactNotActiveError(name)
-
- def creates(self, which_pass, artifact):
- """Register that WHICH_PASS creates ARTIFACT.
-
- ARTIFACT must already have been registered."""
-
- # An artifact is automatically "needed" in the pass in which it is
- # created:
- self.uses(which_pass, artifact)
-
- def uses(self, which_pass, artifact):
- """Register that WHICH_PASS uses ARTIFACT.
-
- ARTIFACT must already have been registered."""
-
- artifact._passes_needed.add(which_pass)
- if which_pass in self._pass_needs:
- self._pass_needs[which_pass].add(artifact)
- else:
- self._pass_needs[which_pass] = set([artifact])
-
- def register_temp_file(self, basename, which_pass):
- """Register a temporary file with base name BASENAME as an artifact.
-
- Return the filename of the temporary file."""
-
- artifact = TempFile(basename)
- self.set_artifact(basename, artifact)
- self.creates(which_pass, artifact)
-
- def get_temp_file(self, basename):
- """Return the filename of the temporary file with the specified BASENAME.
-
- If the temporary file is not an existing, registered TempFile,
- raise a KeyError."""
-
- return self.get_artifact(basename).filename
-
- def register_artifact_needed(self, artifact_name, which_pass):
- """Register that WHICH_PASS uses the artifact named ARTIFACT_NAME.
-
- An artifact with this name must already have been registered."""
-
- artifact = self._artifacts[artifact_name]
- artifact._passes_needed.add(which_pass)
- if which_pass in self._pass_needs:
- self._pass_needs[which_pass].add(artifact)
- else:
- self._pass_needs[which_pass] = set([artifact,])
-
- def register_temp_file_needed(self, basename, which_pass):
- """Register that a temporary file is needed by WHICH_PASS.
-
- Register that the temporary file with base name BASENAME is needed
- by WHICH_PASS."""
-
- self.register_artifact_needed(basename, which_pass)
-
- def _unregister_artifacts(self, which_pass):
- """Unregister any artifacts that were needed for WHICH_PASS.
-
- Return a list of artifacts that are no longer needed at all."""
-
- try:
- artifacts = list(self._pass_needs[which_pass])
- except KeyError:
- # No artifacts were needed for that pass:
- return []
-
- del self._pass_needs[which_pass]
-
- unneeded_artifacts = []
- for artifact in artifacts:
- artifact._passes_needed.remove(which_pass)
- if not artifact._passes_needed:
- unneeded_artifacts.append(artifact)
-
- return unneeded_artifacts
-
- def pass_skipped(self, which_pass):
- """WHICH_PASS was executed during a previous cvs2svn run.
-
- Its artifacts were created then, and any artifacts that would
- normally be cleaned up after this pass have already been cleaned
- up."""
-
- self._unregister_artifacts(which_pass)
-
- def pass_started(self, which_pass):
- """WHICH_PASS is starting."""
-
- self._active_passes.add(which_pass)
-
- def pass_continued(self, which_pass):
- """WHICH_PASS will be continued during the next program run.
-
- WHICH_PASS, which has already been started, will be continued
- during the next program run. Unregister any artifacts that would
- be cleaned up at the end of WHICH_PASS without actually cleaning
- them up."""
-
- self._active_passes.remove(which_pass)
- self._unregister_artifacts(which_pass)
-
- def pass_done(self, which_pass, skip_cleanup):
- """WHICH_PASS is done.
-
- Clean up all artifacts that are no longer needed. If SKIP_CLEANUP
- is True, then just do the bookkeeping without actually calling
- artifact.cleanup()."""
-
- self._active_passes.remove(which_pass)
- artifacts = self._unregister_artifacts(which_pass)
- if not skip_cleanup:
- for artifact in artifacts:
- artifact.cleanup()
-
- def pass_deferred(self, which_pass):
- """WHICH_PASS is being deferred until a future cvs2svn run.
-
- Unregister any artifacts that would be cleaned up during
- WHICH_PASS."""
-
- self._unregister_artifacts(which_pass)
-
- def check_clean(self):
- """All passes have been processed.
-
- Output a warning messages if all artifacts have not been accounted
- for. (This is mainly a consistency check, that no artifacts were
- registered under nonexistent passes.)"""
-
- unclean_artifacts = [
- str(artifact)
- for artifact in self._artifacts.values()
- if artifact._passes_needed]
-
- if unclean_artifacts:
- Log().warn(
- 'INTERNAL: The following artifacts were not cleaned up:\n %s\n'
- % ('\n '.join(unclean_artifacts)))
-
-
-# The default ArtifactManager instance:
-artifact_manager = ArtifactManager()
-
-