Merge branch 'hotfix/v8.22.1'

This commit is contained in:
leo 2024-07-22 16:08:44 +08:00
commit 41dfbb3754
No known key found for this signature in database
16 changed files with 68 additions and 74 deletions

View file

@ -1 +1 @@
8.22
8.22.1

View file

@ -520,7 +520,7 @@ namespace SourceGit
desktop.MainWindow = new Views.Launcher() { DataContext = _launcher };
var pref = ViewModels.Preference.Instance;
if (pref.ShouldCheck4UpdateOnStartup)
if (pref.ShouldCheck4UpdateOnStartup())
{
pref.Save();
Check4Update();

View file

@ -58,7 +58,7 @@ namespace SourceGit.Commands
// If an SSH private key was provided, sets the environment.
if (!string.IsNullOrEmpty(SSHKey))
start.Environment.Add("GIT_SSH_COMMAND", $"ssh -i '{SSHKey}'");
start.Environment.Add("GIT_SSH_COMMAND", $"ssh -o StrictHostKeyChecking=accept-new -i '{SSHKey}'");
else
start.Arguments += "-c credential.helper=manager ";

View file

@ -73,7 +73,7 @@ namespace SourceGit.Commands
branch.IsCurrent = parts[2] == "*";
branch.Upstream = parts[3];
if (branch.IsLocal && !parts[4].Equals("=", StringComparison.Ordinal))
if (branch.IsLocal && !string.IsNullOrEmpty(parts[4]) && !parts[4].Equals("=", StringComparison.Ordinal))
_needQueryTrackStatus.Add(branch);
else
branch.TrackStatus = new Models.BranchTrackStatus();

View file

@ -130,7 +130,7 @@ namespace SourceGit.ViewModels
CallUIThread(() =>
{
var normalizedPath = path.Replace("\\", "/");
var node = Preference.FindOrAddNodeByRepositoryPath(normalizedPath, null, true);
var node = Preference.Instance.FindOrAddNodeByRepositoryPath(normalizedPath, null, true);
_launcher.OpenRepositoryInTab(node, _page);
});

View file

@ -21,7 +21,7 @@ namespace SourceGit.ViewModels
public override Task<bool> Sure()
{
Preference.AddNode(new RepositoryNode()
Preference.Instance.AddNode(new RepositoryNode()
{
Id = Guid.NewGuid().ToString(),
Name = _name,

View file

@ -18,7 +18,7 @@ namespace SourceGit.ViewModels
public override Task<bool> Sure()
{
Preference.RemoveNode(_node);
Preference.Instance.RemoveNode(_node);
return null;
}

View file

@ -48,7 +48,7 @@ namespace SourceGit.ViewModels
_node.Bookmark = _bookmark;
if (needSort)
Preference.SortByRenamedNode(_node);
Preference.Instance.SortByRenamedNode(_node);
return null;
}

View file

@ -31,7 +31,7 @@ namespace SourceGit.ViewModels
CallUIThread(() =>
{
var normalizedPath = _targetPath.Replace("\\", "/");
Preference.FindOrAddNodeByRepositoryPath(normalizedPath, _parentNode, true);
Preference.Instance.FindOrAddNodeByRepositoryPath(normalizedPath, _parentNode, true);
});
return true;

View file

@ -1,11 +1,9 @@
using System;
using System.IO;
using Avalonia;
using Avalonia.Collections;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Media;
using CommunityToolkit.Mvvm.ComponentModel;
@ -34,6 +32,7 @@ namespace SourceGit.ViewModels
Pages = new AvaloniaList<LauncherPage>();
AddNewTab();
var pref = Preference.Instance;
if (!string.IsNullOrEmpty(startupRepo))
{
var root = new Commands.QueryRepositoryRootPath(startupRepo).Result();
@ -48,14 +47,14 @@ namespace SourceGit.ViewModels
}
var normalized = root.Replace("\\", "/");
var node = Preference.FindOrAddNodeByRepositoryPath(normalized, null, false);
var node = pref.FindOrAddNodeByRepositoryPath(normalized, null, false);
OpenRepositoryInTab(node, null);
}
else if (Preference.Instance.RestoreTabs)
else if (pref.RestoreTabs)
{
foreach (var id in Preference.Instance.OpenedTabs)
foreach (var id in pref.OpenedTabs)
{
var node = Preference.FindNode(id);
var node = pref.FindNode(id);
if (node == null)
{
node = new RepositoryNode()
@ -70,7 +69,7 @@ namespace SourceGit.ViewModels
OpenRepositoryInTab(node, null);
}
var lastActiveIdx = Preference.Instance.LastActiveTabIdx;
var lastActiveIdx = pref.LastActiveTabIdx;
if (lastActiveIdx >= 0 && lastActiveIdx < Pages.Count)
ActivePage = Pages[lastActiveIdx];
}

View file

@ -43,7 +43,7 @@ namespace SourceGit.ViewModels
if (_instance.MonospaceFont == null)
_instance.MonospaceFont = new FontFamily("fonts:SourceGit#JetBrains Mono");
if (!_instance.IsGitConfigured)
if (!_instance.IsGitConfigured())
_instance.GitInstallPath = Native.OS.FindGitExecutable();
return _instance;
@ -213,12 +213,6 @@ namespace SourceGit.ViewModels
set => SetProperty(ref _commitChangeViewMode, value);
}
[JsonIgnore]
public bool IsGitConfigured
{
get => !string.IsNullOrEmpty(GitInstallPath) && File.Exists(GitInstallPath);
}
public string GitInstallPath
{
get => Native.OS.GitExecutable;
@ -326,28 +320,30 @@ namespace SourceGit.ViewModels
set;
} = 0;
[JsonIgnore]
public bool ShouldCheck4UpdateOnStartup
public bool IsGitConfigured()
{
get
{
if (!_check4UpdatesOnStartup)
return false;
var lastCheck = DateTime.UnixEpoch.AddSeconds(LastCheckUpdateTime).ToLocalTime();
var now = DateTime.Now;
if (lastCheck.Year == now.Year && lastCheck.Month == now.Month && lastCheck.Day == now.Day)
return false;
LastCheckUpdateTime = now.Subtract(DateTime.UnixEpoch.ToLocalTime()).TotalSeconds;
return true;
}
var path = GitInstallPath;
return !string.IsNullOrEmpty(path) && File.Exists(path);
}
public static void AddNode(RepositoryNode node, RepositoryNode to = null)
public bool ShouldCheck4UpdateOnStartup()
{
var collection = to == null ? _instance._repositoryNodes : to.SubNodes;
if (!_check4UpdatesOnStartup)
return false;
var lastCheck = DateTime.UnixEpoch.AddSeconds(LastCheckUpdateTime).ToLocalTime();
var now = DateTime.Now;
if (lastCheck.Year == now.Year && lastCheck.Month == now.Month && lastCheck.Day == now.Day)
return false;
LastCheckUpdateTime = now.Subtract(DateTime.UnixEpoch.ToLocalTime()).TotalSeconds;
return true;
}
public void AddNode(RepositoryNode node, RepositoryNode to = null)
{
var collection = to == null ? _repositoryNodes : to.SubNodes;
var list = new List<RepositoryNode>();
list.AddRange(collection);
list.Add(node);
@ -364,14 +360,14 @@ namespace SourceGit.ViewModels
collection.Add(one);
}
public static RepositoryNode FindNode(string id)
public RepositoryNode FindNode(string id)
{
return FindNodeRecursive(id, _instance.RepositoryNodes);
return FindNodeRecursive(id, RepositoryNodes);
}
public static RepositoryNode FindOrAddNodeByRepositoryPath(string repo, RepositoryNode parent, bool shouldMoveNode)
public RepositoryNode FindOrAddNodeByRepositoryPath(string repo, RepositoryNode parent, bool shouldMoveNode)
{
var node = FindNodeRecursive(repo, _instance.RepositoryNodes);
var node = FindNodeRecursive(repo, RepositoryNodes);
if (node == null)
{
node = new RepositoryNode()
@ -392,9 +388,9 @@ namespace SourceGit.ViewModels
return node;
}
public static void MoveNode(RepositoryNode node, RepositoryNode to = null)
public void MoveNode(RepositoryNode node, RepositoryNode to = null)
{
if (to == null && _instance._repositoryNodes.Contains(node))
if (to == null && _repositoryNodes.Contains(node))
return;
if (to != null && to.SubNodes.Contains(node))
return;
@ -403,14 +399,14 @@ namespace SourceGit.ViewModels
AddNode(node, to);
}
public static void RemoveNode(RepositoryNode node)
public void RemoveNode(RepositoryNode node)
{
RemoveNodeRecursive(node, _instance._repositoryNodes);
RemoveNodeRecursive(node, _repositoryNodes);
}
public static void SortByRenamedNode(RepositoryNode node)
public void SortByRenamedNode(RepositoryNode node)
{
var container = FindNodeContainer(node, _instance._repositoryNodes);
var container = FindNodeContainer(node, _repositoryNodes);
if (container == null)
return;
@ -435,7 +431,7 @@ namespace SourceGit.ViewModels
File.WriteAllText(_savePath, data);
}
private static RepositoryNode FindNodeRecursive(string id, AvaloniaList<RepositoryNode> collection)
private RepositoryNode FindNodeRecursive(string id, AvaloniaList<RepositoryNode> collection)
{
foreach (var node in collection)
{
@ -450,7 +446,7 @@ namespace SourceGit.ViewModels
return null;
}
private static AvaloniaList<RepositoryNode> FindNodeContainer(RepositoryNode node, AvaloniaList<RepositoryNode> collection)
private AvaloniaList<RepositoryNode> FindNodeContainer(RepositoryNode node, AvaloniaList<RepositoryNode> collection)
{
foreach (var sub in collection)
{
@ -465,7 +461,7 @@ namespace SourceGit.ViewModels
return null;
}
private static bool RemoveNodeRecursive(RepositoryNode node, AvaloniaList<RepositoryNode> collection)
private bool RemoveNodeRecursive(RepositoryNode node, AvaloniaList<RepositoryNode> collection)
{
if (collection.Contains(node))
{

View file

@ -965,7 +965,7 @@ namespace SourceGit.ViewModels
var root = Path.GetFullPath(Path.Combine(_fullpath, submodule));
var normalizedPath = root.Replace("\\", "/");
var node = Preference.FindNode(normalizedPath);
var node = Preference.Instance.FindNode(normalizedPath);
if (node == null)
{
node = new RepositoryNode()
@ -996,7 +996,7 @@ namespace SourceGit.ViewModels
public void OpenWorktree(Models.Worktree worktree)
{
var node = Preference.FindNode(worktree.FullPath);
var node = Preference.Instance.FindNode(worktree.FullPath);
if (node == null)
{
node = new RepositoryNode()

View file

@ -1,4 +1,5 @@
using System;
using Avalonia;
using Avalonia.Collections;
using Avalonia.Controls;
@ -23,13 +24,13 @@ namespace SourceGit.ViewModels
set
{
if (SetProperty(ref _searchFilter, value))
Referesh();
Refresh();
}
}
public void InitRepository(string path, RepositoryNode parent)
{
if (!Preference.Instance.IsGitConfigured)
if (!Preference.Instance.IsGitConfigured())
{
App.RaiseException(PopupHost.Active.GetId(), App.Text("NotConfigured"));
return;
@ -43,7 +44,7 @@ namespace SourceGit.ViewModels
public void Clone()
{
if (!Preference.Instance.IsGitConfigured)
if (!Preference.Instance.IsGitConfigured())
{
App.RaiseException(string.Empty, App.Text("NotConfigured"));
return;
@ -58,7 +59,7 @@ namespace SourceGit.ViewModels
public void OpenTerminal()
{
if (!Preference.Instance.IsGitConfigured)
if (!Preference.Instance.IsGitConfigured())
{
App.RaiseException(PopupHost.Active.GetId(), App.Text("NotConfigured"));
}
@ -81,7 +82,7 @@ namespace SourceGit.ViewModels
public void MoveNode(RepositoryNode from, RepositoryNode to)
{
Preference.MoveNode(from, to);
Preference.Instance.MoveNode(from, to);
}
public ContextMenu CreateContextMenu(RepositoryNode node)
@ -166,7 +167,7 @@ namespace SourceGit.ViewModels
return menu;
}
private void Referesh()
private void Refresh()
{
if (string.IsNullOrWhiteSpace(_searchFilter))
{

View file

@ -139,7 +139,7 @@ namespace SourceGit.Views
});
var ver = string.Empty;
if (pref.IsGitConfigured)
if (pref.IsGitConfigured())
{
var config = new Commands.Config(null).ListAll();

View file

@ -37,9 +37,9 @@ namespace SourceGit.Views
private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs e)
{
if (sender is Grid grid && DataContext is ViewModels.Welcome vm)
if (sender is Grid grid)
{
var menu = vm.CreateContextMenu(grid.DataContext as ViewModels.RepositoryNode);
var menu = ViewModels.Welcome.Instance.CreateContextMenu(grid.DataContext as ViewModels.RepositoryNode);
grid.OpenContextMenu(menu);
e.Handled = true;
}
@ -109,9 +109,7 @@ namespace SourceGit.Views
if (e.Data.Get("MovedRepositoryTreeNode") is ViewModels.RepositoryNode moved)
{
e.Handled = true;
if (DataContext is ViewModels.Welcome vm)
vm.MoveNode(moved, null);
ViewModels.Welcome.Instance.MoveNode(moved, null);
}
else if (e.Data.Contains(DataFormats.Files))
{
@ -173,8 +171,8 @@ namespace SourceGit.Views
{
e.Handled = true;
if (to != moved && DataContext is ViewModels.Welcome vm)
vm.MoveNode(moved, to);
if (to != moved)
ViewModels.Welcome.Instance.MoveNode(moved, to);
}
else if (e.Data.Contains(DataFormats.Files))
{
@ -222,12 +220,12 @@ namespace SourceGit.Views
var root = new Commands.QueryRepositoryRootPath(path).Result();
if (string.IsNullOrEmpty(root))
{
(DataContext as ViewModels.Welcome)?.InitRepository(path, parent);
ViewModels.Welcome.Instance.InitRepository(path, parent);
return;
}
var normalizedPath = root.Replace("\\", "/");
var node = ViewModels.Preference.FindOrAddNodeByRepositoryPath(normalizedPath, parent, true);
var node = ViewModels.Preference.Instance.FindOrAddNodeByRepositoryPath(normalizedPath, parent, true);
var launcher = this.FindAncestorOfType<Launcher>()?.DataContext as ViewModels.Launcher;
launcher?.OpenRepositoryInTab(node, launcher.ActivePage);
}

View file

@ -44,12 +44,12 @@ namespace SourceGit.Views
var root = new Commands.QueryRepositoryRootPath(path).Result();
if (string.IsNullOrEmpty(root))
{
(DataContext as ViewModels.Welcome)?.InitRepository(path, parent);
ViewModels.Welcome.Instance.InitRepository(path, parent);
return;
}
var normalizedPath = root.Replace("\\", "/");
var node = ViewModels.Preference.FindOrAddNodeByRepositoryPath(normalizedPath, parent, true);
var node = ViewModels.Preference.Instance.FindOrAddNodeByRepositoryPath(normalizedPath, parent, true);
var launcher = this.FindAncestorOfType<Launcher>()?.DataContext as ViewModels.Launcher;
launcher?.OpenRepositoryInTab(node, launcher.ActivePage);
}