diff --git a/pkg/commands/git.go b/pkg/commands/git.go index 7127a427e..8d62a1e63 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -746,11 +746,11 @@ func (c *GitCommand) Revert(sha string) error { return c.OSCommand.RunCommand(fmt.Sprintf("git revert %s", sha)) } -// CherryPickShas begins an interactive rebase with the given shas being cherry picked onto HEAD -func (c *GitCommand) CherryPickShas(shas []string) error { +// CherryPickCommits begins an interactive rebase with the given shas being cherry picked onto HEAD +func (c *GitCommand) CherryPickCommits(commits []*Commit) error { todo := "" - for _, sha := range shas { - todo = "pick " + sha + "\n" + todo + for _, commit := range commits { + todo = "pick " + commit.Sha + " " + commit.Name + "\n" + todo } cmd, err := c.PrepareInteractiveRebaseCommand("HEAD", todo, false) diff --git a/pkg/git/commit_list_builder.go b/pkg/git/commit_list_builder.go index 3de255d02..6ae6efeee 100644 --- a/pkg/git/commit_list_builder.go +++ b/pkg/git/commit_list_builder.go @@ -23,21 +23,21 @@ import ( // CommitListBuilder returns a list of Branch objects for the current repo type CommitListBuilder struct { - Log *logrus.Entry - GitCommand *commands.GitCommand - OSCommand *commands.OSCommand - Tr *i18n.Localizer - CherryPickedShas []string + Log *logrus.Entry + GitCommand *commands.GitCommand + OSCommand *commands.OSCommand + Tr *i18n.Localizer + CherryPickedCommits []*commands.Commit } // NewCommitListBuilder builds a new commit list builder -func NewCommitListBuilder(log *logrus.Entry, gitCommand *commands.GitCommand, osCommand *commands.OSCommand, tr *i18n.Localizer, cherryPickedShas []string) (*CommitListBuilder, error) { +func NewCommitListBuilder(log *logrus.Entry, gitCommand *commands.GitCommand, osCommand *commands.OSCommand, tr *i18n.Localizer, cherryPickedCommits []*commands.Commit) (*CommitListBuilder, error) { return &CommitListBuilder{ - Log: log, - GitCommand: gitCommand, - OSCommand: osCommand, - Tr: tr, - CherryPickedShas: cherryPickedShas, + Log: log, + GitCommand: gitCommand, + OSCommand: osCommand, + Tr: tr, + CherryPickedCommits: cherryPickedCommits, }, nil } @@ -159,8 +159,8 @@ func (c *CommitListBuilder) setCommitMergedStatuses(commits []*commands.Commit) func (c *CommitListBuilder) setCommitCherryPickStatuses(commits []*commands.Commit) ([]*commands.Commit, error) { for _, commit := range commits { - for _, sha := range c.CherryPickedShas { - if commit.Sha == sha { + for _, cherryPickedCommit := range c.CherryPickedCommits { + if commit.Sha == cherryPickedCommit.Sha { commit.Copied = true } } diff --git a/pkg/gui/commits_panel.go b/pkg/gui/commits_panel.go index 37b7538f7..6b26d0ef3 100644 --- a/pkg/gui/commits_panel.go +++ b/pkg/gui/commits_panel.go @@ -3,7 +3,6 @@ package gui import ( "fmt" "strconv" - "strings" "github.com/go-errors/errors" @@ -42,7 +41,7 @@ func (gui *Gui) handleCommitSelect(g *gocui.Gui, v *gocui.View) error { func (gui *Gui) refreshCommits(g *gocui.Gui) error { g.Update(func(*gocui.Gui) error { - builder, err := git.NewCommitListBuilder(gui.Log, gui.GitCommand, gui.OSCommand, gui.Tr, gui.State.CherryPickedShas) + builder, err := git.NewCommitListBuilder(gui.Log, gui.GitCommand, gui.OSCommand, gui.Tr, gui.State.CherryPickedCommits) if err != nil { return err } @@ -352,36 +351,34 @@ func (gui *Gui) handleCommitRevert(g *gocui.Gui, v *gocui.View) error { func (gui *Gui) handleCopyCommit(g *gocui.Gui, v *gocui.View) error { // get currently selected commit, add the sha to state. - sha := gui.State.Commits[gui.State.Panels.Commits.SelectedLine].Sha + commit := gui.State.Commits[gui.State.Panels.Commits.SelectedLine] // we will un-copy it if it's already copied - for index, cherryPickedSha := range gui.State.CherryPickedShas { - if sha == cherryPickedSha { - gui.State.CherryPickedShas = append(gui.State.CherryPickedShas[0:index], gui.State.CherryPickedShas[index+1:]...) - gui.Log.Info("removed copied sha. New shas:\n" + strings.Join(gui.State.CherryPickedShas, "\n")) + for index, cherryPickedCommit := range gui.State.CherryPickedCommits { + if commit.Sha == cherryPickedCommit.Sha { + gui.State.CherryPickedCommits = append(gui.State.CherryPickedCommits[0:index], gui.State.CherryPickedCommits[index+1:]...) return gui.refreshCommits(gui.g) } } - gui.addCommitToCherryPickedShas(gui.State.Panels.Commits.SelectedLine) + gui.addCommitToCherryPickedCommits(gui.State.Panels.Commits.SelectedLine) return gui.refreshCommits(gui.g) } -func (gui *Gui) addCommitToCherryPickedShas(index int) { - defer func() { gui.Log.Info("new copied shas:\n" + strings.Join(gui.State.CherryPickedShas, "\n")) }() - +func (gui *Gui) addCommitToCherryPickedCommits(index int) { // not super happy with modifying the state of the Commits array here // but the alternative would be very tricky gui.State.Commits[index].Copied = true - newShas := []string{} + newCommits := []*commands.Commit{} for _, commit := range gui.State.Commits { if commit.Copied { - newShas = append(newShas, commit.Sha) + // duplicating just the things we need to put in the rebase TODO list + newCommits = append(newCommits, &commands.Commit{Name: commit.Name, Sha: commit.Sha}) } } - gui.State.CherryPickedShas = newShas + gui.State.CherryPickedCommits = newCommits } func (gui *Gui) handleCopyCommitRange(g *gocui.Gui, v *gocui.View) error { @@ -399,7 +396,7 @@ func (gui *Gui) handleCopyCommitRange(g *gocui.Gui, v *gocui.View) error { gui.Log.Info("commit copy start index: " + strconv.Itoa(startIndex)) for index := startIndex; index <= gui.State.Panels.Commits.SelectedLine; index++ { - gui.addCommitToCherryPickedShas(index) + gui.addCommitToCherryPickedCommits(index) } return gui.refreshCommits(gui.g) @@ -408,8 +405,7 @@ func (gui *Gui) handleCopyCommitRange(g *gocui.Gui, v *gocui.View) error { // HandlePasteCommits begins a cherry-pick rebase with the commits the user has copied func (gui *Gui) HandlePasteCommits(g *gocui.Gui, v *gocui.View) error { return gui.createConfirmationPanel(g, v, gui.Tr.SLocalize("CherryPick"), gui.Tr.SLocalize("SureCherryPick"), func(g *gocui.Gui, v *gocui.View) error { - err := gui.GitCommand.CherryPickShas(gui.State.CherryPickedShas) + err := gui.GitCommand.CherryPickCommits(gui.State.CherryPickedCommits) return gui.handleGenericMergeCommandResult(err) }, nil) - } diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 2103856fd..69018814e 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -123,29 +123,29 @@ type panelStates struct { } type guiState struct { - Files []*commands.File - Branches []*commands.Branch - Commits []*commands.Commit - StashEntries []*commands.StashEntry - PreviousView string - Platform commands.Platform - Updating bool - Panels *panelStates - WorkingTreeState string // one of "merging", "rebasing", "normal" - Contexts map[string]string - CherryPickedShas []string + Files []*commands.File + Branches []*commands.Branch + Commits []*commands.Commit + StashEntries []*commands.StashEntry + PreviousView string + Platform commands.Platform + Updating bool + Panels *panelStates + WorkingTreeState string // one of "merging", "rebasing", "normal" + Contexts map[string]string + CherryPickedCommits []*commands.Commit } // NewGui builds a new gui handler func NewGui(log *logrus.Entry, gitCommand *commands.GitCommand, oSCommand *commands.OSCommand, tr *i18n.Localizer, config config.AppConfigurer, updater *updates.Updater) (*Gui, error) { initialState := guiState{ - Files: make([]*commands.File, 0), - PreviousView: "files", - Commits: make([]*commands.Commit, 0), - CherryPickedShas: []string{}, - StashEntries: make([]*commands.StashEntry, 0), - Platform: *oSCommand.Platform, + Files: make([]*commands.File, 0), + PreviousView: "files", + Commits: make([]*commands.Commit, 0), + CherryPickedCommits: make([]*commands.Commit, 0), + StashEntries: make([]*commands.StashEntry, 0), + Platform: *oSCommand.Platform, Panels: &panelStates{ Files: &filePanelState{SelectedLine: -1}, Branches: &branchPanelState{SelectedLine: 0},