summaryrefslogtreecommitdiff
path: root/docs/docs-update.py
diff options
context:
space:
mode:
Diffstat (limited to 'docs/docs-update.py')
-rwxr-xr-xdocs/docs-update.py214
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()