显然,此代码中的非确定行为会调用外部进程

时间:2015-04-29 15:00:39

标签: c# git powershell process msbuild

我们在某些基础架构代码中有以下类。它是我通常从PowerShell执行的MSBuild任务的一部分。我的PowerShell环境中可以使用所有Git命令;这不是Git问题。

public class Git
{
    public static string GetCurrentBranch()
    {
        Console.WriteLine("Trying to find current Git branch...");
        string branch = null;
        /* git rev-parse --abbrev-ref HEAD */
        var processStartInfo = new ProcessStartInfo("git", "rev-parse --abbrev-ref HEAD")
        {
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            UseShellExecute = false
        };
        var process = new Process();
        process.ErrorDataReceived += (sender, args) => { branch += args.Data; };
        process.OutputDataReceived += (sender, args) => { branch += args.Data; };
        process.StartInfo = processStartInfo;
        process.Start();
        process.BeginErrorReadLine();
        process.BeginOutputReadLine();
        process.WaitForExit(5000); // Potential failure point?
        Console.WriteLine("Git branch set to '{0}'", branch);
        return branch;
    }
}

大多数时候,我看到它写出这样的输出:

 Trying to find current Git branch...
 Git branch set to 'feature-multitenancy-steel-thread'

然而,在偶然的情况下 - 令我懊恼的是,当发生这种情况时,我无法找出一个模式 - 我得到这样的输出:

Trying to find current Git branch...
Git branch set to ''

这当我肯定在Git存储库中时,如果我直接执行它,git rev-parse --abbrev-ref HEAD肯定会返回分支名称。我想知道WaitForExit()调用是否可能没有等待足够长时间并且在设置分支之前它已经退出,但是当它失败时它似乎不需要五秒钟,而且我从未观察过{{1}无论如何,命令要花那么长时间。

因为我无法始终如一地重现这种情况,所以我想知道代码中是否显示我们是否使用rev-parse错误或其他内容。任何可以在这段代码中打洞的C#/。NET大师?

0 个答案:

没有答案