86 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
| 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()
 |