import subprocess import re # Finds the documents to rewrite for files that include user-guide-content-moved.md. # Then opens these files and processes the stuff after those lines to figure out where # the line should move to. # Returns a list of ('old/path', 'new/path') tuples. def find_documents_to_rewrite(): cmd = "ag --markdown -Q -l \"{% include user-guide-content-moved.md %}\"" moved_docs = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout.read().splitlines() rewrites = [] for doc in moved_docs: location = doc_location(doc) destinations = get_destinations_for_doc(doc) if len(destinations) == 0: print("Unable to get possible destinations for %s" % doc) elif len(destinations) > 1: print("%s has multiple potential destinations. Not rewriting links." % doc) else: # print("%s --> %s" % (location, destinations[0])) rewrites.append((location, destinations[0])) return rewrites # Returns the location of the documentation as we will refer to it in the markdown. # /docs/path/to/foo/index.md are available at /docs/path/to/foo/ # /docs/path/to/foo/bar.md are available at /docs/path/to/foo/bar/ def doc_location(filename): if filename.endswith('/index.md'): return "/docs/" + filename[:-9] + "/" else: return "/docs/" + filename[:-3] + "/" REDIRECT_REGEX = re.compile("^.*\[(.*)\]\((.*)\)$") def get_destinations_for_doc(filename): destination_paths = [] with open(filename) as f: lines = [line.rstrip('\n').rstrip('\r') for line in f.readlines()] # Remove empty lines lines = filter(bool, lines) content_moved_index = lines.index("{% include user-guide-content-moved.md %}") # Get everything after that line. destinations = lines[content_moved_index + 1:] for destination in destinations: result = REDIRECT_REGEX.match(destination) if not result: return [] doc_title = result.group(1) # Unused, can print it out for more info. new_path = result.group(2) destination_paths.append(new_path) return destination_paths # Given a list of (old/path, new/path) tuples executes a sed command across all files in # to replace (/docs/path/to/old/doc/) with (/docs/path/to/new/doc/). def rewrite_documents(rewrites): cmd = "find . -name '*.md' -type f -exec sed -i.bak 's@(%s)@(%s)@g' '{}' \;" for original, new in rewrites: print("%s --> %s" % (original, new)) original = original.replace('-', '\-') new = new.replace('-', '\-') #print(cmd % (original, new)) subprocess.call(cmd % (original, new), shell=True) # We can't have in-line replace across multiple files without sudo (I think), so it # creates a lot of backups that we have to delete. def remove_sed_backups(): cmd = "find . -name '*.bak' -delete" subprocess.call(cmd, shell=True) def main(): rewrites = find_documents_to_rewrite() rewrite_documents(rewrites) remove_sed_backups() if __name__ == "__main__": main()