Skip to content

Commit dafabc5

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 b3f1643 commit dafabc5

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
@@ -128,6 +128,7 @@
128128
<x:String x:Key="Text.CommitCM.CopySHA" xml:space="preserve">SHA</x:String>
129129
<x:String x:Key="Text.CommitCM.CopySubject" xml:space="preserve">Subject</x:String>
130130
<x:String x:Key="Text.CommitCM.CustomAction" xml:space="preserve">Custom Action</x:String>
131+
<x:String x:Key="Text.CommitCM.SoloCommits" xml:space="preserve">Solo on Current Commit</x:String>
131132
<x:String x:Key="Text.CommitCM.InteractiveRebase" xml:space="preserve">Interactive Rebase</x:String>
132133
<x:String x:Key="Text.CommitCM.InteractiveRebase.Drop" xml:space="preserve">Drop...</x:String>
133134
<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
@@ -1064,6 +1064,17 @@ public void SetTagFilterMode(Models.Tag tag, Models.FilterMode mode)
10641064
if (changed)
10651065
RefreshHistoriesFilters(true);
10661066
}
1067+
public void SetSoloCommitFilterMode(Models.Commit commit, Models.FilterMode mode)
1068+
{
1069+
SetSoloCommitFilterMode(commit.SHA[..10], mode);
1070+
}
1071+
1072+
public void SetSoloCommitFilterMode(string sha, Models.FilterMode mode)
1073+
{
1074+
var changed = _settings.UpdateHistoriesFilter(sha, Models.FilterType.SoloCommits, mode);
1075+
if (changed)
1076+
RefreshHistoriesFilters(true);
1077+
}
10671078

10681079
public void SetBranchFilterMode(Models.Branch branch, Models.FilterMode mode, bool clearExists, bool refresh)
10691080
{
@@ -1266,6 +1277,13 @@ public void RefreshTags()
12661277
});
12671278
}
12681279

1280+
public List<Models.Decorator> GetRefsContainsThisCommit(string hash = null)
1281+
{
1282+
var a = new Commands.QueryRefsContainsCommit(FullPath, hash ?? "HEAD")
1283+
.GetResultAsync();
1284+
return a.Result;
1285+
}
1286+
12691287
public void RefreshCommits()
12701288
{
12711289
Task.Run(async () =>
@@ -1289,7 +1307,7 @@ public void RefreshCommits()
12891307
if (_settings.HistoryShowFlags.HasFlag(Models.HistoryShowFlags.SimplifyByDecoration))
12901308
builder.Append("--simplify-by-decoration ");
12911309

1292-
var filters = _settings.BuildHistoriesFilter();
1310+
var filters = _settings.BuildHistoriesFilter(this);
12931311
if (string.IsNullOrEmpty(filters))
12941312
builder.Append("--branches --remotes --tags HEAD");
12951313
else

src/Views/Histories.axaml.cs

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

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

0 commit comments

Comments
 (0)