using Microsoft.Win32;
using System;
using System.IO;
using System.Windows;
namespace SourceGit {
///
/// Application.
///
public partial class App : Application {
///
/// Getter/Setter for Git preference.
///
public static Git.Preference Preference {
get { return Git.Preference.Instance; }
set { Git.Preference.Instance = value; }
}
///
/// Check if GIT has been configured.
///
public static bool IsGitConfigured {
get {
return !string.IsNullOrEmpty(Preference.GitExecutable)
&& File.Exists(Preference.GitExecutable);
}
}
///
/// Interactive rebase sequence file.
///
public static string InteractiveRebaseScript {
get;
private set;
}
///
/// TODO file for interactive rebase.
///
public static string InteractiveRebaseTodo {
get;
private set;
}
///
/// Error handler.
///
public static Action OnError {
get;
set;
}
///
/// Raise error message.
///
///
public static void RaiseError(string message) {
OnError?.Invoke(message);
}
///
/// Startup event.
///
///
///
private void OnAppStartup(object sender, StartupEventArgs e) {
// Try auto configure git via registry.
if (!IsGitConfigured) {
var root = RegistryKey.OpenBaseKey(
RegistryHive.LocalMachine,
Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32);
var git = root.OpenSubKey("SOFTWARE\\GitForWindows");
if (git != null) {
Preference.GitExecutable = Path.Combine(
git.GetValue("InstallPath") as string,
"bin",
"git.exe");
}
}
// Files for interactive rebase.
InteractiveRebaseScript = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"SourceGit",
"rebase.bat");
InteractiveRebaseTodo = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"SourceGit",
"REBASE_TODO");
if (!File.Exists(InteractiveRebaseScript)) {
var folder = Path.GetDirectoryName(InteractiveRebaseScript);
if (!Directory.Exists(folder)) Directory.CreateDirectory(folder);
File.WriteAllText(InteractiveRebaseScript, $"@echo off\ntype \"{InteractiveRebaseTodo}\" > .git\\rebase-merge\\git-rebase-todo");
File.WriteAllText(InteractiveRebaseTodo, "");
}
// Apply themes
if (Preference.UIUseLightTheme) {
foreach (var rs in Current.Resources.MergedDictionaries) {
if (rs.Source != null && rs.Source.OriginalString.StartsWith("pack://application:,,,/Resources/Themes/")) {
rs.Source = new Uri("pack://application:,,,/Resources/Themes/Light.xaml", UriKind.Absolute);
break;
}
}
}
// Show main window
var launcher = new UI.Launcher();
launcher.Show();
}
///
/// Deactivated event.
///
///
///
private void OnAppDeactivated(object sender, EventArgs e) {
GC.Collect();
}
///
/// Quit event.
///
///
///
private void OnAppExit(object sender, ExitEventArgs e) {
Git.Preference.Save();
}
}
}