#!/usr/bin/env python
import os
import re
import sys
import stat
from subprocess import Popen, PIPE

devnull = open('/dev/null', 'a')
here = os.path.abspath(os.path.dirname(__file__))
lib_dir = os.path.abspath(sys.argv[1])

py_version = '%s.%s' % sys.version_info[:2]

bad_prefix = '/usr/local'
good_prefix = '@rpath/lib/python%s/lib-dynload/' % py_version


def find_bad_lib_references(filename):
    c = Popen(['otool', '-L', filename], stdout=PIPE)
    lines = c.communicate()[0].splitlines()
    rv = []
    for line in lines:
        match = re.match('^\t(.*?\.(?:dylib|so))\s+\(', line)
        if match is not None:
            lib = match.group(1)
            if lib.startswith(bad_prefix + '/') and '/openssl' in lib:
                rv.append(lib)
    return rv


def rewrite_bad_libs(base):
    libs = find_bad_lib_references(base)
    rv = set()
    if not libs:
        return rv

    os.chmod(base, os.stat(base).st_mode | stat.S_IWRITE)

    for bad_lib in libs:
        good_lib = good_prefix + os.path.basename(bad_lib)
        Popen(['install_name_tool', '-change', bad_lib, good_lib, base]).wait()
        rv.add(bad_lib)

    good_lib = '@rpath/' + bad_lib[len(bad_prefix) + 1:]
    Popen(['install_name_tool', '-id', good_prefix + os.path.basename(base),
           base]).wait()

    return rv


def rewrite_dylibs():
    for filename in os.listdir(os.path.join(lib_dir)):
        if not filename.endswith(('.dylib', '.so')):
            continue
        filename = os.path.join(lib_dir, filename)
        if os.path.islink(filename):
            continue
        rewrite_bad_libs(filename)


rewrite_dylibs()
