Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,19 @@ Fork releases of SourceGit-SK. Upstream changes arrive through upstream release

## [Unreleased]

### Added

- The stacked multi-file diff now covers every change view: commit details (History), compare, revision compare, submodule compare, and stashes all show the whole change set as one scrollable diff when no file is selected, stack a multi-selection, and show a single file when one is selected ([#8](https://github.com/skoonin/sourcegit-sk/pull/8))
- "Open Another Repository..." entry at the bottom of the repository switcher (Ctrl/Cmd+P) opens a folder picker to open a repo not yet in the list ([#8](https://github.com/skoonin/sourcegit-sk/pull/8))

### Changed

- Local-changes diff view is now selection-driven: selecting a single file shows just that file, selecting several stacks those files, and the continuous stacked view of all changes appears when nothing is selected. The continuous-diff toggle has been removed.

### Fixed

- Clicking blank space below a file list clears the selection (returning the diff panel to the whole-changeset view) ([#8](https://github.com/skoonin/sourcegit-sk/pull/8))

## [2026.15-sk] - 2026-07-11

First fork release, based on upstream [v2026.14](https://github.com/sourcegit-scm/sourcegit/releases/tag/v2026.14).
Expand Down
45 changes: 30 additions & 15 deletions TRANSLATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ This document shows the translation status of each locale file in the repository

### ![en_US](https://img.shields.io/badge/en__US-%E2%88%9A-brightgreen)

### ![de__DE](https://img.shields.io/badge/de__DE-89.28%25-yellow)
### ![de__DE](https://img.shields.io/badge/de__DE-89.19%25-yellow)

<details>
<summary>Missing keys in de_DE.axaml</summary>
Expand Down Expand Up @@ -88,6 +88,7 @@ This document shows the translation status of each locale file in the repository
- Text.Init.CommandTip
- Text.Init.ErrorMessageTip
- Text.InteractiveRebase.NoVerify
- Text.Launcher.OpenOtherRepository
- Text.Merge.Test
- Text.Merge.Test.NoConflicts
- Text.Merge.Test.UnknownError
Expand Down Expand Up @@ -124,7 +125,7 @@ This document shows the translation status of each locale file in the repository

</details>

### ![el__GR](https://img.shields.io/badge/el__GR-96.30%25-yellow)
### ![el__GR](https://img.shields.io/badge/el__GR-96.20%25-yellow)

<details>
<summary>Missing keys in el_GR.axaml</summary>
Expand Down Expand Up @@ -162,6 +163,7 @@ This document shows the translation status of each locale file in the repository
- Text.GitFlow.FinishWithRebase
- Text.GitFlow.StartAt
- Text.GitFlow.StartName
- Text.Launcher.OpenOtherRepository
- Text.Repository.Commits
- Text.TagCM.Checkout
- Text.TagCM.Merge
Expand All @@ -170,7 +172,7 @@ This document shows the translation status of each locale file in the repository

</details>

### ![es__ES](https://img.shields.io/badge/es__ES-98.05%25-yellow)
### ![es__ES](https://img.shields.io/badge/es__ES-97.96%25-yellow)

<details>
<summary>Missing keys in es_ES.axaml</summary>
Expand All @@ -193,12 +195,13 @@ This document shows the translation status of each locale file in the repository
- Text.FileModeChange.Submodule
- Text.FileModeChange.Symlink
- Text.FileModeChange.Unknown
- Text.Launcher.OpenOtherRepository
- Text.Repository.Commits
- Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder

</details>

### ![fr__FR](https://img.shields.io/badge/fr__FR-95.22%25-yellow)
### ![fr__FR](https://img.shields.io/badge/fr__FR-95.13%25-yellow)

<details>
<summary>Missing keys in fr_FR.axaml</summary>
Expand Down Expand Up @@ -238,6 +241,7 @@ This document shows the translation status of each locale file in the repository
- Text.GitFlow.FinishWithRebase
- Text.GitFlow.StartAt
- Text.GitFlow.StartName
- Text.Launcher.OpenOtherRepository
- Text.Merge.Test
- Text.Merge.Test.NoConflicts
- Text.Merge.Test.UnknownError
Expand All @@ -255,7 +259,7 @@ This document shows the translation status of each locale file in the repository

</details>

### ![he__IL](https://img.shields.io/badge/he__IL-95.22%25-yellow)
### ![he__IL](https://img.shields.io/badge/he__IL-95.13%25-yellow)

<details>
<summary>Missing keys in he_IL.axaml</summary>
Expand Down Expand Up @@ -295,6 +299,7 @@ This document shows the translation status of each locale file in the repository
- Text.GitFlow.FinishWithRebase
- Text.GitFlow.StartAt
- Text.GitFlow.StartName
- Text.Launcher.OpenOtherRepository
- Text.Merge.Test
- Text.Merge.Test.NoConflicts
- Text.Merge.Test.UnknownError
Expand All @@ -312,7 +317,7 @@ This document shows the translation status of each locale file in the repository

</details>

### ![id__ID](https://img.shields.io/badge/id__ID-82.26%25-yellow)
### ![id__ID](https://img.shields.io/badge/id__ID-82.18%25-yellow)

<details>
<summary>Missing keys in id_ID.axaml</summary>
Expand Down Expand Up @@ -425,6 +430,7 @@ This document shows the translation status of each locale file in the repository
- Text.Init.ErrorMessageTip
- Text.InteractiveRebase.NoVerify
- Text.Launcher.Commands
- Text.Launcher.OpenOtherRepository
- Text.Launcher.OpenRepository
- Text.Merge.Test
- Text.Merge.Test.NoConflicts
Expand Down Expand Up @@ -502,7 +508,7 @@ This document shows the translation status of each locale file in the repository

</details>

### ![it__IT](https://img.shields.io/badge/it__IT-88.79%25-yellow)
### ![it__IT](https://img.shields.io/badge/it__IT-88.70%25-yellow)

<details>
<summary>Missing keys in it_IT.axaml</summary>
Expand Down Expand Up @@ -587,6 +593,7 @@ This document shows the translation status of each locale file in the repository
- Text.Init.CommandTip
- Text.Init.ErrorMessageTip
- Text.InteractiveRebase.NoVerify
- Text.Launcher.OpenOtherRepository
- Text.Merge.Test
- Text.Merge.Test.NoConflicts
- Text.Merge.Test.UnknownError
Expand Down Expand Up @@ -625,7 +632,7 @@ This document shows the translation status of each locale file in the repository

</details>

### ![ja__JP](https://img.shields.io/badge/ja__JP-99.22%25-yellow)
### ![ja__JP](https://img.shields.io/badge/ja__JP-99.12%25-yellow)

<details>
<summary>Missing keys in ja_JP.axaml</summary>
Expand All @@ -637,11 +644,12 @@ This document shows the translation status of each locale file in the repository
- Text.Diff.LastFile
- Text.Diff.NextFile
- Text.Diff.PrevFile
- Text.Launcher.OpenOtherRepository
- Text.Repository.Commits

</details>

### ![ko__KR](https://img.shields.io/badge/ko__KR-96.69%25-yellow)
### ![ko__KR](https://img.shields.io/badge/ko__KR-96.59%25-yellow)

<details>
<summary>Missing keys in ko_KR.axaml</summary>
Expand Down Expand Up @@ -675,6 +683,7 @@ This document shows the translation status of each locale file in the repository
- Text.GitFlow.FinishWithRebase
- Text.GitFlow.StartAt
- Text.GitFlow.StartName
- Text.Launcher.OpenOtherRepository
- Text.Repository.Commits
- Text.TagCM.Checkout
- Text.TagCM.Merge
Expand All @@ -683,7 +692,7 @@ This document shows the translation status of each locale file in the repository

</details>

### ![pt__BR](https://img.shields.io/badge/pt__BR-62.48%25-red)
### ![pt__BR](https://img.shields.io/badge/pt__BR-62.41%25-red)

<details>
<summary>Missing keys in pt_BR.axaml</summary>
Expand Down Expand Up @@ -889,6 +898,7 @@ This document shows the translation status of each locale file in the repository
- Text.InteractiveRebase.NoVerify
- Text.InteractiveRebase.ReorderTip
- Text.Launcher.Commands
- Text.Launcher.OpenOtherRepository
- Text.Launcher.OpenRepository
- Text.Launcher.Pages
- Text.Launcher.Workspaces
Expand Down Expand Up @@ -1076,7 +1086,7 @@ This document shows the translation status of each locale file in the repository

</details>

### ![ru__RU](https://img.shields.io/badge/ru__RU-98.05%25-yellow)
### ![ru__RU](https://img.shields.io/badge/ru__RU-97.96%25-yellow)

<details>
<summary>Missing keys in ru_RU.axaml</summary>
Expand All @@ -1099,12 +1109,13 @@ This document shows the translation status of each locale file in the repository
- Text.FileModeChange.Submodule
- Text.FileModeChange.Symlink
- Text.FileModeChange.Unknown
- Text.Launcher.OpenOtherRepository
- Text.Repository.Commits
- Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder

</details>

### ![ta__IN](https://img.shields.io/badge/ta__IN-64.33%25-red)
### ![ta__IN](https://img.shields.io/badge/ta__IN-64.26%25-red)

<details>
<summary>Missing keys in ta_IN.axaml</summary>
Expand Down Expand Up @@ -1319,6 +1330,7 @@ This document shows the translation status of each locale file in the repository
- Text.InteractiveRebase.NoVerify
- Text.InteractiveRebase.ReorderTip
- Text.Launcher.Commands
- Text.Launcher.OpenOtherRepository
- Text.Launcher.OpenRepository
- Text.Launcher.Pages
- Text.Launcher.Workspaces
Expand Down Expand Up @@ -1478,7 +1490,7 @@ This document shows the translation status of each locale file in the repository

</details>

### ![uk__UA](https://img.shields.io/badge/uk__UA-65.11%25-red)
### ![uk__UA](https://img.shields.io/badge/uk__UA-65.04%25-red)

<details>
<summary>Missing keys in uk_UA.axaml</summary>
Expand Down Expand Up @@ -1689,6 +1701,7 @@ This document shows the translation status of each locale file in the repository
- Text.InteractiveRebase.NoVerify
- Text.InteractiveRebase.ReorderTip
- Text.Launcher.Commands
- Text.Launcher.OpenOtherRepository
- Text.Launcher.OpenRepository
- Text.Launcher.Pages
- Text.Launcher.Workspaces
Expand Down Expand Up @@ -1844,7 +1857,7 @@ This document shows the translation status of each locale file in the repository

</details>

### ![zh__CN](https://img.shields.io/badge/zh__CN-99.12%25-yellow)
### ![zh__CN](https://img.shields.io/badge/zh__CN-99.03%25-yellow)

<details>
<summary>Missing keys in zh_CN.axaml</summary>
Expand All @@ -1857,11 +1870,12 @@ This document shows the translation status of each locale file in the repository
- Text.Diff.LastFile
- Text.Diff.NextFile
- Text.Diff.PrevFile
- Text.Launcher.OpenOtherRepository
- Text.Repository.Commits

</details>

### ![zh__TW](https://img.shields.io/badge/zh__TW-99.12%25-yellow)
### ![zh__TW](https://img.shields.io/badge/zh__TW-99.03%25-yellow)

<details>
<summary>Missing keys in zh_TW.axaml</summary>
Expand All @@ -1874,6 +1888,7 @@ This document shows the translation status of each locale file in the repository
- Text.Diff.LastFile
- Text.Diff.NextFile
- Text.Diff.PrevFile
- Text.Launcher.OpenOtherRepository
- Text.Repository.Commits

</details>
6 changes: 4 additions & 2 deletions build/scripts/package.linux.sh
Original file line number Diff line number Diff line change
Expand Up @@ -82,5 +82,7 @@ sed -i -e "s/^Version:.*/Version: $VERSION/" \
# Build deb package with gzip compression
dpkg-deb -Zgzip --root-owner-group --build resources/deb "sourcegit_$VERSION-1_$arch.deb"

rpmbuild -bb --target="$target" resources/rpm/SPECS/build.spec --define "_topdir $(pwd)/resources/rpm" --define "_version $VERSION"
mv "resources/rpm/RPMS/$target/sourcegit-$VERSION-1.$target.rpm" ./
# RPM forbids '-' in Version (reserved for the Release separator); the fork's -sk/-sk-dev suffix must use dots.
rpm_version=${VERSION//-/.}
rpmbuild -bb --target="$target" resources/rpm/SPECS/build.spec --define "_topdir $(pwd)/resources/rpm" --define "_version $rpm_version"
mv "resources/rpm/RPMS/$target/sourcegit-$rpm_version-1.$target.rpm" ./
1 change: 1 addition & 0 deletions src/Resources/Locales/en_US.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -587,6 +587,7 @@
<x:String x:Key="Text.Launcher.Commands" xml:space="preserve">Commands</x:String>
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">ERROR</x:String>
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">NOTICE</x:String>
<x:String x:Key="Text.Launcher.OpenOtherRepository" xml:space="preserve">Open Another Repository...</x:String>
<x:String x:Key="Text.Launcher.OpenRepository" xml:space="preserve">Open Repositories</x:String>
<x:String x:Key="Text.Launcher.Pages" xml:space="preserve">Tabs</x:String>
<x:String x:Key="Text.Launcher.Workspaces" xml:space="preserve">Workspaces</x:String>
Expand Down
64 changes: 47 additions & 17 deletions src/ViewModels/CommitDetail.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ public int ActiveTabIndex
{
_sharedData.ActiveTabIndex = value;

if (value == 1 && DiffContext == null && _selectedChanges is { Count: 1 })
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_commit, _selectedChanges[0]));
if (value == 1 && DetailContext == null)
UpdateDetail();
}
}
}
Expand Down Expand Up @@ -102,19 +102,14 @@ public List<Models.Change> SelectedChanges
set
{
if (SetProperty(ref _selectedChanges, value))
{
if (ActiveTabIndex != 1 || value is not { Count: 1 })
DiffContext = null;
else
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_commit, value[0]), _diffContext);
}
UpdateDetail();
}
}

public DiffContext DiffContext
public object DetailContext
{
get => _diffContext;
private set => SetProperty(ref _diffContext, value);
get => _detailContext;
private set => SetProperty(ref _detailContext, value);
}

public string SearchChangeFilter
Expand Down Expand Up @@ -479,7 +474,7 @@ private void Refresh()
{
Changes = [];
VisibleChanges = [];
SelectedChanges = null;
ResetSelection();
return;
}

Expand Down Expand Up @@ -551,10 +546,8 @@ private void Refresh()
Changes = changes;
VisibleChanges = visible;

if (visible.Count == 0)
SelectedChanges = null;
else
SelectedChanges = [VisibleChanges[0]];
// No auto-selected file: an empty selection shows the whole commit as a stacked diff.
ResetSelection();
});
}
}, token);
Expand Down Expand Up @@ -628,6 +621,42 @@ private void RefreshVisibleChanges()

