#!/usr/bin/env python # Copyright 2017 syzkaller project authors. All rights reserved. # Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. from __future__ import print_function import os import re import sys link_re = re.compile('\[' + '[^\[\]]+' + '\]' + '\(' + '([^\(\)]+)' + '\)') if len(sys.argv) < 3: print('Usage: ...') sys.exit(1) root = sys.argv[1] docs = sys.argv[2:] links = [] for doc in docs: with open(doc) as f: for i, line in enumerate(f.readlines()): for match in link_re.finditer(line): links += [(doc, match.group(1), i + 1, match.start(1))] errors = [] for link in links: (doc, link, line, col) = link for prefix in ['https://github.com/google/syzkaller/blob/master', 'https://github.com/google/syzkaller/tree/master']: if link.startswith(prefix): errors += ['%s:%d:%d: Replace absolute link with %s.' % (doc, line, col, link[len(prefix):])] def filter_link(args): (doc, link, line, col) = args if link.startswith('http'): return False if link.startswith('#'): return False if link.startswith('mailto'): return False return True links = list(filter(filter_link, links)) def fix_link(args): (doc, link, line, col) = args link = link.split('#')[0] link = link.split('?')[0] return (doc, link, line, col) links = list(map(fix_link, links)) def check_link(args): (doc, link, line, col) = args path = os.path.dirname(doc) full_link = None if link[0] == '/': link = link[1:] full_link = os.path.join(root, link) else: full_link = os.path.join(root, path, link) if not os.path.exists(full_link): return False return True for link in links: if not check_link(link): (doc, link, line, col) = link errors += ['%s:%d:%d: Broken link %s.' % (doc, line, col, link)] if len(errors) == 0: print('%d links checked: OK' % len(links)) sys.exit(0) for error in errors: print(error) sys.exit(2)