【问题标题】:SVN Pre-commit hook for avoiding commits to specific branchesSVN 预提交钩子,用于避免提交到特定分支
【发布时间】:2012-12-03 20:46:36
【问题描述】:

使用 c# 阻止 svn 提交到指定分支的可能方法是什么?如何从 pre-commit 钩子中的参数获取分支的路径? (或任何其他获得阻止路径的建议)

有没有办法使用 svnlook 来查看它修改了哪些文件?

非常感谢任何建议!

【问题讨论】:

  • 您能否使用 ACL 并仅授予所有用户对您要保护的分支的读取权限?您可以使用 C# 来修改 ACL 配置文件。
  • 看看这个问题是否有帮助:stackoverflow.com/questions/8074143
  • 必须是 C# 吗?我在 Perl 中有一个 pre-commit hook,它完全符合您的要求。它使用了一个控制文件,并且控制文件可以存储在存储库中,因此您可以修改提交权限而无需上服务器。您可以从ActiveState 获得免费版本的 Perl。
  • 我不明白你为什么需要一个钩子。有基于路径的授权:svnbook.red-bean.com/en/1.7/…
  • 对不起,我迟到了一年,但我把它贴在这里以防其他人遇到这个问题。我同意上面的帖子,改用基于路径的身份验证,它内置在 authz 文件和 Subversion 中,专门为此而设计。看到这个帖子:stackoverflow.com/questions/1468651/…

标签: c# svn


【解决方案1】:

当我不得不这样做时,我遵循了这个指南: http://www.troyhunt.com/2010/02/creating-subversion-pre-commit-hooks-in.html

我编写了一个名为 svnlook 的 C# 应用程序,它被 precommit 钩子触发以检查路径是否被允许。

以下是我的代码,它应该很容易适应您的情况:

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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2017-12-19
    • 2014-03-22
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多