Was ist ein Pre-Revprop-Change-Hook in SVN und wie erstelle ich ihn?

168

Ich wollte einen Protokollkommentar im Repository-Browser bearbeiten und erhielt die Fehlermeldung, dass für das Repository kein Pre-Revprop-Change-Hook vorhanden ist. Was ist neben einem beängstigenden Namen ein Pre-Revprop-Change-Hook und wie erstelle ich ihn?

Manu
quelle
16
Jetzt ist dieser Link der zweite, kurz nach einem Link zu dieser Frage :)
ULysses
Der Link über führt zu SEHR veraltetem SVNBook 1.0. Die aktuelle ist 1.7 und 1.8 (nächtlich): svnbook.red-bean.com/de/1.8
bahrep

Antworten:

52

Grundsätzlich handelt es sich um ein Skript, das gestartet wird, bevor die nicht versionierte Eigenschaft im Repository geändert wird, damit Sie genauer verwalten können, was in Ihrem Repository geschieht.

In der SVN-Distribution befinden sich Vorlagen für verschiedene Hooks im Unterverzeichnis / hooks (* .tmpl, die Sie je nach Betriebssystem bearbeiten und umbenennen müssen, um sie zu aktivieren).

PW.
quelle
2
Alle Anweisungen befinden sich im Hook-Template-Skript. Wenn Sie den Hook für einen svnsyncSpiegel benötigen, muss das Standardskript geändert werden, da nur Änderungen an svn: log zulässig sind. Svnsync ändert sich mehr als dies, daher füge ich einfach ein ein exit 0, um alle Eigenschaftsänderungen zuzulassen (da dies nur ein Spiegel für mich ist).
Matt Connolly
... speichern Sie es pre-revprop-changedann im selben Verzeichnis und machen Sie es für den Webserver-Benutzer (unter Linux) ausführbar.
Mateng
209

Für Windows ist hier ein Link zu einer Beispiel-Batchdatei, die nur Änderungen an der Protokollnachricht zulässt (keine anderen Eigenschaften):

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

Kopieren Sie den folgenden Code grundsätzlich in eine Textdatei, benennen Sie ihn pre-revprop-change.batund speichern Sie ihn im \hooksUnterverzeichnis Ihres Repositorys.

@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
Patmortech
quelle
37
Könnte mit der dortigen Version stackoverflow.com/questions/6155/… verlinkt sein . Ich habe diesen Hook geschrieben und vor einiger Zeit im SVN-Forum gepostet. Ich denke, ich hätte ein paar Credits in die Hook-Kommentare einfügen sollen.
Philibert Perusse
1
Ich verwende dieses Skript mit VisualSVN 2.0.8 und TortoiseSVN 1.6.11 und es funktioniert gut.
Mark Biek
27
Sie können Hooks in VisualSVN bearbeiten, indem Sie mit der rechten Maustaste auf Ihren Repository-Namen in VisualSVN Server klicken und "Eigenschaften ..." auswählen. Sie sehen eine Registerkarte "Hooks". Dort sehen Sie die verschiedenen Arten von Haken. Wählen Sie die richtige aus, klicken Sie auf "Bearbeiten" und fügen Sie den obigen Code ein. Hoffe das hilft VisualSVN Nutzern!
Chuck Le Butt
Arbeitete für mich beim Deaktivieren der Zeile: Wenn / ich nicht "% action%" == "M" gehe zu ERROR_ACTION. Auf andere Weise wurde immer wieder gesagt, dass nur Änderungen zulässig sind.
Nathan
6
Schnelle und schmutzige Methode für Windows ist das Erstellen einer leeren Datei namens hooks \ pre-revprop-change.bat
Ben Claar
18

Damit Linux die Ausgabe eines Protokollkommentars zulässt,

  • Suchen Sie die Datei pre-revprop-change.tmplin derhooks Verzeichnis Ihres Repositorys
  • Kopieren Sie die Datei in dasselbe Verzeichnis und benennen Sie sie in um pre-revprop-change
  • gibt die Ausführungsberechtigung auf die Datei (für den Server - Benutzer, zum Beispiel www-data)

Bearbeitet: (danke an lindes)

  • Danach müssen Sie möglicherweise das Skript bearbeiten, um einen Exit-Wert 0für die Art der Änderungen zurückzugeben, die Sie zulassen möchten.
