Mercurial > hg > soundsoftware-site
view extra/soundsoftware/extract-javadoc.sh @ 191:0d1c6fa50d3a feature_20
* Handle Java source found in subdirectories (e.g. under src/)
author | Chris Cannam <chris.cannam@soundsoftware.ac.uk> |
---|---|
date | Fri, 04 Feb 2011 18:40:21 +0000 |
parents | fc1ffeca7437 |
children | 1e55195bca45 |
line wrap: on
line source
#!/bin/sh # Run this script from /var/doc/<project-name> # Find Hg repo and update it. We should separate this process into # two, first the update (run as www-data) and then the extraction (run # as an otherwise totally unprivileged user without write permission # on www-data/code stuff) docdir=$(pwd) name=$(basename $(pwd)) hgdir="/var/hg/$name" echo "Extracting doc for $name" if [ ! -d "$hgdir" ]; then echo "Error: No $hgdir found for project $name" exit 1 fi ( cd "$hgdir" ; hg update ) || exit 1 # Identify either a Doxyfile or some Java packages # TODO: Doxyfile doxyfile=`find "$hgdir" -type f -name Doxyfile -print | head -1` if [ -z "$doxyfile" ]; then echo "No Doxyfile: skipping" else echo "This project contains a Doxyfile:" echo "$doxyfile" # hmm. should be a whitelist ( cd "$hgdir" && grep -vi OUTPUT_DIRECTORY "$doxyfile" | grep -vi HTML_OUTPUT | grep -vi SEARCHENGINE | grep -vi HAVE_DOT | grep -vi DOT_FONTNAME | grep -vi DOT_FONTPATH | grep -vi DOT_TRANSPARENT | \ sed -e '$a OUTPUT_DIRECTORY='"$docdir" -e '$a HTML_OUTPUT = .' -e '$a SEARCHENGINE = NO' -e '$a HAVE_DOT = YES' -e '$a DOT_FONTNAME = FreeMono' -e '$a DOT_FONTPATH = /usr/share/fonts/truetype/freefont' -e '$a DOT_TRANSPARENT = YES' | doxygen - ) fi # Identify Java files whose packages match the trailing parts of their # paths, and list the resulting packages and the path prefixes with # the packages removed (so as to find code in subdirs, # e.g. src/com/example/...) # Regexp match is very rough; check what is actually permitted for # package declarations find "$hgdir" -type f -name \*.java -exec grep '^ *package [a-zA-Z][a-zA-Z0-9\._-]*; *$' \{\} /dev/null \; | sed -e 's/\/[^\/]*: *package */:/' -e 's/; *$//' | sort | uniq | ( current_prefix= current_packages= while IFS=: read filepath package; do echo "Looking at $package in $filepath" packagepath=${package//./\/} prefix=${filepath%$packagepath} prefix=${prefix:=$hgdir} if [ "$prefix" = "$filepath" ]; then echo "Package $package does not match suffix of path $filepath, skipping" continue fi if [ "$prefix" != "$current_prefix" ]; then if [ -n "$current_packages" ]; then echo "Running Javadoc for packages $current_packages from prefix $current_prefix" javadoc -sourcepath "$current_prefix" -d . -subpackages $current_packages fi current_prefix="$prefix" current_packages= else current_packages="$current_packages $package" fi done prefix=${prefix:=$hgdir} if [ -n "$current_packages" ]; then echo "Running Javadoc for packages $current_packages in prefix $current_prefix" javadoc -sourcepath "$current_prefix" -d . -subpackages $current_packages fi ) # This is very rough; check what is actually permitted for package # declarations # java_packages=`find "$hgdir" -type f -name \*.java -print | \ # xargs grep -h '^ *package [a-zA-Z][a-zA-Z0-9\._-]* *; *' | \ # sort | uniq | \ # sed -e 's/^ *package //' -e 's/ *; *$//'` # echo "This project contains Java packages:" # echo "$java_packages" # if [ -z "$java_packages" ]; then # echo "No Java packages: skipping" # exit 0 # fi # # This won't work if code is in a subdir, # # e.g. src/com/example/project/Hello.java # # We need to convert the package name back to a path, and check # # whether that matches the tail of the path to a java file that # # declares itself to be in that package... but we don't have that list # # of java files to hand here... hm # javadoc -sourcepath "$hgdir" -d . -subpackages $java_packages -verbose # # If we have just written something to a doc directory that was # # previously empty, we should switch on Embedded for this project