aboutsummaryrefslogtreecommitdiffstats
path: root/normalize-tags.py
blob: 6701c5349aa88f38d623e9450936fd8af0b5d2d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/python

'''
Resolve symbolic links in tags files and remove duplicate entries from the
resulting list of tags. If your tags files contain symbolic links as well as
canonical filenames this can significantly reduce the size of your tags file.
This script makes a backup of the tags file in case something goes wrong.

Author: Peter Odding <peter@peterodding.com>
Last Change: May 11, 2011
URL: https://github.com/xolox/vim-easytags/blob/master/normalize-tags.py
'''

import os, sys, time

tagsfile = os.path.expanduser(len(sys.argv) > 1 and sys.argv[1] or '~/.vimtags')
tempname = '%s-new-%d' % (tagsfile, time.time())
results, cache = {}, {}
infile = open(tagsfile)
outfile = open(tempname, 'w')
nprocessed = 0
fold_case = False

for line in infile:
  nprocessed += 1
  line = line.rstrip()
  fields = line.split('\t')
  if line.startswith('!_TAG_'):
    results[line] = True
    if line.startswith('!_TAG_FILE_SORTED\t2'):
      fold_case = True
  else:
    pathname = fields[1]
    if pathname not in cache:
      if not os.path.exists(pathname): continue
      cache[pathname] = os.path.realpath(pathname)
    fields[1] = cache[pathname]
    results['\t'.join(fields)] = True

infile.close()

lines = results.keys()
if fold_case:
  lines.sort(key=str.lower)
else:
  lines.sort()

outfile.write('\n'.join(lines))
outfile.write('\n')
outfile.close()

backup = '%s-backup-%d' % (tagsfile, time.time())
print "Making a backup of %s as %s" % (tagsfile, backup)
os.rename(tagsfile, backup)

print "Replacing old", tagsfile, "with new one"
os.rename(tempname, tagsfile)

nfiltered = nprocessed - len(lines)
print "Filtered %d out of %d entries" % (nfiltered, nprocessed)

# vim: ts=2 sw=2 et