Skip to content

Commit 04371a8

Browse files
committed
feat: Add solo commits filter and enhance history filtering
- Add new filter type for solo commits to the filter options. - Enhance history filtering to support solo commits by including or excluding their associated refs. - Add new localization string for solo commits option in context menu. - Add methods to filter and query commits by solo commit mode and refs containing a specific commit. - Add a menu option to filter commits by focusing on a specific commit.
1 parent 403c8f4 commit 04371a8

File tree

5 files changed

+61
-2
lines changed

5 files changed

+61
-2
lines changed

src/Models/Filter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public enum FilterType
99
RemoteBranch,
1010
RemoteBranchFolder,
1111
Tag,
12+
SoloCommits,
1213
}
1314

1415
public enum FilterMode

src/Models/RepositorySettings.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ public void RemoveChildrenBranchFilters(string pattern)
306306
HistoriesFilters.Remove(filter);
307307
}
308308

309-
public string BuildHistoriesFilter()
309+
public string BuildHistoriesFilter(SourceGit.ViewModels.Repository repo)
310310
{
311311
var includedRefs = new List<string>();
312312
var excludedBranches = new List<string>();
@@ -349,6 +349,34 @@ public string BuildHistoriesFilter()
349349
else if (filter.Mode == FilterMode.Excluded)
350350
excludedTags.Add($"--exclude=\"{filter.Pattern}\" --decorate-refs-exclude=\"refs/tags/{filter.Pattern}\"");
351351
}
352+
else if (filter.Type == FilterType.SoloCommits)
353+
{
354+
var allRefs = repo.GetRefsContainsThisCommit(filter.Pattern);
355+
if (filter.Mode == FilterMode.Included)
356+
{
357+
foreach (var refItem in allRefs)
358+
{
359+
if (refItem.Type == Models.DecoratorType.LocalBranchHead)
360+
includedRefs.Add($"{refItem.Name}");
361+
else if (refItem.Type == Models.DecoratorType.RemoteBranchHead)
362+
includedRefs.Add($"{refItem.Name}");
363+
else if (refItem.Type == Models.DecoratorType.Tag)
364+
includedRefs.Add($"refs/tags/{refItem.Name}");
365+
}
366+
}
367+
else if (filter.Mode == FilterMode.Excluded)
368+
{
369+
foreach (var refItem in allRefs)
370+
{
371+
if (refItem.Type == Models.DecoratorType.LocalBranchHead)
372+
excludedBranches.Add($"--exclude=\"{refItem.Name}\" --decorate-refs-exclude=\"refs/heads/{refItem.Name}\"");
373+
else if (refItem.Type == Models.DecoratorType.RemoteBranchHead)
374+
excludedRemotes.Add($"--exclude=\"{refItem.Name}\" --decorate-refs-exclude=\"refs/remotes/{refItem.Name}\"");
375+
else if (refItem.Type == Models.DecoratorType.Tag)
376+
excludedTags.Add($"--exclude=\"refs/tags/{refItem.Name}\" --decorate-refs-exclude=\"refs/tags/{refItem.Name}\"");
377+
}
378+
}
379+
}
352380
}
353381

354382
var builder = new StringBuilder();

src/Resources/Locales/en_US.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@
126126
<x:String x:Key="Text.CommitCM.CopySHA" xml:space="preserve">SHA</x:String>
127127
<x:String x:Key="Text.CommitCM.CopySubject" xml:space="preserve">Subject</x:String>
128128
<x:String x:Key="Text.CommitCM.CustomAction" xml:space="preserve">Custom Action</x:String>
129+
<x:String x:Key="Text.CommitCM.SoloCommits" xml:space="preserve">Solo on Current Commit</x:String>
129130
<x:String x:Key="Text.CommitCM.InteractiveRebase" xml:space="preserve">Interactive Rebase</x:String>
130131
<x:String x:Key="Text.CommitCM.InteractiveRebase.Drop" xml:space="preserve">Drop...</x:String>
131132
<x:String x:Key="Text.CommitCM.InteractiveRebase.Edit" xml:space="preserve">Edit...</x:String>

src/ViewModels/Repository.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1062,6 +1062,17 @@ public void SetTagFilterMode(Models.Tag tag, Models.FilterMode mode)
10621062
if (changed)
10631063
RefreshHistoriesFilters(true);
10641064
}
1065+
public void SetSoloCommitFilterMode(Models.Commit commit, Models.FilterMode mode)
1066+
{
1067+
SetSoloCommitFilterMode(commit.SHA[..10], mode);
1068+
}
1069+
1070+
public void SetSoloCommitFilterMode(string sha, Models.FilterMode mode)
1071+
{
1072+
var changed = _settings.UpdateHistoriesFilter(sha, Models.FilterType.SoloCommits, mode);
1073+
if (changed)
1074+
RefreshHistoriesFilters(true);
1075+
}
10651076

10661077
public void SetBranchFilterMode(Models.Branch branch, Models.FilterMode mode, bool clearExists, bool refresh)
10671078
{
@@ -1257,6 +1268,13 @@ public void RefreshTags()
12571268
});
12581269
}
12591270

1271+
public List<Models.Decorator> GetRefsContainsThisCommit(string hash = null)
1272+
{
1273+
var a = new Commands.QueryRefsContainsCommit(FullPath, hash ?? "HEAD")
1274+
.GetResultAsync();
1275+
return a.Result;
1276+
}
1277+
12601278
public void RefreshCommits()
12611279
{
12621280
Dispatcher.UIThread.Invoke(() => _histories.IsLoading = true);
@@ -1278,7 +1296,7 @@ public void RefreshCommits()
12781296
if (_settings.HistoryShowFlags.HasFlag(Models.HistoryShowFlags.SimplifyByDecoration))
12791297
builder.Append("--simplify-by-decoration ");
12801298

1281-
var filters = _settings.BuildHistoriesFilter();
1299+
var filters = _settings.BuildHistoriesFilter(this);
12821300
if (string.IsNullOrEmpty(filters))
12831301
builder.Append("--branches --remotes --tags HEAD");
12841302
else

src/Views/Histories.axaml.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,17 @@ private ContextMenu CreateContextMenuForSingleCommit(ViewModels.Repository repo,
824824
menu.Items.Add(new MenuItem() { Header = "-" });
825825
}
826826

827+
var SoloCommits = new MenuItem();
828+
SoloCommits.Header = App.Text("CommitCM.SoloCommits");
829+
SoloCommits.Icon = App.CreateMenuIcon("Icons.LightOn");
830+
SoloCommits.Click += (_, e) =>
831+
{
832+
repo.SetSoloCommitFilterMode(commit, Models.FilterMode.Included);
833+
e.Handled = true;
834+
};
835+
836+
menu.Items.Add(SoloCommits);
837+
827838
var copySHA = new MenuItem();
828839
copySHA.Header = App.Text("CommitCM.CopySHA");
829840
copySHA.Icon = App.CreateMenuIcon("Icons.Hash");

0 commit comments

Comments
 (0)