enhance: navigate to upstream head after fetch, pull, and merge (#1180)

This commit is contained in:
Gadfly 2025-04-14 10:42:34 +08:00 committed by GitHub
parent 245de9b458
commit 17cf402c78
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 60 additions and 12 deletions

View file

@ -40,7 +40,7 @@ namespace SourceGit.Commands
foreach (var b in branches)
{
if (b.IsLocal && !string.IsNullOrEmpty(b.Upstream))
b.IsUpsteamGone = !remoteBranches.Contains(b.Upstream);
b.IsUpstreamGone = !remoteBranches.Contains(b.Upstream);
}
return branches;
@ -86,7 +86,7 @@ namespace SourceGit.Commands
branch.Head = parts[1];
branch.IsCurrent = parts[2] == "*";
branch.Upstream = parts[3];
branch.IsUpsteamGone = false;
branch.IsUpstreamGone = false;
if (branch.IsLocal && !string.IsNullOrEmpty(parts[4]) && !parts[4].Equals("=", StringComparison.Ordinal))
branch.TrackStatus = new QueryTrackStatus(WorkingDirectory, branch.Name, branch.Upstream).Result();

View file

@ -34,7 +34,7 @@ namespace SourceGit.Models
public string Upstream { get; set; }
public BranchTrackStatus TrackStatus { get; set; }
public string Remote { get; set; }
public bool IsUpsteamGone { get; set; }
public bool IsUpstreamGone { get; set; }
public string FriendlyName => IsLocal ? Name : $"{Remote}/{Name}";
}

View file

@ -44,7 +44,7 @@ namespace SourceGit.ViewModels
public bool ShowUpstreamGoneTip
{
get => Backend is Models.Branch { IsUpsteamGone: true };
get => Backend is Models.Branch { IsUpstreamGone: true };
}
public string Tooltip

View file

@ -32,7 +32,11 @@ namespace SourceGit.ViewModels
return Task.Run(() =>
{
new Commands.UpdateRef(_repo.FullPath, Local.FullName, To.FullName, SetProgressDescription).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));
CallUIThread(() =>
{
_repo.NavigateToCommit(To.Head);
_repo.SetWatcherEnabled(true);
});
return true;
});
}

View file

@ -34,14 +34,14 @@ namespace SourceGit.ViewModels
set => _repo.Settings.EnableForceOnFetch = value;
}
public Fetch(Repository repo, Models.Remote preferedRemote = null)
public Fetch(Repository repo, Models.Remote preferredRemote = null)
{
_repo = repo;
_fetchAllRemotes = preferedRemote == null;
_fetchAllRemotes = preferredRemote == null;
if (preferedRemote != null)
if (preferredRemote != null)
{
SelectedRemote = preferedRemote;
SelectedRemote = preferredRemote;
}
else if (!string.IsNullOrEmpty(_repo.Settings.DefaultRemote))
{
@ -83,6 +83,7 @@ namespace SourceGit.ViewModels
CallUIThread(() =>
{
_repo.SetNeedNavigateToUpstreamHead();
_repo.MarkFetched();
_repo.SetWatcherEnabled(true);
});

View file

@ -32,7 +32,11 @@ namespace SourceGit.ViewModels
return Task.Run(() =>
{
new Commands.Fetch(_repo.FullPath, Local, Upstream, SetProgressDescription).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));
CallUIThread(() =>
{
_repo.SetNeedNavigateToUpstreamHead();
_repo.SetWatcherEnabled(true);
});
return true;
});
}

View file

@ -62,7 +62,22 @@ namespace SourceGit.ViewModels
return Task.Run(() =>
{
new Commands.Merge(_repo.FullPath, _sourceName, Mode.Arg, SetProgressDescription).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));
CallUIThread(() =>
{
switch (Source)
{
case Models.Branch branch:
_repo.NavigateToCommit(branch.Head);
break;
case Models.Commit commit:
_repo.NavigateToCommit(commit.SHA);
break;
case Models.Tag tag:
_repo.NavigateToCommit(tag.SHA);
break;
}
_repo.SetWatcherEnabled(true);
});
return true;
});
}

View file

@ -192,7 +192,11 @@ namespace SourceGit.ViewModels
rs = new Commands.Stash(_repo.FullPath).Pop("stash@{0}");
}
CallUIThread(() => _repo.SetWatcherEnabled(true));
CallUIThread(() =>
{
_repo.SetNeedNavigateToUpstreamHead();
_repo.SetWatcherEnabled(true);
});
return rs;
});
}

View file

@ -717,6 +717,11 @@ namespace SourceGit.ViewModels
_watcher?.SetEnabled(enabled);
}
public void SetNeedNavigateToUpstreamHead()
{
_needNavigateToUpstreamHead = true;
}
public void MarkBranchesDirtyManually()
{
if (_watcher == null)
@ -773,6 +778,15 @@ namespace SourceGit.ViewModels
NavigateToCommit(_currentBranch.Head);
}
public void NavigateToCurrentUpstreamHead()
{
if (_currentBranch == null || string.IsNullOrEmpty(_currentBranch.Upstream))
return;
var branch = _branches.Find(x => x.FullName == _currentBranch.Upstream);
if (branch != null)
NavigateToCommit(branch.Head);
}
public void ClearHistoriesFilter()
{
_settings.HistoriesFilters.Clear();
@ -991,6 +1005,11 @@ namespace SourceGit.ViewModels
_histories.IsLoading = false;
_histories.Commits = commits;
_histories.Graph = graph;
if (_needNavigateToUpstreamHead)
{
NavigateToCurrentUpstreamHead();
_needNavigateToUpstreamHead = false;
}
}
});
}
@ -2588,5 +2607,6 @@ namespace SourceGit.ViewModels
private bool _isAutoFetching = false;
private Timer _autoFetchTimer = null;
private DateTime _lastFetchTime = DateTime.MinValue;
private bool _needNavigateToUpstreamHead = false;
}
}