using System; using System.Collections.Generic; using System.Text; using Avalonia.Collections; namespace SourceGit.Models { public class RepositorySettings { public string DefaultRemote { get; set; } = string.Empty; public bool EnableReflog { get; set; } = false; public bool EnableFirstParentInHistories { get; set; } = false; public bool EnableTopoOrderInHistories { get; set; } = false; public bool OnlyHighlighCurrentBranchInHistories { get; set; } = false; public TagSortMode TagSortMode { get; set; } = TagSortMode.CreatorDate; public bool IncludeUntrackedInLocalChanges { get; set; } = true; public bool EnableForceOnFetch { get; set; } = false; public bool FetchWithoutTags { get; set; } = false; public bool PreferRebaseInsteadOfMerge { get; set; } = true; public bool FetchWithoutTagsOnPull { get; set; } = false; public bool FetchAllBranchesOnPull { get; set; } = true; public bool CheckSubmodulesOnPush { get; set; } = true; public bool PushAllTags { get; set; } = false; public bool PushToRemoteWhenCreateTag { get; set; } = true; public bool PushToRemoteWhenDeleteTag { get; set; } = false; public bool CheckoutBranchOnCreateBranch { get; set; } = true; public AvaloniaList HistoriesFilters { get; set; } = []; public AvaloniaList CommitTemplates { get; set; } = []; public AvaloniaList CommitMessages { get; set; } = []; public AvaloniaList IssueTrackerRules { get; set; } = []; public AvaloniaList CustomActions { get; set; } = []; public bool EnableAutoFetch { get; set; } = false; public int AutoFetchInterval { get; set; } = 10; public bool EnableSignOffForCommit { get; set; } = false; public bool IncludeUntrackedWhenStash { get; set; } = true; public bool OnlyStagedWhenStash { get; set; } = false; public bool KeepIndexWhenStash { get; set; } = false; public bool AutoRestoreAfterStash { get; set; } = false; public string PreferedOpenAIService { get; set; } = "---"; public bool IsLocalBranchesExpandedInSideBar { get; set; } = true; public bool IsRemotesExpandedInSideBar { get; set; } = false; public bool IsTagsExpandedInSideBar { get; set; } = false; public bool IsSubmodulesExpandedInSideBar { get; set; } = false; public bool IsWorktreeExpandedInSideBar { get; set; } = false; public List ExpandedBranchNodesInSideBar { get; set; } = []; public int PreferredMergeMode { get; set; } = 0; public Dictionary CollectHistoriesFilters() { var map = new Dictionary(); foreach (var filter in HistoriesFilters) map.Add(filter.Pattern, filter.Mode); return map; } public bool UpdateHistoriesFilter(string pattern, FilterType type, FilterMode mode) { // Clear all filters when there's a filter that has different mode. if (mode != FilterMode.None) { var clear = false; foreach (var filter in HistoriesFilters) { if (filter.Mode != mode) { clear = true; break; } } if (clear) { HistoriesFilters.Clear(); HistoriesFilters.Add(new Filter(pattern, type, mode)); return true; } } else { for (int i = 0; i < HistoriesFilters.Count; i++) { var filter = HistoriesFilters[i]; if (filter.Type == type && filter.Pattern.Equals(pattern, StringComparison.Ordinal)) { HistoriesFilters.RemoveAt(i); return true; } } return false; } for (int i = 0; i < HistoriesFilters.Count; i++) { var filter = HistoriesFilters[i]; if (filter.Type != type) continue; if (filter.Pattern.Equals(pattern, StringComparison.Ordinal)) return false; } HistoriesFilters.Add(new Filter(pattern, type, mode)); return true; } public void RemoveChildrenBranchFilters(string pattern) { var dirty = new List(); var prefix = $"{pattern}/"; foreach (var filter in HistoriesFilters) { if (filter.Type == FilterType.Tag) continue; if (filter.Pattern.StartsWith(prefix, StringComparison.Ordinal)) dirty.Add(filter); } foreach (var filter in dirty) HistoriesFilters.Remove(filter); } public string BuildHistoriesFilter() { var includedRefs = new List(); var excludedBranches = new List(); var excludedRemotes = new List(); var excludedTags = new List(); foreach (var filter in HistoriesFilters) { if (filter.Type == FilterType.LocalBranch) { if (filter.Mode == FilterMode.Included) includedRefs.Add(filter.Pattern); else if (filter.Mode == FilterMode.Excluded) excludedBranches.Add($"--exclude=\"{filter.Pattern.Substring(11)}\" --decorate-refs-exclude=\"{filter.Pattern}\""); } else if (filter.Type == FilterType.LocalBranchFolder) { if (filter.Mode == FilterMode.Included) includedRefs.Add($"--branches={filter.Pattern.Substring(11)}/*"); else if (filter.Mode == FilterMode.Excluded) excludedBranches.Add($"--exclude=\"{filter.Pattern.Substring(11)}/*\" --decorate-refs-exclude=\"{filter.Pattern}/*\""); } else if (filter.Type == FilterType.RemoteBranch) { if (filter.Mode == FilterMode.Included) includedRefs.Add(filter.Pattern); else if (filter.Mode == FilterMode.Excluded) excludedRemotes.Add($"--exclude=\"{filter.Pattern.Substring(13)}\" --decorate-refs-exclude=\"{filter.Pattern}\""); } else if (filter.Type == FilterType.RemoteBranchFolder) { if (filter.Mode == FilterMode.Included) includedRefs.Add($"--remotes={filter.Pattern.Substring(13)}/*"); else if (filter.Mode == FilterMode.Excluded) excludedRemotes.Add($"--exclude=\"{filter.Pattern.Substring(13)}/*\" --decorate-refs-exclude=\"{filter.Pattern}/*\""); } else if (filter.Type == FilterType.Tag) { if (filter.Mode == FilterMode.Included) includedRefs.Add($"refs/tags/{filter.Pattern}"); else if (filter.Mode == FilterMode.Excluded) excludedTags.Add($"--exclude=\"{filter.Pattern}\" --decorate-refs-exclude=\"refs/tags/{filter.Pattern}\""); } } var builder = new StringBuilder(); if (includedRefs.Count > 0) { foreach (var r in includedRefs) { builder.Append(r); builder.Append(' '); } } else if (excludedBranches.Count + excludedRemotes.Count + excludedTags.Count > 0) { foreach (var b in excludedBranches) { builder.Append(b); builder.Append(' '); } builder.Append("--exclude=HEA[D] --branches "); foreach (var r in excludedRemotes) { builder.Append(r); builder.Append(' '); } builder.Append("--exclude=origin/HEA[D] --remotes "); foreach (var t in excludedTags) { builder.Append(t); builder.Append(' '); } builder.Append("--tags "); } return builder.ToString(); } public void PushCommitMessage(string message) { var existIdx = CommitMessages.IndexOf(message); if (existIdx == 0) return; if (existIdx > 0) { CommitMessages.Move(existIdx, 0); return; } if (CommitMessages.Count > 9) CommitMessages.RemoveRange(9, CommitMessages.Count - 9); CommitMessages.Insert(0, message); } public IssueTrackerRule AddIssueTracker(string name, string regex, string url) { var rule = new IssueTrackerRule() { Name = name, RegexString = regex, URLTemplate = url, }; IssueTrackerRules.Add(rule); return rule; } public void RemoveIssueTracker(IssueTrackerRule rule) { if (rule != null) IssueTrackerRules.Remove(rule); } public CustomAction AddNewCustomAction() { var act = new CustomAction() { Name = "Unnamed Action" }; CustomActions.Add(act); return act; } public void RemoveCustomAction(CustomAction act) { if (act != null) CustomActions.Remove(act); } } }