summaryrefslogtreecommitdiff
path: root/buildscripts/docs.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildscripts/docs.py')
-rw-r--r--buildscripts/docs.py120
1 files changed, 120 insertions, 0 deletions
diff --git a/buildscripts/docs.py b/buildscripts/docs.py
new file mode 100644
index 0000000..719b5af
--- /dev/null
+++ b/buildscripts/docs.py
@@ -0,0 +1,120 @@
+"""Build the C++ client docs and the MongoDB server docs.
+"""
+
+from __future__ import with_statement
+import os
+import shutil
+import socket
+import subprocess
+import time
+import urllib2
+
+import markdown
+
+
+def clean_dir(dir):
+ try:
+ shutil.rmtree(dir)
+ except:
+ pass
+ os.makedirs(dir)
+
+
+def convert_dir(source, dest):
+ clean_dir(dest)
+
+ for x in os.listdir(source + "/"):
+ if not x.endswith(".md"):
+ continue
+
+ with open("%s/%s" % (source, x)) as f:
+ raw = f.read()
+
+ html = markdown.markdown(raw)
+ print(x)
+
+ with open("%s/%s" % (dest, x.replace(".md", ".html")), 'w') as o:
+ o.write(html)
+
+
+def check_mongo():
+ sock = socket.socket()
+ sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
+ sock.settimeout(1)
+ sock.connect(("localhost", 31999))
+ sock.close()
+
+def did_mongod_start(timeout=20):
+ while timeout > 0:
+ time.sleep(1)
+ try:
+ check_mongo()
+ return True
+ except Exception,e:
+ print e
+ timeout = timeout - 1
+ return False
+
+def stop(proc):
+ try:
+ proc.terminate()
+ except AttributeError:
+ os.kill(proc.pid, 15)
+
+def commands_list(out):
+ clean_dir("dummy_data_dir")
+ with open("/dev/null") as null:
+ try:
+ p = subprocess.Popen(["./mongod", "--dbpath", "dummy_data_dir",
+ "--port", "31999", "--rest"], stdout=null, stderr=null)
+ except:
+ print "No mongod? Skipping..."
+ return
+ if not did_mongod_start():
+ print "Slow mongod? Skipping..."
+ stop(p)
+ return
+ print "Started mongod"
+
+ with open(out, "w") as f:
+ f.write("<base href='http://localhost:28017'/>")
+ f.write(urllib2.urlopen("http://localhost:32999/_commands").read())
+
+ print "Stopping mongod"
+ stop(p)
+
+def gen_cplusplus(dir):
+ clean_dir(dir)
+ clean_dir("docs/doxygen")
+
+ # Too noisy...
+ with open("/dev/null") as null:
+ subprocess.call(["doxygen", "doxygenConfig"], stdout=null, stderr=null)
+
+ os.rename("docs/doxygen/html", dir)
+
+
+def version():
+ """Get the server version from doxygenConfig.
+ """
+ with open("doxygenConfig") as f:
+ for line in f.readlines():
+ if line.startswith("PROJECT_NUMBER"):
+ return line.split("=")[1].strip()
+
+
+def main():
+ v = version()
+ print("Generating server docs in docs/html/internal/%s" % v)
+ convert_dir("docs", "docs/html/internal/%s" % v)
+ print("Generating commands list")
+ commands_list("docs/html/internal/%s/commands.html" % v)
+ shutil.rmtree("dummy_data_dir")
+ print("Generating C++ docs in docs/html/cplusplus/%s" % v)
+ gen_cplusplus("docs/html/cplusplus/%s" % v)
+
+
+if __name__ == "__main__":
+ main()
+
+