summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex March <alexmarch@fastmail.com>2023-12-20 15:38:05 +0900
committerAlex March <alexmarch@fastmail.com>2023-12-22 16:30:20 +0900
commit3fe491fcb25a31268a1dd428d9a00bdcd027d155 (patch)
tree8850ccbfbc8310b0b9be4d6bbc5ba320bb6d033f
parent66b608b2f9857296645f964b67b821e431d7b807 (diff)
Implement a sort order menu for remote branches
-rw-r--r--docs/keybindings/Keybindings_en.md1
-rw-r--r--docs/keybindings/Keybindings_ja.md1
-rw-r--r--docs/keybindings/Keybindings_ko.md1
-rw-r--r--docs/keybindings/Keybindings_nl.md1
-rw-r--r--docs/keybindings/Keybindings_pl.md1
-rw-r--r--docs/keybindings/Keybindings_ru.md1
-rw-r--r--docs/keybindings/Keybindings_zh-CN.md1
-rw-r--r--docs/keybindings/Keybindings_zh-TW.md1
-rw-r--r--pkg/commands/git_commands/remote_loader.go24
-rw-r--r--pkg/config/app_config.go10
-rw-r--r--pkg/config/user_config.go2
-rw-r--r--pkg/gui/controllers/helpers/refs_helper.go31
-rw-r--r--pkg/gui/controllers/remote_branches_controller.go18
-rw-r--r--pkg/i18n/english.go6
-rw-r--r--pkg/i18n/japanese.go7
-rw-r--r--pkg/i18n/russian.go3
-rw-r--r--schema/config.json4
17 files changed, 100 insertions, 13 deletions
diff --git a/docs/keybindings/Keybindings_en.md b/docs/keybindings/Keybindings_en.md
index 5c7d2f1f9..e4f6fd8be 100644
--- a/docs/keybindings/Keybindings_en.md
+++ b/docs/keybindings/Keybindings_en.md
@@ -258,6 +258,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
<kbd>r</kbd>: Rebase checked-out branch onto this branch
<kbd>d</kbd>: Delete remote tag
<kbd>u</kbd>: Set as upstream of checked-out branch
+ <kbd>s</kbd>: Sort order
<kbd>g</kbd>: View reset options
<kbd>w</kbd>: View worktree options
<kbd>&lt;enter&gt;</kbd>: View commits
diff --git a/docs/keybindings/Keybindings_ja.md b/docs/keybindings/Keybindings_ja.md
index 2acbd3777..16e2d8a4d 100644
--- a/docs/keybindings/Keybindings_ja.md
+++ b/docs/keybindings/Keybindings_ja.md
@@ -323,6 +323,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
<kbd>r</kbd>: Rebase checked-out branch onto this branch
<kbd>d</kbd>: Delete remote tag
<kbd>u</kbd>: Set as upstream of checked-out branch
+ <kbd>s</kbd>: 並び替え
<kbd>g</kbd>: View reset options
<kbd>w</kbd>: View worktree options
<kbd>&lt;enter&gt;</kbd>: コミットを閲覧
diff --git a/docs/keybindings/Keybindings_ko.md b/docs/keybindings/Keybindings_ko.md
index 68e3a25ed..35dd0ebc9 100644
--- a/docs/keybindings/Keybindings_ko.md
+++ b/docs/keybindings/Keybindings_ko.md
@@ -241,6 +241,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
<kbd>r</kbd>: 체크아웃된 브랜치를 이 브랜치에 리베이스
<kbd>d</kbd>: Delete remote tag
<kbd>u</kbd>: Set as upstream of checked-out branch
+ <kbd>s</kbd>: Sort order
<kbd>g</kbd>: View reset options
<kbd>w</kbd>: View worktree options
<kbd>&lt;enter&gt;</kbd>: 커밋 보기
diff --git a/docs/keybindings/Keybindings_nl.md b/docs/keybindings/Keybindings_nl.md
index a53ad13a8..c5fe3f3b3 100644
--- a/docs/keybindings/Keybindings_nl.md
+++ b/docs/keybindings/Keybindings_nl.md
@@ -236,6 +236,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
<kbd>r</kbd>: Rebase branch
<kbd>d</kbd>: Delete remote tag
<kbd>u</kbd>: Stel in als upstream van uitgecheckte branch
+ <kbd>s</kbd>: Sort order
<kbd>g</kbd>: Bekijk reset opties
<kbd>w</kbd>: View worktree options
<kbd>&lt;enter&gt;</kbd>: Bekijk commits
diff --git a/docs/keybindings/Keybindings_pl.md b/docs/keybindings/Keybindings_pl.md
index 9ffffade5..558e3b50f 100644
--- a/docs/keybindings/Keybindings_pl.md
+++ b/docs/keybindings/Keybindings_pl.md
@@ -235,6 +235,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
<kbd>r</kbd>: Zmiana bazy gałęzi
<kbd>d</kbd>: Delete remote tag
<kbd>u</kbd>: Set as upstream of checked-out branch
+ <kbd>s</kbd>: Sort order
<kbd>g</kbd>: Wyświetl opcje resetu
<kbd>w</kbd>: View worktree options
<kbd>&lt;enter&gt;</kbd>: View commits
diff --git a/docs/keybindings/Keybindings_ru.md b/docs/keybindings/Keybindings_ru.md
index 3296c8c16..22600aea7 100644
--- a/docs/keybindings/Keybindings_ru.md
+++ b/docs/keybindings/Keybindings_ru.md
@@ -296,6 +296,7 @@ _Связки клавиш_
<kbd>r</kbd>: Перебазировать переключённую ветку на эту ветку
<kbd>d</kbd>: Delete remote tag
<kbd>u</kbd>: Установить как upstream-ветку переключённую ветку
+ <kbd>s</kbd>: Порядок сортировки
<kbd>g</kbd>: Просмотреть параметры сброса
<kbd>w</kbd>: View worktree options
<kbd>&lt;enter&gt;</kbd>: Просмотреть коммиты
diff --git a/docs/keybindings/Keybindings_zh-CN.md b/docs/keybindings/Keybindings_zh-CN.md
index 3f9d060ca..354ef952a 100644
--- a/docs/keybindings/Keybindings_zh-CN.md
+++ b/docs/keybindings/Keybindings_zh-CN.md
@@ -337,6 +337,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
<kbd>r</kbd>: 将已检出的分支变基到该分支
<kbd>d</kbd>: Delete remote tag
<kbd>u</kbd>: 设置为检出分支的上游
+ <kbd>s</kbd>: Sort order
<kbd>g</kbd>: 查看重置选项
<kbd>w</kbd>: View worktree options
<kbd>&lt;enter&gt;</kbd>: 查看提交
diff --git a/docs/keybindings/Keybindings_zh-TW.md b/docs/keybindings/Keybindings_zh-TW.md
index 78fd75687..6e3094afd 100644
--- a/docs/keybindings/Keybindings_zh-TW.md
+++ b/docs/keybindings/Keybindings_zh-TW.md
@@ -347,6 +347,7 @@ _說明:`<c-b>` 表示 Ctrl+B、`<a-b>` 表示 Alt+B,`B`表示 Shift+B_
<kbd>r</kbd>: 將已檢出的分支變基至此分支
<kbd>d</kbd>: Delete remote tag
<kbd>u</kbd>: 將此分支設為當前分支之上游
+ <kbd>s</kbd>: Sort order
<kbd>g</kbd>: 檢視重設選項
<kbd>w</kbd>: View worktree options
<kbd>&lt;enter&gt;</kbd>: 檢視提交
diff --git a/pkg/commands/git_commands/remote_loader.go b/pkg/commands/git_commands/remote_loader.go
index 6551ecb25..9d48374c5 100644
--- a/pkg/commands/git_commands/remote_loader.go
+++ b/pkg/commands/git_commands/remote_loader.go
@@ -1,6 +1,7 @@
package git_commands
import (
+ "fmt"
"strings"
"sync"
@@ -83,14 +84,23 @@ func (self *RemoteLoader) GetRemotes() ([]*models.Remote, error) {
func (self *RemoteLoader) getRemoteBranchesByRemoteName() (map[string][]*models.RemoteBranch, error) {
remoteBranchesByRemoteName := make(map[string][]*models.RemoteBranch)
- cmdArgs := NewGitCmd("branch").Arg("-r").ToArgv()
- err := self.cmd.New(cmdArgs).DontLog().RunAndProcessLines(func(line string) (bool, error) {
- // excluding lines like 'origin/HEAD -> origin/master' (there will be a separate
- // line for 'origin/master')
- if strings.Contains(line, "->") {
- return false, nil
- }
+ var sortOrder string
+ switch strings.ToLower(self.AppState.RemoteBranchSortOrder) {
+ case "alphabetical":
+ sortOrder = "refname"
+ case "date":
+ sortOrder = "-committerdate"
+ default:
+ sortOrder = "refname"
+ }
+
+ cmdArgs := NewGitCmd("for-each-ref").
+ Arg(fmt.Sprintf("--sort=%s", sortOrder)).
+ Arg("--format=%(refname:short)").
+ Arg("refs/remotes").
+ ToArgv()
+ err := self.cmd.New(cmdArgs).DontLog().RunAndProcessLines(func(line string) (bool, error) {
line = strings.TrimSpace(line)
split := strings.SplitN(line, "/", 2)
diff --git a/pkg/config/app_config.go b/pkg/config/app_config.go
index 54d41b695..927f9f309 100644
--- a/pkg/config/app_config.go
+++ b/pkg/config/app_config.go
@@ -323,14 +323,16 @@ type AppState struct {
HideCommandLog bool
IgnoreWhitespaceInDiffView bool
DiffContextSize int
+ RemoteBranchSortOrder string
}
func getDefaultAppState() *AppState {
return &AppState{
- LastUpdateCheck: 0,
- RecentRepos: []string{},
- StartupPopupVersion: 0,
- DiffContextSize: 3,
+ LastUpdateCheck: 0,
+ RecentRepos: []string{},
+ StartupPopupVersion: 0,
+ DiffContextSize: 3,
+ RemoteBranchSortOrder: "alphabetical",
}
}
diff --git a/pkg/config/user_config.go b/pkg/config/user_config.go
index 3d772e778..749b41822 100644
--- a/pkg/config/user_config.go
+++ b/pkg/config/user_config.go
@@ -389,6 +389,7 @@ type KeybindingBranchesConfig struct {
PushTag string `yaml:"pushTag"`
SetUpstream string `yaml:"setUpstream"`
FetchRemote string `yaml:"fetchRemote"`
+ SortOrder string `yaml:"sortOrder"`
}
type KeybindingWorktreesConfig struct {
@@ -781,6 +782,7 @@ func GetDefaultConfig() *UserConfig {
PushTag: "P",
SetUpstream: "u",
FetchRemote: "f",
+ SortOrder: "s",
},
Worktrees: KeybindingWorktreesConfig{
ViewWorktreeOptions: "w",
diff --git a/pkg/gui/controllers/helpers/refs_helper.go b/pkg/gui/controllers/helpers/refs_helper.go
index a6de0d39f..b4617c8a0 100644
--- a/pkg/gui/controllers/helpers/refs_helper.go
+++ b/pkg/gui/controllers/helpers/refs_helper.go
@@ -119,6 +119,37 @@ func (self *RefsHelper) ResetToRef(ref string, strength string, envVars []string
return nil
}
+func (self *RefsHelper) CreateSortOrderMenu(onSelected func(sortOrder string) error) error {
+ type sortOrderWithKey struct {
+ key types.Key
+ label string
+ sortKey string
+ sortOrder string
+ }
+ sortKeys := []sortOrderWithKey{
+ {label: self.c.Tr.SortAlphabetical, sortKey: "refname", sortOrder: "alphabetical", key: 'a'},
+ {label: self.c.Tr.SortByDate, sortKey: "-committerdate", sortOrder: "date", key: 'd'},
+ }
+
+ menuItems := lo.Map(sortKeys, func(row sortOrderWithKey, _ int) *types.MenuItem {
+ return &types.MenuItem{
+ LabelColumns: []string{
+ row.label,
+ style.FgYellow.Sprintf("--sort=%s", row.sortKey),
+ },
+ OnPress: func() error {
+ return onSelected(row.sortOrder)
+ },
+ Key: row.key,
+ }
+ })
+
+ return self.c.Menu(types.CreateMenuOptions{
+ Title: self.c.Tr.SortOrder,
+ Items: menuItems,
+ })
+}
+
func (self *RefsHelper) CreateGitResetMenu(ref string) error {
type strengthWithKey struct {
strength string
diff --git a/pkg/gui/controllers/remote_branches_controller.go b/pkg/gui/controllers/remote_branches_controller.go
index ffb55d5ca..6d2244746 100644
--- a/pkg/gui/controllers/remote_branches_controller.go
+++ b/pkg/gui/controllers/remote_branches_controller.go
@@ -59,6 +59,12 @@ func (self *RemoteBranchesController) GetKeybindings(opts types.KeybindingsOpts)
Description: self.c.Tr.SetAsUpstream,
},
{
+ Key: opts.GetKey(opts.Config.Branches.SortOrder),
+ Handler: self.createSortMenu,
+ Description: self.c.Tr.SortOrder,
+ OpensMenu: true,
+ },
+ {
Key: opts.GetKey(opts.Config.Commits.ViewResetOptions),
Handler: self.checkSelected(self.createResetMenu),
Description: self.c.Tr.ViewResetOptions,
@@ -121,6 +127,18 @@ func (self *RemoteBranchesController) rebase(selectedBranch *models.RemoteBranch
return self.c.Helpers().MergeAndRebase.RebaseOntoRef(selectedBranch.FullName())
}
+func (self *RemoteBranchesController) createSortMenu() error {
+ return self.c.Helpers().Refs.CreateSortOrderMenu(func(sortOrder string) error {
+ if self.c.GetAppState().RemoteBranchSortOrder != sortOrder {
+ self.c.GetAppState().RemoteBranchSortOrder = sortOrder
+ self.c.SaveAppStateAndLogError()
+ self.c.Contexts().RemoteBranches.SetSelectedLineIdx(0)
+ return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.REMOTES}})
+ }
+ return nil
+ })
+}
+
func (self *RemoteBranchesController) createResetMenu(selectedBranch *models.RemoteBranch) error {
return self.c.Helpers().Refs.CreateGitResetMenu(selectedBranch.FullName())
}
diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go
index 32392cee7..260976d64 100644
--- a/pkg/i18n/english.go
+++ b/pkg/i18n/english.go
@@ -555,6 +555,9 @@ type TranslationSet struct {
LogMenuTitle string
ToggleShowGitGraphAll string
ShowGitGraph string
+ SortOrder string
+ SortAlphabetical string
+ SortByDate string
SortCommits string
CantChangeContextSizeError string
OpenCommitInBrowser string
@@ -1364,6 +1367,9 @@ func EnglishTranslationSet() TranslationSet {
LogMenuTitle: "Commit Log Options",
ToggleShowGitGraphAll: "Toggle show whole git graph (pass the `--all` flag to `git log`)",
ShowGitGraph: "Show git graph",
+ SortOrder: "Sort order",
+ SortAlphabetical: "Alphabetical",
+ SortByDate: "Date",
SortCommits: "Commit sort order",
CantChangeContextSizeError: "Cannot change context while in patch building mode because we were too lazy to support it when releasing the feature. If you really want it, please let us know!",
OpenCommitInBrowser: "Open commit in browser",
diff --git a/pkg/i18n/japanese.go b/pkg/i18n/japanese.go
index 03e4ff6f4..089c95ed6 100644
--- a/pkg/i18n/japanese.go
+++ b/pkg/i18n/japanese.go
@@ -461,8 +461,11 @@ func japaneseTranslationSet() TranslationSet {
OpenLogMenu: "ログメニューを開く",
LogMenuTitle: "コミットログオプション",
// ToggleShowGitGraphAll: "Toggle show whole git graph (pass the `--all` flag to `git log`)",
- ShowGitGraph: "コミットグラフの表示",
- SortCommits: "コミットの表示順",
+ ShowGitGraph: "コミットグラフの表示",
+ SortOrder: "並び替え",
+ SortAlphabetical: "アルファベット順",
+ SortByDate: "日付順",
+ SortCommits: "コミットの表示順",
// CantChangeContextSizeError: "Cannot change context while in patch building mode because we were too lazy to support it when releasing the feature. If you really want it, please let us know!",
OpenCommitInBrowser: "ブラウザでコミットを開く",
// LcViewBisectOptions: "View bisect options",
diff --git a/pkg/i18n/russian.go b/pkg/i18n/russian.go
index 3332f72cd..e4b67a77e 100644
--- a/pkg/i18n/russian.go
+++ b/pkg/i18n/russian.go
@@ -525,6 +525,9 @@ func RussianTranslationSet() TranslationSet {
LogMenuTitle: "Параметры журнала коммитов",
ToggleShowGitGraphAll: "Переключить отображение всего git графа (передать флаг --all в git log )",
ShowGitGraph: "Показать git граф",
+ SortOrder: "Порядок сортировки",
+ SortAlphabetical: "По алфавиту",
+ SortByDate: "По дате",
SortCommits: "Упорядочить коммиты",
CantChangeContextSizeError: "Невозможно изменить контекст в режиме создания патча, потому что мы были слишком ленивы, чтобы поддерживать его при выпуске функции. Если вы действительно этого хотите, пожалуйста, дайте нам знать!",
OpenCommitInBrowser: "Открыть коммит в браузере",
diff --git a/schema/config.json b/schema/config.json
index 186ca2576..54f6d6961 100644
--- a/schema/config.json
+++ b/schema/config.json
@@ -1014,6 +1014,10 @@
"fetchRemote": {
"type": "string",
"default": "f"
+ },
+ "sortOrder": {
+ "type": "string",
+ "default": "s"
}
},
"additionalProperties": false,