From f4938deaaeb163dc0791f38dfbeee0f88e8cef56 Mon Sep 17 00:00:00 2001
From: Jesse Duffield Duffield
 <jesseduffieldduffield@Jesses-MacBook-Pro-3.local>
Date: Sun, 24 Feb 2019 17:34:19 +1100
Subject: [PATCH] change type of cherryPickedCommits from []string to []*Commit

---
 pkg/commands/git.go            |  8 ++++----
 pkg/git/commit_list_builder.go | 26 +++++++++++++-------------
 pkg/gui/commits_panel.go       | 30 +++++++++++++-----------------
 pkg/gui/gui.go                 | 34 +++++++++++++++++-----------------
 4 files changed, 47 insertions(+), 51 deletions(-)

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},