using System; using System.Collections.Generic; using JetBrains.Annotations; using UnityModule.Settings; namespace UnityModule.Command.VCS { [PublicAPI] public class ObservableGit : Git> { } [PublicAPI] public class Git : Git { } [PublicAPI] public abstract class Git where TResult : class { private enum SubCommandType { Add, Branch, Checkout, Commit, Push, RevParse, Rm, Status, } private static readonly Dictionary SubCommandMap = new Dictionary() { {SubCommandType.Add, "add"}, {SubCommandType.Branch, "branch"}, {SubCommandType.Checkout, "checkout"}, {SubCommandType.Commit, "commit"}, {SubCommandType.Push, "push"}, {SubCommandType.RevParse, "rev-parse"}, {SubCommandType.Rm, "rm"}, {SubCommandType.Status, "status"}, }; public static TResult Add(IEnumerable files = null, List argumentList = null, double timeout = Runner.DefaultTimeoutSeconds) { argumentList = new SafeList(argumentList) { files == null ? "." : $"-- {files.Combine()}", }; return Run(SubCommandType.Add, argumentList, timeout); } public static TResult Branch(string branchName, bool force = false, List argumentList = null, double timeout = Runner.DefaultTimeoutSeconds) { argumentList = new SafeList(argumentList); if (force) { argumentList.Add("-f"); } argumentList.Add(branchName); return Run(SubCommandType.Branch, argumentList, timeout); } public static TResult Checkout(string branchName, bool create = false, bool force = false, List argumentList = null, double timeout = Runner.DefaultTimeoutSeconds) { argumentList = new SafeList(argumentList); if (create) { argumentList.Add("-b"); } argumentList.Add(branchName); return Run(SubCommandType.Checkout, argumentList, timeout); } public static TResult Commit(string message, List argumentList = null, double timeout = Runner.DefaultTimeoutSeconds) { // コマンド経由の場合何らかのメッセージを入れないとコミットできない argumentList = new SafeList(argumentList) { $"-m {message.Quot()}", }; return Run(SubCommandType.Commit, argumentList, timeout); } public static TResult Push(string branchName, string remoteName = "origin", List argumentList = null, double timeout = Runner.DefaultTimeoutSeconds) { argumentList = new SafeList(argumentList) { remoteName, branchName, }; return Run(SubCommandType.Push, argumentList, timeout); } public static TResult RevParse(List argumentList = null, double timeout = Runner.DefaultTimeoutSeconds) { argumentList = new SafeList(argumentList); return Run(SubCommandType.RevParse, argumentList, timeout); } public static TResult Rm(IEnumerable files, bool ignoreUnmatch = true, List argumentList = null, double timeout = Runner.DefaultTimeoutSeconds) { argumentList = new SafeList(argumentList); if (ignoreUnmatch) { argumentList.Add("--ignore-unmatch"); } argumentList.Add($"-- {files.Combine()}"); return Run(SubCommandType.Rm, argumentList, timeout); } public static TResult Status(bool useShortFormat = true, List argumentList = null, double timeout = Runner.DefaultTimeoutSeconds) { argumentList = new SafeList(argumentList); if (useShortFormat) { argumentList.Add("--short"); } return Run(SubCommandType.Status, argumentList, timeout); } public static TResult GetCurrentBranchName(double timeout = Runner.DefaultTimeoutSeconds) { return RevParse( new List() { "--abbrev-ref", "HEAD", }, timeout ); } public static TResult GetCurrentCommitHash(double timeout = Runner.DefaultTimeoutSeconds) { return RevParse( new List() { "HEAD", }, timeout ); } private static TResult Run(SubCommandType subCommandType, List argumentMap = null, double timeout = Runner.DefaultTimeoutSeconds) { return Runner.Run(GitSetting.GetOrDefault().CommandGit, SubCommandMap[subCommandType], argumentMap, timeout); } } }