d).关于"steal lock"

http://developer.51cto.com/art/201108/282082.htm

这个选项的初衷是为了增强灵活性,当一个文件被其它人锁定后,仍然可以用“偷”的方式将锁强行拿过来。不过这也是引起代码冲突的潜在原因之一,我们决定将其屏避掉。这里用到的技术就是hook script。hook script其实是一些脚本文件,在windows环境下就是一些bat脚本。每当svn做一些特定操作时,比如“锁定”,“提交”时,就会到指定目录下查找相关的hook script并执行它,达到对相应命令的预处理。我们这里是需要在锁定前检查用户在申请锁定文件时是否勾选了"steal lock",如果勾选了,则中断操作,提示用户这个选项已被系统禁止。放置这个hook script的目录是跟代码库路径是相关的,我的目录是:E:RepositoriesHWCHhooks。安装后默认里面已经有若干个模板,以tmpl为扩展名,比如pre-lock.tmpl就是锁定前做的预操作,post-commit.tmpl就是提交后做的预操作。我们在里面新建一个文件:pre-lock.bat,然后在里面输入以下内容:

  1. @echo off  
  2.  
  3. REM [1] REPOS-PATH   (the path to this repository)  
  4. REM [2] PATH         (the path in the repository about to be locked)  
  5. REM [3] USER         (the user creating the lock)  
  6. REM [4] COMMENT      (the comment of the lock)  
  7. REM [5] STEAL-LOCK   (1 if the user is trying to steal the lock, else 0)  
  8.  
  9. setlocal  
  10. ::svn对代码资源库路径与文件路径里的右小括号敏感,需要对其转义  
  11. ::代码资源库路径  
  12. set repos=%1   
  13. set "repos=%repos:)=^)%"  
  14. ::当前文件路径  
  15. set repPath=%2  
  16. set "repPath=%repPath:)=^)%"  
  17. set userName=%3  
  18. set isSteal=%5  
  19.  
  20. rem NO_STEALING  
  21. ::如果没有被锁定,则直接跳走结束处理  
  22. if /I '1'=='%isSteal%' goto NO_STEALING  
  23. REM echo aaa >>d:\log.txt  
  24. REM echo repos = %repos% >>d:\log.txt  
  25. REM echo repPath = %repPath% >>d:\log.txt  
  26. REM echo userName = %userName% >>d:\log.txt  
  27. rem if the path has been locked, find the Owner.  
  28. ::这里是处理重点  
  29. ::通过svnlook lock %repos% %repPath%,命令获取锁信息,例如:  
  30. ::  UUID Token: opaquelocktoken:1707b1a0-8dd1-a94e-87d2-6569a115cd5c  
  31. ::  Owner: ljz  
  32. ::  Created: 2011-08-08 21:05:31 +0800 (周一, 08 八月 2011)  
  33. ::  Expires:  
  34. ::  Comment (1 line):  
  35. ::通过findstr /r /n ".",将所有行的前面加上行号,前返回所有行,例如:  
  36. ::  1:UUID Token: opaquelocktoken:1707b1a0-8dd1-a94e-87d2-6569a115cd5c  
  37. ::  2:Owner: ljz  
  38. ::  3:Created: 2011-08-08 21:05:31 +0800 (周一, 08 八月 2011)  
  39. ::  4:Expires:  
  40. ::  5:Comment (1 line):  
  41. ::通过tokens=1,2,3 delims=: ,以:号与空格作为分隔符,将上述每一行分隔,并将前三段分别装入变量%%i,%%j,%%k  
  42. ::通过if %%i == 2 set LockedName=%%k,把第二行分隔后的第三段装入变量LockedName,在这里,就是ljz  
  43. for /f "tokens=1,2,3 delims=: " %%i in ('svnlook lock %repos% %repPath% ^|findstr /r /n "."') do (  
  44.         if %%i == 2 set LockedName=%%k  
  45.         )  
  46.  
  47. rem If we get no result from svnlook, there's no lock, allow the lock to happen.  
  48. ::如果没有获取到锁定信息,则直接跳走结束处理  
  49. if not defined LockedName goto OK_EXIT  
  50.  
  51. rem If the person locking matches the lock's owner, allow the lock to happen.  
  52. rem But this one won't effect, the SVN don't care if the person matchs, they just don't allow relock.  
  53. REM echo userName = %userName% >>d:\log.txt  
  54. REM echo LockedName = %LockedName% >>d:\log.txt  
  55. ::如果锁定人与当前用户同名,则直接跳走结束处理  
  56. if /I '%LockedName%'=='%userName%' goto OK_EXIT  
  57.  
  58. rem Otherwise, we've got an owner mismatch, so return failure:  
  59. :WRONG_PERSON  
  60. echo the path has been locked by %LockedName%, Pls contact %LockedName% to unlock it.>&2   
  61. goto ERROR_EXIT   
  62. :NO_STEALING  
  63. echo Stealing lock is not allowed at this server.>&2  
  64. :ERROR_EXIT  
  65. endlocal  
  66. exit 1  
  67. :OK_EXIT  
  68. endlocal  
  69. exit 0 
posted @ 2012-07-27 23:44  awp110  阅读(516)  评论(0编辑  收藏  举报