#!/usr/bin/env python
# Copyright 2017 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""\
Convenience script for generating arch-specific ctags file.
This script MUST be executed at the top directory.

Usage:
    $ tools/dev/gen-tags.py [<arch>...]

The example usage is as follows:
    $ tools/dev/gen-tags.py x64

If no <arch> is given, it generates tags file for all arches:
    $ tools/dev/gen-tags.py
"""
import os
import subprocess
import sys

# All arches that this script understands.
ARCHES = ["ia32", "x64", "arm", "arm64", "mips", "mips64", "ppc", "s390"]

def PrintHelpAndExit():
  print(__doc__)
  sys.exit(0)


def _Call(cmd, silent=False):
  if not silent: print("# %s" % cmd)
  return subprocess.call(cmd, shell=True)


def ParseArguments(argv):
  if not "tools/dev" in argv[0]:
    PrintHelpAndExit()
  argv = argv[1:]

  # If no argument is given, then generate ctags for all arches.
  if len(argv) == 0:
    return ARCHES

  user_arches = []
  for argstring in argv:
    if argstring in ("-h", "--help", "help"):
      PrintHelpAndExit()
    if argstring not in ARCHES:
      print("Invalid argument: %s" % argstring)
      sys.exit(1)
    user_arches.append(argstring)

  return user_arches


def Exclude(fullpath, exclude_arches):
  for arch in exclude_arches:
    if ("/%s/" % arch) in fullpath: return True
  return False


def Main(argv):
  user_arches = []

  user_arches = ParseArguments(argv)

  exclude_arches = list(ARCHES)
  for user_arch in user_arches:
    exclude_arches.remove(user_arch)

  paths = ["include", "src", "test"]
  exts = [".h", ".cc", ".c"]

  gtags_filename = "gtags.files"

  with open(gtags_filename, "w") as gtags:
    for path in paths:
      for root, dirs, files in os.walk(path):
        for file in files:
          if not file.endswith(tuple(exts)): continue
          fullpath = os.path.join(root, file)
          if Exclude(fullpath, exclude_arches): continue
          gtags.write(fullpath + os.linesep)

  _Call("ctags --fields=+l -L " + gtags_filename)


if __name__ == "__main__":
  sys.exit(Main(sys.argv))
