diff --git a/pkg/commands/git.go b/pkg/commands/git.go index b52c989d7..eac5c0a53 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -1045,9 +1045,14 @@ func (c *GitCommand) CherryPickCommits(commits []*Commit) error { return c.OSCommand.RunPreparedCommand(cmd) } -// GetCommitFiles get the specified commit files -func (c *GitCommand) GetCommitFiles(commitSha string, patchManager *patch.PatchManager) ([]*CommitFile, error) { - files, err := c.OSCommand.RunCommandWithOutput("git diff-tree --no-commit-id --name-only -r --no-renames %s", commitSha) +// GetFilesInRef get the specified commit files +func (c *GitCommand) GetFilesInRef(commitSha string, isStash bool, patchManager *patch.PatchManager) ([]*CommitFile, error) { + command := "git diff-tree" + if isStash { + command = "git stash show" + } + + files, err := c.OSCommand.RunCommandWithOutput("%s --no-commit-id --name-only -r --no-renames %s", command, commitSha) if err != nil { return nil, err } @@ -1083,7 +1088,7 @@ func (c *GitCommand) ShowCommitFileCmdStr(commitSha, fileName string, plain bool colorArg = "never" } - return fmt.Sprintf("git show --no-renames --color=%s %s -- %s", colorArg, commitSha, fileName) + return fmt.Sprintf("git diff --no-renames --color=%s %s^..%s -- %s", colorArg, commitSha, commitSha, fileName) } // CheckoutFile checks out the file for the given commit diff --git a/pkg/commands/git_test.go b/pkg/commands/git_test.go index a376e10bf..fba4d0482 100644 --- a/pkg/commands/git_test.go +++ b/pkg/commands/git_test.go @@ -1852,8 +1852,8 @@ func TestGitCommandShowCommitFile(t *testing.T) { } } -// TestGitCommandGetCommitFiles is a function. -func TestGitCommandGetCommitFiles(t *testing.T) { +// TestGitCommandGetFilesInRef is a function. +func TestGitCommandGetFilesInRef(t *testing.T) { type scenario struct { testName string commitSha string @@ -1886,7 +1886,7 @@ func TestGitCommandGetCommitFiles(t *testing.T) { for _, s := range scenarios { t.Run(s.testName, func(t *testing.T) { gitCmd.OSCommand.command = s.command - s.test(gitCmd.GetCommitFiles(s.commitSha, nil)) + s.test(gitCmd.GetFilesInRef(s.commitSha, false, nil)) }) } } diff --git a/pkg/gui/arrangement.go b/pkg/gui/arrangement.go index 13148a3c6..f4b8d494c 100644 --- a/pkg/gui/arrangement.go +++ b/pkg/gui/arrangement.go @@ -6,15 +6,15 @@ import ( ) func (gui *Gui) mainSectionChildren() []*boxlayout.Box { - currentViewName := gui.currentViewName() + currentWindow := gui.currentWindow() // if we're not in split mode we can just show the one main panel. Likewise if // the main panel is focused and we're in full-screen mode - if !gui.isMainPanelSplit() || (gui.State.ScreenMode == SCREEN_FULL && currentViewName == "main") { + if !gui.isMainPanelSplit() || (gui.State.ScreenMode == SCREEN_FULL && currentWindow == "main") { return []*boxlayout.Box{ { - ViewName: "main", - Weight: 1, + Window: "main", + Weight: 1, }, } } @@ -28,18 +28,18 @@ func (gui *Gui) mainSectionChildren() []*boxlayout.Box { return []*boxlayout.Box{ { - ViewName: main, - Weight: 1, + Window: main, + Weight: 1, }, { - ViewName: secondary, - Weight: 1, + Window: secondary, + Weight: 1, }, } } func (gui *Gui) getMidSectionWeights() (int, int) { - currentViewName := gui.currentViewName() + currentWindow := gui.currentWindow() // we originally specified this as a ratio i.e. .20 would correspond to a weight of 1 against 4 sidePanelWidthRatio := gui.Config.GetUserConfig().GetFloat64("gui.sidePanelWidth") @@ -51,7 +51,7 @@ func (gui *Gui) getMidSectionWeights() (int, int) { mainSectionWeight = 5 // need to shrink side panel to make way for main panels if side-by-side } - if currentViewName == "main" { + if currentWindow == "main" { if gui.State.ScreenMode == SCREEN_HALF || gui.State.ScreenMode == SCREEN_FULL { sideSectionWeight = 0 } @@ -70,12 +70,12 @@ func (gui *Gui) infoSectionChildren(informationStr string, appStatus string) []* if gui.State.Searching.isSearching { return []*boxlayout.Box{ { - ViewName: "searchPrefix", - Size: len(SEARCH_PREFIX), + Window: "searchPrefix", + Size: len(SEARCH_PREFIX), }, { - ViewName: "search", - Weight: 1, + Window: "search", + Weight: 1, }, } } @@ -85,8 +85,8 @@ func (gui *Gui) infoSectionChildren(informationStr string, appStatus string) []* if len(appStatus) > 0 { result = append(result, &boxlayout.Box{ - ViewName: "appStatus", - Size: len(appStatus) + len(INFO_SECTION_PADDING), + Window: "appStatus", + Size: len(appStatus) + len(INFO_SECTION_PADDING), }, ) } @@ -94,11 +94,11 @@ func (gui *Gui) infoSectionChildren(informationStr string, appStatus string) []* result = append(result, []*boxlayout.Box{ { - ViewName: "options", - Weight: 1, + Window: "options", + Weight: 1, }, { - ViewName: "information", + Window: "information", // unlike appStatus, informationStr has various colors so we need to decolorise before taking the length Size: len(INFO_SECTION_PADDING) + len(utils.Decolorise(informationStr)), }, @@ -108,7 +108,7 @@ func (gui *Gui) infoSectionChildren(informationStr string, appStatus string) []* return result } -func (gui *Gui) getViewDimensions(informationStr string, appStatus string) map[string]boxlayout.Dimensions { +func (gui *Gui) getWindowDimensions(informationStr string, appStatus string) map[string]boxlayout.Dimensions { width, height := gui.g.Size() sideSectionWeight, mainSectionWeight := gui.getMidSectionWeights() @@ -162,23 +162,23 @@ func (gui *Gui) getViewDimensions(informationStr string, appStatus string) map[s }, } - return boxlayout.ArrangeViews(root, 0, 0, width, height) + return boxlayout.ArrangeWindows(root, 0, 0, width, height) } func (gui *Gui) sidePanelChildren(width int, height int) []*boxlayout.Box { - currentCyclableViewName := gui.currentCyclableViewName() + currentWindow := gui.currentSideWindowName() if gui.State.ScreenMode == SCREEN_FULL || gui.State.ScreenMode == SCREEN_HALF { - fullHeightBox := func(viewName string) *boxlayout.Box { - if viewName == currentCyclableViewName { + fullHeightBox := func(window string) *boxlayout.Box { + if window == currentWindow { return &boxlayout.Box{ - ViewName: viewName, - Weight: 1, + Window: window, + Weight: 1, } } else { return &boxlayout.Box{ - ViewName: viewName, - Size: 0, + Window: window, + Size: 0, } } } @@ -193,10 +193,10 @@ func (gui *Gui) sidePanelChildren(width int, height int) []*boxlayout.Box { } else if height >= 28 { accordianMode := gui.Config.GetUserConfig().GetBool("gui.expandFocusedSidePanel") accordianBox := func(defaultBox *boxlayout.Box) *boxlayout.Box { - if accordianMode && defaultBox.ViewName == currentCyclableViewName { + if accordianMode && defaultBox.Window == currentWindow { return &boxlayout.Box{ - ViewName: defaultBox.ViewName, - Weight: 2, + Window: defaultBox.Window, + Weight: 2, } } @@ -205,13 +205,13 @@ func (gui *Gui) sidePanelChildren(width int, height int) []*boxlayout.Box { return []*boxlayout.Box{ { - ViewName: "status", - Size: 3, + Window: "status", + Size: 3, }, - accordianBox(&boxlayout.Box{ViewName: "files", Weight: 1}), - accordianBox(&boxlayout.Box{ViewName: "branches", Weight: 1}), - accordianBox(&boxlayout.Box{ViewName: "commits", Weight: 1}), - accordianBox(&boxlayout.Box{ViewName: "stash", Size: 3}), + accordianBox(&boxlayout.Box{Window: "files", Weight: 1}), + accordianBox(&boxlayout.Box{Window: "branches", Weight: 1}), + accordianBox(&boxlayout.Box{Window: "commits", Weight: 1}), + accordianBox(&boxlayout.Box{Window: "stash", Size: 3}), } } else { squashedHeight := 1 @@ -219,16 +219,16 @@ func (gui *Gui) sidePanelChildren(width int, height int) []*boxlayout.Box { squashedHeight = 3 } - squashedSidePanelBox := func(viewName string) *boxlayout.Box { - if viewName == currentCyclableViewName { + squashedSidePanelBox := func(window string) *boxlayout.Box { + if window == currentWindow { return &boxlayout.Box{ - ViewName: viewName, - Weight: 1, + Window: window, + Weight: 1, } } else { return &boxlayout.Box{ - ViewName: viewName, - Size: squashedHeight, + Window: window, + Size: squashedHeight, } } } @@ -243,21 +243,14 @@ func (gui *Gui) sidePanelChildren(width int, height int) []*boxlayout.Box { } } -func (gui *Gui) currentCyclableViewName() string { - // there is always a cyclable context in the context stack. We'll look from top to bottom +func (gui *Gui) currentSideWindowName() string { + // there is always one and only one cyclable context in the context stack. We'll look from top to bottom for idx := range gui.State.ContextStack { reversedIdx := len(gui.State.ContextStack) - 1 - idx context := gui.State.ContextStack[reversedIdx] if context.GetKind() == SIDE_CONTEXT { - viewName := context.GetViewName() - - // unfortunate result of the fact that these are separate views, have to map explicitly - if viewName == "commitFiles" { - return "commits" - } - - return viewName + return context.GetWindowName() } } diff --git a/pkg/gui/boxlayout/boxlayout.go b/pkg/gui/boxlayout/boxlayout.go index f4bd8310e..b5d78faea 100644 --- a/pkg/gui/boxlayout/boxlayout.go +++ b/pkg/gui/boxlayout/boxlayout.go @@ -14,9 +14,9 @@ const ( COLUMN ) -// to give a high-level explanation of what's going on here. We layout our views by arranging a bunch of boxes in the window. +// to give a high-level explanation of what's going on here. We layout our windows by arranging a bunch of boxes in the available space. // If a box has children, it needs to specify how it wants to arrange those children: ROW or COLUMN. -// If a box represents a view, you can put the view name in the viewName field. +// If a box represents a window, you can put the window name in the Window field. // When determining how to divvy-up the available height (for row children) or width (for column children), we first // give the boxes with a static `size` the space that they want. Then we apportion // the remaining space based on the weights of the dynamic boxes (you can't define @@ -36,8 +36,8 @@ type Box struct { // function which takes the width and height assigned to the box and decides the layout of the children. ConditionalChildren func(width int, height int) []*Box - // ViewName refers to the name of the view this box represents, if there is one - ViewName string + // Window refers to the name of the window this box represents, if there is one + Window string // static Size. If parent box's direction is ROW this refers to height, otherwise width Size int @@ -47,13 +47,13 @@ type Box struct { Weight int } -func ArrangeViews(root *Box, x0, y0, width, height int) map[string]Dimensions { +func ArrangeWindows(root *Box, x0, y0, width, height int) map[string]Dimensions { children := root.getChildren(width, height) if len(children) == 0 { // leaf node - if root.ViewName != "" { - dimensionsForView := Dimensions{X0: x0, Y0: y0, X1: x0 + width - 1, Y1: y0 + height - 1} - return map[string]Dimensions{root.ViewName: dimensionsForView} + if root.Window != "" { + dimensionsForWindow := Dimensions{X0: x0, Y0: y0, X1: x0 + width - 1, Y1: y0 + height - 1} + return map[string]Dimensions{root.Window: dimensionsForWindow} } return map[string]Dimensions{} } @@ -104,9 +104,9 @@ func ArrangeViews(root *Box, x0, y0, width, height int) map[string]Dimensions { var resultForChild map[string]Dimensions if direction == COLUMN { - resultForChild = ArrangeViews(child, x0+offset, y0, boxSize, height) + resultForChild = ArrangeWindows(child, x0+offset, y0, boxSize, height) } else { - resultForChild = ArrangeViews(child, x0, y0+offset, width, boxSize) + resultForChild = ArrangeWindows(child, x0, y0+offset, width, boxSize) } result = mergeDimensionMaps(result, resultForChild) diff --git a/pkg/gui/boxlayout/boxlayout_test.go b/pkg/gui/boxlayout/boxlayout_test.go index 05d97ca9d..d339f828f 100644 --- a/pkg/gui/boxlayout/boxlayout_test.go +++ b/pkg/gui/boxlayout/boxlayout_test.go @@ -6,7 +6,7 @@ import ( "github.com/stretchr/testify/assert" ) -func TestArrangeViews(t *testing.T) { +func TestArrangeWindows(t *testing.T) { type scenario struct { testName string root *Box @@ -31,7 +31,7 @@ func TestArrangeViews(t *testing.T) { }, { "Box with static and dynamic panel", - &Box{Children: []*Box{{Size: 1, ViewName: "static"}, {Weight: 1, ViewName: "dynamic"}}}, + &Box{Children: []*Box{{Size: 1, Window: "static"}, {Weight: 1, Window: "dynamic"}}}, 0, 0, 10, @@ -49,7 +49,7 @@ func TestArrangeViews(t *testing.T) { }, { "Box with static and two dynamic panels", - &Box{Children: []*Box{{Size: 1, ViewName: "static"}, {Weight: 1, ViewName: "dynamic1"}, {Weight: 2, ViewName: "dynamic2"}}}, + &Box{Children: []*Box{{Size: 1, Window: "static"}, {Weight: 1, Window: "dynamic1"}, {Weight: 2, Window: "dynamic2"}}}, 0, 0, 10, @@ -68,7 +68,7 @@ func TestArrangeViews(t *testing.T) { }, { "Box with COLUMN direction", - &Box{Direction: COLUMN, Children: []*Box{{Size: 1, ViewName: "static"}, {Weight: 1, ViewName: "dynamic1"}, {Weight: 2, ViewName: "dynamic2"}}}, + &Box{Direction: COLUMN, Children: []*Box{{Size: 1, Window: "static"}, {Weight: 1, Window: "dynamic1"}, {Weight: 2, Window: "dynamic2"}}}, 0, 0, 10, @@ -93,7 +93,7 @@ func TestArrangeViews(t *testing.T) { } else { return ROW } - }, Children: []*Box{{Weight: 1, ViewName: "dynamic1"}, {Weight: 1, ViewName: "dynamic2"}}}, + }, Children: []*Box{{Weight: 1, Window: "dynamic1"}, {Weight: 1, Window: "dynamic2"}}}, 0, 0, 4, @@ -117,7 +117,7 @@ func TestArrangeViews(t *testing.T) { } else { return ROW } - }, Children: []*Box{{Weight: 1, ViewName: "dynamic1"}, {Weight: 1, ViewName: "dynamic2"}}}, + }, Children: []*Box{{Weight: 1, Window: "dynamic1"}, {Weight: 1, Window: "dynamic2"}}}, 0, 0, 5, @@ -137,9 +137,9 @@ func TestArrangeViews(t *testing.T) { "Box with conditional children where box is wide", &Box{ConditionalChildren: func(width int, height int) []*Box { if width > 4 { - return []*Box{{ViewName: "wide", Weight: 1}} + return []*Box{{Window: "wide", Weight: 1}} } else { - return []*Box{{ViewName: "narrow", Weight: 1}} + return []*Box{{Window: "narrow", Weight: 1}} } }}, 0, @@ -160,9 +160,9 @@ func TestArrangeViews(t *testing.T) { "Box with conditional children where box is narrow", &Box{ConditionalChildren: func(width int, height int) []*Box { if width > 4 { - return []*Box{{ViewName: "wide", Weight: 1}} + return []*Box{{Window: "wide", Weight: 1}} } else { - return []*Box{{ViewName: "narrow", Weight: 1}} + return []*Box{{Window: "narrow", Weight: 1}} } }}, 0, @@ -183,7 +183,7 @@ func TestArrangeViews(t *testing.T) { for _, s := range scenarios { t.Run(s.testName, func(t *testing.T) { - s.test(ArrangeViews(s.root, s.x0, s.y0, s.width, s.height)) + s.test(ArrangeWindows(s.root, s.x0, s.y0, s.width, s.height)) }) } } diff --git a/pkg/gui/commit_files_panel.go b/pkg/gui/commit_files_panel.go index e70092891..9854cfc77 100644 --- a/pkg/gui/commit_files_panel.go +++ b/pkg/gui/commit_files_panel.go @@ -1,6 +1,7 @@ package gui import ( + "github.com/davecgh/go-spew/spew" "github.com/go-errors/errors" "github.com/jesseduffield/gocui" "github.com/jesseduffield/lazygit/pkg/commands" @@ -80,12 +81,14 @@ func (gui *Gui) refreshCommitFilesView() error { return err } - files, err := gui.GitCommand.GetCommitFiles(gui.State.Panels.CommitFiles.refName, gui.GitCommand.PatchManager) + files, err := gui.GitCommand.GetFilesInRef(gui.State.Panels.CommitFiles.refName, gui.State.Panels.CommitFiles.isStash, gui.GitCommand.PatchManager) if err != nil { return gui.surfaceError(err) } gui.State.CommitFiles = files + gui.Log.Warn(spew.Sdump(files)) + return gui.postRefreshUpdate(gui.Contexts.CommitFiles.Context) } @@ -211,3 +214,23 @@ func (gui *Gui) enterCommitFile(selectedLineIdx int) error { return enterTheFile(selectedLineIdx) } + +func (gui *Gui) switchToCommitFilesContext(refName string, isStash bool, context Context, windowName string) error { + // sometimes the commitFiles view is already shown in another window, so we need to ensure that window + // no longer considers the commitFiles view as its main view. + + window := gui.getWindowForViewName("commitFiles") + gui.State.WindowViewNameMap[window] = window + + gui.State.Panels.CommitFiles.SelectedLineIdx = 0 + gui.State.Panels.CommitFiles.refName = refName + gui.State.Panels.CommitFiles.isStash = isStash + gui.Contexts.CommitFiles.Context.SetParentContext(context) + gui.Contexts.CommitFiles.Context.SetWindowName(windowName) + + if err := gui.refreshCommitFilesView(); err != nil { + return err + } + + return gui.switchContext(gui.Contexts.CommitFiles.Context) +} diff --git a/pkg/gui/commits_panel.go b/pkg/gui/commits_panel.go index 148a0e460..697da9ee7 100644 --- a/pkg/gui/commits_panel.go +++ b/pkg/gui/commits_panel.go @@ -505,14 +505,7 @@ func (gui *Gui) handleViewCommitFiles() error { return nil } - gui.State.Panels.CommitFiles.refName = commit.Sha - gui.Contexts.CommitFiles.Context.SetParentContext(gui.Contexts.BranchCommits.Context) - - if err := gui.refreshCommitFilesView(); err != nil { - return err - } - - return gui.switchContext(gui.Contexts.CommitFiles.Context) + return gui.switchToCommitFilesContext(commit.Sha, false, gui.Contexts.BranchCommits.Context, "commits") } func (gui *Gui) hasCommit(commits []*commands.Commit, target string) (int, bool) { diff --git a/pkg/gui/context.go b/pkg/gui/context.go index 9fa166571..05f8212ee 100644 --- a/pkg/gui/context.go +++ b/pkg/gui/context.go @@ -41,6 +41,8 @@ type Context interface { HandleRender() error GetKind() int GetViewName() string + GetWindowName() string + SetWindowName(string) GetKey() string GetSelectedItemId() string SetParentContext(Context) @@ -56,6 +58,15 @@ type BasicContext struct { ViewName string } +func (c BasicContext) SetWindowName(windowName string) { + panic("can't set window name on basic context") +} + +func (c BasicContext) GetWindowName() string { + // TODO: fix this up + return c.GetViewName() +} + func (c BasicContext) SetParentContext(Context) { panic("can't set parent context on basic context") } @@ -433,6 +444,7 @@ func (gui *Gui) activateContext(c Context) error { } } + // ensure that any other window for which this view was active is now set to the default for that window. gui.setViewAsActiveForWindow(viewName) if viewName == "main" { diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index e0ab0c724..aa7a72d0a 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -188,6 +188,7 @@ type commitFilesPanelState struct { // this is the SHA of the commit or the stash index of the stash. // Not sure if ref is actually the right word here refName string + isStash bool // true if we're dealing with a stash entry rather than a commit } type panelStates struct { diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index 3ce94c631..96a300c72 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -818,6 +818,12 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { Handler: gui.handleCreateReflogResetMenu, Description: gui.Tr.SLocalize("viewResetOptions"), }, + { + ViewName: "stash", + Key: gui.getKey("universal.goInto"), + Handler: gui.wrappedHandler(gui.handleViewStashFiles), + Description: gui.Tr.SLocalize("viewStashFiles"), + }, { ViewName: "stash", Key: gui.getKey("universal.select"), diff --git a/pkg/gui/layout.go b/pkg/gui/layout.go index 0c1a6d07a..266bb278c 100644 --- a/pkg/gui/layout.go +++ b/pkg/gui/layout.go @@ -50,7 +50,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { informationStr := gui.informationStr() appStatus := gui.statusManager.getStatusString() - viewDimensions := gui.getViewDimensions(informationStr, appStatus) + viewDimensions := gui.getWindowDimensions(informationStr, appStatus) _, _ = g.SetViewOnBottom("limit") _ = g.DeleteView("limit") @@ -152,7 +152,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { branchesView.ContainsList = true } - commitFilesView, err := setViewFromDimensions("commitFiles", "commits", true) + commitFilesView, err := setViewFromDimensions("commitFiles", gui.Contexts.CommitFiles.Context.GetWindowName(), true) if err != nil { if err.Error() != "unknown view" { return err diff --git a/pkg/gui/list_context.go b/pkg/gui/list_context.go index f70c202b7..ba2b41962 100644 --- a/pkg/gui/list_context.go +++ b/pkg/gui/list_context.go @@ -20,12 +20,28 @@ type ListContext struct { RendersToMainView bool Kind int ParentContext Context + WindowName string } type ListItem interface { ID() string } +func (lc *ListContext) SetWindowName(windowName string) { + lc.WindowName = windowName +} + +func (lc *ListContext) GetWindowName() string { + windowName := lc.WindowName + + if windowName != "" { + return windowName + } + + // TODO: actually set this for everything so we don't default to the view name + return lc.ViewName +} + func (lc *ListContext) SetParentContext(c Context) { lc.ParentContext = c } @@ -371,6 +387,7 @@ func (gui *Gui) stashListContext() *ListContext { func (gui *Gui) commitFilesListContext() *ListContext { return &ListContext{ ViewName: "commitFiles", + WindowName: "commits", ContextKey: COMMIT_FILES_CONTEXT_KEY, GetItemsLength: func() int { return len(gui.State.CommitFiles) }, GetPanelState: func() IListPanelState { return gui.State.Panels.CommitFiles }, diff --git a/pkg/gui/reflog_panel.go b/pkg/gui/reflog_panel.go index d14557599..7c6bcb766 100644 --- a/pkg/gui/reflog_panel.go +++ b/pkg/gui/reflog_panel.go @@ -119,12 +119,5 @@ func (gui *Gui) handleViewReflogCommitFiles() error { return nil } - gui.State.Panels.CommitFiles.refName = commit.Sha - gui.Contexts.CommitFiles.Context.SetParentContext(gui.Contexts.ReflogCommits.Context) - - if err := gui.refreshCommitFilesView(); err != nil { - return err - } - - return gui.switchContext(gui.Contexts.CommitFiles.Context) + return gui.switchToCommitFilesContext(commit.Sha, false, gui.Contexts.ReflogCommits.Context, "commits") } diff --git a/pkg/gui/stash_panel.go b/pkg/gui/stash_panel.go index 5f12d2462..97f04aa0a 100644 --- a/pkg/gui/stash_panel.go +++ b/pkg/gui/stash_panel.go @@ -128,3 +128,12 @@ func (gui *Gui) handleStashSave(stashFunc func(message string) error) error { return gui.refreshSidePanels(refreshOptions{scope: []int{STASH, FILES}}) }) } + +func (gui *Gui) handleViewStashFiles() error { + stashEntry := gui.getSelectedStashEntry() + if stashEntry == nil { + return nil + } + + return gui.switchToCommitFilesContext(stashEntry.RefName(), true, gui.Contexts.Stash.Context, "stash") +} diff --git a/pkg/gui/window.go b/pkg/gui/window.go index bec14d863..8d2f3ff18 100644 --- a/pkg/gui/window.go +++ b/pkg/gui/window.go @@ -16,9 +16,8 @@ func (gui *Gui) getViewNameForWindow(window string) string { } func (gui *Gui) getWindowForViewName(viewName string) string { - // should soft-code this if viewName == "commitFiles" { - return "commits" + return gui.Contexts.CommitFiles.Context.GetWindowName() } return viewName diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index 08fda9e7d..24d55b7f2 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -1167,6 +1167,9 @@ func addEnglish(i18nObject *i18n.Bundle) error { }, &i18n.Message{ ID: "createNewBranchFromCommit", Other: "create new branch off of commit", + }, &i18n.Message{ + ID: "viewStashFiles", + Other: "view stash entry's files", }, ) }