2

c#を使用して指定されたブランチへのsvnコミットをブロックするための可能な方法は何ですか?pre-commitフックの引数からブランチのパスを取得するにはどうすればよいですか?(またはブロックするパスを取得するための他の提案)

svnlookを使用してこれを実行し、変更されたファイルを確認する方法はありますか?

どんな提案でも大歓迎です!

4

1 に答える 1

4

これをしなければならなかったとき、私はこのガイドに従いました: http://www.troyhunt.com/2010/02/creating-subversion-pre-commit-hooks-in.html

パスが許可されているかどうかを確認するために、svnlook を呼び出して precommit フックによって起動される 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;
    }
}
于 2012-12-03T21:23:19.270 に答える