Move definitions of generate_ignores() higher in the file.
[cvs2svn.git] / cvs2svn_lib / cvs_revision_manager.py
blob5003aab71a6006c06f9b93b68127e92016f05144
1 # (Be in -*- python -*- mode.)
3 # ====================================================================
4 # Copyright (c) 2000-2008 CollabNet. All rights reserved.
6 # This software is licensed as described in the file COPYING, which
7 # you should have received as part of this distribution. The terms
8 # are also available at http://subversion.tigris.org/license-1.html.
9 # If newer versions of this license are posted there, you may use a
10 # newer version instead, at your option.
12 # This software consists of voluntary contributions made by many
13 # individuals. For exact contribution history, see the revision
14 # history and logs, available at http://cvs2svn.tigris.org/.
15 # ====================================================================
17 """Access the CVS repository via CVS's 'cvs' command."""
20 from cvs2svn_lib.common import FatalError
21 from cvs2svn_lib.process import check_command_runs
22 from cvs2svn_lib.process import CommandFailedException
23 from cvs2svn_lib.abstract_rcs_revision_manager import AbstractRCSRevisionReader
26 class CVSRevisionReader(AbstractRCSRevisionReader):
27 """A RevisionReader that reads the contents via CVS."""
29 # Different versions of CVS support different global options. Here
30 # are the global options that we try to use, in order of decreasing
31 # preference:
32 _possible_global_options = [
33 ['-Q', '-R', '-f'],
34 ['-Q', '-R'],
35 ['-Q', '-f'],
36 ['-Q'],
37 ['-q', '-R', '-f'],
38 ['-q', '-R'],
39 ['-q', '-f'],
40 ['-q'],
43 def __init__(self, cvs_executable, global_options=None):
44 """Initialize a CVSRevisionReader.
46 CVS_EXECUTABLE is the CVS command (possibly including the full
47 path to the executable; otherwise it is sought in the $PATH).
48 GLOBAL_ARGUMENTS, if specified, should be a list of global options
49 that are passed to the CVS command before the subcommand. If
50 GLOBAL_ARGUMENTS is not specified, then each of the possibilities
51 listed in _possible_global_options is checked in order until one
52 is found that runs successfully and without any output to stderr."""
54 self.cvs_executable = cvs_executable
56 if global_options is None:
57 for global_options in self._possible_global_options:
58 try:
59 self._check_cvs_runs(global_options)
60 except CommandFailedException, e:
61 pass
62 else:
63 break
64 else:
65 raise FatalError(
66 '%s\n'
67 'Please check that cvs is installed and in your PATH.' % (e,)
69 else:
70 try:
71 self._check_cvs_runs(global_options)
72 except CommandFailedException, e:
73 raise FatalError(
74 '%s\n'
75 'Please check that cvs is installed and in your PATH and that\n'
76 'the global options that you specified (%r) are correct.'
77 % (e, global_options,)
80 # The global options were OK; use them for all CVS invocations.
81 self.global_options = global_options
83 def _check_cvs_runs(self, global_options):
84 """Check that CVS can be started.
86 Try running 'cvs --version' with the current setting for
87 self.cvs_executable and the specified global_options. If not
88 successful, raise a CommandFailedException."""
90 check_command_runs(
91 [self.cvs_executable] + global_options + ['--version'],
92 self.cvs_executable,
95 def get_pipe_command(self, cvs_rev, k_option):
96 project = cvs_rev.cvs_file.project
97 return [
98 self.cvs_executable
99 ] + self.global_options + [
100 '-d', ':local:' + project.cvs_repository_root,
101 'co',
102 '-r' + cvs_rev.rev,
103 '-p'
104 ] + k_option + [
105 project.cvs_module + cvs_rev.cvs_path