Che cos'è un hook di modifica pre-revprop in SVN e come lo creo?


169

Volevo modificare un commento di registro nel browser del repository e ho ricevuto un messaggio di errore che non esiste alcun hook di pre-revprop-change per il repository. Oltre ad avere un nome spaventoso, che cos'è un hook di cambio pre-revprop e come posso crearlo?


16
ora questo link è il secondo, subito dopo un link a questa domanda :)
ULysses

Il link su porta a SVNBook 1.0 MOLTO obsoleto. Quello attuale è 1.7 e 1.8 (per notte): svnbook.red-bean.com/en/1.8
bahrep

Risposte:


52

Fondamentalmente si tratta di uno script che viene avviato prima che la proprietà senzaversione venga modificata nel repository, in modo da poter gestire con maggiore precisione ciò che sta accadendo nel proprio repository.

Ci sono modelli nella distribuzione SVN per diversi hook, situati nella sottodirectory / hooks (* .tmpl che devi modificare e rinominare a seconda del tuo sistema operativo, per attivare).


2
Tutte le istruzioni sono nello script del modello hook. Se è necessario l'hook per un svnsyncmirror, sarà necessario modificare lo script predefinito, poiché consente solo le modifiche a svn: log. Svnsync cambia più di questo, quindi ho semplicemente inserito uno exit 0per consentire tutte le modifiche alle proprietà (poiché questo è un mirror solo per me).
Matt Connolly,

... quindi salvalo pre-revprop-changenella stessa directory e rendilo eseguibile per l'utente del server web (su Linux).
Mateng,

209

Per Windows, ecco un collegamento a un file batch di esempio che consente solo modifiche al messaggio di registro (non altre proprietà):

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

Fondamentalmente copia il codice qui sotto in un file di testo e denominalo pre-revprop-change.bate salvalo nella \hookssottodirectory per il tuo repository.

@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
Potrebbe essersi collegato alla versione lì stackoverflow.com/questions/6155/… . Ho scritto quel gancio e l'ho pubblicato sul forum SVN qualche tempo fa. Immagino che avrei dovuto mettere dei crediti nei commenti hook.
Philibert Perusse,

1
Sto usando questo script con VisualSVN 2.0.8 e TortoiseSVN 1.6.11 e funziona bene.
Mark Biek,

27
È possibile modificare gli hook in VisualSVN facendo clic con il pulsante destro del mouse sul nome del repository nel server VisualSVN e selezionando "Proprietà ...". Vedrai una scheda "Ganci". Lì vedrai i diversi tipi di ganci disponibili. Seleziona quello giusto, fai clic su "Modifica" e incolla il codice sopra. Spero che aiuti gli utenti di VisualSVN!
Chuck Le Butt,

Ha funzionato per me disabilitando la riga: if / I "% action%" == "M" vai a ERROR_ACTION. Altrimenti, continuava a dire solo le modifiche consentite.
Nathan,

6
Il metodo rapido e sporco per Windows è quello di creare un file vuoto chiamato hooks \ pre-revprop-change.bat
Ben Claar,

18

Per Linux consentire l'edizione di un commento di registro,

  • trova il file pre-revprop-change.tmplnella hooksdirectory del tuo repository
  • copia il file nella stessa directory, rinominandolo in pre-revprop-change
  • autorizzare l'esecuzione del file (per l'utente del server, ad es. www-data)

A cura di: (grazie a Lindes)

  • successivamente potrebbe essere necessario modificare lo script per restituire un valore di uscita 0per il tipo di modifiche che si desidera consentire.

Questo è insufficiente ... è ancora necessario modificare i valori di uscita in modo appropriato. Ma l'ho trovato utile in ogni caso, come un puntatore al posto giusto in cui guardare ... a cui mancavano alcune altre risposte o a cui dare risposte specifiche per Windows. Quindi grazie per questo.
scade il

1
Sono abbastanza sicuro, nella mia versione di Ubuntu Linux copiare e dare il permesso era abbastanza. Ma non lo so più per certo. Ho modificato la risposta di conseguenza. Grazie.
Alois Heimer,

Bene, sono sicuro che non ha funzionato per me così com'è quando l'ho provato 2 giorni fa e ho aggiunto questo commento. Con la modifica, tuttavia, questa risposta funziona per me.
lindes

11

Ecco il link alla domanda di overflow dello stack con molti hook comuni Tipi comuni di hook di sovversione , inclusa la fonte originale pre-revprop-changedell'hook per Windows incrociata qui.

Dovresti fare riferimento lì in quanto potrebbero migliorare nel tempo.


7

Grazie #patmortech

E ho aggiunto il tuo codice che "solo lo stesso utente può modificare il suo codice".

:: 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

Il nome dello script hook non è così spaventoso se riesci a decifrarlo: è hook di modifica della proprietà pre-revisione . In breve, lo scopo di pre-revprop-changehook script è controllare le modifiche delle proprietà non riviste (revisione) e inviare notifiche (ad es. Per inviare un'e-mail quando si modifica la proprietà revisione).

Esistono 2 tipi di proprietà in Subversion:

  • proprietà con versione (ad es. svn:needs-locke svn:mime-type) che possono essere impostate su file e directory,
  • proprietà non revisionate (revisione) (ad es. svn:loge svn:date) impostate su revisioni del repository .

Le proprietà con versione hanno una cronologia e possono essere manipolate da utenti ordinari che hanno accesso in lettura / scrittura a un repository. D'altra parte, le proprietà non controllate non hanno alcuna storia e servono principalmente per scopi di manutenzione. Ad esempio, se si commette una revisione, questa ottiene immediatamente svn:datecon l'ora UTC del commit, svn:authorcon il proprio nome utente e svn:logcon il messaggio di registro del commit (se specificato).

Come ho già specificato, lo scopo di pre-revprop-changehook script è controllare le modifiche alle proprietà di revisione. Non si desidera che tutti coloro che hanno accesso a un repository siano in grado di modificare tutte le proprietà di revisione, quindi la modifica delle proprietà di revisione è vietata per impostazione predefinita. Per consentire agli utenti di modificare le proprietà, è necessario creare un pre-revprop-changehook.

Il gancio più semplice può contenere una sola riga: exit 0. Consentirà a qualsiasi utente autenticato di modificare qualsiasi proprietà di revisione e non dovrebbe essere utilizzato in un ambiente reale. Su Windows, è possibile utilizzare script batch o script basati su PowerShell per implementare una logica all'interno del pre-revprop-changehook.

Questo script di PowerShell consente di modificare svn:logsolo la proprietà e nega i messaggi di registro vuoti.

# 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

Questo script batch consente solo all'utente "svnmgr" di modificare le proprietà della revisione:

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

exit 1
goto :eof

:label1
exit 0

2

Per gli utenti di PC: l'estensione .bat non ha funzionato per me se utilizzata su macchine Windows Server. Ho usato VisualSvn come suggerito da Django Reinhardt, e ha creato un hook con estensione .cmd.


0
  1. Vai alla directory repository SVN nella sottocartella "hooks", ad esempio "D: \ SVN \ hooks \"
  2. crea lì il file vuoto "pre-revprop-change.bat"
  3. nel file scrivi "exit 0" (senza "") e salvalo
  4. godere :)

(Questa soluzione ha sicuramente degli svantaggi, dal momento che nulla è controllato / proibito. Ma per il mio caso - un repository locale che sto solo usando - sembra funzionare.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.