comparison extra/soundsoftware/extract-docs.sh @ 231:5d6e2819f3dd cannam-pre-20110113-merge

Merge from branch "feature_20". This initial implementation of #20 has been tested, but needs to be tested again in the proper context.
author Chris Cannam
date Thu, 17 Feb 2011 18:35:11 +0000
parents 3c084a25d8ab
children 5410d82c12df e7ba81c8dc5a
comparison
equal deleted inserted replaced
206:30203ffaa612 231:5d6e2819f3dd
1 #!/bin/bash
2
3 # Run this script from anywhere
4
5 # Enumerate Hg repos; make sure they're up to date; extract docs for
6 # each
7
8 hgdir="/var/hg"
9 docdir="/var/doc"
10 logfile="/var/www/test-cannam/log/extract-docs.log"
11
12 redgrp="redmine"
13
14 apikey=""
15 apihost=""
16 apiuser=""
17 apipass=""
18
19 progdir=$(dirname $0)
20 case "$progdir" in
21 /*) ;;
22 *) progdir="$(pwd)/$progdir" ;;
23 esac
24
25 types="doxygen javadoc" # Do Doxygen first (it can be used for Java too)
26
27 for x in $types; do
28 if [ ! -x "$progdir/extract-$x.sh" ]; then
29 echo "Helper script not available: $progdir/extract-$x.sh"
30 exit 1
31 fi
32 done
33
34 enable_embedded()
35 {
36 p="$1"
37 if [ -n "$apikey" ]; then
38 if [ -n "$apiuser" ]; then
39 sudo -u docgen curl -u "$apiuser":"$apipass" "http://$apihost/sys/projects/$p/embedded.xml?enable=1&key=$apikey" -d ""
40 else
41 sudo -u docgen curl "http://$apihost/sys/projects/$p/embedded.xml?enable=1&key=$apikey" -d ""
42 fi
43 else
44 echo "Can't enable Embedded, API not configured" 1>&2
45 fi
46 }
47
48 # We want to ensure the doc extraction is done by the unprivileged
49 # user docgen, which is not a member of any interesting group
50 #
51 # To this end, we create the tmpdir with user docgen and group
52 # www-data, and use the www-data user to pull out an archive of the Hg
53 # repo tip into a location beneath that, before using the docgen user
54 # to extract docs from that location and write them into the tmpdir
55
56 # Same tmpdir for each project: we delete and recreate to avoid
57 # cleanup duty from lots of directories being created
58 #
59 tmpdir=$(mktemp -d "$docdir/tmp_XXXXXX")
60
61 fail()
62 {
63 message="$1"
64 echo "$message" 1>&2
65 case "$tmpdir" in
66 */tmp*) rm -rf "$tmpdir";;
67 *);;
68 esac
69 exit 1
70 }
71
72 case "$tmpdir" in
73 /*) ;;
74 *) fail "Temporary directory creation failed";;
75 esac
76
77 chown docgen.www-data "$tmpdir" || fail "Temporary directory ownership change failed"
78 chmod g+rwx "$tmpdir" || fail "Temporary directory permissions change failed"
79
80 for projectdir in "$hgdir"/* ; do
81
82 if [ -d "$projectdir" ] && [ -d "$projectdir/.hg" ]; then
83
84 if ! sudo -u www-data hg -R "$projectdir" -q update; then
85 echo "Failed to update Hg in $projectdir, skipping" 1>&2
86 continue
87 fi
88
89 project=$(basename "$projectdir")
90
91 tmptargetdir="$tmpdir/doc"
92 snapshotdir="$tmpdir/hgsnapshot"
93
94 rm -rf "$tmptargetdir" "$snapshotdir"
95
96 mkdir -m 770 "$tmptargetdir" || fail "Temporary target directory creation failed"
97 chown docgen.www-data "$tmptargetdir" || fail "Temporary target directory ownership change failed"
98
99 mkdir -m 770 "$snapshotdir" || fail "Snapshot directory creation failed"
100 chown docgen.www-data "$snapshotdir" || fail "Snapshot directory ownership change failed"
101
102 hgparents=$(sudo -u www-data hg -R "$projectdir" parents)
103 if [ -z "$hgparents" ]; then
104 echo "Hg repo at $projectdir has no working copy (empty repo?), skipping"
105 continue
106 else
107 echo "Found non-empty Hg repo: $projectdir for project $project"
108 fi
109
110 if ! sudo -u www-data hg -R "$projectdir" archive -r tip -t files "$snapshotdir"; then
111 echo "Failed to pick archive from $projectdir, skipping" 1>&2
112 continue
113 fi
114
115 targetdir="$docdir/$project"
116
117 echo "Temporary dir is $tmpdir, temporary doc dir is $tmptargetdir, snapshot dir is $snapshotdir, eventual target is $targetdir"
118
119 for x in $types; do
120 if sudo -u docgen "$progdir/extract-$x.sh" "$project" "$snapshotdir" "$tmptargetdir" >> "$logfile" 2>&1; then
121 break
122 else
123 echo "Failed to extract via type $x"
124 fi
125 done
126
127 if [ -f "$tmptargetdir/index.html" ]; then
128 echo "Processing resulted in an index.html being created, looks good!"
129 if [ ! -d "$targetdir" ] || [ ! -f "$targetdir/index.html" ]; then
130 echo "This project hasn't had doc extracted before: enabling Embedded"
131 enable_embedded "$project"
132 fi
133
134 if [ -d "$targetdir" ]; then
135 mv "$targetdir" "$targetdir"_"$$" && \
136 mv "$tmptargetdir" "$targetdir" && \
137 rm -rf "$targetdir"_"$$"
138 chgrp -R "$redgrp" "$targetdir"
139 else
140 mv "$tmptargetdir" "$targetdir"
141 chgrp -R "$redgrp" "$targetdir"
142 fi
143 else
144 echo "Processing did not result in an index.html being created"
145 fi
146 fi
147 done
148
149 rm -rf "$tmpdir"