]> git.bzium.org/ - embe/man-symlinker.git/blob - man-symlinker
529982969a85d193b43c4b0ef6593aa33a7e28d1
[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     m = MAN_NAME_RE.search(name)
16     if not m:
17         return False
18     category = m.group(1)
19     dir_name = 'man' + category
20     with open(name, 'r') as f:
21         s = f.read(MAX_LEN+1)
22         if len(s) > MAX_LEN:
23             return False
24         s = s.strip()
25         if '\n' in s:
26             return False
27     m = SO_RE.search(s)
28     if not m:
29         return False
30     link = m.group(1)
31     if link.startswith('/') or link.count('/') > 1:
32         return False
33     if link.startswith(dir_name+'/'):
34         link = link[len(dir_name)+1:]
35     elif '/' in link:
36         link = '../' + link
37     os.unlink(name)
38     os.symlink(link, name)
39     print 'Converted {} into a symlink to {}'.format(name, link)
40     return True
41
42 def main(args=[]):
43     try:
44         dashes = args.index('--')
45     except ValueError:
46         compressor = []
47         all_files = args
48     else:
49         compressor = args[:dashes]
50         all_files = args[dashes+1:]
51     files = []
52     for name in all_files:
53         if not process_file(name):
54             files.append(name)
55     if not compressor or not files:
56         return 0
57     os.execvp(compressor[0], compressor + files)
58     return 1
59
60 if __name__ == '__main__':
61     sys.exit(main(sys.argv[1:]))