#!/usr/bin/env python
# Copyright 1999-2017 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

"""Ebuild and tree health checks and maintenance utilities.
"""

from __future__ import print_function

import sys
import errno
# This block ensures that ^C interrupts are handled quietly.
try:
	import signal

	def exithandler(signum, _frame):
		signal.signal(signal.SIGINT, signal.SIG_IGN)
		signal.signal(signal.SIGTERM, signal.SIG_IGN)
		sys.exit(128 + signum)

	signal.signal(signal.SIGINT, exithandler)
	signal.signal(signal.SIGTERM, exithandler)
	signal.signal(signal.SIGPIPE, signal.SIG_DFL)

except KeyboardInterrupt:
	sys.exit(1)

from os import path as osp
here = osp.realpath(__file__)
if osp.isfile(osp.join(osp.dirname(osp.dirname(here)), ".repoman_not_installed")):
	# Add the repoman subpkg
	pym_path = osp.join(osp.dirname(osp.dirname(here)), "lib")
	sys.path.insert(0, pym_path)
	if osp.isfile(osp.join(osp.dirname(osp.dirname(osp.dirname(here))), ".portage_not_installed")):
		# Add the base portage pkg
		pym_path = osp.join(osp.dirname(osp.dirname(osp.dirname(here))), "lib")
		sys.path.insert(0, pym_path)

import portage
portage._internal_caller = True
from portage.util._eventloop.global_event_loop import global_event_loop
from repoman.main import repoman_main

try:
	sys.exit(repoman_main(sys.argv[1:]))
except IOError as e:
	if e.errno == errno.EACCES:
		print("\nRepoman: Need user access")
		sys.exit(1)
	else:
		raise
finally:
	global_event_loop().close()
