Download SSL Certificates Sort Subtasks of Markdown files Test BioRad EAF CopyDirectories json to Markdown Sort Day 2024 Q2 GitRemoteRemove Handle directoryInfo.LinkTarget better Remove StartAt Handle directoryInfo.LinkTarget
120 lines
5.2 KiB
C#
120 lines
5.2 KiB
C#
using System.Collections.ObjectModel;
|
|
using System.Diagnostics;
|
|
using System.Text;
|
|
|
|
namespace File_Folder_Helper.Helpers;
|
|
|
|
internal static class HelperGit
|
|
{
|
|
|
|
private record ProcessResult(string Errors,
|
|
int ExitCode,
|
|
string Output);
|
|
|
|
private static async Task<ProcessResult> RunProcessAsync(string application, string arguments, string workingDirectory, CancellationToken cancellationToken)
|
|
{
|
|
using Process process = new();
|
|
StringBuilder outputBuilder = new();
|
|
StringBuilder errorsBuilder = new();
|
|
process.StartInfo = new ProcessStartInfo
|
|
{
|
|
CreateNoWindow = true,
|
|
UseShellExecute = false,
|
|
RedirectStandardError = true,
|
|
RedirectStandardOutput = true,
|
|
FileName = application,
|
|
Arguments = arguments,
|
|
WorkingDirectory = workingDirectory,
|
|
};
|
|
process.OutputDataReceived += (_, args) => outputBuilder.AppendLine(args.Data);
|
|
process.ErrorDataReceived += (_, args) => errorsBuilder.AppendLine(args.Data);
|
|
_ = process.Start();
|
|
process.BeginErrorReadLine();
|
|
process.BeginOutputReadLine();
|
|
await process.WaitForExitAsync(cancellationToken);
|
|
return new(errorsBuilder.ToString().Trim(), process.ExitCode, outputBuilder.ToString().Trim());
|
|
}
|
|
|
|
private static async Task<string> RunAsync(string arguments, string workingDirectory, CancellationToken cancellationToken)
|
|
{
|
|
ProcessResult result = await RunProcessAsync("git", arguments, workingDirectory, cancellationToken);
|
|
if (result.ExitCode != 0)
|
|
throw new Exception($"{result.ExitCode} {result.Errors}");
|
|
return result.Output;
|
|
}
|
|
|
|
private static List<string> GetOthersModifiedAndDeletedExcludingStandardFilesAsList(string repositoryDirectory, bool usePathCombine, CancellationToken cancellationToken)
|
|
{
|
|
List<string> results = [];
|
|
Task<string> task = RunAsync("ls-files --others --modified --deleted --exclude-standard", repositoryDirectory, cancellationToken);
|
|
task.Wait(cancellationToken);
|
|
string[] files = task.Result.Split("\r\n");
|
|
foreach (string file in files)
|
|
{
|
|
if (!usePathCombine)
|
|
results.Add(file);
|
|
else
|
|
results.Add(Path.GetFullPath(Path.Combine(repositoryDirectory, file)));
|
|
}
|
|
return results;
|
|
}
|
|
|
|
internal static ReadOnlyCollection<string> GetOthersModifiedAndDeletedExcludingStandardFiles(string repositoryDirectory, bool usePathCombine, CancellationToken cancellationToken)
|
|
{
|
|
List<string> results = [];
|
|
List<string> relativePathFiles;
|
|
DirectoryInfo directoryInfo;
|
|
bool usePathCombineInner = false;
|
|
string checkDirectory = Path.Combine(repositoryDirectory, ".git");
|
|
if (Directory.Exists(checkDirectory))
|
|
results.AddRange(GetOthersModifiedAndDeletedExcludingStandardFilesAsList(repositoryDirectory, usePathCombine, cancellationToken));
|
|
string[] subdirectories = Directory.GetDirectories(repositoryDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
foreach (string subdirectory in subdirectories)
|
|
{
|
|
directoryInfo = new(subdirectory);
|
|
if (directoryInfo.LinkTarget is null)
|
|
continue;
|
|
checkDirectory = Path.Combine(directoryInfo.LinkTarget, ".git");
|
|
if (!Directory.Exists(checkDirectory))
|
|
continue;
|
|
relativePathFiles = GetOthersModifiedAndDeletedExcludingStandardFilesAsList(directoryInfo.LinkTarget, usePathCombineInner, cancellationToken);
|
|
foreach (string relativePathFile in relativePathFiles)
|
|
results.Add(Path.GetFullPath(Path.Combine(subdirectory, relativePathFile)));
|
|
}
|
|
return new(results);
|
|
}
|
|
|
|
internal static ReadOnlyCollection<string> RemoteRemove(string repositoryDirectory, string name, CancellationToken cancellationToken)
|
|
{
|
|
List<string> results = [];
|
|
Task<string> task = RunAsync($"remote rm {name}", repositoryDirectory, cancellationToken);
|
|
task.Wait(cancellationToken);
|
|
string[] lines = task.Result.Split("\r\n");
|
|
foreach (string line in lines)
|
|
results.Add(line);
|
|
return new(results);
|
|
}
|
|
|
|
internal static ReadOnlyCollection<string> RemoteAdd(string repositoryDirectory, string name, string url, CancellationToken cancellationToken)
|
|
{
|
|
List<string> results = [];
|
|
Task<string> task = RunAsync($"remote add {name} {url}", repositoryDirectory, cancellationToken);
|
|
task.Wait(cancellationToken);
|
|
string[] lines = task.Result.Split("\r\n");
|
|
foreach (string line in lines)
|
|
results.Add(line);
|
|
return new(results);
|
|
}
|
|
|
|
internal static ReadOnlyCollection<string> PushBranch(string repositoryDirectory, string remote, string name, CancellationToken cancellationToken)
|
|
{
|
|
List<string> results = [];
|
|
Task<string> task = RunAsync($"push {remote} {name}", repositoryDirectory, cancellationToken);
|
|
task.Wait(cancellationToken);
|
|
string[] lines = task.Result.Split("\r\n");
|
|
foreach (string line in lines)
|
|
results.Add(line);
|
|
return new(results);
|
|
}
|
|
|
|
} |