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(); } } }