Що таке гачок попередньої зміни у програмі SVV і як це створити?


168

Я хотів відредагувати коментар до журналу в браузері репозиторію і отримав повідомлення про помилку про те, що для сховища не існує жодного попереднього зміни гачка. Окрім того, що у мене є страшне ім'я, що таке гачок попередньої зміни, і як це створити?


16
зараз це посилання є другим, одразу після посилання на це питання :)
ULysses

Посилання про веде до ДУЖЕ застарілого SVNBook 1.0. Поточний - 1,7 та 1,8 (щоночі): svnbook.red-bean.com/en/1.8
bahrep

Відповіді:


52

В основному це сценарій, який запускається перед зміною неперевершеного властивості у сховищі, щоб ви могли більш точно керувати тим, що відбувається у вашому сховищі.

У дистрибутиві SVN є шаблони для різних гачків, розташовані у підкаталозі / hooks (* .tmpl, який потрібно відредагувати та перейменувати залежно від вашої ОС, щоб активувати його).


2
Усі інструкції містяться в сценарії шаблону гачка. Якщо вам потрібен гачок для svnsyncдзеркала, то сценарій за замовчуванням потрібно буде змінити, оскільки він дозволяє лише зміни до svn: log. Svnsync змінюється більше, ніж це, тому я просто поміщаю exit 0туди, щоб дозволити всі зміни властивостей (оскільки це дзеркало лише для мене).
Метт Конноллі

... тоді збережіть його pre-revprop-changeу тому самому каталозі та зробіть його виконуваним для користувача веб-сервера (в Linux).
Матенг

209

Для Windows, ось посилання на прикладний пакетний файл, який дозволяє змінити лише повідомлення журналу (не інші властивості):

http://ayria.livejournal.com/33438.html

В основному скопіюйте код нижче в текстовий файл і дайте ім’я pre-revprop-change.batта збережіть його у \hooksпідкаталозі вашого сховища.

@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5

:: Only allow the log message to be changed, but not author, etc.
if /I not "%propertyName%" == "svn:log" goto ERROR_PROPNAME

:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION

:: Make sure that the new svn:log message is not empty.
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
set bIsEmpty=false
)
if "%bIsEmpty%" == "true" goto ERROR_EMPTY

goto :eof

:ERROR_EMPTY
echo Empty svn:log messages are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log messages are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1

37
Може бути пов'язана з версією там stackoverflow.com/questions/6155 / ... . Я написав цей гачок і деякий час тому розмістив його на форумі SVN. Я думаю, я мав би покласти деякі кредити у коментарях гака.
Філіберт Персе

1
Я використовую цей скрипт з VisualSVN 2.0.8 і TortoiseSVN 1.6.11, і він прекрасно працює.
Марк Бейк

27
Ви можете редагувати гачки у VisualSVN, клацнувши правою кнопкою миші своє ім’я сховища на сервері VisualSVN та вибравши "Властивості ...". Ви побачите вкладку "Гачки". Там ви побачите доступні різні типи гачків. Виберіть потрібний, натисніть "Редагувати" та вставте в нього вищевказаний код. Сподіваємось, що допоможе користувачам VisualSVN!
Чак Ле Бутт

Для мене працював рядок відключення: якщо / я не "% action%" == "M" перейшов до ERROR_ACTION. З іншого боку, він постійно говорив, що дозволяються лише зміни.
Натан

6
Швидкий і брудний метод для Windows - це створити порожній файл під назвою гачки \ pre-revprop-change.bat
Бен

18

Щоб Linux дозволяв видання коментаря до журналу,

  • знайдіть файл pre-revprop-change.tmplу hooksкаталозі вашого сховища
  • скопіюйте файл у той самий каталог, перейменувавши його в pre-revprop-change
  • дати дозвіл на виконання файлу (для користувача сервера, наприклад www-data)

Відредаговано: (спасибі lindes)

  • після цього вам, можливо, доведеться відредагувати скрипт, щоб повернути значення виходу 0для того чи іншого редагування, яке ви хочете дозволити.

Цього недостатньо ... ще потрібно змінити значення виходу належним чином. Але я вважаю це корисним у будь-якому випадку, як вказівник на потрібне місце, щоб подивитися ... на які бракувало деяких інших відповідей, або даючи відповіді, характерні для Windows. Тож дякую за це.
липня

1
Я впевнений, що в моїй версії Ubuntu Linux було достатньо копіювання та надання дозволу. Але я вже не знаю точно. Відповідь я відредагував відповідно. Дякую.
Алоїз Хеймер

