Проверьте, комментируется ли класс Java в хуке SVN Precommit
Я хочу убедиться, что Java-класс закомментирован, прежде чем кто-то что-то сделает в SVN-репозитории. Поэтому я хочу реализовать следующий рабочий процесс:
- Пользователь меняет что-то в классе
- Пользователь хочет зафиксировать класс
- Перед выполнением фиксации в хранилище SVN или что-то еще проверяет, есть ли комментарии перед классом и перед
public
методы (для Java AutoDoc). - Если есть комментарии => Подтвердить, В противном случае вернуть сообщение об ошибке
Как я могу это понять? Я много узнал о хуках предварительной фиксации. Но все было о проверке, если установлено сообщение коммита / комментарий.
Было бы очень приятно и полезно, если бы кто-то мог предоставить решение этой проблемы.
1 ответ
Да, вы можете сделать это, используя CheckStyle.
Сначала скачайте флягу CheckStyle и установите ее где-нибудь. Затем создайте новый конфигурационный файл xml для CheckStyle, чтобы проверить, есть ли в ваших открытых методах / классах какой-то JavaDoc (вы можете, например, назвать его javadoc_check.xml):
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<module name="Checker">
<module name="TreeWalker">
<module name="JavadocMethod">
<property name="scope" value="public"/>
</module>
<module name="JavadocType">
<property name="scope" value="public"/>
</module>
</module>
</module>
Как только это будет сделано, вы можете создать свой pre_commit hook, вот так:
#!/bin/bash
REPOS="$1"
TXN="$2"
CHECKSTYLEJAR=/path/to/checkstyle-5.7/checkstyle-5.7-all.jar
CHECKSTYLECONFIG=/path/to/javadoc_check.xml
SVNLOOK=/usr/bin/svnlook
JAVA=/usr/bin/java
EXITSTATUS=0
ERRORMARKER=__ERROR_MARKER__
# Create temporary dir
TMPDIR=$(mktemp -d)
# Iterate on the files commited
while read changeline;
do
# Get the filename
file=${changeline:4}
# Check if it's an Updated or Added java file
if [[ $file == *.java && ($changeline == U* || $changeline == A*) ]] ; then
# Get the file content in a temporary file
$SVNLOOK cat -t "$TXN" "$REPOS" "$file" > $TMPDIR/${file##*/}
echo -e "\n=> Checking $file"
# Check the file with checkstyle
( $JAVA -jar $CHECKSTYLEJAR -c $CHECKSTYLECONFIG $TMPDIR/${file##*/} 2>&1 || echo "$ERRORMARKER" 1>&2 ) | sed -e "s{$TMPDIR/{{"
# Delete the temporary file
rm $TMPDIR/${file##*/}
fi
done < <($SVNLOOK changed -t "$TXN" "$REPOS") 3>&2 2>&1 1>&3 | grep "$ERRORMARKER" && EXITSTATUS=1 # Check for errors
# Delete temporary dir
rmdir $TMPDIR
exit $EXITSTATUS
Не забудьте изменить путь к банке CheckStyle и конфигурации CheckStyle.
В следующий раз, когда вы попытаетесь зафиксировать файл Java без комментариев JavaDoc для открытого метода / класса, фиксация будет отменена, и вы получите сообщение об ошибке:
$ svn commit
Sending test.java
Transmitting file data .svn: E165001: Commit failed (details follow):
svn: E165001: Commit blocked by pre-commit hook (exit code 1) with output:
=> Checking test.java
Starting audit...
test.java:9:1: Missing a Javadoc comment.
Audit done.
svn: E165001: Your commit message was left in a temporary file:
svn: E165001: '/path/to/project/svn-commit.1.tmp'
$
Если вы фиксируете более одного файла, все файлы будут проверены, и фиксация будет авторизована, только если все измененные / добавленные файлы Java имеют комментарии JavaDoc.