Skip to content

Commit 66788be

Browse files
Merge branch 'main' into feature/add-copy-to-clipboard
2 parents 87af18f + 6fba2eb commit 66788be

File tree

9 files changed

+102
-141
lines changed

9 files changed

+102
-141
lines changed

.github/workflows/build.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,21 @@ jobs:
2727

2828
#- name: Test
2929
# run: go test -v -cover -timeout=30s ./...
30+
dependabot:
31+
needs: [build]
32+
runs-on: ubuntu-latest
33+
permissions:
34+
pull-requests: write
35+
contents: write
36+
if: ${{ github.actor == 'dependabot[bot]' && github.event_name == 'pull_request'}}
37+
steps:
38+
- id: metadata
39+
uses: dependabot/fetch-metadata@v2
40+
with:
41+
github-token: "${{ secrets.GITHUB_TOKEN }}"
42+
- run: |
43+
gh pr review --approve "$PR_URL"
44+
gh pr merge --squash --auto "$PR_URL"
45+
env:
46+
PR_URL: ${{github.event.pull_request.html_url}}
47+
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

CONTRIBUTING.md

Lines changed: 0 additions & 3 deletions
This file was deleted.

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,12 @@ Here's what an example configuration looks like:
358358
}
359359
```
360360

361+
## Contributing
362+
363+
See [contributing][contribute].
364+
365+
[contribute]: https://github.com/charmbracelet/freeze/contribute
366+
361367
## Feedback
362368

363369
We’d love to hear your thoughts on this project. Feel free to drop us a note!

error.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,22 @@ import (
88
)
99

1010
var (
11-
errorHeader = lipgloss.NewStyle().Foreground(lipgloss.Color("#F1F1F1")).Background(lipgloss.Color("#FF5F87")).Bold(true).Padding(0, 1).Margin(1).MarginLeft(2).SetString("ERROR")
12-
errorDetails = lipgloss.NewStyle().Foreground(lipgloss.Color("#757575")).Margin(0, 0, 1, 2)
11+
errorHeader = lipgloss.NewStyle().
12+
Foreground(lipgloss.Color("#F1F1F1")).
13+
Background(lipgloss.Color("#FF5F87")).
14+
Bold(true).
15+
Padding(0, 1).
16+
Margin(1).
17+
MarginLeft(2).
18+
SetString("ERROR")
19+
errorDetails = lipgloss.NewStyle().
20+
Foreground(lipgloss.Color("#757575")).
21+
MarginLeft(2)
1322
)
1423

1524
func printError(title string, err error) {
16-
fmt.Printf("%s\n", lipgloss.JoinHorizontal(lipgloss.Center, errorHeader.String(), title))
17-
fmt.Printf("%s\n", errorDetails.Render(err.Error()))
25+
fmt.Println(lipgloss.JoinHorizontal(lipgloss.Center, errorHeader.String(), title))
26+
fmt.Println(errorDetails.Render(err.Error()))
1827
}
1928

2029
func printErrorFatal(title string, err error) {

go.mod

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@ go 1.21.0
55
toolchain go1.22.5
66

77
require (
8-
github.com/adrg/xdg v0.5.0
9-
github.com/alecthomas/chroma/v2 v2.14.0
10-
github.com/alecthomas/kong v1.2.1
8+
github.com/adrg/xdg v0.5.3
9+
github.com/alecthomas/chroma/v2 v2.15.0
10+
github.com/alecthomas/kong v1.6.1
1111
github.com/aymanbagabas/go-udiff v0.2.0
1212
github.com/beevik/etree v1.4.1
1313
github.com/caarlos0/go-shellwords v1.0.12
1414
github.com/charmbracelet/huh v0.6.0
15-
github.com/charmbracelet/lipgloss v0.13.0
15+
github.com/charmbracelet/lipgloss v1.0.0
1616
github.com/charmbracelet/log v0.4.0
17-
github.com/charmbracelet/x/ansi v0.3.2
18-
github.com/charmbracelet/x/exp/term v0.0.0-20240403043919-dea9035a27d4
19-
github.com/creack/pty v1.1.23
17+
github.com/charmbracelet/x/ansi v0.4.2
18+
github.com/charmbracelet/x/term v0.2.1
19+
github.com/charmbracelet/x/xpty v0.1.1
2020
github.com/kanrichan/resvg-go v0.0.2-0.20231001163256-63db194ca9f5
2121
github.com/mattn/go-isatty v0.0.20
2222
github.com/mattn/go-runewidth v0.0.16
@@ -30,10 +30,12 @@ require (
3030
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
3131
github.com/catppuccin/go v0.2.0 // indirect
3232
github.com/charmbracelet/bubbles v0.20.0 // indirect
33-
github.com/charmbracelet/bubbletea v1.1.0 // indirect
33+
github.com/charmbracelet/bubbletea v1.1.2 // indirect
34+
github.com/charmbracelet/x/conpty v0.1.0 // indirect
3435
github.com/charmbracelet/x/errors v0.0.0-20240906161213-162f3037fef5 // indirect
3536
github.com/charmbracelet/x/exp/strings v0.0.0-20240906161213-162f3037fef5 // indirect
36-
github.com/charmbracelet/x/term v0.2.0 // indirect
37+
github.com/charmbracelet/x/termios v0.1.0 // indirect
38+
github.com/creack/pty v1.1.24 // indirect
3739
github.com/dlclark/regexp2 v1.11.4 // indirect
3840
github.com/dustin/go-humanize v1.0.1 // indirect
3941
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
@@ -51,5 +53,6 @@ require (
5153
golang.org/x/image v0.14.0 // indirect
5254
golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a // indirect
5355
golang.org/x/sync v0.8.0 // indirect
56+
golang.org/x/sys v0.28.0 // indirect
5457
golang.org/x/text v0.18.0 // indirect
5558
)

go.sum

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
22
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
3-
github.com/adrg/xdg v0.5.0 h1:dDaZvhMXatArP1NPHhnfaQUqWBLBsmx1h1HXQdMoFCY=
4-
github.com/adrg/xdg v0.5.0/go.mod h1:dDdY4M4DF9Rjy4kHPeNL+ilVF+p2lK8IdM9/rTSGcI4=
5-
github.com/alecthomas/assert/v2 v2.10.0 h1:jjRCHsj6hBJhkmhznrCzoNpbA3zqy0fYiUcYZP/GkPY=
6-
github.com/alecthomas/assert/v2 v2.10.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
7-
github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E=
8-
github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I=
9-
github.com/alecthomas/kong v1.2.1 h1:E8jH4Tsgv6wCRX2nGrdPyHDUCSG83WH2qE4XLACD33Q=
10-
github.com/alecthomas/kong v1.2.1/go.mod h1:rKTSFhbdp3Ryefn8x5MOEprnRFQ7nlmMC01GKhehhBM=
3+
github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78=
4+
github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ=
5+
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
6+
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
7+
github.com/alecthomas/chroma/v2 v2.15.0 h1:LxXTQHFoYrstG2nnV9y2X5O94sOBzf0CIUpSTbpxvMc=
8+
github.com/alecthomas/chroma/v2 v2.15.0/go.mod h1:gUhVLrPDXPtp/f+L1jo9xepo9gL4eLwRuGAunSZMkio=
9+
github.com/alecthomas/kong v1.6.1 h1:/7bVimARU3uxPD0hbryPE8qWrS3Oz3kPQoxA/H2NKG8=
10+
github.com/alecthomas/kong v1.6.1/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU=
1111
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
1212
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
1313
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
@@ -24,26 +24,30 @@ github.com/catppuccin/go v0.2.0 h1:ktBeIrIP42b/8FGiScP9sgrWOss3lw0Z5SktRoithGA=
2424
github.com/catppuccin/go v0.2.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc=
2525
github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE=
2626
github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU=
27-
github.com/charmbracelet/bubbletea v1.1.0 h1:FjAl9eAL3HBCHenhz/ZPjkKdScmaS5SK69JAK2YJK9c=
28-
github.com/charmbracelet/bubbletea v1.1.0/go.mod h1:9Ogk0HrdbHolIKHdjfFpyXJmiCzGwy+FesYkZr7hYU4=
27+
github.com/charmbracelet/bubbletea v1.1.2 h1:naQXF2laRxyLyil/i7fxdpiz1/k06IKquhm4vBfHsIc=
28+
github.com/charmbracelet/bubbletea v1.1.2/go.mod h1:9HIU/hBV24qKjlehyj8z1r/tR9TYTQEag+cWZnuXo8E=
2929
github.com/charmbracelet/huh v0.6.0 h1:mZM8VvZGuE0hoDXq6XLxRtgfWyTI3b2jZNKh0xWmax8=
3030
github.com/charmbracelet/huh v0.6.0/go.mod h1:GGNKeWCeNzKpEOh/OJD8WBwTQjV3prFAtQPpLv+AVwU=
31-
github.com/charmbracelet/lipgloss v0.13.0 h1:4X3PPeoWEDCMvzDvGmTajSyYPcZM4+y8sCA/SsA3cjw=
32-
github.com/charmbracelet/lipgloss v0.13.0/go.mod h1:nw4zy0SBX/F/eAO1cWdcvy6qnkDUxr8Lw7dvFrAIbbY=
31+
github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg=
32+
github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo=
3333
github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM=
3434
github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM=
35-
github.com/charmbracelet/x/ansi v0.3.2 h1:wsEwgAN+C9U06l9dCVMX0/L3x7ptvY1qmjMwyfE6USY=
36-
github.com/charmbracelet/x/ansi v0.3.2/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
35+
github.com/charmbracelet/x/ansi v0.4.2 h1:0JM6Aj/g/KC154/gOP4vfxun0ff6itogDYk41kof+qk=
36+
github.com/charmbracelet/x/ansi v0.4.2/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
37+
github.com/charmbracelet/x/conpty v0.1.0 h1:4zc8KaIcbiL4mghEON8D72agYtSeIgq8FSThSPQIb+U=
38+
github.com/charmbracelet/x/conpty v0.1.0/go.mod h1:rMFsDJoDwVmiYM10aD4bH2XiRgwI7NYJtQgl5yskjEQ=
3739
github.com/charmbracelet/x/errors v0.0.0-20240906161213-162f3037fef5 h1:rIt3LGU1yOC7U48eZjaAtjdzuSjH6Y0GA1KsRN7wqn8=
3840
github.com/charmbracelet/x/errors v0.0.0-20240906161213-162f3037fef5/go.mod h1:2P0UgXMEa6TsToMSuFqKFQR+fZTO9CNGUNokkPatT/0=
3941
github.com/charmbracelet/x/exp/strings v0.0.0-20240906161213-162f3037fef5 h1:73C9VsX8PMlXxVMKjg7ix67cZWg+zySdyzWRaXS239A=
4042
github.com/charmbracelet/x/exp/strings v0.0.0-20240906161213-162f3037fef5/go.mod h1:pBhA0ybfXv6hDjQUZ7hk1lVxBiUbupdw5R31yPUViVQ=
41-
github.com/charmbracelet/x/exp/term v0.0.0-20240403043919-dea9035a27d4 h1:LewLBFkff+bCxgMZn1m8xNYQbUksWaY71d1QARHA11s=
42-
github.com/charmbracelet/x/exp/term v0.0.0-20240403043919-dea9035a27d4/go.mod h1:6GZ13FjIP6eOCqWU4lqgveGnYxQo9c3qBzHPeFu4HBE=
43-
github.com/charmbracelet/x/term v0.2.0 h1:cNB9Ot9q8I711MyZ7myUR5HFWL/lc3OpU8jZ4hwm0x0=
44-
github.com/charmbracelet/x/term v0.2.0/go.mod h1:GVxgxAbjUrmpvIINHIQnJJKpMlHiZ4cktEQCN6GWyF0=
45-
github.com/creack/pty v1.1.23 h1:4M6+isWdcStXEf15G/RbrMPOQj1dZ7HPZCGwE4kOeP0=
46-
github.com/creack/pty v1.1.23/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE=
43+
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
44+
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
45+
github.com/charmbracelet/x/termios v0.1.0 h1:y4rjAHeFksBAfGbkRDmVinMg7x7DELIGAFbdNvxg97k=
46+
github.com/charmbracelet/x/termios v0.1.0/go.mod h1:H/EVv/KRnrYjz+fCYa9bsKdqF3S8ouDK0AZEbG7r+/U=
47+
github.com/charmbracelet/x/xpty v0.1.1 h1:A3DxWhvNjSkBR8/thRTcVnJ5bdv7OXRmChdMKtsi/5M=
48+
github.com/charmbracelet/x/xpty v0.1.1/go.mod h1:jnu0EnSUYO5l+BExMLFiKVgpGPPV/RT2+6LYyCyf8zs=
49+
github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s=
50+
github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE=
4751
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4852
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4953
github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo=
@@ -101,8 +105,8 @@ golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
101105
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
102106
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
103107
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
104-
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
105-
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
108+
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
109+
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
106110
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
107111
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
108112
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ func main() {
8585
if config.Execute != "" {
8686
input, err = executeCommand(config)
8787
if err != nil {
88+
if input != "" {
89+
err = fmt.Errorf("%w\n%s", err, input)
90+
}
8891
printErrorFatal("Something went wrong", err)
8992
}
9093
if input == "" {

pty.go

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,53 @@
1-
//go:build !windows
2-
// +build !windows
3-
41
package main
52

63
import (
74
"bytes"
85
"context"
6+
"fmt"
97
"io"
108
"os"
119
"os/exec"
12-
"syscall"
1310

1411
"github.com/caarlos0/go-shellwords"
15-
"github.com/creack/pty"
12+
"github.com/charmbracelet/x/term"
13+
"github.com/charmbracelet/x/xpty"
1614
)
1715

18-
// runInPty opens a new pty and runs the given command in it.
19-
// The returned file is the pty's file descriptor and must be closed by the
20-
// caller.
21-
func (cfg Config) runInPty(c *exec.Cmd) (*os.File, error) {
22-
//nolint: wrapcheck
23-
return pty.StartWithAttrs(c, &pty.Winsize{
24-
Cols: 80,
25-
Rows: 10,
26-
X: uint16(cfg.Width),
27-
}, &syscall.SysProcAttr{})
28-
}
29-
3016
func executeCommand(config Config) (string, error) {
3117
args, err := shellwords.Parse(config.Execute)
3218
if err != nil {
33-
return "", err //nolint: wrapcheck
19+
return "", fmt.Errorf("could not execute: %w", err)
3420
}
21+
3522
ctx, cancel := context.WithTimeout(context.Background(), config.ExecuteTimeout)
3623
defer cancel()
3724

38-
cmd := exec.CommandContext(ctx, args[0], args[1:]...) //nolint: gosec
39-
pty, err := config.runInPty(cmd)
25+
width, height, err := term.GetSize(os.Stdout.Fd())
4026
if err != nil {
41-
return "", err
27+
width = 80
28+
height = 24
4229
}
43-
defer pty.Close() //nolint: errcheck
30+
31+
pty, err := xpty.NewPty(width, height)
32+
if err != nil {
33+
return "", fmt.Errorf("could not execute: %w", err)
34+
}
35+
defer func() { _ = pty.Close() }()
36+
37+
cmd := exec.CommandContext(ctx, args[0], args[1:]...) //nolint: gosec
38+
if err := pty.Start(cmd); err != nil {
39+
return "", fmt.Errorf("could not execute: %w", err)
40+
}
41+
4442
var out bytes.Buffer
43+
var errorOut bytes.Buffer
4544
go func() {
4645
_, _ = io.Copy(&out, pty)
46+
errorOut.Write(out.Bytes())
4747
}()
4848

49-
err = cmd.Wait()
50-
if err != nil {
51-
return "", err //nolint: wrapcheck
49+
if err := xpty.WaitProcess(ctx, cmd); err != nil {
50+
return errorOut.String(), fmt.Errorf("could not execute: %w", err)
5251
}
5352
return out.String(), nil
5453
}

pty_windows.go

Lines changed: 0 additions & 78 deletions
This file was deleted.

0 commit comments

Comments
 (0)