# -*-python-*-
#
# Copyright (C) 1999-2020 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('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()
