# -*-python-*-
#
# Copyright (C) 1999-2026 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."""

import time

from .__init__ import parse
from . 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(f"USAGE: {sys.argv[0]} COMMAND filename,v")
    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()
