From 5d740f970a9cff2a35c42032a02fd51b2334ad08 Mon Sep 17 00:00:00 2001 From: mhagger Date: Tue, 24 May 2011 08:38:52 +0000 Subject: [PATCH] Access the rcsparse code via a new interface module, rcsparser. This is the first step towards getting a better handle on how cvs2svn uses the rcsparse code. This first version differs from cvs2svn_rcsparse/__init__.py by not trying to use tparse, which is not shipped with cvs2svn and seems anyway to be broken and unmaintained. git-svn-id: http://cvs2svn.tigris.org/svn/cvs2svn/trunk@5351 be7e6eca-30d4-0310-a8e5-ac0d63af7087 --- contrib/destroy_repository.py | 4 ++-- contrib/rcs_file_filter.py | 13 ++++++------- contrib/renumber_branch.py | 8 +++++--- contrib/shrink_test_case.py | 14 +++++++------- cvs2svn_lib/checkout_internal.py | 7 ++++--- cvs2svn_lib/collect_data.py | 10 ++++++---- cvs2svn_lib/generate_blobs.py | 4 ++-- cvs2svn_lib/rcsparser.py | 38 +++++++++++++++++++++++++++++++++++++ cvs2svn_lib/test/rcs_stream_test.py | 4 ++-- 9 files changed, 72 insertions(+), 30 deletions(-) create mode 100644 cvs2svn_lib/rcsparser.py diff --git a/contrib/destroy_repository.py b/contrib/destroy_repository.py index 24141098..f4e336d2 100755 --- a/contrib/destroy_repository.py +++ b/contrib/destroy_repository.py @@ -111,7 +111,7 @@ import re sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from cvs2svn_lib.key_generator import KeyGenerator -import cvs2svn_rcsparse +from cvs2svn_lib.rcsparser import parse from rcs_file_filter import WriteRCSFileSink from rcs_file_filter import FilterSink @@ -347,7 +347,7 @@ class FileDestroyer: tmp_filename = get_tmp_filename() f = open(tmp_filename, 'wb') new_filename = rewrite_filename(filename) - cvs2svn_rcsparse.parse( + parse( open(filename, 'rb'), DestroyerFilterSink( self.author_substituter, diff --git a/contrib/rcs_file_filter.py b/contrib/rcs_file_filter.py index 1be3b3f2..32963aa1 100755 --- a/contrib/rcs_file_filter.py +++ b/contrib/rcs_file_filter.py @@ -24,7 +24,8 @@ import time sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -import cvs2svn_rcsparse +from cvs2svn_lib.rcsparser import Sink +from cvs2svn_lib.rcsparser import parse def at_quote(s): @@ -41,7 +42,7 @@ def format_date(date): return year + time.strftime('.%m.%d.%H.%M.%S', date_tuple) -class WriteRCSFileSink(cvs2svn_rcsparse.Sink): +class WriteRCSFileSink(Sink): """A Sink that outputs reconstructed RCS file contents.""" def __init__(self, f): @@ -138,7 +139,7 @@ class WriteRCSFileSink(cvs2svn_rcsparse.Sink): pass -class FilterSink(cvs2svn_rcsparse.Sink): +class FilterSink(Sink): """A Sink that passes callbacks through to another sink. This is intended for use as a base class for other filter classes @@ -202,12 +203,10 @@ if __name__ == '__main__': if sys.argv[1:]: for path in sys.argv[1:]: if os.path.isfile(path) and path.endswith(',v'): - cvs2svn_rcsparse.parse( - open(path, 'rb'), WriteRCSFileSink(sys.stdout) - ) + parse(open(path, 'rb'), WriteRCSFileSink(sys.stdout)) else: sys.stderr.write('%r is being ignored.\n' % path) else: - cvs2svn_rcsparse.parse(sys.stdin, WriteRCSFileSink(sys.stdout)) + parse(sys.stdin, WriteRCSFileSink(sys.stdout)) diff --git a/contrib/renumber_branch.py b/contrib/renumber_branch.py index e929e321..9d539410 100755 --- a/contrib/renumber_branch.py +++ b/contrib/renumber_branch.py @@ -46,8 +46,10 @@ import os sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -import cvs2svn_rcsparse -from rcs_file_filter import WriteRCSFileSink, FilterSink +from cvs2svn_lib.rcsparser import parse +from rcs_file_filter import WriteRCSFileSink +from rcs_file_filter import FilterSink + class RenumberingFilter(FilterSink): '''A filter that transforms all revision numbers using a @@ -112,7 +114,7 @@ def process_file(filename, rev_from, rev_to, force): try: writer = WriteRCSFileSink(outfp) revfilter = RenumberingFilter(writer, func) - cvs2svn_rcsparse.parse(infp, revfilter) + parse(infp, revfilter) finally: outfp.close() infp.close() diff --git a/contrib/shrink_test_case.py b/contrib/shrink_test_case.py index fb6a6664..b17dee1b 100755 --- a/contrib/shrink_test_case.py +++ b/contrib/shrink_test_case.py @@ -42,8 +42,8 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from cvs2svn_lib.key_generator import KeyGenerator -import cvs2svn_rcsparse - +from cvs2svn_lib.rcsparser import Sink +from cvs2svn_lib.rcsparser import parse from contrib.rcs_file_filter import WriteRCSFileSink from contrib.rcs_file_filter import FilterSink @@ -388,7 +388,7 @@ class RCSFileFilter: fout = StringIO() sink = WriteRCSFileSink(fout) filter = self.get_filter_sink(sink) - cvs2svn_rcsparse.parse(StringIO(text), filter) + parse(StringIO(text), filter) return fout.getvalue() def get_subfilters(self): @@ -422,7 +422,7 @@ class DeleteTagRCSFileFilter(RCSFileFilter): def get_tag_set(path): - class TagCollector(cvs2svn_rcsparse.Sink): + class TagCollector(Sink): def __init__(self): self.tags = set() @@ -454,7 +454,7 @@ def get_tag_set(path): return tags tag_collector = TagCollector() - cvs2svn_rcsparse.parse(open(path, 'rb'), tag_collector) + parse(open(path, 'rb'), tag_collector) return tag_collector.get_tags() @@ -519,7 +519,7 @@ def get_branch_tree(path): """ - class BranchCollector(cvs2svn_rcsparse.Sink): + class BranchCollector(Sink): def __init__(self): self.branches = {} @@ -551,7 +551,7 @@ def get_branch_tree(path): return retval branch_collector = BranchCollector() - cvs2svn_rcsparse.parse(open(path, 'rb'), branch_collector) + parse(open(path, 'rb'), branch_collector) return branch_collector.get_branches() diff --git a/cvs2svn_lib/checkout_internal.py b/cvs2svn_lib/checkout_internal.py index 543cf5ec..6d4d1df8 100644 --- a/cvs2svn_lib/checkout_internal.py +++ b/cvs2svn_lib/checkout_internal.py @@ -100,7 +100,8 @@ from cvs2svn_lib.serializer import CompressingSerializer from cvs2svn_lib.serializer import PrimedPickleSerializer from cvs2svn_lib.apple_single_filter import get_maybe_apple_single -import cvs2svn_rcsparse +from cvs2svn_lib.rcsparser import Sink +from cvs2svn_lib.rcsparser import parse class TextRecord(object): @@ -446,7 +447,7 @@ class TextRecordDatabase: return '\n'.join(retval) -class _Sink(cvs2svn_rcsparse.Sink): +class _Sink(Sink): def __init__(self, revision_collector, cvs_file_items): self.revision_collector = revision_collector self.cvs_file_items = cvs_file_items @@ -609,7 +610,7 @@ class InternalRevisionCollector(RevisionCollector): # A map from cvs_rev_id to TextRecord instance: self.text_record_db = TextRecordDatabase(self._delta_db, NullDatabase()) - cvs2svn_rcsparse.parse( + parse( open(cvs_file_items.cvs_file.rcs_path, 'rb'), _Sink(self, cvs_file_items), ) diff --git a/cvs2svn_lib/collect_data.py b/cvs2svn_lib/collect_data.py index 6b17217d..ba7f3b93 100644 --- a/cvs2svn_lib/collect_data.py +++ b/cvs2svn_lib/collect_data.py @@ -74,7 +74,9 @@ from cvs2svn_lib.symbol_statistics import SymbolStatisticsCollector from cvs2svn_lib.metadata_database import MetadataDatabase from cvs2svn_lib.metadata_database import MetadataLogger -import cvs2svn_rcsparse +from cvs2svn_lib.rcsparser import Sink +from cvs2svn_lib.rcsparser import parse +from cvs2svn_lib.rcsparser import RCSParseError # A regular expression defining "valid" revision numbers (used to @@ -517,7 +519,7 @@ class _SymbolDataCollector(object): return self.rev_to_branch_data(revision).symbol -class _FileDataCollector(cvs2svn_rcsparse.Sink): +class _FileDataCollector(Sink): """Class responsible for collecting RCS data for a particular file. Any collected data that need to be remembered are stored into the @@ -1044,8 +1046,8 @@ class _ProjectDataCollector: logger.normal(cvs_file.rcs_path) fdc = _FileDataCollector(self, cvs_file) try: - cvs2svn_rcsparse.parse(open(cvs_file.rcs_path, 'rb'), fdc) - except (cvs2svn_rcsparse.common.RCSParseError, RuntimeError): + parse(open(cvs_file.rcs_path, 'rb'), fdc) + except (RCSParseError, RuntimeError): self.collect_data.record_fatal_error( "%r is not a valid ,v file" % (cvs_file.rcs_path,) ) diff --git a/cvs2svn_lib/generate_blobs.py b/cvs2svn_lib/generate_blobs.py index d2051acc..83f9ed1b 100755 --- a/cvs2svn_lib/generate_blobs.py +++ b/cvs2svn_lib/generate_blobs.py @@ -50,8 +50,8 @@ import cPickle as pickle sys.path.insert(0, os.path.dirname(os.path.dirname(sys.argv[0]))) -from cvs2svn_rcsparse import Sink -from cvs2svn_rcsparse import parse +from cvs2svn_lib.rcsparser import Sink +from cvs2svn_lib.rcsparser import parse from cvs2svn_lib.rcs_stream import RCSStream diff --git a/cvs2svn_lib/rcsparser.py b/cvs2svn_lib/rcsparser.py new file mode 100644 index 00000000..257383da --- /dev/null +++ b/cvs2svn_lib/rcsparser.py @@ -0,0 +1,38 @@ +# (Be in -*- python -*- mode.) +# +# ==================================================================== +# Copyright (c) 2011 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/. +# ==================================================================== + +"""The interface between cvs2svn and cvs2svn_rcsparse.""" + + +from cvs2svn_rcsparse.common import Sink +from cvs2svn_rcsparse.common import RCSParseError + +try: + from cvs2svn_rcsparse.texttools import Parser +except ImportError: + from cvs2svn_rcsparse.default import Parser + + +def parse(file, sink): + """Parse an RCS file. + + The arguments are the same as those of + cvs2svn_rcsparse.common._Parser.parse() (see that method's docstring + for more details). + """ + return Parser().parse(file, sink) + + diff --git a/cvs2svn_lib/test/rcs_stream_test.py b/cvs2svn_lib/test/rcs_stream_test.py index 9a6e1a78..964ce521 100755 --- a/cvs2svn_lib/test/rcs_stream_test.py +++ b/cvs2svn_lib/test/rcs_stream_test.py @@ -31,8 +31,8 @@ sys.path.insert(0, SRCPATH) import unittest -from cvs2svn_rcsparse import Sink -from cvs2svn_rcsparse import parse +from cvs2svn_lib.rcsparser import Sink +from cvs2svn_lib.rcsparser import parse from cvs2svn_lib.rcs_stream import RCSStream TMPDIR = os.path.join(SRCPATH, 'cvs2svn-tmp') -- 2.11.4.GIT