#!/usr/bin/env python

"""Apply lipo recursively to trees.
"""

import sys
import os
import shutil
import subprocess

# Parse arguments
import argparse
parser = argparse.ArgumentParser(description=sys.modules[__name__].__doc__,
                                 formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument("output", help="Output tree")
parser.add_argument("input", help="Input trees", nargs="+")
options = parser.parse_args()
output = options.output
inputs = options.input

def ismacho(path):
    """Check if a file is Mach-O"""
    fnull = open(os.devnull, "w")
    try:
        subprocess.check_call(["lipo", "-info", path], stdout=fnull, stderr=fnull)
    except subprocess.CalledProcessError:
        return False
    return True

# Copy
for root, dirs, files in os.walk(inputs[0]):
    # Create root directory in output
    oroot = root[len(inputs[0]):].lstrip("/")
    oroot = os.path.join(output, oroot)
    if not os.path.isdir(oroot):
        os.makedirs(oroot)
        shutil.copystat(root, oroot)

    # Copy files
    for f in files:
        of = os.path.join(oroot, f)
        f = os.path.join(root, f)
        if os.path.islink(f):
            # Symlink
            linkto = os.readlink(f)
            os.symlink(linkto, of)
        elif ismacho(f):
            sff = [ os.path.join(r, f[len(inputs[0]):].lstrip("/"))
                    for r in inputs ]
            args = [ "lipo", "-create", "-output", of ]
            args.extend(sff)
            subprocess.check_call(args)
        else:
            # Regular file, just copy from the first input directory
            shutil.copyfile(f, of)
            shutil.copystat(f, of)
