diff --git a/pkg/commands/patch/patch_modifier.go b/pkg/commands/patch/patch_modifier.go index c2bbc60f6..e5c6d061f 100644 --- a/pkg/commands/patch/patch_modifier.go +++ b/pkg/commands/patch/patch_modifier.go @@ -137,12 +137,17 @@ func ModifiedPatchForLines(log *logrus.Entry, filename string, diffText string, } // I want to know, given a hunk, what line a given index is on -func (hunk *PatchHunk) LineNumberOfLine(idx int) int { - lines := hunk.bodyLines[0 : idx-hunk.FirstLineIdx-1] +func (hunk *PatchHunk) LineNumberOfLine(idx int) (int, error) { + n := idx - hunk.FirstLineIdx - 1 + if n < 0 || len(hunk.bodyLines) <= n { + return -1, fmt.Errorf("line index out of range") + } + + lines := hunk.bodyLines[0:n] offset := nLinesWithPrefix(lines, []string{"+", " "}) - return hunk.newStart + offset + return hunk.newStart + offset, nil } func nLinesWithPrefix(lines []string, chars []string) int { diff --git a/pkg/commands/patch/patch_modifier_test.go b/pkg/commands/patch/patch_modifier_test.go index 8b866019b..1f1eeb114 100644 --- a/pkg/commands/patch/patch_modifier_test.go +++ b/pkg/commands/patch/patch_modifier_test.go @@ -539,7 +539,7 @@ func TestLineNumberOfLine(t *testing.T) { for _, s := range scenarios { t.Run(s.testName, func(t *testing.T) { - result := s.hunk.LineNumberOfLine(s.idx) + result, _ := s.hunk.LineNumberOfLine(s.idx) if !assert.Equal(t, s.expected, result) { fmt.Println(result) } diff --git a/pkg/gui/lbl/state.go b/pkg/gui/lbl/state.go index 8ae828923..6adb03a54 100644 --- a/pkg/gui/lbl/state.go +++ b/pkg/gui/lbl/state.go @@ -167,7 +167,7 @@ func (s *State) SelectedRange() (int, int) { } } -func (s *State) CurrentLineNumber() int { +func (s *State) CurrentLineNumber() (int, error) { return s.CurrentHunk().LineNumberOfLine(s.selectedLineIdx) } diff --git a/pkg/gui/line_by_line_panel.go b/pkg/gui/line_by_line_panel.go index 7171864f4..6f93c36b9 100644 --- a/pkg/gui/line_by_line_panel.go +++ b/pkg/gui/line_by_line_panel.go @@ -208,7 +208,11 @@ func (gui *Gui) handleOpenFileAtLine() error { } // need to look at current index, then work out what my hunk's header information is, and see how far my line is away from the hunk header - lineNumber := state.CurrentLineNumber() + lineNumber, err := state.CurrentLineNumber() + if err != nil { + lineNumber = 1 + } + filenameWithLineNum := fmt.Sprintf("%s:%d", filename, lineNumber) if err := gui.OSCommand.OpenFile(filenameWithLineNum); err != nil { return err @@ -279,7 +283,10 @@ func (gui *Gui) handleLineByLineEdit() error { return nil } - lineNumber := gui.State.Panels.LineByLine.CurrentLineNumber() + lineNumber, err := gui.State.Panels.LineByLine.CurrentLineNumber() + if err != nil { + lineNumber = 1 + } return gui.editFileAtLine(file.Name, lineNumber) }