mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-05-31 23:19:40 +02:00
autostash changes when pulling file into index
This commit is contained in:
parent
a9559a5c87
commit
0c0231c3e8
@ -131,14 +131,22 @@ func (c *GitCommand) MovePatchToSelectedCommit(commits []*Commit, sourceCommitId
|
|||||||
return c.GenericMerge("rebase", "continue")
|
return c.GenericMerge("rebase", "continue")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GitCommand) PullPatchIntoIndex(commits []*Commit, commitIdx int, p *PatchManager) error {
|
func (c *GitCommand) PullPatchIntoIndex(commits []*Commit, commitIdx int, p *PatchManager, stash bool) error {
|
||||||
|
if stash {
|
||||||
|
if err := c.StashSave(c.Tr.SLocalize("StashPrefix") + commits[commitIdx].Sha); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err := c.BeginInteractiveRebaseForCommit(commits, commitIdx); err != nil {
|
if err := c.BeginInteractiveRebaseForCommit(commits, commitIdx); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := p.ApplyPatches(true); err != nil {
|
if err := p.ApplyPatches(true); err != nil {
|
||||||
if err := c.GenericMerge("rebase", "abort"); err != nil {
|
if c.WorkingTreeState() == "rebasing" {
|
||||||
return err
|
if err := c.GenericMerge("rebase", "abort"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -155,12 +163,20 @@ func (c *GitCommand) PullPatchIntoIndex(commits []*Commit, commitIdx int, p *Pat
|
|||||||
c.onSuccessfulContinue = func() error {
|
c.onSuccessfulContinue = func() error {
|
||||||
// add patches to index
|
// add patches to index
|
||||||
if err := p.ApplyPatches(false); err != nil {
|
if err := p.ApplyPatches(false); err != nil {
|
||||||
if err := c.GenericMerge("rebase", "abort"); err != nil {
|
if c.WorkingTreeState() == "rebasing" {
|
||||||
return err
|
if err := c.GenericMerge("rebase", "abort"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if stash {
|
||||||
|
if err := c.StashDo(0, "apply"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
c.PatchManager.Reset()
|
c.PatchManager.Reset()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,11 @@ func (gui *Gui) createPopupPanel(g *gocui.Gui, currentView *gocui.View, title, p
|
|||||||
}
|
}
|
||||||
|
|
||||||
gui.renderString(g, "confirmation", prompt)
|
gui.renderString(g, "confirmation", prompt)
|
||||||
return gui.setKeyBindings(g, handleConfirm, handleClose, returnFocusOnClose)
|
if err := gui.setKeyBindings(g, handleConfirm, handleClose, returnFocusOnClose); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return gui.refreshSidePanels(refreshOptions{})
|
||||||
})
|
})
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ func (gui *Gui) handleCreateDiscardMenu(g *gocui.Gui, v *gocui.View) error {
|
|||||||
displayString: gui.Tr.SLocalize("discardAllChanges"),
|
displayString: gui.Tr.SLocalize("discardAllChanges"),
|
||||||
onPress: func() error {
|
onPress: func() error {
|
||||||
if err := gui.GitCommand.DiscardAllFileChanges(file); err != nil {
|
if err := gui.GitCommand.DiscardAllFileChanges(file); err != nil {
|
||||||
return err
|
return gui.surfaceError(err)
|
||||||
}
|
}
|
||||||
return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []int{FILES}})
|
return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []int{FILES}})
|
||||||
},
|
},
|
||||||
@ -30,7 +30,7 @@ func (gui *Gui) handleCreateDiscardMenu(g *gocui.Gui, v *gocui.View) error {
|
|||||||
displayString: gui.Tr.SLocalize("discardUnstagedChanges"),
|
displayString: gui.Tr.SLocalize("discardUnstagedChanges"),
|
||||||
onPress: func() error {
|
onPress: func() error {
|
||||||
if err := gui.GitCommand.DiscardUnstagedFileChanges(file); err != nil {
|
if err := gui.GitCommand.DiscardUnstagedFileChanges(file); err != nil {
|
||||||
return err
|
return gui.surfaceError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []int{FILES}})
|
return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []int{FILES}})
|
||||||
|
@ -130,7 +130,7 @@ func (gui *Gui) stagedFiles() []*commands.File {
|
|||||||
|
|
||||||
func (gui *Gui) trackedFiles() []*commands.File {
|
func (gui *Gui) trackedFiles() []*commands.File {
|
||||||
files := gui.State.Files
|
files := gui.State.Files
|
||||||
result := make([]*commands.File, 0)
|
result := make([]*commands.File, 0, len(files))
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
if file.Tracked {
|
if file.Tracked {
|
||||||
result = append(result, file)
|
result = append(result, file)
|
||||||
|
@ -113,11 +113,21 @@ func (gui *Gui) handlePullPatchIntoWorkingTree() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return gui.WithWaitingStatus(gui.Tr.SLocalize("RebasingStatus"), func() error {
|
pull := func(stash bool) error {
|
||||||
commitIndex := gui.getPatchCommitIndex()
|
return gui.WithWaitingStatus(gui.Tr.SLocalize("RebasingStatus"), func() error {
|
||||||
err := gui.GitCommand.PullPatchIntoIndex(gui.State.Commits, commitIndex, gui.GitCommand.PatchManager)
|
commitIndex := gui.getPatchCommitIndex()
|
||||||
return gui.handleGenericMergeCommandResult(err)
|
err := gui.GitCommand.PullPatchIntoIndex(gui.State.Commits, commitIndex, gui.GitCommand.PatchManager, stash)
|
||||||
})
|
return gui.handleGenericMergeCommandResult(err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(gui.trackedFiles()) > 0 {
|
||||||
|
return gui.createConfirmationPanel(gui.g, gui.g.CurrentView(), true, gui.Tr.SLocalize("MustStashTitle"), gui.Tr.SLocalize("MustStashWarning"), func(*gocui.Gui, *gocui.View) error {
|
||||||
|
return pull(true)
|
||||||
|
}, nil)
|
||||||
|
} else {
|
||||||
|
return pull(false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) handleApplyPatch() error {
|
func (gui *Gui) handleApplyPatch() error {
|
||||||
|
@ -155,15 +155,6 @@ type handleHardResetWithAutoStashOptions struct {
|
|||||||
|
|
||||||
// only to be used in the undo flow for now
|
// only to be used in the undo flow for now
|
||||||
func (gui *Gui) handleHardResetWithAutoStash(commitSha string, options handleHardResetWithAutoStashOptions) error {
|
func (gui *Gui) handleHardResetWithAutoStash(commitSha string, options handleHardResetWithAutoStashOptions) error {
|
||||||
// if we have any modified tracked files we need to ask the user if they want us to stash for them
|
|
||||||
dirtyWorkingTree := false
|
|
||||||
for _, file := range gui.State.Files {
|
|
||||||
if file.Tracked {
|
|
||||||
dirtyWorkingTree = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
reset := func() error {
|
reset := func() error {
|
||||||
if err := gui.resetToRef(commitSha, "hard", commands.RunCommandOptions{EnvVars: options.EnvVars}); err != nil {
|
if err := gui.resetToRef(commitSha, "hard", commands.RunCommandOptions{EnvVars: options.EnvVars}); err != nil {
|
||||||
return gui.surfaceError(err)
|
return gui.surfaceError(err)
|
||||||
@ -171,6 +162,8 @@ func (gui *Gui) handleHardResetWithAutoStash(commitSha string, options handleHar
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if we have any modified tracked files we need to ask the user if they want us to stash for them
|
||||||
|
dirtyWorkingTree := len(gui.trackedFiles()) > 0
|
||||||
if dirtyWorkingTree {
|
if dirtyWorkingTree {
|
||||||
// offer to autostash changes
|
// 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 {
|
return gui.createConfirmationPanel(gui.g, gui.getBranchesView(), true, gui.Tr.SLocalize("AutoStashTitle"), gui.Tr.SLocalize("AutoStashPrompt"), func(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
@ -1062,6 +1062,12 @@ func addEnglish(i18nObject *i18n.Bundle) error {
|
|||||||
}, &i18n.Message{
|
}, &i18n.Message{
|
||||||
ID: "cantRedoWhileRebasing",
|
ID: "cantRedoWhileRebasing",
|
||||||
Other: "Can't redo while rebasing",
|
Other: "Can't redo while rebasing",
|
||||||
|
}, &i18n.Message{
|
||||||
|
ID: "MustStashWarning",
|
||||||
|
Other: "Pulling a patch out into the index requires stashing and unstashing your changes. If something goes wrong, you'll be able to access your files from the stash. Continue?",
|
||||||
|
}, &i18n.Message{
|
||||||
|
ID: "MustStashTitle",
|
||||||
|
Other: "Must stash",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user