#!/usr/bin/python3

import sys
import os
import argparse

def call(command, exit_on_failure=True):
    return_code = os.system(command)
    if return_code != 0 and exit_on_failure:
        print("ERROR: '%s' exited with return code %d" % (command, return_code))
        sys.exit(1)

parser = argparse.ArgumentParser(description='Build in a Docker image')
parser.add_argument("-i", "--image", help="Docker image", required=True)
parser.add_argument("-s", "--suffix", help="Version suffix", required=False)
parser.add_argument("-g", "--git-repository", help="Git clone URL, or project name (for Mint projects on Github). Suffix with #tagname or #branchname to specify a branch or a tag to build from.", required=False)
args = parser.parse_args()

current_dir = os.getcwd()
project_dir = current_dir.split("/")[-1]
parent_dir = "/".join(current_dir.split("/")[:-1])

# Create the output directory
if args.git_repository is None:
    output_directory = os.path.join(os.getcwd(), "..", "docker-output", args.image.replace("/", "_"))
else:
    output_directory = os.path.join(os.getcwd(), "docker-output", args.image.replace("/", "_"))
call("mkdir -p %s" % output_directory)

# Kill all containers for this image
call("sudo docker rm $(sudo docker stop $(sudo docker ps -a -q --filter ancestor=%s --format=\"{{.ID}}\"))" % args.image, exit_on_failure=False)

# Update the image
call("sudo docker pull %s" % args.image)

mintbuild = "mint-build"

if args.git_repository is not None:
    mintbuild = "%s -g %s" % (mintbuild, args.git_repository)

if args.suffix is not None:
    mintbuild = "%s -s %s" % (mintbuild, args.suffix)

if args.git_repository is None:
    commands = "cp /host_bin/mint-build /usr/bin/mint-build; apt-get update; mkdir -p /PROJECT; cp -R /volume_in/* /PROJECT/; cd /PROJECT/%(project_dir)s; %(mintbuild)s; cp ../*_* /volume_out" % {'mintbuild':mintbuild, 'project_dir':project_dir}
else:
    # If only a name is given, assume the URL is on Linux Mint's github
    repository = args.git_repository
    if "#" in repository:
        repository = repository.split("#")[0]
    project_name = repository
    if "://" in repository or "@" in repository:
        project_name = repository.split("/")[-1].replace(".git", "")
    commands = "cp /host_bin/mint-build /usr/bin/mint-build; apt-get update; apt-get install --yes openssh-client; %(mintbuild)s; cp %(project)s/*_* /volume_out" % {'mintbuild':mintbuild, 'project':project_name}

# Build in a container
ssh_options = ""
ssh_dir = os.path.expanduser("~/.ssh")
if os.path.exists(ssh_dir) and args.git_repository is not None:
    ssh_options = "-v %s:/root/.ssh" % ssh_dir

call("sudo docker run -ti -v /usr/bin:/host_bin %(ssh_options)s -v %(parent_dir)s:/volume_in -v %(output_directory)s:/volume_out %(image)s /bin/sh -c \"%(commands)s\"" % {'ssh_options':ssh_options, 'parent_dir': parent_dir, 'output_directory': output_directory, 'image': args.image, 'commands': commands})

# Fix permissions
os.system("sudo chown -R `whoami`:`whoami` %s" % output_directory)

