Tworzenie symlinków z rozszerzeniem.
[embe/man-symlinker.git] / man-symlinker
1 #!/usr/bin/env python
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 SUFFIXES = {
15     'xz': '.xz',
16     'bzip2': '.bz2',
17     'gzip': '.gz',
18 }
19
20 def process_file(name, suffix):
21     full_name = os.path.abspath(name)
22     m = MAN_NAME_RE.search(full_name)
23     if not m:
24         return False
25     category = m.group(1)
26     dir_name = 'man' + category
27     with open(name, 'r') as f:
28         s = f.read(MAX_LEN+1)
29         if len(s) > MAX_LEN:
30             return False
31     lines = [line for line in s.rstrip().split('\n') if not line.startswith('.\\"')]
32     if len(lines) != 1:
33         return False
34     m = SO_RE.search(lines[0])
35     if not m:
36         return False
37     link = m.group(1)
38     if link.startswith('/') or link.count('/') > 1:
39         return False
40     if link.startswith(dir_name+'/'):
41         link = link[len(dir_name)+1:]
42     elif '/' in link:
43         link = '../' + link
44     os.unlink(name)
45     os.symlink(link + suffix, name + suffix)
46     print 'Converted {} into a symlink to {}'.format(full_name, link)
47     return True
48
49 def main(args=[]):
50     try:
51         dashes = args.index('--')
52     except ValueError:
53         compressor = []
54         all_files = args
55     else:
56         compressor = args[:dashes]
57         all_files = args[dashes+1:]
58     if compressor:
59         suffix = SUFFIXES.get(compressor[0], '')
60     else:
61         suffix = ''
62     files = []
63     for name in all_files:
64         if not process_file(name, suffix):
65             files.append(name)
66     if not compressor or not files:
67         return 0
68     os.execvp(compressor[0], compressor + files)
69     return 1
70
71 if __name__ == '__main__':
72     sys.exit(main(sys.argv[1:]))