df13d0620dbbb8d0bdf20bdff2d99c90bc3026ca
[embe/man-symlinker.git] / man-symlinker
1 #!/usr/bin/env python2.7
2 # encoding: UTF-8
3
4 from __future__ import absolute_import, division
5
6 import os
7 import re
8 import sys
9
10 MAN_NAME_RE = re.compile(r'/man/(?:[^/]+/)?man([^/]+)/[^/]+.\1$')
11 MAX_LEN = 1024
12 SO_RE = re.compile(r'^\.so\s+(.*)$')
13
14 def process_file(name):
15     full_name = os.path.abspath(name)
16     m = MAN_NAME_RE.search(full_name)
17     if not m:
18         return False
19     category = m.group(1)
20     dir_name = 'man' + category
21     with open(name, 'r') as f:
22         s = f.read(MAX_LEN+1)
23         if len(s) > MAX_LEN:
24             return False
25     lines = [line for line in s.rstrip().split('\n') if not line.startswith('.\\"')]
26     if len(lines) != 1:
27         return False
28     m = SO_RE.search(lines[0])
29     if not m:
30         return False
31     link = m.group(1)
32     if link.startswith('/') or link.count('/') > 1:
33         return False
34     if link.startswith(dir_name+'/'):
35         link = link[len(dir_name)+1:]
36     elif '/' in link:
37         link = '../' + link
38     os.unlink(name)
39     os.symlink(link, name)
40     print 'Converted {} into a symlink to {}'.format(full_name, link)
41     return True
42
43 def main(args=[]):
44     try:
45         dashes = args.index('--')
46     except ValueError:
47         compressor = []
48         all_files = args
49     else:
50         compressor = args[:dashes]
51         all_files = args[dashes+1:]
52     files = []
53     for name in all_files:
54         if not process_file(name):
55             files.append(name)
56     if not compressor or not files:
57         return 0
58     os.execvp(compressor[0], compressor + files)
59     return 1
60
61 if __name__ == '__main__':
62     sys.exit(main(sys.argv[1:]))