import json
import os
import re
import shutil
import subprocess
import sys

def identifier():
	try:
		svn_output = subprocess.check_output(["svn", "info", "--show-item", "url"], stderr=subprocess.STDOUT).rstrip()
		return svn_output
	except:
		pass
	try:
		git_remote_and_branch = subprocess.check_output(["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"], stderr=subprocess.STDOUT).rstrip()
		git_remote = git_remote_and_branch.split("/")[0]
		git_branch = "/".join(git_remote_and_branch.split("/")[1:])
		git_url = subprocess.check_output(["git", "remote", "get-url", git_remote]).rstrip()
		return git_url + ":" + git_branch
	except:
		pass
	return None

def get_override():
	dir = os.path.dirname(os.path.realpath(__file__))
	repos_dir = os.path.join(dir, "repos")
	json_regex = re.compile(r"^.*.json$")
	override_path = os.path.join(repos_dir, "OVERRIDE")
	if os.path.isfile(override_path):
		override_set = json.load(open(override_path))
		return override_set["repos"]
        else:
		return None

def find(identifier):
	dir = os.path.dirname(os.path.realpath(__file__))
	repos_dir = os.path.join(dir, "repos")
	json_regex = re.compile(r"^.*.json$")
	override_path = os.path.join(repos_dir, "OVERRIDE")
	if os.path.isfile(override_path):
		override_set = json.load(open(override_path))
		return override_set["repos"]
	fallback_path = os.path.join(repos_dir, "FALLBACK")
	for path in [os.path.join(repos_dir, f) for f in filter(json_regex.match, os.listdir(repos_dir))]:
		fd = open(path)
		set = json.load(fd)
		fd.close()
		if any(re.match(set_regex, identifier) for set_regex in set["regexs"]):
			shutil.copyfile(path, fallback_path)
			return set["repos"]
	if os.path.isfile(fallback_path):
		fallback_set = json.load(open(fallback_path))
		return fallback_set["repos"]
	sys.exit("Couldn't find a branch configuration for " + identifier + " and there was no " + fallback_path)
