zoukankan      html  css  js  c++  java
  • 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 
  • 相关阅读:
    Cookie和Session
    HTTP简介
    Python赋值与深浅拷贝
    Python装饰器探险
    Python操作MongoDB数据库
    MongoDB数据库基础
    python操作mysql数据库
    USACO2012 overplanting /// 矩阵切割 递归 oj21547
    USACO2007 The Bale Tower /// DFS oj21160
    USACO2012 Moo /// 模拟 oj21548
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/2612623.html
Copyright © 2011-2022 走看看