Ну, я впевнений, що це не спрацювало для мене, як це було, коли я спробував це 2 дні тому, і додав цей коментар. Однак із редагуванням ця відповідь працює для мене.
липня

11

Ось посилання на запитання про переповнення стека з багатьма поширеними гачками Загальні типи підривних гачків , включаючи оригінальне джерело pre-revprop-changeгака для Windows, перекладене тут.

Вам слід посилатися там, оскільки вони можуть покращитися з часом.


7

Дякую #patmortech

І я додав ваш код, який "лише той самий користувач може змінити свій код".

:: Only allow editing of the same user.
for /f "tokens=*" %%a in ( 
'"%VISUALSVN_SERVER%\bin\svnlook.exe" author -r %revision% %repository%') do ( 
set orgAuthor=%%a
)
if /I not "%userName%" == "%orgAuthor%" goto ERROR_SAME_USER

4

Назва сценарію гачка не така страшна, якщо вам вдасться розшифрувати його: це попередньо переглянути властивість зміни гачка . Коротше кажучи, мета pre-revprop-changeсценарію гака - контролювати зміни неперевершених (ревізійних) властивостей та надсилати сповіщення (наприклад, надсилати електронну пошту при зміні властивості редагування).

У Subversion є 2 типи властивостей:

  • перелічені властивості (наприклад, svn:needs-lockта svn:mime-type), які можна встановити у файлах та каталогах,
  • неперевершені (ревізійні) властивості (наприклад, svn:logта svn:date), які встановлені на ревізії репозиторію .

Універсальні властивості мають історію і ними можуть керувати звичайні користувачі, які мають доступ до читання / запису до сховища. З іншого боку, неперевірені властивості не мають жодної історії та служать переважно технічному обслуговуванню. Наприклад, якщо ви скористаєтеся редакцією, вона негайно отримує svn:dateз часом UTC вашого вчинення, svn:authorсвоїм ім'ям користувача та svn:logповідомленням журналу фіксування (якщо ви вказали таке).

Як я вже вказав, мета pre-revprop-changeскрипту гака - це контроль змін властивостей ревізії. Ви не хочете, щоб усі, хто має доступ до сховища, мали змогу змінювати всі властивості редагування, тому зміна властивостей версії за замовчуванням забороняється. Щоб дозволити користувачам змінювати властивості, потрібно створити pre-revprop-changeгачок.

Найпростіший гачок може містити тільки один рядок: exit 0. Це дозволить будь-якому аутентифікованому користувачеві змінити будь-яку властивість редакції, і він не повинен використовуватися в реальному середовищі. У Windows ви можете використовувати пакетний сценарій або сценарій на основі PowerShell, щоб реалізувати певну логіку в pre-revprop-changeгачку.

Цей скрипт PowerShell дозволяє змінювати svn:logлише властивості та відхиляє порожні повідомлення журналу.

# Store hook arguments into variables with mnemonic names
$repos    = $args[0]
$rev      = $args[1]
$user     = $args[2]
$propname = $args[3]
$action   = $args[4]

# Only allow changes to svn:log. The author, date and other revision
# properties cannot be changed
if ($propname -ne "svn:log")
{
  [Console]::Error.WriteLine("Only changes to 'svn:log' revision properties are allowed.")
  exit 1
}

# Only allow modifications to svn:log (no addition/overwrite or deletion)
if ($action -ne "M")
{
  [Console]::Error.WriteLine("Only modifications to 'svn:log' revision properties are allowed.")
  exit 2
}

# Read from the standard input while the first non-white-space characters
$datalines = ($input | where {$_.trim() -ne ""})
if ($datalines.length -lt 25)
{
  # Log message is empty. Show the error.
  [Console]::Error.WriteLine("Empty 'svn:log' properties are not allowed.")
  exit 3
}

exit 0

Цей пакетний сценарій дозволяє лише користувачеві "svnmgr" змінювати властивості редагування:

IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )

exit 1
goto :eof

:label1
exit 0

2

Для користувачів ПК: Розширення .bat не працювало для мене під час використання в обробці Windows Server. Я використовував VisualSvn, як запропонував Джанго Рейнхардт, і він створив гачок з розширенням .cmd.


0
  1. Перейдіть до каталогу репортажу SVN у підпапку "гачки", наприклад "D: \ SVN \ гачки \"
  2. створити там порожній файл "pre-revprop-change.bat"
  3. у файл напишіть "exit 0" (без "") і збережіть його
  4. насолоджуйтесь :)

(Це рішення, безумовно, має недоліки, оскільки нічого не перевіряється / забороняється. Але для мого випадку - локальне репо, яке використовую лише я - воно, здається, працює).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.