1 # (Be in -*- python -*- mode.)
3 # ====================================================================
4 # Copyright (c) 2000-2009 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
.context
import Ctx
28 from cvs2svn_lib
.dvcs_common
import DVCSRunOptions
29 from cvs2svn_lib
.run_options
import RunOptions
30 from cvs2svn_lib
.run_options
import ContextOption
31 from cvs2svn_lib
.run_options
import IncompatibleOption
32 from cvs2svn_lib
.run_options
import authors
33 from cvs2svn_lib
.run_options
import not_both
34 from cvs2svn_lib
.man_writer
import ManWriter
35 from cvs2svn_lib
.revision_manager
import NullRevisionRecorder
36 from cvs2svn_lib
.revision_manager
import NullRevisionExcluder
37 from cvs2svn_lib
.rcs_revision_manager
import RCSRevisionReader
38 from cvs2svn_lib
.cvs_revision_manager
import CVSRevisionReader
39 from cvs2svn_lib
.git_revision_recorder
import GitRevisionRecorder
40 from cvs2svn_lib
.git_output_option
import GitRevisionMarkWriter
41 from cvs2svn_lib
.git_output_option
import GitOutputOption
42 from cvs2svn_lib
.fulltext_revision_recorder \
43 import SimpleFulltextRevisionRecorderAdapter
46 short_desc
= 'convert a cvs repository into a git repository'
50 [\\fIOPTION\\fR]... \\fIOUTPUT-OPTIONS CVS-REPOS-PATH\\fR
53 [\\fIOPTION\\fR]... \\fI--options=PATH\\fR
57 Create a new git repository based on the version history stored in a
58 CVS repository. Each CVS commit will be mirrored in the git
59 repository, including such information as date of commit and id of the
62 The output of this program are a "blobfile" and a "dumpfile", which
63 together can be loaded into a git repository using "git fast-import".
65 \\fICVS-REPOS-PATH\\fR is the filesystem path of the part of the CVS
66 repository that you want to convert. This path doesn't have to be the
67 top level directory of a CVS repository; it can point at a project
68 within a repository, in which case only that project will be
69 converted. This path or one of its parent directories has to contain
70 a subdirectory called CVSROOT (though the CVSROOT directory can be
73 It is not possible directly to convert a CVS repository to which you
74 only have remote access, but the FAQ describes tools that may be used
75 to create a local copy of a remote CVS repository.
79 A directory called \\fIcvs2svn-tmp\\fR (or the directory specified by
80 \\fB--tmpdir\\fR) is used as scratch space for temporary data files.
86 ('git-fast-import', '1'),
90 class GitRunOptions(DVCSRunOptions
):
92 def _get_output_options_group(self
):
93 group
= DVCSRunOptions
._get
_output
_options
_group
(self
)
95 group
.add_option(IncompatibleOption(
96 '--blobfile', type='string',
98 help='path to which the "blob" data should be written',
100 'Write the "blob" data (containing revision contents) to '
105 group
.add_option(IncompatibleOption(
106 '--dumpfile', type='string',
108 help='path to which the revision data should be written',
110 'Write the revision data (branches and commits) to \\fIpath\\fR.'
114 group
.add_option(ContextOption(
118 'do not create any output; just print what would happen.'
121 'Do not create any output; just print what would happen.'
127 def _get_extraction_options_group(self
):
128 group
= RunOptions
._get
_extraction
_options
_group
(self
)
129 self
._add
_use
_cvs
_option
(group
)
130 self
._add
_use
_rcs
_option
(group
)
133 def callback_manpage(self
, option
, opt_str
, value
, parser
):
134 f
= codecs
.getwriter('utf_8')(sys
.stdout
)
138 date
=datetime
.date
.today(),
139 source
='Version %s' % (VERSION
,),
140 manual
='User Commands',
141 short_desc
=short_desc
,
150 # XXX not quite the same as same method in SVNRunOptions, but it
152 def process_extraction_options(self
):
153 """Process options related to extracting data from the CVS
156 options
= self
.options
158 not_both(options
.use_rcs
, '--use-rcs',
159 options
.use_cvs
, '--use-cvs')
162 revision_reader
= RCSRevisionReader(
163 co_executable
=options
.co_executable
166 # --use-cvs is the default:
167 revision_reader
= CVSRevisionReader(
168 cvs_executable
=options
.cvs_executable
172 ctx
.revision_recorder
= NullRevisionRecorder()
174 if not (options
.blobfile
and options
.dumpfile
):
175 raise FatalError("must pass '--blobfile' and '--dumpfile' options.")
176 ctx
.revision_recorder
= SimpleFulltextRevisionRecorderAdapter(
178 GitRevisionRecorder(options
.blobfile
),
181 ctx
.revision_excluder
= NullRevisionExcluder()
182 ctx
.revision_reader
= None
184 def process_output_options(self
):
185 """Process options related to fastimport output."""
187 ctx
.output_option
= GitOutputOption(
188 self
.options
.dumpfile
,
189 GitRevisionMarkWriter(),
191 # Optional map from CVS author names to git author names:
192 author_transforms
={}, # FIXME