diff --git a/pkg/gui/main_panels.go b/pkg/gui/main_panels.go index 9279f9ae5..c48f01b19 100644 --- a/pkg/gui/main_panels.go +++ b/pkg/gui/main_panels.go @@ -70,6 +70,10 @@ func (gui *Gui) RefreshMainView(opts *types.ViewUpdateOpts, context types.Contex if mainContext := gui.mainContextForView(view); mainContext != nil { mainContext.SetContentIsDiff(types.ContentIsDiff(opts.Task)) + // A diff is wrapped as the user asks; anything else a main pane shows is prose + // or a log, and reads as badly cut off at the edge of the pane as it would + // anywhere else. + view.Wrap = !mainContext.ContentIsDiff() || gui.c.UserConfig().Gui.WrapLinesInDiffView } if err := gui.runTaskForView(view, opts.Task); err != nil { diff --git a/pkg/integration/components/view_driver.go b/pkg/integration/components/view_driver.go index e270e75d9..7f2ebf322 100644 --- a/pkg/integration/components/view_driver.go +++ b/pkg/integration/components/view_driver.go @@ -217,6 +217,38 @@ func (self *ViewDriver) ContainsLines(matchers ...*TextMatcher) *ViewDriver { return self } +// asserts that somewhere in the view there are consecutive lines matching the given +// matchers, taking the lines as the view lays them out rather than as its content has +// them: a line of content too long for a view that wraps is several of these. +func (self *ViewDriver) ContainsViewLines(matchers ...*TextMatcher) *ViewDriver { + self.validateMatchersPassed(matchers) + + self.t.assertWithRetries(func() (bool, string) { + lines := self.getView().ViewBufferLines() + + for i := range len(lines) - len(matchers) + 1 { + matches := true + for j, matcher := range matchers { + if ok, _ := matcher.test(lines[i+j]); !ok { + matches = false + break + } + } + if matches { + return true, "" + } + } + + return false, fmt.Sprintf( + "Expected the following view lines:\n-----\n%s\n-----\nBut got:\n-----\n%s\n-----", + expectedContentFromMatchers(matchers), + strings.Join(lines, "\n"), + ) + }) + + return self +} + func (self *ViewDriver) ContainsColoredText(fgColorStr string, text string) *ViewDriver { self.t.assertWithRetries(func() (bool, string) { view := self.getView() diff --git a/pkg/integration/tests/main_view/wrap_only_the_diff.go b/pkg/integration/tests/main_view/wrap_only_the_diff.go new file mode 100644 index 000000000..95294d0ce --- /dev/null +++ b/pkg/integration/tests/main_view/wrap_only_the_diff.go @@ -0,0 +1,42 @@ +package main_view + +import ( + "strings" + + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var longLine = "start " + strings.Repeat("word ", 40) + "end" + +var WrapOnlyTheDiff = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Turning wrapping off for diffs leaves everything else the main view shows wrapped", + ExtraCmdArgs: []string{}, + Skip: false, + SetupConfig: func(cfg *config.AppConfig) { + cfg.GetUserConfig().Gui.WrapLinesInDiffView = false + }, + SetupRepo: func(shell *Shell) { + shell.CreateFileAndAdd("file1", "one\n") + shell.Commit(longLine) + + shell.UpdateFile("file1", "one\n"+longLine+"\n") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + // The option is about diffs, so the added line runs off the edge of the pane in + // one piece. + t.Views().Files(). + IsFocused(). + Tap(func() { + t.Views().Main().ContainsViewLines(Contains("start").Contains("end")) + }) + + // A branch's commit log is no diff, and the option leaves it alone: the same + // text is laid out over as many lines as it takes. + t.Views().Branches(). + Focus() + + t.Views().Main(). + ContainsViewLines(Contains("end").DoesNotContain("start")) + }, +}) diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go index 11f31755a..dcfcf9466 100644 --- a/pkg/integration/tests/test_list.go +++ b/pkg/integration/tests/test_list.go @@ -482,6 +482,7 @@ var tests = []*components.IntegrationTest{ main_view.StageUnderUnsupportedDiffRenderer, main_view.StartPatchFromAnotherCommit, main_view.UnstageDiffLines, + main_view.WrapOnlyTheDiff, misc.ConfirmOnQuit, misc.CopyConfirmationMessageToClipboard, misc.CopyToClipboard,