C# SVN预提交钩子,用于避免提交到特定分支
使用c#阻止svn提交到指定分支的可能方法是什么?如何从pre-commit钩子中的参数获取分支的路径?(或获得阻塞路径的任何其他建议) 有没有办法使用svnlook查看它修改了哪些文件C# SVN预提交钩子,用于避免提交到特定分支,c#,svn,C#,Svn,使用c#阻止svn提交到指定分支的可能方法是什么?如何从pre-commit钩子中的参数获取分支的路径?(或获得阻塞路径的任何其他建议) 有没有办法使用svnlook查看它修改了哪些文件 非常感谢您的任何建议 当我不得不这样做时,我遵循以下指南: 我编写了一个名为svnlook的C#应用程序,并由预提交挂钩启动,以检查路径是否被允许 以下是我的代码,它应该很容易适应您的情况: class Program { static void Main(string[] args) {
非常感谢您的任何建议 当我不得不这样做时,我遵循以下指南: 我编写了一个名为svnlook的C#应用程序,并由预提交挂钩启动,以检查路径是否被允许 以下是我的代码,它应该很容易适应您的情况:
class Program
{
static void Main(string[] args)
{
var repos = args[0];
var txn = args[1];
var log = GetSvnLookOutput(repos, txn, "log");
var changedPaths = GetSvnLookOutput(repos, txn, "changed");
var logValidation = GetLogMessageErrors(log.Replace("\r", "").Replace("\n", ""));
if (logValidation != null)
{
Console.Error.WriteLine(logValidation);
Environment.Exit(1);
}
if (log.Contains("Autoversioning commit"))
{
// this is an autoversion webdav client, enforce path rules
var changedPathsValidation = GetFileNameErrors(changedPaths);
if (changedPathsValidation != null)
{
Console.Error.WriteLine(changedPathsValidation);
Environment.Exit(1);
}
}
Environment.Exit(0);
}
private static string GetLogMessageErrors(string log)
{
if (string.IsNullOrEmpty(log))
{
return "Log message is required.";
}
return null;
}
private static string GetFileNameErrors(string changedPaths)
{
var changeRows = Regex.Split(changedPaths.TrimEnd(), Environment.NewLine);
foreach (var changeRow in changeRows)
{
var filePath = changeRow.Substring(4, changeRow.Length - 4);
if (filePath.ToLower().Contains("/code/"))
{
return "Autoversioning commits are not allowed inside /CODE/ folders. Use a SVN client for this.";
}
}
return null;
}
private static string GetSvnLookOutput(string repos, string txn, string subcommand)
{
var processStartInfo = new ProcessStartInfo
{
FileName = @"svnlook.exe",
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
Arguments = String.Format("{0} -t \"{1}\" \"{2}\"", subcommand, txn, repos)
};
var process = Process.Start(processStartInfo);
var output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return output;
}
}
当我不得不这样做时,我遵循以下指南: 我编写了一个名为svnlook的C#应用程序,并由预提交挂钩启动,以检查路径是否被允许 以下是我的代码,它应该很容易适应您的情况:
class Program
{
static void Main(string[] args)
{
var repos = args[0];
var txn = args[1];
var log = GetSvnLookOutput(repos, txn, "log");
var changedPaths = GetSvnLookOutput(repos, txn, "changed");
var logValidation = GetLogMessageErrors(log.Replace("\r", "").Replace("\n", ""));
if (logValidation != null)
{
Console.Error.WriteLine(logValidation);
Environment.Exit(1);
}
if (log.Contains("Autoversioning commit"))
{
// this is an autoversion webdav client, enforce path rules
var changedPathsValidation = GetFileNameErrors(changedPaths);
if (changedPathsValidation != null)
{
Console.Error.WriteLine(changedPathsValidation);
Environment.Exit(1);
}
}
Environment.Exit(0);
}
private static string GetLogMessageErrors(string log)
{
if (string.IsNullOrEmpty(log))
{
return "Log message is required.";
}
return null;
}
private static string GetFileNameErrors(string changedPaths)
{
var changeRows = Regex.Split(changedPaths.TrimEnd(), Environment.NewLine);
foreach (var changeRow in changeRows)
{
var filePath = changeRow.Substring(4, changeRow.Length - 4);
if (filePath.ToLower().Contains("/code/"))
{
return "Autoversioning commits are not allowed inside /CODE/ folders. Use a SVN client for this.";
}
}
return null;
}
private static string GetSvnLookOutput(string repos, string txn, string subcommand)
{
var processStartInfo = new ProcessStartInfo
{
FileName = @"svnlook.exe",
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
Arguments = String.Format("{0} -t \"{1}\" \"{2}\"", subcommand, txn, repos)
};
var process = Process.Start(processStartInfo);
var output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return output;
}
}
您能否使用ACL并向所有用户授予仅对要保护的分支的读取权限?您可以使用C来修改ACL配置文件。看看这个问题是否有帮助:它必须是C吗?我在Perl中有一个完全满足您需要的功能。它使用一个控制文件,并且控制文件可以存储在存储库中,因此您可以修改提交权限,而无需访问服务器。你可以从中获得一个免费的Perl版本。我不明白为什么你需要一个钩子。这里有一个基于路径的授权:很抱歉,我迟到了一年,但我在这里发布它,以防其他人遇到这种情况。我同意上面的帖子,改用基于路径的身份验证,它内置在authz文件和Subversion中,专为此而设计。请参阅本文:您能否使用ACL并向所有用户授予仅对要保护的分支的读取权限?您可以使用C来修改ACL配置文件。看看这个问题是否有帮助:它必须是C吗?我在Perl中有一个完全满足您需要的功能。它使用一个控制文件,并且控制文件可以存储在存储库中,因此您可以修改提交权限,而无需访问服务器。你可以从中获得一个免费的Perl版本。我不明白为什么你需要一个钩子。这里有一个基于路径的授权:很抱歉,我迟到了一年,但我在这里发布它,以防其他人遇到这种情况。我同意上面的帖子,改用基于路径的身份验证,它内置在authz文件和Subversion中,专为此而设计。见此帖: