我们在Windows 2012上运行VisualSVN。我的任务是防止窃取锁。我想使用预解锁钩子。首先,我想将锁定所有者的名称与锁定用户的名称进行比较。我可以使用svnlook
:
svnlook lock C:\Repositories\DIT_TEST time-for-a-sandwich.txt
这给了我一个包含所有者的信息列表。凉。
我想在SharpSVN中复制它。这就是我到目前为止所拥有的:
using (SvnClient client = new SvnClient())
{
StringBuilder sbLockOwner = new StringBuilder();
Collection<SvnListEventArgs> col;
if (client.GetList(new Uri("https://dit-visualsvn/svn/DIT_TEST"), out col))
{
foreach (SvnListEventArgs svnListEventArg in col)
{
sbLockOwner.Append(svnListEventArg.Lock.Owner.ToString());
}
}
}
当我尝试释放锁定时,我收到错误:
Unable to connect to a repository at URL 'https://dit-visualsvn/svn/DIT_TEST' --->
Access to '/svn/DIT_TEST' forbidden.
我已验证我的用户对存储库具有读/写权限,并且我已尝试使用client.Authentication.ForceCredentials("login", "pswd");
解决方案。仍然不允许。
如何使用SharpSVN获取锁拥有者的姓名?
更多信息:如果我将代码更改为this SO上的回复,我仍然会看到禁止访问。
答案 0 :(得分:0)
如果你想复制&#39; svnlook&#39;使用SharpSvn,您应该首先查看SvnLookClient
。
我猜测您正在使用Windows /集成安全性与您的visualsvn服务器,并且(通常)不会从在不同凭据下运行的服务器进程工作。但是当你在存储库钩子中时,由于你有权访问物理文件,所以你不需要凭据。
但是你遇到了问题svnlook lock
尚未在SvnLookClient
上实施......
此时我通常会开始查看svnadmin
命令,看看是否存在svnlook
和svnadmin
在同一层上工作的等价物。在这种情况下,您会发现svnadmin lslocks
,svnadmin lock
和svnadmin unlock
...但是继续搜索SharpSvn的svnadmin-like SvnRepositoryClient
找到这些命令。
此时我切换到了不同的答案模式。该功能尚未在SharpSvn中使用。但截至目前,它已在上一个SharpSvn版本中提供。
您现在应该可以使用
了void Main(string[] args)
{
SvnHookArguments ha;
if (!SvnHookArguments.ParseHookArguments(args, SvnHookType.PreUnlock, Console.In, out ha)
{
Console.Error.Writeline("Bad arguments");
Environment.Exit(1);
}
using (SvnLookClient look = new SvnLookClient())
{
SvnLockInfo lck;
look.GetLock(ha.LookOrigin, ha.Path, out lck);
if (lck == null)
return; // Wasn't locked???
// lck.Owner now contains the old owner
// ha.User the new user
}
}
但是我猜你也想要实现一个.PreLock钩子,因为我自己在获取锁时通常会破坏锁...而不是解锁。