namespace GitMerge
{
using UnityEngine;
using UnityEditor;
using System.Diagnostics;
using System.ComponentModel;
using System.IO;
///
/// This abstract class represents a vcs interface.
/// It manages saving and retrieving the exe path from/to the EditorPrefs
/// and offers a small set of actions using the vcs.
///
public abstract class VCS
{
protected abstract string GetDefaultPath();
protected abstract string EditorPrefsKey();
public abstract void CheckoutOurs(string path);
public abstract void CheckoutTheirs(string path);
public abstract void MarkAsMerged(string path);
public string GetExePath()
{
if (EditorPrefs.HasKey(EditorPrefsKey()))
{
return EditorPrefs.GetString(EditorPrefsKey());
}
return GetDefaultPath();
}
public void SetPath(string path)
{
EditorPrefs.SetString(EditorPrefsKey(), path);
}
///
/// Executes the VCS as a subprocess.
///
/// The parameters passed. Like "status" for "git status".
/// Whatever the call returns.
protected string Execute(string args, string workingDirectoryPath)
{
var process = new Process();
var startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = GetExePath();
startInfo.Arguments = args;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
startInfo.WorkingDirectory = workingDirectoryPath;
process.StartInfo = startInfo;
try
{
process.Start();
}
catch (Win32Exception)
{
throw new VCSException();
}
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return output;
}
private static string GetAboluteFolderPath(string relativeFilePath)
{
var projectPath = Application.dataPath;
projectPath = Directory.GetParent(projectPath).FullName;
var fullPath = Path.Combine(projectPath, relativeFilePath);
return Path.GetDirectoryName(fullPath);
}
protected static void GetAbsoluteFolderPathAndFilename(string relativeFilePath, out string absoluteFolderPath, out string filename)
{
absoluteFolderPath = GetAboluteFolderPath(relativeFilePath);
filename = Path.GetFileName(relativeFilePath);
}
}
}