101 lines
3.4 KiB
C#
101 lines
3.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using GameDevLibrary.Extensions;
|
|
using LibGit2Sharp;
|
|
using OmegaLeo.HelperLib.Git.Models;
|
|
|
|
namespace OmegaLeo.HelperLib.Git
|
|
{
|
|
public class GitClient
|
|
{
|
|
private Repository _repo;
|
|
|
|
public GitClient(string path)
|
|
{
|
|
if (path.IsNullOrEmpty())
|
|
{
|
|
path = AppDomain.CurrentDomain.BaseDirectory;
|
|
}
|
|
|
|
_repo = new Repository(path);
|
|
}
|
|
|
|
public void CheckoutBranch(string branchName)
|
|
{
|
|
var branch = _repo.Branches[branchName];
|
|
|
|
if (branch == null)
|
|
{
|
|
branch = _repo.CreateBranch(branchName);
|
|
}
|
|
|
|
Commands.Checkout(_repo, branch);
|
|
}
|
|
|
|
public bool HasChanges() => _repo.Diff.Compare<TreeChanges>().Count > 0;
|
|
|
|
public ChangeFolder GetChanges()
|
|
{
|
|
var folder = new ChangeFolder();
|
|
|
|
if (HasChanges())
|
|
{
|
|
var changes = _repo.Diff.Compare<TreeChanges>();
|
|
|
|
var allChanges = new List<TreeEntryChanges>();
|
|
allChanges.AddRange(changes.Added);
|
|
allChanges.AddRange(changes.Modified);
|
|
allChanges.AddRange(changes.Deleted);
|
|
|
|
var uniqueFolderPaths = allChanges.Select(x => Path.GetDirectoryName(x.Path)).Distinct();
|
|
|
|
|
|
|
|
foreach (var path in uniqueFolderPaths)
|
|
{
|
|
if (path.IsNullOrEmpty()) continue;
|
|
|
|
if (path.Contains(Path.DirectorySeparatorChar))
|
|
{
|
|
var paths = path.Split(Path.DirectorySeparatorChar);
|
|
|
|
for (var i = 0; i < paths.Length; i++)
|
|
{
|
|
var p = paths[i];
|
|
|
|
if (folder.FolderName.Equals(p))
|
|
{
|
|
if (folder.ChangesInFolder.Any()) continue;
|
|
|
|
folder.ChangesInFolder =
|
|
allChanges.Where(x => Path.GetDirectoryName(x.Path)!.Equals(p, StringComparison.OrdinalIgnoreCase));
|
|
}
|
|
else
|
|
{
|
|
var pathList = paths[0..(i+1)].ToList();
|
|
var subFolder = folder.RecursiveGet(pathList);
|
|
var fullPath = string.Join(Path.DirectorySeparatorChar, pathList);
|
|
|
|
if (!subFolder.ChangesInFolder.Any())
|
|
{
|
|
subFolder.ChangesInFolder = allChanges.Where(x =>
|
|
Path.GetDirectoryName(x.Path)!.Equals(fullPath, StringComparison.OrdinalIgnoreCase));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
folder.FolderName = path;
|
|
folder.ChangesInFolder =
|
|
allChanges.Where(x => Path.GetDirectoryName(x.Path)!.Equals(path, StringComparison.OrdinalIgnoreCase));
|
|
}
|
|
}
|
|
}
|
|
|
|
return folder;
|
|
}
|
|
}
|
|
} |