We are trying to replicate the ShadowFolders feature of VSS, whereby each 
checked-in file that needs it gets mirrored to a reference directory.
To do this, I wrote the following script, which works well except for the 
actual file copy - svn copy complains about the target folder not being a 
directory, although it most certainly is. My questions are a) what is wrong 
with my use of svn copy, and b) is there perhaps a better way to achieve the 
ShadowFolder feature?

You'll note that my solution allows every file to have a specific shadow folder 
(by virtue of the associated property), so that they aren't all collected into 
a single box. It also skips any files without the property set so that only 
those files which need to be shadowed are copied (a necessity since only a 
fraction of the files being checked in to SVN need this mirroring). I've tried 
looking online for an existing script, but it doesn't seem like any have been 
made available yet.

Thanks in advance for all suggestions you may have.

Here's the scripts (and the associated log):

Post-commit.bat:
call %~dp0post-commit-run.bat %* >> %1/hooks/post-commit.log 2>&1

Post-commit-run.bat:
@echo off

rem Under Windows, SVN passes in the repository argument as 
drive:\path\to\repository, which SVN
rem EXPORT treats as a working file -- to access the repository itself requires 
the use of the
rem server URL (so that the request is sent using http).  The easiest solution 
is to simply define
rem that URL here and use it in the SVN calls.
rem
rem+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
rem  Note this means the EnvVar needs to be updated each time the script is 
moved to a new hooks folder!!
rem+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
set REPURL=https://iss01sb299/svn/icbc

rem Keep track of the SVN components being worked with
set REPOSITORY=%1
set REVISION=%2

rem Get current date and time, formatting for readability
for /F "tokens=1-4 delims=/ " %%i in ('date/t') do set CURRDT=%%j-%%k-%%l
for /F "tokens=1-9 delims=:. " %%i in ('time/t') do set CURRTM=%%i:%%j%%k

rem Process each file in the revision package
for /f "tokens=2*" %%a in ('svnlook changed --revision %REVISION% 
%REPOSITORY%') do call :readProperties %%a
exit /b

rem ========================================================
rem Support functions
rem ========================================================

rem ----------------------------------------------------------
rem Process the associated ShadowFolder property if it exists
rem ----------------------------------------------------------
:readProperties
for /f %%a in ('svnlook proplist -r %REVISION% %REPOSITORY% %1') do if [%%a] == 
[ShadowFolder] call :readShadowFolder %1
exit /b

rem --------------------------------------------------------
rem Determine the value of the associated shadow folder
rem --------------------------------------------------------
:readShadowFolder
for /f %%a in ('svnlook propget -r %REVISION% %REPOSITORY% ShadowFolder %1') do 
call :processFile %1 %%a
exit /b

rem --------------------------------------------------------
rem If a shadow folder was defined, copy the file into it; note that this 
process is running
rem as the server resource, so the shadow folder needs to be Write privileged 
for Everyone
rem --------------------------------------------------------
:processFile
set FPATH=%1
set FOLDER=%2
if [%FOLDER%] == [] exit /b

rem Keep track of what we are doing
echo (%CURRDT% %CURRTM%) Copying %FPATH% to %FOLDER%

rem Extract the filename from the full path
set FNAME=
call :extractFileFromPath %FPATH% %FNAME%

rem Copy the file to the indicated shadow folder
svn copy -r %REVISION% %REPURL%/%FPATH% %FOLDER%/%FNAME%
exit /b

rem --------------------------------------------------------
rem Determine the file from a full pathname
rem --------------------------------------------------------
:extractFileFromPath
set FULLPATH=%1
set FNAME=%2

rem if we are at the last character stop the recursion
if [%FULLPATH:~1%]==[] exit /b

rem if the current character is a slash reduce the filename to what follows it
if [%FULLPATH:~0,1%]==[/] set FNAME=%FULLPATH:~1%

rem drop the leading character from the substring and recurse
call :extractFileFromPath %FULLPATH:~1% %FNAME%

exit /b

Post-commit.log (note that I have also echoed the command used to the log - 
this line was removed from the above script for clarity):

a)      Writing to a local ShadowFolder
(02-07-2011 11:31AM) Copying Development/CCSA/Tools/CCPW001/ccpw001.hr to 
C:\SVNtest\RefDir
svn copy -r 601 
https://iss01sb299/svn/icbc/Development/CCSA/Tools/CCPW001/ccpw001.hr 
C:\SVNtest\RefDir\ccpw001.hr
svn: Path 'C:\SVNtest\RefDir' is not a directory

b)      Writing to a network shadow folder
(02-07-2011 11:48AM) Copying Development/CCSA/Tools/CCPW001/ccpw001.h to 
\\MQ01DV299\LIBRARY\ReferenceDir\SVNtest
svn copy -r 603 
https://iss01sb299/svn/icbc/Development/CCSA/Tools/CCPW001/ccpw001.h 
\\MQ01DV299\LIBRARY\ReferenceDir\SVNtest\ccpw001.h
svn: Path '\\mq01dv299\LIBRARY\ReferenceDir\SVNtest' is not a directory

c)      Removing the filename from the destination path
(02-07-2011 12:00PM) Copying Development/CCSA/Tools/CCPW001/ccpw001.h to 
\\MQ01DV299\LIBRARY\ReferenceDir\SVNtest
svn copy -r 604 
https://iss01sb299/svn/icbc/Development/CCSA/Tools/CCPW001/ccpw001.h 
\\MQ01DV299\LIBRARY\ReferenceDir\SVNtest
svn: Path '\\mq01dv299\LIBRARY\ReferenceDir\SVNtest' is not a directory

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wolf Schneider
IS Claims Services (Claim Initiation / Litigation)

ICBC - building trust. driving confidence.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
404-35  Strachan-Bortnick Building (Head Office)
151 W. Esplanade   North Vancouver
British Columbia     V7M 3H9
direct: 604-982-7296
facsimile: 604-443-4500
* Save trees. Print only when necessary.





------------------------------------------------------------
This email and any attachments are intended only for the named
recipient and may contain confidential and/or privileged material.
Any unauthorized copying, dissemination or other use by a person
other than the named recipient of this communication is prohibited.
 If you received this in error or are not named as a recipient,
please notify the sender and destroy all copies of this email
immediately.


Reply via email to