79 lines
2.3 KiB
Python
79 lines
2.3 KiB
Python
|
# Ugliest Python code I've ever written. -- aszlig
|
||
|
import sys
|
||
|
|
||
|
def get_plist(path):
|
||
|
in_pack = False
|
||
|
in_str = False
|
||
|
current_key = None
|
||
|
buf = ""
|
||
|
packages = {}
|
||
|
package_name = None
|
||
|
package_attrs = {}
|
||
|
with open(path, 'r') as setup:
|
||
|
for line in setup:
|
||
|
if in_str and line.rstrip().endswith('"'):
|
||
|
package_attrs[current_key] = buf + line.rstrip()[:-1]
|
||
|
in_str = False
|
||
|
continue
|
||
|
elif in_str:
|
||
|
buf += line
|
||
|
continue
|
||
|
|
||
|
if line.startswith('@'):
|
||
|
in_pack = True
|
||
|
package_name = line[1:].strip()
|
||
|
package_attrs = {}
|
||
|
elif in_pack and ':' in line:
|
||
|
key, value = line.split(':', 1)
|
||
|
if value.lstrip().startswith('"'):
|
||
|
if value.lstrip()[1:].rstrip().endswith('"'):
|
||
|
value = value.strip().strip('"')
|
||
|
else:
|
||
|
in_str = True
|
||
|
current_key = key.strip().lower()
|
||
|
buf = value.lstrip()[1:]
|
||
|
continue
|
||
|
package_attrs[key.strip().lower()] = value.strip()
|
||
|
elif in_pack:
|
||
|
in_pack = False
|
||
|
packages[package_name] = package_attrs
|
||
|
return packages
|
||
|
|
||
|
def main():
|
||
|
packages = get_plist(sys.argv[1])
|
||
|
to_include = set()
|
||
|
|
||
|
def traverse(package):
|
||
|
to_include.add(package)
|
||
|
attrs = packages.get(package, {})
|
||
|
deps = attrs.get('requires', '').split()
|
||
|
for new_dep in set(deps) - to_include:
|
||
|
traverse(new_dep)
|
||
|
|
||
|
map(traverse, sys.argv[2:])
|
||
|
|
||
|
sys.stdout.write('[\n')
|
||
|
for package, attrs in packages.iteritems():
|
||
|
if package not in to_include:
|
||
|
cats = [c.lower() for c in attrs.get('category', '').split()]
|
||
|
if 'base' not in cats:
|
||
|
continue
|
||
|
|
||
|
install_line = attrs.get('install')
|
||
|
if install_line is None:
|
||
|
continue
|
||
|
|
||
|
url, size, md5 = install_line.split(' ', 2)
|
||
|
|
||
|
pack = [
|
||
|
' {',
|
||
|
' url = "{0}";'.format(url),
|
||
|
' md5 = "{0}";'.format(md5),
|
||
|
' }',
|
||
|
];
|
||
|
sys.stdout.write('\n'.join(pack) + '\n')
|
||
|
sys.stdout.write(']\n')
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|