# -*-python-*-
#
# Copyright (C) 1999-2006 The ViewCVS Group. All Rights Reserved.
#
# By using this file, you agree to the terms and conditions set forth in
# the LICENSE.html file which can be found at the top level of the ViewVC
# distribution or at http://viewvc.org/license-1.html.
#
# For more information, visit http://viewvc.org/
#
# -----------------------------------------------------------------------

"""debug.py: various debugging tools for the rcsparse package."""

from __future__ import print_function
import time

from __init__ import parse
import common


class DebugSink(common.Sink):
    def set_head_revision(self, revision):
        print('head:', revision)

    def set_principal_branch(self, branch_name):
        print('branch:', branch_name)

    def define_tag(self, name, revision):
        print('tag:', name, '=', revision)

    def set_comment(self, comment):
        print('comment:', comment)

    def set_description(self, description):
        print('description:', description)

    def define_revision(self, revision, timestamp, author, state,
                        branches, next):
        print('revision:', revision)
        print('    timestamp:', timestamp)
        print('    author:', author)
        print('    state:', state)
        print('    branches:', branches)
        print('    next:', next)

    def set_revision_info(self, revision, log, text):
        print('revision:', revision)
        print('    log:', log)
        print('    text:', text[:100], '...')


class DumpSink(common.Sink):
    """Dump all the parse information directly to stdout.

    The output is relatively unformatted and untagged. It is intended as a
    raw dump of the data in the RCS file. A copy can be saved, then changes
    made to the parsing engine, then a comparison of the new output against
    the old output.
    """
    def __init__(self):
        global sha
        import sha

    def set_head_revision(self, revision):
        print(revision)

    def set_principal_branch(self, branch_name):
        print(branch_name)

    def define_tag(self, name, revision):
        print(name, revision)

    def set_comment(self, comment):
        print(comment)

    def set_description(self, description):
        print(description)

    def define_revision(self, revision, timestamp, author, state,
                        branches, next):
        print(revision, timestamp, author, state, branches, next)

    def set_revision_info(self, revision, log, text):
        print(revision, sha.new(log).hexdigest(), sha.new(text).hexdigest())

    def tree_completed(self):
        print('tree_completed')

    def parse_completed(self):
        print('parse_completed')


def dump_file(fname):
    parse(open(fname, 'rb'), DumpSink())

def time_file(fname):
    f = open(fname, 'rb')
    s = common.Sink()
    t = time.time()
    parse(f, s)
    t = time.time() - t
    print(t)

def _usage():
    print('This is normally a module for importing, but it has a couple')
    print('features for testing as an executable script.')
    print('USAGE: %s COMMAND filename,v' % sys.argv[0])
    print('  where COMMAND is one of:')
    print('    dump: filename is "dumped" to stdout')
    print('    time: filename is parsed with the time written to stdout')
    sys.exit(1)

if __name__ == '__main__':
    import sys
    if len(sys.argv) != 3:
        _usage()
    if sys.argv[1] == 'dump':
        dump_file(sys.argv[2])
    elif sys.argv[1] == 'time':
        time_file(sys.argv[2])
    else:
        _usage()
