summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Haller <stefan@haller-berlin.de>2023-04-06 07:04:25 +0200
committerStefan Haller <stefan@haller-berlin.de>2023-04-29 07:28:33 +0200
commitab25600ccbbc9b8880289c496f521710894e26cc (patch)
tree143fbad1da1f2f38aec9db8718fa4318145afb79
parentd50c58b4c669b1de94bf4d04f508b3eb5b84647c (diff)
Extract EditRebaseTodo into a function in utils.rebaseTodo
We want to reuse it from the daemon code in the next commit.
-rw-r--r--pkg/commands/git_commands/rebase.go21
-rw-r--r--pkg/utils/rebase_todo.go23
2 files changed, 25 insertions, 19 deletions
diff --git a/pkg/commands/git_commands/rebase.go b/pkg/commands/git_commands/rebase.go
index 26c0536e9..31eaf1366 100644
--- a/pkg/commands/git_commands/rebase.go
+++ b/pkg/commands/git_commands/rebase.go
@@ -231,25 +231,8 @@ func (self *RebaseCommands) AmendTo(commit *models.Commit) error {
// EditRebaseTodo sets the action for a given rebase commit in the git-rebase-todo file
func (self *RebaseCommands) EditRebaseTodo(commit *models.Commit, action todo.TodoCommand) error {
- fileName := filepath.Join(self.dotGitDir, "rebase-merge/git-rebase-todo")
- todos, err := utils.ReadRebaseTodoFile(fileName)
- if err != nil {
- return err
- }
-
- for i := range todos {
- t := &todos[i]
- // Comparing just the sha is not enough; we need to compare both the
- // action and the sha, as the sha could appear multiple times (e.g. in a
- // pick and later in a merge)
- if t.Command == commit.Action && t.Commit == commit.Sha {
- t.Command = action
- return utils.WriteRebaseTodoFile(fileName, todos)
- }
- }
-
- // Should never get here
- return fmt.Errorf("Todo %s not found in git-rebase-todo", commit.Sha)
+ return utils.EditRebaseTodo(
+ filepath.Join(self.dotGitDir, "rebase-merge/git-rebase-todo"), commit.Sha, commit.Action, action)
}
// MoveTodoDown moves a rebase todo item down by one position
diff --git a/pkg/utils/rebase_todo.go b/pkg/utils/rebase_todo.go
index 0b6a6a40c..a61d4c36c 100644
--- a/pkg/utils/rebase_todo.go
+++ b/pkg/utils/rebase_todo.go
@@ -9,6 +9,29 @@ import (
"github.com/samber/lo"
)
+// Read a git-rebase-todo file, change the action for the given sha to
+// newAction, and write it back
+func EditRebaseTodo(filePath string, sha string, oldAction todo.TodoCommand, newAction todo.TodoCommand) error {
+ todos, err := ReadRebaseTodoFile(filePath)
+ if err != nil {
+ return err
+ }
+
+ for i := range todos {
+ t := &todos[i]
+ // Comparing just the sha is not enough; we need to compare both the
+ // action and the sha, as the sha could appear multiple times (e.g. in a
+ // pick and later in a merge)
+ if t.Command == oldAction && equalShas(t.Commit, sha) {
+ t.Command = newAction
+ return WriteRebaseTodoFile(filePath, todos)
+ }
+ }
+
+ // Should never get here
+ return fmt.Errorf("Todo %s not found in git-rebase-todo", sha)
+}
+
func equalShas(a, b string) bool {
return strings.HasPrefix(a, b) || strings.HasPrefix(b, a)
}