diff options
Diffstat (limited to 'docs/docs-update.py')
-rwxr-xr-x | docs/docs-update.py | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/docs/docs-update.py b/docs/docs-update.py new file mode 100755 index 0000000000..31bb47db3b --- /dev/null +++ b/docs/docs-update.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python + +# +# Sven's quick hack script to update the documentation +# +# call with: +# ./docs/update.py /usr/bin/docker +# + +import re +from sys import argv +import subprocess +import os +import os.path + +script, docker_cmd = argv + +def print_usage(outtext, docker_cmd, command): + help = "" + try: + #print "RUN ", "".join((docker_cmd, " ", command, " --help")) + help = subprocess.check_output("".join((docker_cmd, " ", command, " --help")), stderr=subprocess.STDOUT, shell=True) + except subprocess.CalledProcessError, e: + help = e.output + for l in str(help).strip().split("\n"): + l = l.rstrip() + if l == '': + outtext.write("\n") + else: + # `docker --help` tells the user the path they called it with + l = re.sub(docker_cmd, "docker", l) + outtext.write(" "+l+"\n") + outtext.write("\n") + +# TODO: look for an complain about any missing commands +def update_cli_reference(): + originalFile = "docs/sources/reference/commandline/cli.md" + os.rename(originalFile, originalFile+".bak") + + intext = open(originalFile+".bak", "r") + outtext = open(originalFile, "w") + + mode = 'p' + space = " " + command = "" + # 2 mode line-by line parser + for line in intext: + if mode=='p': + # Prose + match = re.match("( \s*)Usage: docker ([a-z]+)", line) + if match: + # the begining of a Docker command usage block + space = match.group(1) + command = match.group(2) + mode = 'c' + else: + match = re.match("( \s*)Usage of .*docker.*:", line) + if match: + # the begining of the Docker --help usage block + space = match.group(1) + command = "" + mode = 'c' + else: + outtext.write(line) + else: + # command usage block + match = re.match("("+space+")(.*)|^$", line) + #print "CMD ", command + if not match: + # The end of the current usage block - Shell out to run docker to see the new output + print_usage(outtext, docker_cmd, command) + outtext.write(line) + mode = 'p' + if mode == 'c': + print_usage(outtext, docker_cmd, command) + +def update_man_pages(): + cmds = [] + try: + help = subprocess.check_output("".join((docker_cmd)), stderr=subprocess.STDOUT, shell=True) + except subprocess.CalledProcessError, e: + help = e.output + for l in str(help).strip().split("\n"): + l = l.rstrip() + if l != "": + match = re.match(" (.*?) .*", l) + if match: + cmds.append(match.group(1)) + + desc_re = re.compile(r".*# DESCRIPTION(.*?)# (OPTIONS|EXAMPLES?).*", re.MULTILINE|re.DOTALL) + example_re = re.compile(r".*# EXAMPLES?(.*)# HISTORY.*", re.MULTILINE|re.DOTALL) + history_re = re.compile(r".*# HISTORY(.*)", re.MULTILINE|re.DOTALL) + + for command in cmds: + print "COMMAND: "+command + history = "" + description = "" + examples = "" + if os.path.isfile("docs/man/docker-"+command+".1.md"): + intext = open("docs/man/docker-"+command+".1.md", "r") + txt = intext.read() + intext.close() + match = desc_re.match(txt) + if match: + description = match.group(1) + match = example_re.match(txt) + if match: + examples = match.group(1) + match = history_re.match(txt) + if match: + history = match.group(1).strip() + + usage = "" + usage_description = "" + params = {} + key_params = {} + + help = "" + try: + help = subprocess.check_output("".join((docker_cmd, " ", command, " --help")), stderr=subprocess.STDOUT, shell=True) + except subprocess.CalledProcessError, e: + help = e.output + last_key = "" + for l in str(help).split("\n"): + l = l.rstrip() + if l != "": + match = re.match("Usage: docker "+command+"(.*)", l) + if match: + usage = match.group(1).strip() + else: + #print ">>>>"+l + match = re.match(" (-+)(.*) \s+(.*)", l) + if match: + last_key = match.group(2).rstrip() + #print " found "+match.group(1) + key_params[last_key] = match.group(1)+last_key + params[last_key] = match.group(3) + else: + if last_key != "": + params[last_key] = params[last_key] + "\n" + l + else: + if usage_description != "": + usage_description = usage_description + "\n" + usage_description = usage_description + l + + # replace [OPTIONS] with the list of params + options = "" + match = re.match("\[OPTIONS\](.*)", usage) + if match: + usage = match.group(1) + + new_usage = "" + # TODO: sort without the `-`'s + for key in sorted(params.keys(), key=lambda s: s.lower()): + # split on commas, remove --?.*=.*, put in *'s mumble + ps = [] + opts = [] + for k in key_params[key].split(","): + #print "......"+k + match = re.match("(-+)([A-Za-z-0-9]*)(?:=(.*))?", k.lstrip()) + if match: + p = "**"+match.group(1)+match.group(2)+"**" + o = "**"+match.group(1)+match.group(2)+"**" + if match.group(3): + # if ="" then use UPPERCASE(group(2))" + val = match.group(3) + if val == "\"\"": + val = match.group(2).upper() + p = p+"[=*"+val+"*]" + val = match.group(3) + if val in ("true", "false"): + params[key] = params[key].rstrip() + if not params[key].endswith('.'): + params[key] = params[key]+ "." + params[key] = params[key] + " The default is *"+val+"*." + val = "*true*|*false*" + o = o+"="+val + ps.append(p) + opts.append(o) + else: + print "nomatch:"+k + new_usage = new_usage+ "\n["+"|".join(ps)+"]" + options = options + ", ".join(opts) + "\n "+ params[key]+"\n\n" + if new_usage != "": + new_usage = new_usage.strip() + "\n" + usage = new_usage + usage + + + outtext = open("docs/man/docker-"+command+".1.md", "w") + outtext.write("""% DOCKER(1) Docker User Manuals +% Docker Community +% JUNE 2014 +# NAME +""") + outtext.write("docker-"+command+" - "+usage_description+"\n\n") + outtext.write("# SYNOPSIS\n**docker "+command+"**\n"+usage+"\n\n") + if description != "": + outtext.write("# DESCRIPTION"+description) + if options == "": + options = "There are no available options.\n\n" + outtext.write("# OPTIONS\n"+options) + if examples != "": + outtext.write("# EXAMPLES"+examples) + outtext.write("# HISTORY\n") + if history != "": + outtext.write(history+"\n") + recent_history_re = re.compile(".*June 2014.*", re.MULTILINE|re.DOTALL) + if not recent_history_re.match(history): + outtext.write("June 2014, updated by Sven Dowideit <SvenDowideit@home.org.au>\n") + outtext.close() + +# main +update_cli_reference() +update_man_pages() |