Files
2024-03-28 18:34:33 +02:00

86 lines
2.2 KiB
C#

using System;
using System.Diagnostics;
namespace DeployAll;
public static class GitCmd
{
private const string GitCmdName = "git";
private static ProcessStartInfo MakePsi(params string[] args)
{
var psi = new ProcessStartInfo
{
FileName = GitCmdName,
RedirectStandardError = true,
RedirectStandardOutput = true
};
foreach (var arg in args)
{
psi.ArgumentList.Add(arg);
}
return psi;
}
private static void ExecCmd(out string stdOut, out string stdErr, params string[] args)
{
var process = Util.StartProcess(MakePsi(args));
process.WaitForExit();
stdOut = process.StandardOutput.ReadToEnd();
stdErr = process.StandardError.ReadToEnd();
}
public static string GetRevision()
{
ExecCmd(out string stdOut, out _,
"rev-parse",
"--short",
"HEAD");
return stdOut.Trim();
}
public static string GetBranch()
{
ExecCmd(out string stdOut, out _,
"branch",
"--show-current");
return stdOut.Trim();
}
public static bool HasUncommittedChanges()
{
ExecCmd(out string stdOut, out _,
"status",
"--porcelain=1");
return !string.IsNullOrWhiteSpace(stdOut);
}
public static bool IsRepoOutOfSync()
{
ExecCmd(out _, out _,
"fetch");
ExecCmd(out string remoteBranch, out _,
"status",
"-sb");
if (!remoteBranch.StartsWith("##")) { return true; }
if (!remoteBranch.Contains("...")) { return true; }
remoteBranch = remoteBranch[(remoteBranch.IndexOf("...", StringComparison.InvariantCulture) + 3)..];
remoteBranch = remoteBranch[..remoteBranch.IndexOf("\n", StringComparison.InvariantCulture)];
string localRevision = GetRevision();
ExecCmd(out string remoteRevision, out _,
"rev-parse",
"--short",
remoteBranch);
remoteRevision = remoteRevision.Trim();
return localRevision != remoteRevision;
}
}