#!/usr/bin/python

from sys import stdout

import yamlconfig
import configsearch
import gitcache
import yamldoctree
import brdefinitions

# Generates a config file parser
parser = yamlconfig.load(join(dirname(m.__file__), 'config-schema.yaml')
                         for m in (gitcache, yamldoctree, brdefinitions)
                         if exists(join(dirname(m.__file__),
                                        'config-schema.yaml'))
# Generates a command-line parser
parser = parser.parse_files(configsearch.find_config('byod'))
options = parser.parse_argv()

with brdefinitions.load_file_tree(options) as filetree:
	yaml_tree = yamldoctree.YAMLTree(filetree)
	defs = brdefinitions.Definitions(yaml_tree)
	# Resolve refs and generate instructions,
	# including cache IDs for produced artifacts.
	with gitcache.load(options.gitcache) as git_cache:
		build_graph = defs.resolve_build_graph(options.targets, git_cache)

build_graph.serialize(stdout)
flatten = chain.from_iterable
from multiprocessing import Pool, cpu_count
from os.path import dirname, exists, join
from sys import stdin

import yamlconfig   # partly configargparse
import configsearch # xdg.BaseDirectory.load_config_paths('byod')
import gitcache
import yamldoctree
import brdefinitions
import artifactcache
import sandboxlib

# Generates a config file parser
parser = yamlconfig.load(join(dirname(m.__file__), 'config-schema.yaml')
                         for m in (gitcache, artifactcache, sandboxlib)
                         if exists(join(dirname(m.__file__),
                                        'config-schema.yaml'))
# Generates a command-line parser
parser = parser.parse_files(configsearch.find_config('byod'))
options = parser.parse_argv()

build_graph = brdefinitions.deserialize_build_graph(stdin)
assert set(build_graph.find_leaves()) >= set(build_graph.find_targets())


def determine_parallelism(options):
	nprocs = floor(cpu_count() / options.localbuild.cpus_per_process) or 1
	maxjobs = cpu_count() / nprocs
	return nprocs, maxjobs