Skip to content

Commit 1848746

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 a4611ae commit 1848746

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
@@ -1071,6 +1071,17 @@ public void SetTagFilterMode(Models.Tag tag, Models.FilterMode mode)
10711071
if (changed)
10721072
RefreshHistoriesFilters(true);
10731073
}
1074+
public void SetSoloCommitFilterMode(Models.Commit commit, Models.FilterMode mode)
1075+
{
1076+
SetSoloCommitFilterMode(commit.SHA[..10], mode);
1077+
}
1078+
1079+
public void SetSoloCommitFilterMode(string sha, Models.FilterMode mode)
1080+
{
1081+
var changed = _settings.UpdateHistoriesFilter(sha, Models.FilterType.SoloCommits, mode);
1082+
if (changed)
1083+
RefreshHistoriesFilters(true);
1084+
}
10741085

10751086
public void SetBranchFilterMode(Models.Branch branch, Models.FilterMode mode, bool clearExists, bool refresh)
10761087
{
@@ -1273,6 +1284,13 @@ public void RefreshTags()
12731284
});
12741285
}
12751286

1287+
public List<Models.Decorator> GetRefsContainsThisCommit(string hash = null)
1288+
{
1289+
var a = new Commands.QueryRefsContainsCommit(FullPath, hash ?? "HEAD")
1290+
.GetResultAsync();
1291+
return a.Result;
1292+
}
1293+
12761294
public void RefreshCommits()
12771295
{
12781296
Task.Run(async () =>
@@ -1296,7 +1314,7 @@ public void RefreshCommits()
12961314
if (_settings.HistoryShowFlags.HasFlag(Models.HistoryShowFlags.SimplifyByDecoration))
12971315
builder.Append("--simplify-by-decoration ");
12981316

1299-
var filters = _settings.BuildHistoriesFilter();
1317+
var filters = _settings.BuildHistoriesFilter(this);
13001318
if (string.IsNullOrEmpty(filters))
13011319
builder.Append("--branches --remotes --tags HEAD");
13021320
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)