Svn-sync

Sitter här på tåget på väg till FSCONS. Jag skrev häromdagen ett inlägg där jag efterlyste en fri ersättare till Dropbox och i en av kommentarerna rekommenderades SVN. Jag passade på nu när har hade ett par timmar över på tåget att titta på det. Jag sökte på nätet men hittade inget som fungerar tvåvägs (dessutom går det ohyggligt segt här på tåget så jag ledsnade på att leta) så jag började skriva på ett eget mest på skoj.

Jag gör inga anspråk på att det är snyggt eller ens fungerar. Men jag har i alla fall två kataloger på min dator som synkas snyggt och fint så snart något ändras i dem. Jag har inte testat allt men har hunnit med att skapa, ändra och ta bort kataloger och filer. Konflikter hanteras inte (med det tror jag inte de gör i Dropbox heller). Det spottar ur sig lite felmeddelanden i bland (till exempel i tunnlar och så… :-)).

Bifogar skriptet här om någon vill lattja vidare med det. Observera att det är ett hack gjort på ett tåg …

Ursäkta de långa raderna …

#!/bin/bash
#
# Skript to keep a directory synced via SVN. Very untested. Have not used it in
# practice yet.
#
# *** DO NOT USE FOR PRODUCTION DATA ***
#
# By: Marcus Rejås, Rejås Dataskonsult AB
#
# This is free software under GPL see http://www.gnu.org/licenses/. I will
# include the correct statements some day.
#
#
# In order to make this work you have to have a checked out copy of the dir to
# sync. You should be able to run "svn up" in that dir without supplying a
# password.
#
# This dir should be pointed out in CONFIG_FILE ($HOME/.svnsync) as:
#
# sync_dir[0]=/home/rejas/Sync1
#
# If you have more than one, just add them.
#
# sync_dir[1]=/home/rejas/Sync2
# sync_dir[2]=/home/rejas/Sync3"
# ...
#
# Then run this script. For now you probably want to run in a terminal just to
# test it. If you (not likely) will find that it works you could add it as a
# startup skript in you desktop environment (or whatever).
#
#
# Notes ...
# apt-get install libnotify-bin
# apt-get install zenity  (Currently not needed. Maybe use for extra candy ...)

CONFIG_FILE=$HOME/.svnsync
DELAY=5 # Run every DELAY seconds
HOST=`hostname -f`
NOTIFY=1 # Nofify via libnotify

function notify {
	if [ $NOTIFY -eq 1 ]; then
		notify-send "SVN Update daemom" "$1"
	fi
}

notify "SVN sync daemon started"

#
# Set config file, if noone found raise an error
#
if [ -e $CONFIG_FILE ]; then
	source $CONFIG_FILE
else
	echo "No config file ($CONFIG_FILE) found"
	echo
	echo "Create one with content like:"
	echo
	echo "sync_dir[0]=/home/rejas/Sync1"
	echo "sync_dir[1]=/home/rejas/Sync2"
	echo
	echo "Please observe that these needs to be checked out directories"
	notify "No config file found!!"
	exit 1
fi

#
# There is currently no code to set up the local repo, so it must be created.
#
while true; do
	for DIR in ${sync_dir[*]}; do

		status=`svn status $DIR --xml | xmlstarlet sel -t -m "/status/target/entry" -v "concat(@path,':',wc-status/@item,'\n')" -n`
		if [ -z "$status" ]; then
			status=`svn status $DIR -u --xml | xmlstarlet sel -t -m "/status/target/entry" -v "concat(@path,':',wc-status/@item,'\n')" -n`
		fi

		if [ -z "$status" ]; then continue; fi

		#
		# Find out what to do ...
		#
		echo -e $status | while read line; do
			file=`echo $line | cut -d: -f1`
			stat=`echo $line | cut -d: -f2`

			if [ -z "$stat" ]; then continue; fi

			case $stat in  # I'm not sure if this is all cases, let me know if you hit the last rule (and how to handle it ...)
				modified)
					mess="updated $file to Server"
					svn commit --non-interactive -m "Sync script on $HOST: $mess" $file
					notify "$mess"
				;;
				none)
					mess="updated $file from Server"
					svn update --non-interactive $file
					notify "$mess"
				;;
				missing)
					mess="Deleted $file from server"
					svn delete --non-interactive $file
					svn commit --non-interactive -m "Sync script on $HOST: deleted $file" $file
					notify "$mess"
				;;
				unversioned)
					mess="Added $file to server"
					svn add $file
					svn commit --non-interactive -m "Sync script on $HOST: added $file" $file
					notify "$mess"

				;;
				deleted)
					mess="Deleting $file"
					#
					# This is a little hack. Dirs needs to be removed from the repo root
					#
					svn commit --non-interactive -m "Sync script on $HOST: deleted files" `dirname $file`
					notify "$mess"
				;;
				normal)
					mess="updated $file from Server"
					svn update --non-interactive $file
					notify "$mess"
				;;
				*)
					echo $file is unknown status $stat
					notify "$mess"
			esac
		done
	done
	sleep $DELAY
	echo "Running ..."
done

En reaktion på ”Svn-sync”

  1. Om jag förstått det hela rätt, så hanterar Dropbox konflikter på det sätt att den senast inlagda filen är den som gäller, men den har inget stöd för merge-oprationer. Däremot sparar de någon slags historik så man kan återskapa filerna.

    Har aldrig använt Dropbox själv, utan har bara läst om det någonstans.

    Själv använder jag git med Joey Hess’ mr för att hålla reda på mina filer, vilket fungerar riktigt bra. Kanske någonting att titta på? mr har stöd för svn, bzr, git, svn, cvs etc

Kommentarer är stängda.