#! /usr/bin/env python
import sys
import subprocess
import os
import re

_uuid_re = re.compile(r'^[0-9A-Fa-f]{8}-(?:[0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}$')
_hex_re = re.compile(r'^[0-9A-Fa-f]{32}$')

def canonicalise_uuid(uuid):
    if _uuid_re.match(uuid):
        return uuid.upper()
    if _hex_re.match(uuid):
        return '-'.join([uuid[0:8], uuid[8:12], uuid[12:16],
                         uuid[16:20], uuid[20:]]).upper()
    return None

_dduuid_re = re.compile(r'^UUID: ([0-9A-Fa-f]{8}-(?:[0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12})')
def uuid_from_path(path):
    ddump = subprocess.Popen(['/usr/bin/dwarfdump',
                              '-u', path],
                             stdout=subprocess.PIPE)

    ddline = ddump.stdout.readline().strip()
    m = _dduuid_re.match(ddline)

    if m:
        return m.group(1)

    return None

def find_dsym(uuid):
    uuid = canonicalise_uuid(uuid)

    if uuid is None:
        return ''
    
    mdfind = subprocess.Popen(['/usr/bin/mdfind',
                               'com_apple_xcode_dsym_uuids=%s' % uuid],
                               stdout=subprocess.PIPE)
    
    path = mdfind.stdout.readline().strip()
    executable = None
    
    if path.endswith('.xcarchive'):
        for dsym in os.listdir(os.path.join(path, 'dSYMs')):
            if not dsym.endswith('.dSYM'):
                continue
            
            dsym_path = os.path.join(path, 'dSYMs', dsym)

            if uuid == uuid_from_path(dsym_path):
                # Find the executable
                find = subprocess.Popen(['/usr/bin/find',
                                         path,
                                         '-perm', '+0111',
                                         '-type', 'f'],
                                         stdout=subprocess.PIPE)

                for line in find.stdout:
                    line = line.strip()
                    if uuid == uuid_from_path(line):
                        executable = line
                        break
                    
                path = dsym_path
                break

    return (path, executable)

print """<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>"""

for arg in sys.argv[1:]:
    path,executable = find_dsym(arg)
    print '    <key>%s</key>\n    <dict>\n' % arg
    if path:
        print '      <key>DBGDSYMPath</key>\n      <string>%s</string>\n' % path
    if executable:
        print '      <key>DBGSymbolRichExecutable</key>\n      <string>%s</string>\n' % executable
    print '    </dict>\n'

print """  </dict>
</plist>"""


