Subversion Needs Lock Property global setzen

Wenn man SVN zur Revisionsverwaltung von Quellcode nutzt, kann man über das Property “Needs Lock” festlegen, dass keine Änderung an Dateien vorgenommen werden kann, solange man diese Dateien nicht für sich gesperrt hat.
Sollte im Nachhinein auffallen, dass das Property nicht durchgängig gesetzt ist, kann das über folgende Skripte automatisiert werden.
Zunächst muss eine Liste aller Repositories erstellt werden, in deinen das Property fehlt.
Dazu kann folgendes Bash Skript auf dem Subversion Server genutzt werden.

#!/bin/bash
#Dateien in jedem Repository finden, die die Eigenschaft "Needs-Lock" nicht gesetzt haben
#
#findReposWithoutLogInHEAD.sh ausführen.
#Repositories ohne Needs-Lock Property werden ausgegeben.
#Ausgaben in Datei umleiten: ./findReposWithoutLogInHEAD.sh >> needLockFehlt.log
#Log auf PC kopieren und PS Script starten: checkoutWholeRepo.ps1

IFS=$'n'
cd /srv/svn-parent/
pwd

#Verzeichnis auflisten
array=(*/)

#Repos durchgehen
for dir in "${array[@]%/*}";
do #echo "$dir";
	files=`svn list -r HEAD -R http://subversion-server/svn/$dir --username *** --password "***" | grep -e ".*.vi$" -e ".*.ctl$" -e ".*.lvlib$" -e ".*.lvclass$" -e ".*.rtm$" -e ".*.lvproj$"`
	for fn in $files;
	do
		#wenn svn propget nicht gleich yes, dann ist prop nicht gesetzt
		if [[ $(svn propget svn:needs-lock http://subversion-server/svn/$dir/$fn --revprop -r HEAD) != "*"  ]]; then
			#echo Hier ist Prop nicht gesetzt
			echo http://subversion-server/svn/$dir/$fn
		fi
	done
done

Die Ausgabe des Skripts sollte in eine Datei umgeleitet werden, die dem Powershell Skript mitgegeben wird. Das Skript setzt das Vorhandensein des SVN Clients Tortoise SVN voraus!

#Liest Liste von Dateien ein, denen Needs:Lock fehlt, checkt das jeweilige Repository aus und setzt die Eigenschaft auf die Dateien
#

$files = cat "PfadzumLog.log"
#Array für die Repositories, wo die Namen drin stehen
$repoArray=@()
$lwDPfad
$pfadAufD ="D:SVNREPOS"

$checkout='checkout'
$usernamePasswort='--username "***" --password "***"'

#Initiierung für den ersten String
$a = $files[0].split("/")
$compString=$a[4] + "/" + $a[5]
Write-Host "Erstes Repo: $compString"
$repoArray+=("http://subversion-server/svn/"+$compString)

for ($i=0; $i -lt $files.length; $i++){
	if($files[$i] -match $compString){
        #Repo gleich, nichts zu tun
	}else{
		Write-Host "Neues Repo gefunden: "$files[$i]
		$a = $files[$i].split("/")
		$compString=$a[4] + "/" + $a[5]
		#Write-host $compString
        $repoArray+=("http://subversion-server/svn/"+$compString)
	}
}

#Jedes Repo einzeln auschecken
foreach($s in $repoArray){
Write-Warning "Checke $s aus"
#hier auschecken
svn.exe checkout $s $pfadAufD

    foreach($file in $files){
        if($file -match $s){
        #das sind die Dateien, die angepasst werden müssen
        #Pfad lokal anpassen
            #write-host $file
            $z = $file.split("/")
            $compString=$z[0] + "/" + $z[1] + "/" +$z[2] + "/" +$z[3] + "/" +$z[4] + "/" +$z[5]
            $lwDPfad = $file -replace $compString, $pfadAufD
            $lwDPfad = $lwDPfad -replace "/",""
            #Das ist der Pfad zur Datei, die angepasst werden muss:
            if(test-path $lwDPfad){
                write-host "Datei gefunden: $lwDPfad" -ForegroundColor green
                svn lock $lwDPfad
                svn propset svn:needs-lock yes $lwDPfad

                }
            else{
                write-host "Datei nicht gefunden: $lwDPfad" -ForegroundColor red}
        }
    }
#Fertig mit Repo, also commit und dann löschen
svn commit $pfadAufD -m "Needs Lock wurde auf die Dateien gesetzt"
read-host
Write-Warning "Lösche Inhalte..."
rmdir "$pfadAufD*" -force -Recurse
}

Damit werden nun alle gefundenen Repositories ausgecheckt und das Property gesetzt. Danach wird es wieder eingecheckt.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s