1 # (Be in -*- python -*- mode.)
3 # ====================================================================
4 # Copyright (c) 2007-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 """Write file contents to a stream of git-fast-import blobs."""
19 from cvs2svn_lib
import config
20 from cvs2svn_lib
.cvs_item
import CVSRevisionDelete
21 from cvs2svn_lib
.revision_manager
import RevisionCollector
22 from cvs2svn_lib
.key_generator
import KeyGenerator
23 from cvs2svn_lib
.artifact_manager
import artifact_manager
26 class GitRevisionCollector(RevisionCollector
):
27 """Output file revisions to git-fast-import."""
29 def __init__(self
, revision_reader
, blob_filename
=None):
30 self
.revision_reader
= revision_reader
31 self
.blob_filename
= blob_filename
33 def register_artifacts(self
, which_pass
):
34 self
.revision_reader
.register_artifacts(which_pass
)
35 if self
.blob_filename
is None:
36 artifact_manager
.register_temp_file(
37 config
.GIT_BLOB_DATAFILE
, which_pass
,
41 self
.revision_reader
.start()
42 if self
.blob_filename
is None:
43 self
.dump_file
= open(
44 artifact_manager
.get_temp_file(config
.GIT_BLOB_DATAFILE
), 'wb',
47 self
.dump_file
= open(self
.blob_filename
, 'wb')
48 self
._mark
_generator
= KeyGenerator()
50 def _process_revision(self
, cvs_rev
):
51 """Write the revision fulltext to a blob if it is not dead."""
53 if isinstance(cvs_rev
, CVSRevisionDelete
):
54 # There is no need to record a delete revision, and its token
55 # will never be needed:
58 # FIXME: We have to decide what to do about keyword substitution
60 fulltext
= self
.revision_reader
.get_content(cvs_rev
)
62 mark
= self
._mark
_generator
.gen_id()
63 self
.dump_file
.write('blob\n')
64 self
.dump_file
.write('mark :%d\n' % (mark
,))
65 self
.dump_file
.write('data %d\n' % (len(fulltext
),))
66 self
.dump_file
.write(fulltext
)
67 self
.dump_file
.write('\n')
68 cvs_rev
.revision_reader_token
= mark
70 def _process_symbol(self
, cvs_symbol
, cvs_file_items
):
71 """Record the original source of CVS_SYMBOL.
73 Determine the original revision source of CVS_SYMBOL, and store it
74 as the symbol's revision_reader_token."""
76 cvs_source
= cvs_symbol
.get_cvs_revision_source(cvs_file_items
)
77 cvs_symbol
.revision_reader_token
= cvs_source
.revision_reader_token
79 def process_file(self
, cvs_file_items
):
80 for lod_items
in cvs_file_items
.iter_lods():
81 for cvs_rev
in lod_items
.cvs_revisions
:
82 self
._process
_revision
(cvs_rev
)
84 # Now that all CVSRevisions' revision_reader_tokens are set,
85 # iterate through symbols and set their tokens to those of their
86 # original source revisions:
87 for lod_items
in cvs_file_items
.iter_lods():
88 if lod_items
.cvs_branch
is not None:
89 self
._process
_symbol
(lod_items
.cvs_branch
, cvs_file_items
)
90 for cvs_tag
in lod_items
.cvs_tags
:
91 self
._process
_symbol
(cvs_tag
, cvs_file_items
)
94 self
.revision_reader
.finish()
95 self
.dump_file
.close()