#!/usr/bin/env python # encoding: UTF-8 from __future__ import absolute_import, division import os import re import sys MAN_NAME_RE = re.compile(r'/man/(?:[^/]+/)?man([^/]+)/[^/]+.\1$') MAX_LEN = 1024 SO_RE = re.compile(r'^\.so\s+(.*)$') SUFFIXES = { 'xz': '.xz', 'bzip2': '.bz2', 'gzip': '.gz', } def process_file(name, suffix): full_name = os.path.abspath(name) m = MAN_NAME_RE.search(full_name) if not m: return False category = m.group(1) dir_name = 'man' + category with open(name, 'r') as f: s = f.read(MAX_LEN+1) if len(s) > MAX_LEN: return False lines = [line for line in s.rstrip().split('\n') if not line.startswith('.\\"')] if len(lines) != 1: return False m = SO_RE.search(lines[0]) if not m: return False link = m.group(1) if link.startswith('/') or link.count('/') > 1: return False if link.startswith(dir_name+'/'): link = link[len(dir_name)+1:] elif '/' in link: link = '../' + link os.unlink(name) os.symlink(link + suffix, name + suffix) print 'Converted {} into a symlink to {}'.format(full_name, link) return True def main(args=[]): try: dashes = args.index('--') except ValueError: compressor = [] all_files = args else: compressor = args[:dashes] all_files = args[dashes+1:] if compressor: suffix = SUFFIXES.get(compressor[0], '') else: suffix = '' files = [] for name in all_files: if not process_file(name, suffix): files.append(name) if not compressor or not files: return 0 os.execvp(compressor[0], compressor + files) return 1 if __name__ == '__main__': sys.exit(main(sys.argv[1:]))