NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Сервер VisualSVN 3.9 обеспечивает VisualSVNServerHooks.exe check-logmessage
рычаг перед фиксацией, который помогает Вам отклонить фиксации с пустыми или короткими сообщениями журнала. См. статью KB140: Проверка фиксации регистрирует сообщения в Сервере VisualSVN для инструкций.
Помимо встроенного VisualSVNServerHooks.exe
, Сервер VisualSVN и SVN в общем использовании количество рычагов для выполнения задач как это.
start-commit
—, выполненный перед транзакцией фиксации, начинается, может использоваться, чтобы сделать специальное разрешение, проверяющее pre-commit
—, выполненный в конце транзакции, но перед фиксацией. Часто используемый для проверки вещей такой как не обнуляют сообщение журнала длины. post-commit
— бежит за транзакцией, фиксировался. Может использоваться для отправки электронных писем или репозитория поддержки. pre-revprop-change
— выполнения перед изменением свойства пересмотра. Может использоваться для проверки полномочий. post-revprop-change
— бежит за изменением свойства пересмотра. Может использоваться, чтобы послать по электронной почте или скопировать эти изменения. необходимо использовать эти pre-commit
рычаг. Можно записать его сами на примерно любом языке поддержка платформ, но в сети существует много сценариев. Гугление "svn предварительная фиксация сцепляется для требования комментария", я нашел пару, которая была похожа, они будут отвечать всем требованиям:
Технические ответы на Ваш вопрос были уже даны. Я хотел бы добавить социальный ответ, который является: "Устанавливая стандарты сообщения о фиксации с Вашей командой и заставляя их согласиться (или принять) обосновывает, почему можно было бы быть нужно выразительный сообщения о фиксации",
я видел столько сообщений о фиксации, в которых было сказано, что "патч", "опечатка", "фиксирует" или подобный, что я потерял счет.
Действительно - проясняют всем, почему Вам были бы нужны они.
Примеры по причинам:
Hope, которая помогает, дополнительно к техническим ответам о рычагах перед фиксацией.
Использование эта предварительная фиксация зацепляет Windows. Это записано в Windows Batch и использует утилита командной строки grep для проверки длины фиксации.
svnlook log -t "%2" "%1" | c:\tools\grep -c "[a-zA-z0-9]" > nul
if %ERRORLEVEL% NEQ 1 exit 0
echo Please enter a check-in comment 1>&2
exit 1
Помнят, что Вам будет нужна копия grep, я рекомендую версия .
инструментов гнуЧто VisualSVN предлагает Вам для ввода, поскольку рычаги являются "командными сценариями Windows NT", которые являются в основном пакетными файлами.
Запись if-then-else в пакетных файлах очень ужасна и вероятно очень трудно отладить.
Это посмотрит что-то как следующее (ищите pre-commit.bat) (не протестированный):
SVNLOOK.exe log -t "%2" "%1" | grep.exe "[a-zA-Z0-9]" > nul || GOTO ERROR
GOTO OK
:ERROR
ECHO "Please enter comment and then retry commit!"
exit 1
:OK
exit 0
Вам нужен grep.exe на пути, %1 путь к этому репозиторию, %2 название txn, собирающегося фиксироваться. Также взгляните на pre-commit.tmpl в каталоге рычагов Вашего репозитория.
До добавления передают рычаги моему серверу, я просто распределил svnprops клиентам TortoiseSVN.
Так, как альтернатива:
имя свойства In TortoiseSVN-> Properties - добавляют/устанавливают tsvn:logminsize
соответственно.
Это, конечно, не никакая гарантия на сервере, поскольку клиенты/пользователи могут решить не сделать это, но можно распределить svnprops файлы, если Вам нравится. Таким образом, пользователи не должны устанавливать свои собственные значения - можно предоставить их всем пользователям.
Это также работает на вещи как bugtraq: настройки для соединения материала отслеживания ошибки в журналах.
Вот JScript оболочки Windows, который вы можете использовать, указав ловушку как:
%SystemRoot%\System32\CScript.exe //nologo <..path..to..script> %1 %2
Он довольно легко читается, так что продолжайте эксперимент.
Кстати, причина делать это в JScript заключается в том, что он не требует установки каких-либо других инструментов (Perl, CygWin и т. д.).
if (WScript.Arguments.Length < 2)
{
WScript.StdErr.WriteLine("Repository Hook Error: Missing parameters. Should be REPOS_PATH then TXN_NAME, e.g. %1 %2 in pre-commit hook");
WScript.Quit(-1);
}
var oShell = new ActiveXObject("WScript.Shell");
var oFSO = new ActiveXObject("Scripting.FileSystemObject");
var preCommitStdOut = oShell.ExpandEnvironmentStrings("%TEMP%\\PRE-COMMIT." + WScript.Arguments(1) + ".stdout");
var preCommitStdErr = oShell.ExpandEnvironmentStrings("%TEMP%\\PRE-COMMIT." + WScript.Arguments(1) + ".stderr");
var commandLine = "%COMSPEC% /C \"C:\\Program Files\\VisualSVN Server\\bin\\SVNLook.exe\" log -t ";
commandLine += WScript.Arguments(1);
commandLine += " ";
commandLine += WScript.Arguments(0);
commandLine += "> " + preCommitStdOut + " 2> " + preCommitStdErr;
// Run Synchronously, don't show a window
// WScript.Echo("About to run: " + commandLine);
var exitCode = oShell.Run(commandLine, 0, true);
var fsOUT = oFSO.GetFile(preCommitStdOut).OpenAsTextStream(1);
var fsERR = oFSO.GetFile(preCommitStdErr).OpenAsTextStream(1);
var stdout = fsOUT && !fsOUT.AtEndOfStream ? fsOUT.ReadAll() : "";
var stderr = fsERR && !fsERR.AtEndOfStream ? fsERR.ReadAll() : "";
if (stderr.length > 0)
{
WScript.StdErr.WriteLine("Error with SVNLook: " + stderr);
WScript.Quit(-2);
}
// To catch naught commiters who write 'blah' as their commit message
if (stdout.length < 5)
{
WScript.StdErr.WriteLine("Please provide a commit message that describes why you've made these changes.");
WScript.Quit(-3);
}
WScript.Quit(0);
Я рад, что вы задали этот вопрос. Это наш сценарий ловушки перед фиксацией, написанный в общем пакете Windows . Он отклоняет фиксацию, если сообщение журнала меньше 6 символов. Просто поместите pre-commit.bat в каталог хуков.
pre-commit.bat
setlocal enabledelayedexpansion
set REPOS=%1
set TXN=%2
set SVNLOOK="%VISUALSVN_SERVER%\bin\svnlook.exe"
SET M=
REM Concatenate all the lines in the commit message
FOR /F "usebackq delims==" %%g IN (`%SVNLOOK% log -t %TXN% %REPOS%`) DO SET M=!M!%%g
REM Make sure M is defined
SET M=0%M%
REM Here the 6 is the length we require
IF NOT "%M:~6,1%"=="" goto NORMAL_EXIT
:ERROR_TOO_SHORT
echo "Commit note must be at least 6 letters" >&2
goto ERROR_EXIT
:ERROR_EXIT
exit /b 1
REM All checks passed, so allow the commit.
:NORMAL_EXIT
exit 0