Skip to content

Commit 6729d4e

Browse files
committed
feature: supports to ignore new files in folder from context menu of selected folder node in change tree (#1432)
Signed-off-by: leo <[email protected]>
1 parent f9f44ae commit 6729d4e

File tree

5 files changed

+97
-34
lines changed

5 files changed

+97
-34
lines changed

src/Resources/Locales/en_US.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,7 @@
764764
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore" xml:space="preserve">Git Ignore</x:String>
765765
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.Extension" xml:space="preserve">Ignore all *{0} files</x:String>
766766
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.ExtensionInSameFolder" xml:space="preserve">Ignore *{0} files in the same folder</x:String>
767+
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InFolder" xml:space="preserve">Ignore files in this folder</x:String>
767768
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InSameFolder" xml:space="preserve">Ignore files in the same folder</x:String>
768769
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.SingleFile" xml:space="preserve">Ignore this file only</x:String>
769770
<x:String x:Key="Text.WorkingCopy.Amend" xml:space="preserve">Amend</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,7 @@
768768
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore" xml:space="preserve">添加至 .gitignore 忽略列表</x:String>
769769
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.Extension" xml:space="preserve">忽略所有 *{0} 文件</x:String>
770770
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.ExtensionInSameFolder" xml:space="preserve">忽略同目录下所有 *{0} 文件</x:String>
771+
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InFolder" xml:space="preserve">忽略该目录下的新文件</x:String>
771772
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InSameFolder" xml:space="preserve">忽略同目录下所有文件</x:String>
772773
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.SingleFile" xml:space="preserve">忽略本文件</x:String>
773774
<x:String x:Key="Text.WorkingCopy.Amend" xml:space="preserve">修补</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,7 @@
768768
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore" xml:space="preserve">加入至 .gitignore 忽略清單</x:String>
769769
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.Extension" xml:space="preserve">忽略所有 *{0} 檔案</x:String>
770770
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.ExtensionInSameFolder" xml:space="preserve">忽略同路徑下所有 *{0} 檔案</x:String>
771+
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InFolder" xml:space="preserve">忽略本路徑下的新增檔案</x:String>
771772
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InSameFolder" xml:space="preserve">忽略同路徑下所有檔案</x:String>
772773
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.SingleFile" xml:space="preserve">忽略本檔案</x:String>
773774
<x:String x:Key="Text.WorkingCopy.Amend" xml:space="preserve">修補</x:String>

src/ViewModels/WorkingCopy.cs

Lines changed: 87 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,7 @@ public void CommitWithPush()
581581
DoCommit(false, true);
582582
}
583583