VisibleChanges = visible;
}

// The whole-set stack tracks the filtered list, but rebuilding it per keystroke would spawn
// a git diff per visible file; coalesce until typing pauses.
if (_selectedChanges is not { Count: > 0 })
{
_filterDebounce ??= new Debouncer(TimeSpan.FromMilliseconds(300), () =>
{
if (_selectedChanges is not { Count: > 0 })
UpdateDetail();
});
_filterDebounce.Trigger();
}
}

private void ResetSelection()
{
// Setting null on an already-null selection raises no change event, so force the rebuild
// that keys the detail to the new commit.
var hadSelection = _selectedChanges is { Count: > 0 };
SelectedChanges = null;
if (!hadSelection)
UpdateDetail();
}

// Detail is lazy until the Changes tab (index 1) is visible.
private void UpdateDetail()
{
if (ActiveTabIndex != 1 || _commit == null)
DetailContext = null;
else
DetailContext = MultipleDiffContext.BuildDetail(_repo.FullPath, MakeDiffOption, _selectedChanges, _visibleChanges, _detailContext);
}

private Models.DiffOption MakeDiffOption(Models.Change change)
{
return new Models.DiffOption(_commit, change);
}

private void RefreshRevisionSearchSuggestion()
Expand Down Expand Up @@ -768,7 +797,8 @@ private async Task SetViewingCommitAsync(Models.Object file)
private List<Models.Change> _visibleChanges = [];
private List<Models.Change> _selectedChanges = null;
private string _searchChangeFilter = string.Empty;
private DiffContext _diffContext = null;
private object _detailContext = null;
private Debouncer _filterDebounce = null;
private string _viewRevisionFilePath = string.Empty;
private object _viewRevisionFileContent = null;
private CancellationTokenSource _cancellationSource = null;
Expand Down
Loading
Loading