summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pkg/commands/git.go2
-rw-r--r--pkg/gui/branches_panel.go13
-rw-r--r--pkg/gui/commits_panel.go11
-rw-r--r--pkg/gui/keybindings.go7
-rw-r--r--pkg/gui/remote_branches_panel.go2
-rw-r--r--pkg/gui/tags_panel.go2
-rw-r--r--pkg/i18n/english.go6
7 files changed, 34 insertions, 9 deletions
diff --git a/pkg/commands/git.go b/pkg/commands/git.go
index ab71f80e3..0975ba501 100644
--- a/pkg/commands/git.go
+++ b/pkg/commands/git.go
@@ -515,7 +515,7 @@ func (c *GitCommand) DiscardUnstagedFileChanges(file *File) error {
return c.OSCommand.RunCommand("git checkout -- %s", quotedFileName)
}
-// Checkout checks out a branch, with --force if you set the force arg to true
+// Checkout checks out a branch (or commit), with --force if you set the force arg to true
func (c *GitCommand) Checkout(branch string, force bool) error {
forceArg := ""
if force {
diff --git a/pkg/gui/branches_panel.go b/pkg/gui/branches_panel.go
index f78d86ab8..985be932e 100644
--- a/pkg/gui/branches_panel.go
+++ b/pkg/gui/branches_panel.go
@@ -128,7 +128,7 @@ func (gui *Gui) handleBranchPress(g *gocui.Gui, v *gocui.View) error {
return gui.createErrorPanel(g, gui.Tr.SLocalize("AlreadyCheckedOutBranch"))
}
branch := gui.getSelectedBranch()
- return gui.handleCheckoutBranch(branch.Name)
+ return gui.handleCheckoutRef(branch.Name)
}
func (gui *Gui) handleCreatePullRequestPress(g *gocui.Gui, v *gocui.View) error {
@@ -165,17 +165,17 @@ func (gui *Gui) handleForceCheckout(g *gocui.Gui, v *gocui.View) error {
}, nil)
}
-func (gui *Gui) handleCheckoutBranch(branchName string) error {
- if err := gui.GitCommand.Checkout(branchName, false); err != nil {
+func (gui *Gui) handleCheckoutRef(ref string) error {
+ if err := gui.GitCommand.Checkout(ref, false); err != nil {
// note, this will only work for english-language git commands. If we force git to use english, and the error isn't this one, then the user will receive an english command they may not understand. I'm not sure what the best solution to this is. Running the command once in english and a second time in the native language is one option
if strings.Contains(err.Error(), "Please commit your changes or stash them before you switch branch") {
// offer to autostash changes
return gui.createConfirmationPanel(gui.g, gui.getBranchesView(), true, gui.Tr.SLocalize("AutoStashTitle"), gui.Tr.SLocalize("AutoStashPrompt"), func(g *gocui.Gui, v *gocui.View) error {
- if err := gui.GitCommand.StashSave(gui.Tr.SLocalize("StashPrefix") + branchName); err != nil {
+ if err := gui.GitCommand.StashSave(gui.Tr.SLocalize("StashPrefix") + ref); err != nil {
return gui.createErrorPanel(g, err.Error())
}
- if err := gui.GitCommand.Checkout(branchName, false); err != nil {
+ if err := gui.GitCommand.Checkout(ref, false); err != nil {
return gui.createErrorPanel(g, err.Error())
}
@@ -198,12 +198,13 @@ func (gui *Gui) handleCheckoutBranch(branchName string) error {
}
gui.State.Panels.Branches.SelectedLine = 0
+ gui.State.Panels.Commits.SelectedLine = 0
return gui.refreshSidePanels(gui.g)
}
func (gui *Gui) handleCheckoutByName(g *gocui.Gui, v *gocui.View) error {
gui.createPromptPanel(g, v, gui.Tr.SLocalize("BranchName")+":", "", func(g *gocui.Gui, v *gocui.View) error {
- return gui.handleCheckoutBranch(gui.trimmedContent(v))
+ return gui.handleCheckoutRef(gui.trimmedContent(v))
})
return nil
}
diff --git a/pkg/gui/commits_panel.go b/pkg/gui/commits_panel.go
index 22ea6fe7e..3f82584c1 100644
--- a/pkg/gui/commits_panel.go
+++ b/pkg/gui/commits_panel.go
@@ -611,3 +611,14 @@ func (gui *Gui) handleCreateLightweightTag(commitSha string) error {
return gui.handleCommitSelect(g, v)
})
}
+
+func (gui *Gui) handleCheckoutCommit(g *gocui.Gui, v *gocui.View) error {
+ commit := gui.getSelectedCommit(g)
+ if commit == nil {
+ return gui.renderString(g, "main", gui.Tr.SLocalize("NoCommitsThisBranch"))
+ }
+
+ return gui.createConfirmationPanel(g, gui.getCommitsView(), true, gui.Tr.SLocalize("checkoutCommit"), gui.Tr.SLocalize("SureCheckoutThisCommit"), func(g *gocui.Gui, v *gocui.View) error {
+ return gui.handleCheckoutRef(commit.Sha)
+ }, nil)
+}
diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go
index 8d036fc07..1deb6f7e3 100644
--- a/pkg/gui/keybindings.go
+++ b/pkg/gui/keybindings.go
@@ -596,6 +596,13 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
ViewName: "commits",
Key: gocui.KeySpace,
Modifier: gocui.ModNone,
+ Handler: gui.handleCheckoutCommit,
+ Description: gui.Tr.SLocalize("checkoutCommit"),
+ },
+ {
+ ViewName: "commits",
+ Key: 'h',
+ Modifier: gocui.ModNone,
Handler: gui.handleToggleDiffCommit,
Description: gui.Tr.SLocalize("CommitsDiff"),
},
diff --git a/pkg/gui/remote_branches_panel.go b/pkg/gui/remote_branches_panel.go
index af9835999..2de045e4d 100644
--- a/pkg/gui/remote_branches_panel.go
+++ b/pkg/gui/remote_branches_panel.go
@@ -79,7 +79,7 @@ func (gui *Gui) handleCheckoutRemoteBranch(g *gocui.Gui, v *gocui.View) error {
if remoteBranch == nil {
return nil
}
- if err := gui.handleCheckoutBranch(remoteBranch.RemoteName + "/" + remoteBranch.Name); err != nil {
+ if err := gui.handleCheckoutRef(remoteBranch.RemoteName + "/" + remoteBranch.Name); err != nil {
return err
}
return gui.switchBranchesPanelContext("local-branches")
diff --git a/pkg/gui/tags_panel.go b/pkg/gui/tags_panel.go
index e1f9d364a..e287156ac 100644
--- a/pkg/gui/tags_panel.go
+++ b/pkg/gui/tags_panel.go
@@ -90,7 +90,7 @@ func (gui *Gui) handleCheckoutTag(g *gocui.Gui, v *gocui.View) error {
if tag == nil {
return nil
}
- if err := gui.handleCheckoutBranch(tag.Name); err != nil {
+ if err := gui.handleCheckoutRef(tag.Name); err != nil {
return err
}
return gui.switchBranchesPanelContext("local-branches")
diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go
index c6c423285..d9a2dcee9 100644
--- a/pkg/i18n/english.go
+++ b/pkg/i18n/english.go
@@ -924,6 +924,12 @@ func addEnglish(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "FetchingRemoteStatus",
Other: "fetching remote",
+ }, &i18n.Message{
+ ID: "checkoutCommit",
+ Other: "checkout commit",
+ }, &i18n.Message{
+ ID: "SureCheckoutThisCommit",
+ Other: "Are you sure you want to checkout this commit?",
},
)
}