Alois Heimer
quelle
Dies ist nicht ausreichend ... man muss die Exit-Werte noch entsprechend ändern. Aber ich fand es trotzdem hilfreich, als Hinweis auf den richtigen Ort, an dem man suchen konnte ... auf den einige andere Antworten fehlten oder auf den Windows-spezifische Antworten gegeben wurden. Also danke dafür.
Lindes
1
Ich bin mir ziemlich sicher, dass es in meiner Ubuntu Linux-Version ausreichte, zu kopieren und die Erlaubnis zu geben. Aber ich weiß es nicht mehr genau. Ich habe die Antwort entsprechend bearbeitet. Vielen Dank.
Alois Heimer
Nun, ich bin mir sicher, dass es bei mir nicht so funktioniert hat, wie es ist, als ich es vor 2 Tagen ausprobiert und diesen Kommentar hinzugefügt habe. Mit der Bearbeitung funktioniert diese Antwort jedoch für mich.
Lindes
11

Hier ist der Link zur Stapelüberlauffrage mit vielen allgemeinen Hooks. Häufige Arten von Subversion-Hooks , einschließlich der ursprünglichen Quelle despre-revprop-change für Windows, die hier veröffentlicht wurde.

Sie sollten sich dort beziehen, da sie sich im Laufe der Zeit verbessern können.

Philibert Perusse
quelle
7

Danke #patmortech

Und ich habe Ihren Code hinzugefügt, der "nur derselbe Benutzer seinen Code ändern kann".

:: 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
Yasin
quelle
4

Der Name des Hook-Skripts ist nicht so beängstigend, wenn Sie die Entschlüsselung verwalten: Es handelt sich um einen Hook zur Änderung der Eigenschaften vor der Revision . Kurz gesagt, der Zweck vonpre-revprop-change Hook-Skripts besteht darin, Änderungen an nicht versionierten (Revisions-) Eigenschaften zu steuern und Benachrichtigungen zu senden (z. B. eine E-Mail zu senden, wenn die Revisionseigenschaft geändert wird).

In Subversion gibt es zwei Arten von Eigenschaften:

  • versionierte Eigenschaften (zB svn:needs-lockundsvn:mime-type ), die für Dateien und Verzeichnisse festgelegt werden können,
  • nicht versionierte (Revisions-) Eigenschaften (z. B. svn:logund svn:date), die für Repository- Revisionen festgelegt wurden .

Versionierte Eigenschaften haben einen Verlauf und können von normalen Benutzern bearbeitet werden, die Lese- / Schreibzugriff auf ein Repository haben. Auf der anderen Seite haben nicht versionierte Eigenschaften keine Historie und dienen hauptsächlich Wartungszwecken. Wenn Sie beispielsweise eine Revision festschreiben, wird diese sofort svn:datemit der UTC-Zeit Ihres Commits, svn:authorIhrem Benutzernamen und svn:logIhrer Commit-Protokollnachricht (falls Sie eine angegeben haben) angezeigt.

Wie bereits erwähnt, dient das pre-revprop-changeHook-Skript dazu, Änderungen der Revisionseigenschaften zu steuern. Sie möchten nicht, dass jeder, der Zugriff auf ein Repository hat, alle Revisionseigenschaften ändern kann. Daher ist das Ändern von Revisionseigenschaften standardmäßig verboten. Damit Benutzer Eigenschaften ändern können, müssen Sie einen pre-revprop-changeHook erstellen .

Der einfachste Haken kann nur eine Zeile enthalten : exit 0. Jeder authentifizierte Benutzer kann Revisionseigenschaften ändern und sollte nicht in einer realen Umgebung verwendet werden. Unter Windows können Sie ein Batch-Skript oder ein PowerShell-basiertes Skript verwenden, um eine Logik innerhalb des pre-revprop-changeHooks zu implementieren .

Dieses PowerShell-Skript ermöglicht nur das Ändern von svn:logEigenschaften und lehnt leere Protokollnachrichten ab.

# 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

Mit diesem Batch-Skript kann nur der Benutzer "svnmgr" die Revisionseigenschaften ändern:

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

exit 1
goto :eof

:label1
exit 0
bahrep
quelle
2

Für PC-Benutzer: Die Erweiterung .bat funktionierte bei Windows Server-Bearbeitung nicht. Ich habe VisualSvn verwendet, wie Django Reinhardt vorgeschlagen hat, und es wurde ein Hook mit der Erweiterung .cmd erstellt.

nicht ich
quelle
0
  1. Wechseln Sie in das SVN-Repo-Verzeichnis in den Unterordner "hooks", z. B. "D: \ SVN \ hooks \".
  2. Erstellen Sie dort die leere Datei "pre-revprop-change.bat"
  3. Schreiben Sie in die Datei "exit 0" (ohne "") und speichern Sie es
  4. genießen :)

(Diese Lösung hat sicherlich Nachteile, da nichts überprüft / verboten wird. Aber für meinen Fall - ein lokales Repo, das nur ich verwende - scheint es zu funktionieren.)

Janis
quelle