#!/usr/bin/env python
"""
wciia - Whose Code Is It Anyway

Determines code owner of the file/folder relative to the llvm source root.
Code owner is determined from the content of the CODE_OWNERS.TXT 
by parsing the D: field

usage:

utils/wciia.py  path

limitations:
- must be run from llvm source root
- very simplistic algorithm
- only handles * as a wildcard
- not very user friendly 
- does not handle the proposed F: field

"""

from __future__ import print_function
import os

code_owners = {}


def process_files_and_folders(owner):
    filesfolders = owner['filesfolders']
    # paths must be in ( ... ) so strip them
    lpar = filesfolders.find('(')
    rpar = filesfolders.rfind(')')
    if rpar <= lpar:
        # give up
        return
    paths = filesfolders[lpar + 1:rpar]
    # split paths
    owner['paths'] = []
    for path in paths.split():
        owner['paths'].append(path)


def process_code_owner(owner):
    if 'filesfolders' in owner:
        filesfolders = owner['filesfolders']
    else:
        #		print "F: field missing, using D: field"
        owner['filesfolders'] = owner['description']
    process_files_and_folders(owner)
    code_owners[owner['name']] = owner


# process CODE_OWNERS.TXT first
code_owners_file = open("CODE_OWNERS.TXT", "r").readlines()
code_owner = {}
for line in code_owners_file:
    for word in line.split():
        if word == "N:":
            name = line[2:].strip()
            if code_owner:
                process_code_owner(code_owner)
                code_owner = {}
            # reset the values
            code_owner['name'] = name
        if word == "E:":
            email = line[2:].strip()
            code_owner['email'] = email
        if word == "D:":
            description = line[2:].strip()
            code_owner['description'] = description
        if word == "F:":
            filesfolders = line[2:].strip()
            code_owner['filesfolders'].append(filesfolders)


def find_owners(fpath):
    onames = []
    lmatch = -1
    #  very simplistic way of findning the best match
    for name in code_owners:
        owner = code_owners[name]
        if 'paths' in owner:
            for path in owner['paths']:
                #				print "searching (" + path + ")"
                # try exact match
                if fpath == path:
                    return name
                # see if path ends with a *
                rstar = path.rfind('*')
                if rstar > 0:
                    # try the longest match,
                    rpos = -1
                    if len(fpath) < len(path):
                        rpos = path.find(fpath)
                    if rpos == 0:
                        onames.append(name)
    onames.append('Chris Lattner')
    return onames


# now lest try to find the owner of the file or folder
import sys

if len(sys.argv) < 2:
    print("usage " + sys.argv[0] + " file_or_folder")
    exit(-1)

# the path we are checking
path = str(sys.argv[1])

# check if this is real path
if not os.path.exists(path):
    print("path (" + path + ") does not exist")
    exit(-1)

owners_name = find_owners(path)

# be grammatically correct
print("The owner(s) of the (" + path + ") is(are) : " + str(owners_name))

exit(0)

# bottom up walk of the current .
# not yet used
root = "."
for dir, subdirList, fileList in os.walk(root, topdown=False):
    print("dir :", dir)
    for fname in fileList:
        print("-", fname)
    print()
