Skip to content

Commit 054d5e4

Browse files
committed
feature: warn when creating commit on a detached HEAD (#1462)
Signed-off-by: leo <[email protected]>
1 parent 271f02b commit 054d5e4

File tree

4 files changed

+25
-9
lines changed

4 files changed

+25
-9
lines changed

src/Resources/Locales/en_US.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,7 @@
793793
<x:String x:Key="Text.WorkingCopy.CommitTip" xml:space="preserve">Trigger click event</x:String>
794794
<x:String x:Key="Text.WorkingCopy.CommitToEdit" xml:space="preserve">Commit (Edit)</x:String>
795795
<x:String x:Key="Text.WorkingCopy.CommitWithAutoStage" xml:space="preserve">Stage all changes and commit</x:String>
796+
<x:String x:Key="Text.WorkingCopy.ConfirmCommitWithDetachedHead">You are creating commit on a detached HEAD. Do you want to continue?</x:String>
796797
<x:String x:Key="Text.WorkingCopy.ConfirmCommitWithFilter">You have staged {0} file(s) but only {1} file(s) displayed ({2} files are filtered out). Do you want to continue?</x:String>
797798
<x:String x:Key="Text.WorkingCopy.Conflicts" xml:space="preserve">CONFLICTS DETECTED</x:String>
798799
<x:String x:Key="Text.WorkingCopy.Conflicts.OpenExternalMergeTool" xml:space="preserve">OPEN EXTERNAL MERGETOOL</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,7 @@
797797
<x:String x:Key="Text.WorkingCopy.CommitTip" xml:space="preserve">触发点击事件</x:String>
798798
<x:String x:Key="Text.WorkingCopy.CommitToEdit" xml:space="preserve">提交(修改原始提交)</x:String>
799799
<x:String x:Key="Text.WorkingCopy.CommitWithAutoStage" xml:space="preserve">自动暂存所有变更并提交</x:String>
800+
<x:String x:Key="Text.WorkingCopy.ConfirmCommitWithDetachedHead">您正在向一个游离的 HEAD 提交变更,是否继续提交?</x:String>
800801
<x:String x:Key="Text.WorkingCopy.ConfirmCommitWithFilter" xml:space="preserve">当前有 {0} 个文件在暂存区中,但仅显示了 {1} 个文件({2} 个文件被过滤掉了),是否继续提交?</x:String>
801802
<x:String x:Key="Text.WorkingCopy.Conflicts" xml:space="preserve">检测到冲突</x:String>
802803
<x:String x:Key="Text.WorkingCopy.Conflicts.OpenExternalMergeTool" 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
@@ -797,6 +797,7 @@
797797
<x:String x:Key="Text.WorkingCopy.CommitTip" xml:space="preserve">觸發點擊事件</x:String>
798798
<x:String x:Key="Text.WorkingCopy.CommitToEdit" xml:space="preserve">提交 (修改原始提交)</x:String>
799799
<x:String x:Key="Text.WorkingCopy.CommitWithAutoStage" xml:space="preserve">自動暫存全部變更並提交</x:String>
800+
<x:String x:Key="Text.WorkingCopy.ConfirmCommitWithDetachedHead">您正在向一个分離狀態的 HEAD 提交變更,您確定要繼續提交嗎?</x:String>
800801
<x:String x:Key="Text.WorkingCopy.ConfirmCommitWithFilter" xml:space="preserve">您已暫存 {0} 個檔案,但只顯示 {1} 個檔案 ({2} 個檔案被篩選器隱藏)。您確定要繼續提交嗎?</x:String>
801802
<x:String x:Key="Text.WorkingCopy.Conflicts" xml:space="preserve">偵測到衝突</x:String>
802803
<x:String x:Key="Text.WorkingCopy.Conflicts.OpenExternalMergeTool" xml:space="preserve">使用外部合併工具開啟</x:String>

src/ViewModels/WorkingCopy.cs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,6 @@ public void SetData(List<Models.Change> changes)
261261
}
262262

263263
_cached = changes;
264-
_count = _cached.Count;
265264

