adium/adium

Updated Changes.txt for 1.5.10.4.
adium-1.5.10.4
2017-04-25, Robert Vehse
09440b7b46e0
Updated Changes.txt for 1.5.10.4.
#!/usr/bin/env python
import sys
import os
import re
import dircache
import shutil
class OtoolParser:
def __init__(self, otool_output):
self.data = otool_output.split('\n')
self._library_path = self.data[0][0:-1]
self._library_name = self._library_path.split('/')[-1]
useless_data = re.compile(r' \(.*\)')
libs = [useless_data.sub('',x.lstrip()) for x in self.data[1:-1]
if x.count('framework') == 0]
self.base_libs = [x for x in libs if x.startswith('/usr/') and
x.endswith('dylib')]
self.third_libs = [x for x in libs if x not in self.base_libs and
x.endswith('dylib')]
def built_in_shlib_deps(self):
return self.base_libs
def library_path(self):
return self._library_path
def library_name(self):
return self._library_name
def third_party_shlib_deps(self):
return self.third_libs
def otool_library(path, arch = None):
command_str = 'otool -L '
if arch:
command_str += '-arch ' + arch + ' '
command_str += path
otool_file = os.popen(command_str)
otool_data = otool_file.read()
parser = OtoolParser(otool_data)
return parser
def otool_library(lib):
'''Runs otool on the library at lib.
Returns an otool_parse.OtoolParser.
'''
otool_file = os.popen('otool -L "' + lib +'"')
otool_data = otool_file.read()
return OtoolParser(otool_data)
def discover_all_dependencies(lib):
'''Find all dependencies for library at path in lib.
Returns a list of paths.
'''
dep_parser = otool_library(lib)
return dep_parser.third_party_shlib_deps()
def lib_path_to_framework_and_version(library_path):
library_name = library_path.split('/')[-1]
# check to see if it's a "versionless" library name
match = re.match(r'[A-Za-z]*\.dylib', library_name)
library_name = library_name.replace('.dylib','')
if match:
return (library_name, 'A')
# Note: these styles are named after where I noticed them, not necessarily
# where they originate. -RAF
regexes = [r'([A-Za-z0-9_-]*)-([0-9\.]*)$', #apr style
r'([A-Za-z0-9_-]*[a-zA-Z])\.([0-9\.]*)$', #gnu style
r'([A-Za-z0-9_-]*[a-zA-Z])([0-9\.]*)$', #sqlite style
]
for regex in regexes:
match = re.match(regex, library_name)
if match:
return match.groups()
# If we get here, we need a new regex. Throw an exception.
raise ValueError, ('Library ' + library_path + ' with name ' + library_name +
' did not match any known format, please update the'
' script.')
if __name__ == '__main__':
if len(sys.argv) < 3:
print 'Usage:', sys.argv[0], '/paths/to/libraries', 'output_plugin_dir'
sys.exit(1)
plugins_dir = sys.argv[1]
output_dir = sys.argv[1]
known_frameworks = [d[0:len(d)-len(".subproj")] for d in dircache.listdir("Frameworks/") if d.endswith(".subproj")]
plugins = [plugins_dir+'/'+d for d in dircache.listdir(plugins_dir) if d.endswith('.so')]
for library in plugins:
libs_to_convert = discover_all_dependencies(library)
libs_to_convert.sort()
new_paths = []
for l in libs_to_convert:
is_known_framework = 0
for known_framework in known_frameworks:
if l.find(known_framework + "-") != -1 or l.find(known_framework + ".") != -1:
is_known_framework = 1
break
if is_known_framework:
new_path = lib_path_to_framework_and_version(l)
new_path = '@executable_path/../Frameworks/' + new_path[0] + '.framework/Versions/' + new_path[1] + '/' + new_path[0]
else:
pos = output_dir.find(".subproj/") + len(".subproj/")
new_path = l.replace(plugins_dir, "@executable_path/../Frameworks/" + output_dir[pos:-1])
args = ['install_name_tool', '-change', l, new_path, library]
status = os.spawnvp(os.P_WAIT, 'install_name_tool', args)
if status != 0:
print 'Something went wrong. install_name_tool failed for ', l,
print ' with status ', status
sys.exit(1)