diff extra/soundsoftware/extract-docs.sh @ 247:73ff0e6a11b1 cannam

* Merge from branch cannam-pre-20110113-merge
author Chris Cannam
date Thu, 03 Mar 2011 12:11:53 +0000
parents 3c084a25d8ab
children 5410d82c12df e7ba81c8dc5a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extra/soundsoftware/extract-docs.sh	Thu Mar 03 12:11:53 2011 +0000
@@ -0,0 +1,149 @@
+#!/bin/bash
+
+# Run this script from anywhere
+
+# Enumerate Hg repos; make sure they're up to date; extract docs for
+# each
+
+hgdir="/var/hg"
+docdir="/var/doc"
+logfile="/var/www/test-cannam/log/extract-docs.log"
+
+redgrp="redmine"
+
+apikey=""
+apihost=""
+apiuser=""
+apipass=""
+
+progdir=$(dirname $0)
+case "$progdir" in
+    /*) ;;
+    *) progdir="$(pwd)/$progdir" ;;
+esac
+
+types="doxygen javadoc" # Do Doxygen first (it can be used for Java too)
+
+for x in $types; do
+    if [ ! -x "$progdir/extract-$x.sh" ]; then
+	echo "Helper script not available: $progdir/extract-$x.sh"
+	exit 1
+    fi
+done
+
+enable_embedded()
+{
+    p="$1"
+    if [ -n "$apikey" ]; then
+	if [ -n "$apiuser" ]; then
+	    sudo -u docgen curl -u "$apiuser":"$apipass" "http://$apihost/sys/projects/$p/embedded.xml?enable=1&key=$apikey" -d ""
+	else
+	    sudo -u docgen curl "http://$apihost/sys/projects/$p/embedded.xml?enable=1&key=$apikey" -d ""
+	fi
+    else 
+	echo "Can't enable Embedded, API not configured" 1>&2
+    fi
+}
+
+# We want to ensure the doc extraction is done by the unprivileged
+# user docgen, which is not a member of any interesting group
+# 
+# To this end, we create the tmpdir with user docgen and group
+# www-data, and use the www-data user to pull out an archive of the Hg
+# repo tip into a location beneath that, before using the docgen user
+# to extract docs from that location and write them into the tmpdir
+
+# Same tmpdir for each project: we delete and recreate to avoid
+# cleanup duty from lots of directories being created
+#
+tmpdir=$(mktemp -d "$docdir/tmp_XXXXXX")
+
+fail()
+{
+    message="$1"
+    echo "$message" 1>&2
+    case "$tmpdir" in
+	*/tmp*) rm -rf "$tmpdir";;
+	*);;
+    esac
+    exit 1
+}
+
+case "$tmpdir" in
+    /*) ;;
+    *) fail "Temporary directory creation failed";;
+esac
+
+chown docgen.www-data "$tmpdir" || fail "Temporary directory ownership change failed"
+chmod g+rwx "$tmpdir" || fail "Temporary directory permissions change failed"
+
+for projectdir in "$hgdir"/* ; do
+
+    if [ -d "$projectdir" ] && [ -d "$projectdir/.hg" ]; then
+
+	if ! sudo -u www-data hg -R "$projectdir" -q update; then
+	    echo "Failed to update Hg in $projectdir, skipping" 1>&2
+	    continue
+	fi
+
+	project=$(basename "$projectdir")
+
+	tmptargetdir="$tmpdir/doc"
+	snapshotdir="$tmpdir/hgsnapshot"
+
+	rm -rf "$tmptargetdir" "$snapshotdir"
+
+	mkdir -m 770 "$tmptargetdir" || fail "Temporary target directory creation failed"
+	chown docgen.www-data "$tmptargetdir" || fail "Temporary target directory ownership change failed"
+
+	mkdir -m 770 "$snapshotdir" || fail "Snapshot directory creation failed"
+	chown docgen.www-data "$snapshotdir" || fail "Snapshot directory ownership change failed"
+
+	hgparents=$(sudo -u www-data hg -R "$projectdir" parents)
+	if [ -z "$hgparents" ]; then
+	    echo "Hg repo at $projectdir has no working copy (empty repo?), skipping"
+	    continue
+	else
+	    echo "Found non-empty Hg repo: $projectdir for project $project"
+	fi
+
+	if ! sudo -u www-data hg -R "$projectdir" archive -r tip -t files "$snapshotdir"; then
+	    echo "Failed to pick archive from $projectdir, skipping" 1>&2
+	    continue
+	fi
+
+	targetdir="$docdir/$project"
+
+	echo "Temporary dir is $tmpdir, temporary doc dir is $tmptargetdir, snapshot dir is $snapshotdir, eventual target is $targetdir"
+
+	for x in $types; do
+	    if sudo -u docgen "$progdir/extract-$x.sh" "$project" "$snapshotdir" "$tmptargetdir" >> "$logfile" 2>&1; then
+		break
+	    else
+		echo "Failed to extract via type $x"
+	    fi
+	done
+
+        if [ -f "$tmptargetdir/index.html" ]; then
+	    echo "Processing resulted in an index.html being created, looks good!"
+	    if [ ! -d "$targetdir" ] || [ ! -f "$targetdir/index.html" ]; then
+		echo "This project hasn't had doc extracted before: enabling Embedded"
+		enable_embedded "$project"
+	    fi
+
+	    if [ -d "$targetdir" ]; then
+		mv "$targetdir" "$targetdir"_"$$" && \
+		    mv "$tmptargetdir" "$targetdir" && \
+		    rm -rf "$targetdir"_"$$"
+		chgrp -R "$redgrp" "$targetdir"
+	    else 
+		mv "$tmptargetdir" "$targetdir"
+		chgrp -R "$redgrp" "$targetdir"
+	    fi
+	else
+	    echo "Processing did not result in an index.html being created"
+	fi
+    fi
+done
+
+rm -rf "$tmpdir"