266265
var lastSelectedUnstaged = new HashSet<string>();
267266
var lastSelectedStaged = new HashSet<string>();
@@ -1782,7 +1781,7 @@ private void SetDetail(Models.Change change, bool isUnstaged)
17821781
DetailContext = new DiffContext(_repo.FullPath, new Models.DiffOption(change, isUnstaged), _detailContext as DiffContext);
17831782
}
17841783

1785-
private void DoCommit(bool autoStage, bool autoPush, bool allowEmpty = false, bool confirmWithFilter = false)
1784+
private void DoCommit(bool autoStage, bool autoPush, CommitCheckPassed checkPassed = CommitCheckPassed.None)
17861785
{
17871786
if (string.IsNullOrWhiteSpace(_commitMessage))
17881787
return;
@@ -1793,18 +1792,25 @@ private void DoCommit(bool autoStage, bool autoPush, bool allowEmpty = false, bo
17931792
return;
17941793
}
17951794

1796-
if (!string.IsNullOrEmpty(_filter) && _staged.Count > _visibleStaged.Count && !confirmWithFilter)
1795+
if (_repo.CurrentBranch is { IsDetachedHead: true } && checkPassed < CommitCheckPassed.DetachedHead)
17971796
{
1798-
var confirmMessage = App.Text("WorkingCopy.ConfirmCommitWithFilter", _staged.Count, _visibleStaged.Count, _staged.Count - _visibleStaged.Count);
1799-
App.ShowWindow(new ConfirmCommit(confirmMessage, () => DoCommit(autoStage, autoPush, allowEmpty, true)), true);
1797+
var msg = App.Text("WorkingCopy.ConfirmCommitWithDetachedHead");
1798+
App.ShowWindow(new ConfirmCommit(msg, () => DoCommit(autoStage, autoPush, CommitCheckPassed.DetachedHead)), true);
18001799
return;
18011800
}
18021801

1803-
if (!_useAmend && !allowEmpty)
1802+
if (!string.IsNullOrEmpty(_filter) && _staged.Count > _visibleStaged.Count && checkPassed < CommitCheckPassed.Filter)
18041803
{
1805-
if ((autoStage && _count == 0) || (!autoStage && _staged.Count == 0))
1804+
var msg = App.Text("WorkingCopy.ConfirmCommitWithFilter", _staged.Count, _visibleStaged.Count, _staged.Count - _visibleStaged.Count);
1805+
App.ShowWindow(new ConfirmCommit(msg, () => DoCommit(autoStage, autoPush, CommitCheckPassed.Filter)), true);
1806+
return;
1807+
}
1808+
1809+
if (checkPassed < CommitCheckPassed.FileCount && !_useAmend)
1810+
{
1811+
if ((!autoStage && _staged.Count == 0) || (autoStage && _cached.Count == 0))
18061812
{
1807-
App.ShowWindow(new ConfirmEmptyCommit(_count > 0, stageAll => DoCommit(stageAll, autoPush, true, confirmWithFilter)), true);
1813+
App.ShowWindow(new ConfirmEmptyCommit(_cached.Count > 0, stageAll => DoCommit(stageAll, autoPush, CommitCheckPassed.FileCount)), true);
18081814
return;
18091815
}
18101816
}
@@ -1871,6 +1877,14 @@ private bool IsChanged(List<Models.Change> old, List<Models.Change> cur)
18711877
return false;
18721878
}
18731879

1880+
private enum CommitCheckPassed
1881+
{
1882+
None = 0,
1883+
DetachedHead,
1884+
Filter,
1885+
FileCount,
1886+
}
1887+
18741888
private Repository _repo = null;
18751889
private bool _isLoadingData = false;
18761890
private bool _isStaging = false;
@@ -1886,7 +1900,6 @@ private bool IsChanged(List<Models.Change> old, List<Models.Change> cur)
18861900
private List<Models.Change> _visibleStaged = [];
18871901
private List<Models.Change> _selectedUnstaged = [];
18881902
private List<Models.Change> _selectedStaged = [];
1889-
private int _count = 0;
18901903
private object _detailContext = null;
18911904
private string _filter = string.Empty;
18921905
private string _commitMessage = string.Empty;

0 commit comments

Comments
 (0)