38 lines
1.0 KiB
Python
Executable File
38 lines
1.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import os
|
|
import re
|
|
import sys
|
|
from contextlib import closing
|
|
from mmap import mmap, ACCESS_READ
|
|
from typing import Iterator
|
|
|
|
if len(sys.argv) != 2 or not os.path.isdir(sys.argv[1]):
|
|
print('Usage: {} /path/to/recipe_dir'.format(os.path.basename(__file__)),
|
|
file=sys.stderr)
|
|
exit(1)
|
|
|
|
|
|
rx_a = re.compile(br'[@(]\.\./([^/]*)')
|
|
|
|
|
|
def regex_file(file: str) -> Iterator[str]:
|
|
with open(file, 'r') as f:
|
|
with closing(mmap(f.fileno(), 0, access=ACCESS_READ)) as d:
|
|
for x in re.finditer(rx_a, d):
|
|
yield x.group(1).decode('utf-8')
|
|
|
|
|
|
all_ids = None
|
|
for path, dirs, files in os.walk(sys.argv[1]):
|
|
if not all_ids:
|
|
all_ids = dirs
|
|
for lr_file in files:
|
|
if not lr_file.endswith('lr'):
|
|
continue
|
|
for link in regex_file(path + os.path.sep + lr_file):
|
|
if link not in all_ids:
|
|
short_name = os.path.basename(path) + os.path.sep + lr_file
|
|
print(f'dead-link: {short_name} ({link})')
|
|
|
|
print('done.')
|