#!/usr/bin/python -b
# Copyright 2009-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

import sys
import portage
portage._internal_caller = True
from portage import os
from portage.util._argparse import ArgumentParser

def command_recompose(args):

	usage = "usage: recompose <binpkg_path> <metadata_dir>\n"

	if len(args) != 2:
		sys.stderr.write(usage)
		sys.stderr.write("2 arguments are required, got %s\n" % len(args))
		return 1

	binpkg_path, metadata_dir = args

	if not os.path.isfile(binpkg_path):
		sys.stderr.write(usage)
		sys.stderr.write("Argument 1 is not a regular file: '%s'\n" % \
			binpkg_path)
		return 1

	if not os.path.isdir(metadata_dir):
		sys.stderr.write(usage)
		sys.stderr.write("Argument 2 is not a directory: '%s'\n" % \
			metadata_dir)
		return 1

	t = portage.xpak.tbz2(binpkg_path)
	t.recompose(metadata_dir)
	return os.EX_OK

def main(argv):

	if argv and isinstance(argv[0], bytes):
		for i, x in enumerate(argv):
			argv[i] = portage._unicode_decode(x, errors='strict')

	valid_commands = ('recompose',)
	description = "Perform metadata operations on a binary package."
	usage = "usage: %s COMMAND [args]" % \
		os.path.basename(argv[0])

	parser = ArgumentParser(description=description, usage=usage)
	options, args = parser.parse_known_args(argv[1:])

	if not args:
		parser.error("missing command argument")

	command = args[0]

	if command not in valid_commands:
		parser.error("invalid command: '%s'" % command)

	if command == 'recompose':
		rval = command_recompose(args[1:])
	else:
		raise AssertionError("invalid command: '%s'" % command)

	return rval

if __name__ == "__main__":
	rval = main(sys.argv[:])
	sys.exit(rval)
