123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- """Adds xref targets to the top of files."""
- import sys
- import os
- testing = False
- DONT_TOUCH = (
- './index.txt',
- )
- def target_name(fn):
- if fn.endswith('.txt'):
- fn = fn[:-4]
- return '_' + fn.lstrip('./').replace('/', '-')
- def process_file(fn, lines):
- lines.insert(0, '\n')
- lines.insert(0, '.. %s:\n' % target_name(fn))
- try:
- f = open(fn, 'w')
- except IOError:
- print("Can't open %s for writing. Not touching it." % fn)
- return
- try:
- f.writelines(lines)
- except IOError:
- print("Can't write to %s. Not touching it." % fn)
- finally:
- f.close()
- def has_target(fn):
- try:
- f = open(fn, 'r')
- except IOError:
- print("Can't open %s. Not touching it." % fn)
- return (True, None)
- readok = True
- try:
- lines = f.readlines()
- except IOError:
- print("Can't read %s. Not touching it." % fn)
- readok = False
- finally:
- f.close()
- if not readok:
- return (True, None)
- if len(lines) < 1:
- print("Not touching empty file %s." % fn)
- return (True, None)
- if lines[0].startswith('.. _'):
- return (True, None)
- return (False, lines)
- def main(argv=None):
- if argv is None:
- argv = sys.argv
- if len(argv) == 1:
- argv.extend('.')
- files = []
- for root in argv[1:]:
- for (dirpath, dirnames, filenames) in os.walk(root):
- files.extend([(dirpath, f) for f in filenames])
- files.sort()
- files = [os.path.join(p, fn) for p, fn in files if fn.endswith('.txt')]
- for fn in files:
- if fn in DONT_TOUCH:
- print("Skipping blacklisted file %s." % fn)
- continue
- target_found, lines = has_target(fn)
- if not target_found:
- if testing:
- print '%s: %s' % (fn, lines[0]),
- else:
- print "Adding xref to %s" % fn
- process_file(fn, lines)
- else:
- print "Skipping %s: already has a xref" % fn
- if __name__ == '__main__':
- sys.exit(main())
|