584-
public ContextMenu CreateContextMenuForUnstagedChanges()
584+
public ContextMenu CreateContextMenuForUnstagedChanges(string selectedSingleFolder)
585585
{
586586
if (_selectedUnstaged == null || _selectedUnstaged.Count == 0)
587587
return null;
@@ -761,52 +761,87 @@ public ContextMenu CreateContextMenuForUnstagedChanges()
761761
var hasExtra = false;
762762
if (change.WorkTree == Models.ChangeState.Untracked)
763763
{
764-
var isRooted = change.Path.IndexOf('/', StringComparison.Ordinal) <= 0;
765764
var addToIgnore = new MenuItem();
766765
addToIgnore.Header = App.Text("WorkingCopy.AddToGitIgnore");
767766
addToIgnore.Icon = App.CreateMenuIcon("Icons.GitIgnore");
768767

769-
var singleFile = new MenuItem();
770-
singleFile.Header = App.Text("WorkingCopy.AddToGitIgnore.SingleFile");
771-
singleFile.Click += (_, e) =>
768+
if (!string.IsNullOrEmpty(selectedSingleFolder))
772769
{
773-
Commands.GitIgnore.Add(_repo.FullPath, change.Path);
774-
e.Handled = true;
775-
};
776-
addToIgnore.Items.Add(singleFile);
777-
778-
var byParentFolder = new MenuItem();
779-
byParentFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.InSameFolder");
780-
byParentFolder.IsVisible = !isRooted;
781-
byParentFolder.Click += (_, e) =>
782-
{
783-
var dir = Path.GetDirectoryName(change.Path)!.Replace('\\', '/').TrimEnd('/');
784-
Commands.GitIgnore.Add(_repo.FullPath, dir + "/");
785-
e.Handled = true;
786-
};
787-
addToIgnore.Items.Add(byParentFolder);
788-
789-
if (!string.IsNullOrEmpty(extension))
770+
var ignoreFolder = new MenuItem();
771+
ignoreFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.InFolder");
772+
ignoreFolder.Click += (_, e) =>
773+
{
774+
Commands.GitIgnore.Add(_repo.FullPath, $"{selectedSingleFolder}/");
775+
e.Handled = true;
776+
};
777+
addToIgnore.Items.Add(ignoreFolder);
778+
}
779+
else
790780
{
791-
var byExtension = new MenuItem();
792-
byExtension.Header = App.Text("WorkingCopy.AddToGitIgnore.Extension", extension);
793-
byExtension.Click += (_, e) =>
781+
var isRooted = change.Path.IndexOf('/', StringComparison.Ordinal) <= 0;
782+
var singleFile = new MenuItem();
783+
singleFile.Header = App.Text("WorkingCopy.AddToGitIgnore.SingleFile");
784+
singleFile.Click += (_, e) =>
794785
{
795-
Commands.GitIgnore.Add(_repo.FullPath, $"*{extension}");
786+
Commands.GitIgnore.Add(_repo.FullPath, change.Path);
796787
e.Handled = true;
797788
};
798-
addToIgnore.Items.Add(byExtension);
789+
addToIgnore.Items.Add(singleFile);
799790

800-
var byExtensionInSameFolder = new MenuItem();
801-
byExtensionInSameFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.ExtensionInSameFolder", extension);
802-
byExtensionInSameFolder.IsVisible = !isRooted;
803-
byExtensionInSameFolder.Click += (_, e) =>
791+
var byParentFolder = new MenuItem();
792+
byParentFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.InSameFolder");
793+
byParentFolder.IsVisible = !isRooted;
794+
byParentFolder.Click += (_, e) =>
804795
{
805796
var dir = Path.GetDirectoryName(change.Path)!.Replace('\\', '/').TrimEnd('/');
806-
Commands.GitIgnore.Add(_repo.FullPath, $"{dir}/*{extension}");
797+
Commands.GitIgnore.Add(_repo.FullPath, dir + "/");
807798
e.Handled = true;
808799
};
809-
addToIgnore.Items.Add(byExtensionInSameFolder);
800+
addToIgnore.Items.Add(byParentFolder);
801+
802+
if (!string.IsNullOrEmpty(extension))
803+
{
804+
var byExtension = new MenuItem();
805+
byExtension.Header = App.Text("WorkingCopy.AddToGitIgnore.Extension", extension);
806+
byExtension.Click += (_, e) =>
807+
{
808+
Commands.GitIgnore.Add(_repo.FullPath, $"*{extension}");
809+
e.Handled = true;
810+
};
811+
addToIgnore.Items.Add(byExtension);
812+
813+
var byExtensionInSameFolder = new MenuItem();
814+
byExtensionInSameFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.ExtensionInSameFolder", extension);
815+
byExtensionInSameFolder.IsVisible = !isRooted;
816+
byExtensionInSameFolder.Click += (_, e) =>
817+
{
818+
var dir = Path.GetDirectoryName(change.Path)!.Replace('\\', '/').TrimEnd('/');
819+
Commands.GitIgnore.Add(_repo.FullPath, $"{dir}/*{extension}");
820+
e.Handled = true;
821+
};
822+
addToIgnore.Items.Add(byExtensionInSameFolder);
823+
}
824+
}
825+
826+
menu.Items.Add(addToIgnore);
827+
hasExtra = true;
828+
}
829+
else if (!string.IsNullOrEmpty(selectedSingleFolder))
830+
{
831+
var addToIgnore = new MenuItem();
832+
addToIgnore.Header = App.Text("WorkingCopy.AddToGitIgnore");
833+
addToIgnore.Icon = App.CreateMenuIcon("Icons.GitIgnore");
834+
835+
if (!string.IsNullOrEmpty(selectedSingleFolder))
836+
{
837+
var ignoreFolder = new MenuItem();
838+
ignoreFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.InFolder");
839+
ignoreFolder.Click += (_, e) =>
840+
{
841+
Commands.GitIgnore.Add(_repo.FullPath, $"{selectedSingleFolder}/");
842+
e.Handled = true;
843+
};
844+
addToIgnore.Items.Add(ignoreFolder);
810845
}
811846

812847
menu.Items.Add(addToIgnore);
@@ -1086,6 +1121,25 @@ public ContextMenu CreateContextMenuForUnstagedChanges()
10861121
menu.Items.Add(discard);
10871122
menu.Items.Add(stash);
10881123
menu.Items.Add(patch);
1124+
1125+
if (!string.IsNullOrEmpty(selectedSingleFolder))
1126+
{
1127+
var ignoreFolder = new MenuItem();
1128+
ignoreFolder.Header = App.Text("WorkingCopy.AddToGitIgnore.InFolder");
1129+
ignoreFolder.Click += (_, e) =>
1130+
{
1131+
Commands.GitIgnore.Add(_repo.FullPath, $"{selectedSingleFolder}/");
1132+
e.Handled = true;
1133+
};
1134+
1135+
var addToIgnore = new MenuItem();
1136+
addToIgnore.Header = App.Text("WorkingCopy.AddToGitIgnore");
1137+
addToIgnore.Icon = App.CreateMenuIcon("Icons.GitIgnore");
1138+
addToIgnore.Items.Add(ignoreFolder);
1139+
1140+
menu.Items.Add(new MenuItem() { Header = "-" });
1141+
menu.Items.Add(addToIgnore);
1142+
}
10891143
}
10901144

10911145
return menu;

src/Views/WorkingCopy.axaml.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Avalonia.Controls;
22
using Avalonia.Input;
33
using Avalonia.Interactivity;
4+
using Avalonia.VisualTree;
45

56
namespace SourceGit.Views
67
{
@@ -29,7 +30,12 @@ private void OnUnstagedContextRequested(object sender, ContextRequestedEventArgs
2930
{
3031
if (DataContext is ViewModels.WorkingCopy vm && sender is Control control)
3132
{
32-
var menu = vm.CreateContextMenuForUnstagedChanges();
33+
var container = control.FindDescendantOfType<ChangeCollectionContainer>();
34+
var selectedSingleFolder = string.Empty;
35+
if (container is { SelectedItems: { Count: 1 }, SelectedItem: ViewModels.ChangeTreeNode { IsFolder: true } node })
36+
selectedSingleFolder = node.FullPath;
37+
38+
var menu = vm.CreateContextMenuForUnstagedChanges(selectedSingleFolder);
3339
menu?.Open(control);
3440
e.Handled = true;
3541
}

0 commit comments

Comments
 (0)