]> git.bzium.org/ - embe/man-symlinker.git/blob - man-symlinker
e337c6d6919df18463d7deb6c704947a2b8d44f4
[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.join(os.getcwd(), 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         s = s.strip()
26         if '\n' in s:
27             return False
28     m = SO_RE.search(s)
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(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:]))