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 """This module manages cvs2git run options."""
24 from cvs2svn_lib
.version
import VERSION
25 from cvs2svn_lib
.common
import error_prefix
26 from cvs2svn_lib
.common
import FatalError
27 from cvs2svn_lib
.log
import Log
28 from cvs2svn_lib
.context
import Ctx
29 from cvs2svn_lib
.run_options
import not_both
30 from cvs2svn_lib
.run_options
import RunOptions
31 from cvs2svn_lib
.run_options
import ContextOption
32 from cvs2svn_lib
.run_options
import IncompatibleOption
33 from cvs2svn_lib
.run_options
import authors
34 from cvs2svn_lib
.man_writer
import ManWriter
35 from cvs2svn_lib
.project
import Project
36 from cvs2svn_lib
.rcs_revision_manager
import RCSRevisionReader
37 from cvs2svn_lib
.cvs_revision_manager
import CVSRevisionReader
38 from cvs2svn_lib
.git_revision_recorder
import GitRevisionRecorder
39 from cvs2svn_lib
.git_output_option
import GitRevisionMarkWriter
40 from cvs2svn_lib
.git_output_option
import GitOutputOption
41 from cvs2svn_lib
.revision_manager
import NullRevisionRecorder
42 from cvs2svn_lib
.revision_manager
import NullRevisionExcluder
43 from cvs2svn_lib
.fulltext_revision_recorder \
44 import SimpleFulltextRevisionRecorderAdapter
47 short_desc
= 'convert a cvs repository into a git repository'
51 [\\fIOPTION\\fR]... \\fIOUTPUT-OPTIONS CVS-REPOS-PATH\\fR
54 [\\fIOPTION\\fR]... \\fI--options=PATH\\fR
58 Create a new git repository based on the version history stored in a
59 CVS repository. Each CVS commit will be mirrored in the git
60 repository, including such information as date of commit and id of the
63 The output of this program are a "blobfile" and a "dumpfile", which
64 together can be loaded into a git repository using "git fast-import".
66 \\fICVS-REPOS-PATH\\fR is the filesystem path of the part of the CVS
67 repository that you want to convert. This path doesn't have to be the
68 top level directory of a CVS repository; it can point at a project
69 within a repository, in which case only that project will be
70 converted. This path or one of its parent directories has to contain
71 a subdirectory called CVSROOT (though the CVSROOT directory can be
74 It is not possible directly to convert a CVS repository to which you
75 only have remote access, but the FAQ describes tools that may be used
76 to create a local copy of a remote CVS repository.
80 A directory called \\fIcvs2svn-tmp\\fR (or the directory specified by
81 \\fB--tmpdir\\fR) is used as scratch space for temporary data files.
87 ('git-fast-import', '1'),
91 class GitRunOptions(RunOptions
):
92 def __init__(self
, progname
, cmd_args
, pass_manager
):
93 Ctx().cross_project_commits
= False
94 Ctx().cross_branch_commits
= False
95 RunOptions
.__init
__(self
, progname
, cmd_args
, pass_manager
)
97 def _get_output_options_group(self
):
98 group
= RunOptions
._get
_output
_options
_group
(self
)
100 group
.add_option(IncompatibleOption(
101 '--blobfile', type='string',
103 help='path to which the "blob" data should be written',
105 'Write the "blob" data (containing revision contents) to '
110 group
.add_option(IncompatibleOption(
111 '--dumpfile', type='string',
113 help='path to which the revision data should be written',
115 'Write the revision data (branches and commits) to \\fIpath\\fR.'
119 group
.add_option(ContextOption(
123 'do not create any output; just print what would happen.'
126 'Do not create any output; just print what would happen.'
132 def _get_extraction_options_group(self
):
133 group
= RunOptions
._get
_extraction
_options
_group
(self
)
135 self
.parser
.set_default('use_cvs', False)
136 group
.add_option(IncompatibleOption(
140 'use CVS to extract revision contents (slower than '
141 '--use-rcs but more reliable) (default)'
144 'Use CVS to extract revision contents. This option is slower '
145 'than \\fB--use-rcs\\fR but more reliable.'
148 self
.parser
.set_default('use_rcs', False)
149 group
.add_option(IncompatibleOption(
153 'use RCS to extract revision contents (faster than '
154 '--use-cvs but fails in some cases)'
157 'Use RCS \'co\' to extract revision contents. This option is '
158 'faster than \\fB--use-cvs\\fR but fails in some cases.'
164 def callback_manpage(self
, option
, opt_str
, value
, parser
):
165 f
= codecs
.getwriter('utf_8')(sys
.stdout
)
169 date
=datetime
.date
.today(),
170 source
='Version %s' % (VERSION
,),
171 manual
='User Commands',
172 short_desc
=short_desc
,
181 def process_io_options(self
):
182 """Process input/output options.
184 Process options related to extracting data from the CVS repository
185 and writing to 'git fast-import'-formatted files."""
188 options
= self
.options
190 not_both(options
.use_rcs
, '--use-rcs',
191 options
.use_cvs
, '--use-cvs')
194 revision_reader
= RCSRevisionReader(
195 co_executable
=options
.co_executable
198 # --use-cvs is the default:
199 revision_reader
= CVSRevisionReader(
200 cvs_executable
=options
.cvs_executable
204 ctx
.revision_recorder
= NullRevisionRecorder()
206 if not (options
.blobfile
and options
.dumpfile
):
207 raise FatalError("must pass '--blobfile' and '--dumpfile' options.")
208 ctx
.revision_recorder
= SimpleFulltextRevisionRecorderAdapter(
210 GitRevisionRecorder(options
.blobfile
),
213 ctx
.revision_excluder
= NullRevisionExcluder()
214 ctx
.revision_reader
= None
216 ctx
.output_option
= GitOutputOption(
218 GitRevisionMarkWriter(),
220 # Optional map from CVS author names to git author names:
221 author_transforms
={}, # FIXME
226 project_cvs_repos_path
,
227 symbol_transforms
=None,
228 symbol_strategy_rules
=[],
230 """Set the project to be converted.
232 If a project had already been set, overwrite it.
234 Most arguments are passed straight through to the Project
235 constructor. SYMBOL_STRATEGY_RULES is an iterable of
236 SymbolStrategyRules that will be applied to symbols in this
239 symbol_strategy_rules
= list(symbol_strategy_rules
)
243 project_cvs_repos_path
,
244 symbol_transforms
=symbol_transforms
,
247 self
.projects
= [project
]
248 self
.project_symbol_strategy_rules
= [symbol_strategy_rules
]
250 def process_options(self
):
251 # Consistency check for options and arguments.
252 if len(self
.args
) == 0:
256 if len(self
.args
) > 1:
257 Log().error(error_prefix
+ ": must pass only one CVS repository.\n")
261 cvsroot
= self
.args
[0]
263 self
.process_io_options()
264 self
.process_encoding_options()
265 self
.process_symbol_strategy_options()
266 self
.process_property_setter_options()
268 # Create the project:
271 symbol_transforms
=self
.options
.symbol_transforms
,
272 symbol_strategy_rules
=self
.options
.symbol_strategy_rules
,