#!/usr/bin/make -f

svn = /usr/bin/svn
svnadmin = /usr/bin/svnadmin

auth = --username userfoo --password passbar

svn_import = $(svn) import 
svn_checkout = $(svn) checkout --quiet
svn_remove = $(svn) remove --quiet
svn_add = $(svn) add --quiet
svn_commit = $(svn) commit
svn_update = $(svn) update
svn_revert = $(svn) revert

projname = testproj

# This needs to be set on the command line or exported by the caller
# REPOSITORY_PATH = $(CURDIR)/testdir/repository

# These need to be set by the caller
# repos_url = invalid://foo/bar
# abs_srcdir = /absolute/path/to/directory/with/this/file

.PHONY : full-cycle empty-repository clean-repository clean-sandbox modified-sandbox v2 clean

clean :
	$(abs_srcdir)/svnserve stop $(testroot)
	rm -rf testdir

full-cycle : v2

v2 : testdir/v2.stamp

testdir/v2.stamp : testdir/modified-sandbox.stamp
	set -e; \
	cd testdir/sandbox ; \
	$(svn_commit) $(auth) -m "Automated modifications"
	set -e ; \
	    cd testdir/sandbox ; \
	    rm -f fortune-11.txt fortune-2.txt ; \
	    $(svn_update) $(auth) ; \
	    test -f fortune-11.txt ; \
	    test -f fortune-2.txt ; \
	    ! test -f fortune-3.txt
	rm -f testdir/modified-sandbox.stamp
	rm -f testdir/clean-repository.stamp

modified-sandbox : testdir/modified-sandbox.stamp

testdir/modified-sandbox.stamp : testdir/clean-sandbox.stamp
	@set -ex ; \
	    cd testdir/sandbox ; \
	    fortune -l > fortune-11.txt ; \
	    $(svn_add) fortune-11.txt ; \
	    fortune -l > fortune-2.txt ; \
	    $(svn_remove) fortune-3.txt ; \
	    ! test -f fortune-3.txt ; 
	@set -ex ; \
	    cd testdir/sandbox ; \
	    $(svn_remove) fortune-4.txt ; \
	    ! test -f fortune-4.txt ; \
	    $(svn_revert) fortune-4.txt ; \
	    test -f fortune-4.txt
	rm -rf testdir/clean-sandbox.stamp
	touch $@

clean-sandbox : testdir/clean-sandbox.stamp

testdir/clean-sandbox.stamp : testdir/clean-repository.stamp
	@echo Creating clean sandbox
	rm -rf testdir/sandbox
	set -e ; cd testdir ; $(svn_checkout) $(auth) $(repos_url)/$(projname) sandbox
	touch $@

clean-repository : testdir/clean-repository.stamp

testdir/clean-repository.stamp : testdir/import-files.stamp testdir/empty-repository.stamp
	@echo Importing files into repository $(repos_url)
	$(svn_import) $(auth) -m "Initial import" testdir/import $(repos_url)/$(projname)
	touch $@
	@#rm -f testdir/empty-repository.stamp

empty-repository : testdir/empty-repository.stamp

testdir/empty-repository.stamp :
	@echo Creating a virgin empty repository in $(repos_path)
	$(abs_srcdir)/svnserve stop $(testroot)
	rm -rf testdir/repository
	mkdir --parents testdir/repository
	$(svnadmin) create $(repos_path)
	cp $(abs_srcdir)/svnserve.conf $(repos_path)/conf/svnserve.conf
	$(abs_srcdir)/svnserve start $(testroot) $(repos_path) $(port)
	touch $@

testdir/import-files.stamp : 
	@echo Preparing dummy source files
	rm -rf testdir/import
	mkdir --parents testdir/import
	for f in 1 2 3 4 5 6 7 8 9 10 ; do \
	    fortune -l > testdir/import/fortune-$$f.txt; \
	done
	touch $@

