Apa itu pengait pre-revprop-change di SVN, dan bagaimana cara membuatnya?

169

Saya ingin mengedit komentar log di browser repositori dan menerima pesan kesalahan bahwa tidak ada kait pre-revprop-change ada untuk repositori. Selain memiliki nama yang menakutkan, apa itu pengait perubahan pra-revprop, dan bagaimana cara membuatnya?

Manu
sumber
16
sekarang tautan ini adalah yang kedua, tepat setelah tautan ke pertanyaan ini :)
ULysses
Tautan tentang mengarah ke SVNBook 1.0 SANGAT kedaluwarsa. Yang sekarang adalah 1.7 dan 1.8 (malam): svnbook.red-bean.com/en/1.8
bahrep

Jawaban:

52

Pada dasarnya ini adalah skrip yang diluncurkan sebelum properti tidak berversi dimodifikasi pada repositori, sehingga Anda dapat mengelola lebih tepat apa yang terjadi pada repositori Anda.

Ada templat di distrib SVN untuk kait yang berbeda, yang terletak di subdirektori / hooks (* .tmpl yang harus Anda edit dan ubah namanya tergantung pada OS Anda, untuk mengaktifkan).

PW.
sumber
2
Semua instruksi ada dalam skrip templat kait. Jika Anda memerlukan pengait untuk svnsyncmirror, maka skrip default perlu diubah, karena hanya memungkinkan perubahan ke svn: log. Svnsync berubah lebih dari ini, jadi saya cukup meletakkan exit 0di sana untuk mengizinkan semua perubahan properti (karena ini hanya cermin bagi saya).
Matt Connolly
... kemudian simpan sebagai pre-revprop-changeke direktori yang sama dan membuatnya dapat dieksekusi untuk pengguna server web (di Linux).
Mateng
209

Untuk Windows, berikut ini tautan ke file batch contoh yang hanya memungkinkan perubahan pada pesan log (bukan properti lainnya):

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

Pada dasarnya salin kode di bawah ini ke file teks dan beri nama pre-revprop-change.batdan simpan di \hookssubdirektori untuk repositori Anda.

@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
sumber
37
Bisa dikaitkan dengan versi di sana stackoverflow.com/questions/6155/… . Saya menulis hook itu dan mempostingnya di forum SVN beberapa waktu lalu. Saya kira saya seharusnya menaruh beberapa pujian di komentar.
Philibert Perusse
1
Saya menggunakan skrip ini dengan VisualSVN 2.0.8 dan TortoiseSVN 1.6.11 dan bekerja dengan baik.
Mark Biek
27
Anda dapat mengedit kait di VisualSVN dengan mengklik kanan nama repositori Anda di VisualSVN Server dan memilih "Properti ...". Anda akan melihat tab "Hooks". Di sana Anda akan melihat berbagai jenis kait yang tersedia. Pilih yang benar, klik "Edit" dan rekatkan kode di atas. Harapan yang membantu pengguna VisualSVN!
Chuck Le Butt
Bekerja untuk saya menonaktifkan baris: jika / saya tidak "% action%" == "M" goto ERROR_ACTION. Cara lain, itu terus mengatakan hanya modifikasi yang diizinkan.
Nathan
6
Metode cepat dan kotor untuk windows adalah membuat file kosong yang disebut hooks \ pre-revprop-change.bat
Ben Claar
18

Agar Linux mengizinkan edisi komentar log,

  • cari file pre-revprop-change.tmpldi hooksdirektori repositori Anda
  • salin file ke direktori yang sama, ganti namanya menjadi pre-revprop-change
  • memberikan izin eksekusi ke file (untuk pengguna server, mis. www-data)

Diedit: (terima kasih kepada lindes)

  • setelah itu Anda mungkin harus mengedit skrip untuk mengembalikan nilai keluar 0untuk jenis pengeditan, yang ingin Anda izinkan.
