Files
yay/pkg/menus/pager_test.go
T
github-actions[bot]andJo Garnier 45964c4b42 [repo-assist] fix(diff): add --no-pager and package header to git diff (#1243) (#2905)
* fix(diff): add --no-pager and package header to git diff

Previously, each package's diff was shown via a separate `git diff`
invocation with Show(), allowing git to invoke its own pager (e.g. less)
independently for each package. This caused inconsistent pagination:
large diffs opened a pager, small diffs scrolled past in the terminal.

Changes:
- Add --no-pager flag to git diff so git doesn't open its own pager
  per package; all diffs now stream consistently to stdout.
- Print a package name header before each diff so users can easily
  identify which package each diff belongs to when reviewing multiple
  packages.

Closes #1243

* bunch up diffs and render in one go

Co-authored-by: Jo Garnier <me@jguer.space>
2026-07-19 02:23:09 +02:00

128 lines
3.4 KiB
Go

//go:build !integration
package menus
import (
"bytes"
"context"
"os/exec"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/Jguer/yay/v13/pkg/text"
)
func TestResolvePager(t *testing.T) {
// Not parallel: t.Setenv cannot be used after t.Parallel.
tests := []struct {
name string
pagerConfig string
pager string
want string
}{
{name: "config wins", pagerConfig: "delta", pager: "less", want: "delta"},
{name: "PAGER when config empty", pagerConfig: "", pager: "most", want: "most"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Setenv("PAGER", tt.pager)
assert.Equal(t, tt.want, resolvePager(tt.pagerConfig))
})
}
}
func TestCollectPkgbuildDiffs(t *testing.T) {
t.Parallel()
var warnOut bytes.Buffer
logger := text.NewLogger(&bytes.Buffer{}, &warnOut, strings.NewReader(""), false, "test")
builder := &fakeMenusCmdBuilder{
captureFn: func(cmd *exec.Cmd) (string, string, error) {
joined := strings.Join(cmd.Args, " ")
switch {
case strings.Contains(joined, "--quiet --verify AUR_SEEN"):
return "", "", nil
case strings.Contains(joined, "rev-parse AUR_SEEN HEAD@{upstream}"):
return "aaa\nbbb\n", "", nil
case strings.Contains(joined, "rev-parse AUR_SEEN"):
return "aaa\n", "", nil
case strings.Contains(joined, "--no-pager diff"):
require.Contains(t, joined, "--no-pager")
pkg := "alpha"
if strings.Contains(joined, "beta/") {
pkg = "beta"
}
return "diff for " + pkg, "", nil
default:
t.Fatalf("unexpected git args: %s", joined)
return "", "", nil
}
},
}
dirs := map[string]string{
"alpha": "/tmp/alpha",
"beta": "/tmp/beta",
}
out, errs := collectPkgbuildDiffs(context.Background(), builder, logger, dirs, []string{"alpha", "beta"})
require.Empty(t, errs)
require.Contains(t, out, "Showing diff for")
require.Contains(t, out, "diff for alpha")
require.Contains(t, out, "diff for beta")
// Headers for both packages appear before their diffs in one buffer.
alphaIdx := strings.Index(out, "diff for alpha")
betaIdx := strings.Index(out, "diff for beta")
require.Positive(t, alphaIdx)
require.Greater(t, betaIdx, alphaIdx)
}
func TestShowPkgbuildDiffsPagesOnce(t *testing.T) {
t.Parallel()
var paged strings.Builder
origRunPager := runPager
origIsTTY := isStdoutTerminal
t.Cleanup(func() {
runPager = origRunPager
isStdoutTerminal = origIsTTY
})
isStdoutTerminal = func() bool { return true }
runPager = func(_ context.Context, content, _ string) error {
paged.WriteString(content)
return nil
}
logger := text.NewLogger(&bytes.Buffer{}, &bytes.Buffer{}, strings.NewReader(""), false, "test")
builder := &fakeMenusCmdBuilder{
captureFn: func(cmd *exec.Cmd) (string, string, error) {
joined := strings.Join(cmd.Args, " ")
switch {
case strings.Contains(joined, "--quiet --verify AUR_SEEN"):
return "", "", exec.ErrNotFound // no AUR_SEEN → empty tree, always show
case strings.Contains(joined, "--no-pager diff"):
return "+++ changed", "", nil
default:
return "", "", nil
}
},
}
err := showPkgbuildDiffs(context.Background(), builder, logger,
map[string]string{"pkg": "/tmp/pkg"}, []string{"pkg"}, "")
require.NoError(t, err)
require.Contains(t, paged.String(), "+++ changed")
require.Contains(t, paged.String(), "Showing diff for")
}