Alois Heimer
sumber
Ini tidak cukup ... kita masih perlu mengubah nilai keluar dengan tepat. Tapi saya tetap merasa terbantu, sebagai penunjuk ke tempat yang tepat untuk melihat ... yang tidak dimiliki oleh beberapa jawaban lain, atau memberikan jawaban khusus untuk windows. Jadi terima kasih untuk ini
lindes
1
Saya cukup yakin, dalam menyalin versi Ubuntu Linux saya dan memberikan izin sudah cukup. Tapi saya tidak tahu pasti lagi. Saya telah mengedit jawaban sesuai dengan itu. Terima kasih.
Alois Heimer
Yah, saya yakin itu tidak berhasil bagi saya apa adanya ketika saya mencobanya 2 hari yang lalu, dan menambahkan komentar ini. Namun, dengan pengeditan, jawaban ini berfungsi untuk saya.
lindes
11

Berikut ini tautan ke pertanyaan overflow tumpukan dengan banyak kait umum Jenis Umum Kait Subversion , termasuk sumber asli pre-revprop-changekait untuk Windows yang diposkan silang di sini.

Anda harus merujuk ke sana karena mereka dapat ditingkatkan dari waktu ke waktu.

Philibert Perusse
sumber
7

Terima kasih #patmortech

Dan saya menambahkan kode Anda yang "hanya pengguna yang sama yang dapat mengubah kodenya".

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

Nama skrip kait tidak begitu menyeramkan jika Anda berhasil menguraikannya: ini adalah kait perubahan properti pra revisi . Singkatnya, tujuan pre-revprop-changeskrip kait adalah untuk mengontrol perubahan properti yang tidak berversi (revisi) dan mengirim pemberitahuan (misalnya untuk mengirim email ketika properti revisi diubah).

Ada 2 jenis properti di Subversion:

  • properti berversi (misalnya svn:needs-lockdan svn:mime-type) yang dapat diatur pada file dan direktori,
  • properti (revisi) tidak berversi (misalnya svn:logdan svn:date) yang ditetapkan pada revisi repositori .

Properti versi memiliki riwayat dan dapat dimanipulasi oleh pengguna biasa yang memiliki akses Baca / Tulis ke repositori. Di sisi lain, properti tidak berversi tidak memiliki riwayat dan melayani sebagian besar tujuan pemeliharaan. Misalnya, jika Anda mengkomit revisi, maka svn:datewaktu UTC dengan komitmen Anda, svn:authordengan nama pengguna Anda dan svn:logdengan pesan log komit Anda (jika Anda tentukan).

Seperti yang sudah saya tentukan, tujuan pre-revprop-changeskrip kait adalah untuk mengontrol perubahan properti revisi. Anda tidak ingin semua orang yang memiliki akses ke repositori dapat mengubah semua properti revisi, jadi mengubah properti revisi dilarang secara default. Untuk memungkinkan pengguna mengubah properti, Anda harus membuat pre-revprop-changekait.

Hook sederhana dapat berisi hanya satu baris: exit 0. Ini akan memungkinkan pengguna terotentikasi untuk mengubah properti revisi apa pun dan tidak boleh digunakan di lingkungan nyata. Pada Windows, Anda bisa menggunakan skrip batch atau skrip berbasis PowerShell untuk menerapkan beberapa logika di dalam pre-revprop-changehook.

Skrip PowerShell ini memungkinkan untuk mengubah svn:logproperti saja dan menolak pesan log kosong.

# 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

Skrip kumpulan ini memungkinkan hanya pengguna "svnmgr" untuk mengubah properti revisi:

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

exit 1
goto :eof

:label1
exit 0
bahrep
sumber
2

Untuk pengguna PC: Ekstensi .bat tidak berfungsi untuk saya ketika digunakan pada pengerjaan Windows Server. Saya menggunakan VisualSvn seperti yang disarankan Django Reinhardt, dan itu menciptakan sebuah kait dengan ekstensi .cmd.

bukan saya
sumber
0
  1. Pergi ke direktori repo SVN ke dalam subfolder "hooks", mis. "D: \ SVN \ hooks \"
  2. buat file kosong "pre-revprop-change.bat" di sana
  3. dalam file tulis "keluar 0" (tanpa "") dan simpan
  4. Nikmati :)

(Solusi ini pasti memiliki kelemahan, karena tidak ada yang diperiksa / dilarang. Tetapi untuk kasus saya - repo lokal yang hanya saya gunakan - tampaknya berfungsi.)

Janis
sumber