Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package pop for openSUSE:Factory checked in at 2026-04-29 19:18:14 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/pop (Old) and /work/SRC/openSUSE:Factory/.pop.new.30200 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "pop" Wed Apr 29 19:18:14 2026 rev:4 rq:1349829 version:0.2.1 Changes: -------- --- /work/SRC/openSUSE:Factory/pop/pop.changes 2024-12-03 20:49:00.599563247 +0100 +++ /work/SRC/openSUSE:Factory/.pop.new.30200/pop.changes 2026-04-29 19:19:18.244670533 +0200 @@ -1,0 +2,82 @@ +Tue Apr 28 14:34:44 UTC 2026 - Sai Karthik Karra <[email protected]> + +- Update to version 0.2.1: + * chore: lint + * chore(ci): update lint rules + * chore(deps): bump all deps, bump go version to v1.25.9 + * chore: remove CODEOWNERS + * chore(deps): bump github.com/charmbracelet/bubbles in the all group (#161) + * chore(deps): bump github.com/charmbracelet/bubbles in the all group (#159) + * chore(deps): bump github.com/yuin/goldmark in the all group (#158) + * chore(deps): bump github.com/yuin/goldmark in the all group (#157) + * chore(deps): bump github.com/spf13/cobra in the all group (#156) + * chore(deps): bump actions/checkout from 5 to 6 in the all group (#155) + * chore(deps): bump golangci/golangci-lint-action in the all group (#154) + * chore(deps): bump github.com/charmbracelet/bubbletea in the all group (#151) + * chore(deps): bump the all group with 3 updates (#150) + * chore(deps): bump actions/setup-go from 5 to 6 in the all group (#148) + * ci: sync dependabot config (#146) + * chore(deps): bump actions/checkout from 4 to 5 (#145) + * chore(deps): bump github.com/yuin/goldmark from 1.7.12 to 1.7.13 (#143) + * chore(deps): bump github.com/charmbracelet/bubbletea from 1.3.5 to 1.3.6 (#140) + * chore(deps): bump github.com/yuin/goldmark from 1.7.11 to 1.7.12 (#135) + * chore(deps): bump golangci/golangci-lint-action from 7 to 8 (#134) + * chore(deps): bump github.com/charmbracelet/bubbletea from 1.3.4 to 1.3.5 (#133) + * chore(deps): bump github.com/yuin/goldmark from 1.7.10 to 1.7.11 (#132) + * ci: sync dependabot config (#131) + * chore(deps): bump github.com/yuin/goldmark from 1.7.8 to 1.7.10 (#130) + * chore(deps): bump github.com/charmbracelet/bubbles from 0.20.0 to 0.21.0 (#129) + * chore(deps): bump golangci/golangci-lint-action from 6 to 7 (#128) + * Merge pull request #124 from jficz/fix_92 + * chore(deps): bump github.com/charmbracelet/lipgloss from 1.0.0 to 1.1.0 (#127) + * chore(deps): bump github.com/charmbracelet/bubbletea from 1.3.3 to 1.3.4 (#126) + * chore(deps): bump github.com/spf13/cobra from 1.8.1 to 1.9.1 (#123) + * ci: sync dependabot config + * feat(deps): bump github.com/charmbracelet/bubbletea from 1.3.2 to 1.3.3 (#121) + * feat(deps): bump github.com/charmbracelet/bubbletea from 1.3.0 to 1.3.2 (#120) + * feat(deps): bump github.com/charmbracelet/bubbletea from 1.2.4 to 1.3.0 (#117) + * feat(deps): bump github.com/charmbracelet/bubbletea from 1.2.3 to 1.2.4 (#113) + * feat(deps): bump github.com/charmbracelet/bubbletea from 1.2.2 to 1.2.3 (#112) + * feat(deps): bump github.com/charmbracelet/bubbletea from 1.2.1 to 1.2.2 (#111) + * feat(deps): bump github.com/charmbracelet/bubbletea from 1.2.0 to 1.2.1 (#110) + * feat(deps): bump github.com/charmbracelet/bubbletea from 1.1.2 to 1.2.0 (#109) + * feat(deps): bump github.com/charmbracelet/lipgloss from 0.13.0 to 0.13.1 (#106) + * feat(deps): bump github.com/yuin/goldmark from 1.7.4 to 1.7.8 (#105) + * feat(deps): bump github.com/charmbracelet/bubbletea from 1.1.1 to 1.1.2 (#107) + * feat(deps): bump github.com/yuin/goldmark from 1.7.2 to 1.7.4 (#85) + * feat(deps): bump github.com/charmbracelet/bubbletea from 1.1.0 to 1.1.1 (#101) + * feat(deps): bump github.com/charmbracelet/bubbles from 0.19.0 to 0.20.0 (#100) + * feat(deps): bump github.com/charmbracelet/bubbletea from 1.0.0 to 1.1.0 (#99) + * feat(deps): bump github.com/charmbracelet/bubbletea from 0.27.0 to 1.0.0 (#97) + * feat(deps): bump github.com/charmbracelet/bubbles from 0.18.0 to 0.19.0 (#93) + * feat(deps): bump github.com/charmbracelet/lipgloss from 0.12.1 to 0.13.0 (#94) + * feat(deps): bump github.com/charmbracelet/lipgloss from 0.11.0 to 0.12.1 (#90) + * chore(deps): bump golangci/golangci-lint-action from 5 to 6 (#72) + * chore(deps): bump deps + * feat(deps): bump github.com/yuin/goldmark from 1.7.1 to 1.7.2 (#78) + * feat(deps): bump github.com/spf13/cobra from 1.8.0 to 1.8.1 (#79) + * feat(deps): bump github.com/charmbracelet/x/exp/ordered (#80) + * feat: add CC and BCC inputs if --cc or --bcc is specified. (#65) + * Save email body to tmp file when error (#64) + * feat(deps): bump github.com/yuin/goldmark from 1.7.0 to 1.7.1 (#56) + * chore(deps): bump golangci/golangci-lint-action from 3 to 5 (#63) + * Correct mods example (#57) + * feat(deps): bump github.com/charmbracelet/lipgloss from 0.9.1 to 0.10.0 (#54) + * docs: update README with resend from instruction (#5) + * chore(deps): bump dependencies + * Create CODEOWNERS + * chore(deps): bump actions/setup-go from 4 to 5 (#46) + * feat(deps): bump github.com/spf13/cobra from 1.7.0 to 1.8.0 (#41) + * feat(deps): bump github.com/charmbracelet/lipgloss from 0.8.0 to 0.9.1 (#39) + * fix: `--from` should take priority over `--smtp.user` if set + * chore(deps): bump actions/checkout from 3 to 4 (#34) + * feat(deps): bump github.com/xhit/go-simple-mail/v2 from 2.15.0 to 2.16.0 (#30) + * feat(deps): bump github.com/charmbracelet/lipgloss from 0.7.1 to 0.8.0 (#32) + * fix: handle both resend and smtp set up together (#28) + * feat(deps): bump github.com/yuin/goldmark from 1.5.5 to 1.5.6 + * build: fix aur project name + * build: fix aur_key + * fix: exit status 1 when missing environment variable + * fix: remove extra completion cmd + +------------------------------------------------------------------- Old: ---- pop-0.2.0.tar.xz New: ---- pop-0.2.1.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ pop.spec ++++++ --- /var/tmp/diff_new_pack.DwtNrp/_old 2026-04-29 19:19:18.768692001 +0200 +++ /var/tmp/diff_new_pack.DwtNrp/_new 2026-04-29 19:19:18.772692166 +0200 @@ -1,7 +1,7 @@ # # spec file for package pop # -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # Copyright (c) specCURRENT_YEAR SUSE LLC # # All modifications and additions to the file contributed by third parties @@ -18,7 +18,7 @@ Name: pop -Version: 0.2.0 +Version: 0.2.1 Release: 0 Summary: Program to send emails from a terminal License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.DwtNrp/_old 2026-04-29 19:19:18.808693640 +0200 +++ /var/tmp/diff_new_pack.DwtNrp/_new 2026-04-29 19:19:18.812693804 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/charmbracelet/pop.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v0.2.0</param> + <param name="revision">v0.2.1</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> <param name="versionrewrite-pattern">v(.*)</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.DwtNrp/_old 2026-04-29 19:19:18.852695442 +0200 +++ /var/tmp/diff_new_pack.DwtNrp/_new 2026-04-29 19:19:18.872696262 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/charmbracelet/pop.git</param> - <param name="changesrevision">99f44cc8822a5ba564f0eb02b8a19b92530834d9</param></service></servicedata> + <param name="changesrevision">bf5b4738529a3fe53a23aff7bc4b9136e8f8f189</param></service></servicedata> (No newline at EOF) ++++++ pop-0.2.0.tar.xz -> pop-0.2.1.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/.github/ISSUE_TEMPLATE/bug_report.md new/pop-0.2.1/.github/ISSUE_TEMPLATE/bug_report.md --- old/pop-0.2.0/.github/ISSUE_TEMPLATE/bug_report.md 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/.github/ISSUE_TEMPLATE/bug_report.md 1970-01-01 01:00:00.000000000 +0100 @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/.github/ISSUE_TEMPLATE/feature_request.md new/pop-0.2.1/.github/ISSUE_TEMPLATE/feature_request.md --- old/pop-0.2.0/.github/ISSUE_TEMPLATE/feature_request.md 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/.github/ISSUE_TEMPLATE/feature_request.md 1970-01-01 01:00:00.000000000 +0100 @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/.github/dependabot.yml new/pop-0.2.1/.github/dependabot.yml --- old/pop-0.2.0/.github/dependabot.yml 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/.github/dependabot.yml 1970-01-01 01:00:00.000000000 +0100 @@ -1,29 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "gomod" - directory: "/" - schedule: - interval: "daily" - labels: - - "dependencies" - commit-message: - prefix: "feat" - include: "scope" - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "daily" - labels: - - "dependencies" - commit-message: - prefix: "chore" - include: "scope" - - package-ecosystem: "docker" - directory: "/" - schedule: - interval: "daily" - labels: - - "dependencies" - commit-message: - prefix: "feat" - include: "scope" \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/.github/workflows/build.yml new/pop-0.2.1/.github/workflows/build.yml --- old/pop-0.2.0/.github/workflows/build.yml 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/.github/workflows/build.yml 1970-01-01 01:00:00.000000000 +0100 @@ -1,12 +0,0 @@ -name: build - -on: [push, pull_request] - -jobs: - build: - uses: charmbracelet/meta/.github/workflows/build.yml@main - - snapshot: - uses: charmbracelet/meta/.github/workflows/snapshot.yml@main - secrets: - goreleaser_key: ${{ secrets.GORELEASER_KEY }} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/.github/workflows/goreleaser.yml new/pop-0.2.1/.github/workflows/goreleaser.yml --- old/pop-0.2.0/.github/workflows/goreleaser.yml 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/.github/workflows/goreleaser.yml 1970-01-01 01:00:00.000000000 +0100 @@ -1,24 +0,0 @@ -name: goreleaser - -on: - push: - tags: - - v*.*.* - -concurrency: - group: goreleaser - cancel-in-progress: true - -jobs: - goreleaser: - uses: charmbracelet/meta/.github/workflows/goreleaser.yml@main - secrets: - docker_username: ${{ secrets.DOCKERHUB_USERNAME }} - docker_token: ${{ secrets.DOCKERHUB_TOKEN }} - gh_pat: ${{ secrets.PERSONAL_ACCESS_TOKEN }} - goreleaser_key: ${{ secrets.GORELEASER_KEY }} - fury_token: ${{ secrets.FURY_TOKEN }} - nfpm_gpg_key: ${{ secrets.NFPM_GPG_KEY }} - nfpm_passphrase: ${{ secrets.NFPM_PASSPHRASE }} - -# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/.github/workflows/lint.yml new/pop-0.2.1/.github/workflows/lint.yml --- old/pop-0.2.0/.github/workflows/lint.yml 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/.github/workflows/lint.yml 1970-01-01 01:00:00.000000000 +0100 @@ -1,21 +0,0 @@ -name: lint -on: - push: - pull_request: - -jobs: - golangci: - name: lint - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-go@v4 - with: - go-version: ^1 - - name: golangci-lint - uses: golangci/golangci-lint-action@v3 - with: - # Optional: golangci-lint command line arguments. - args: --issues-exit-code=0 - # Optional: show only new issues if it's a pull request. The default value is `false`. - only-new-issues: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/.github/workflows/nightly.yml new/pop-0.2.1/.github/workflows/nightly.yml --- old/pop-0.2.0/.github/workflows/nightly.yml 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/.github/workflows/nightly.yml 1970-01-01 01:00:00.000000000 +0100 @@ -1,14 +0,0 @@ -name: nightly - -on: - push: - branches: - - main - -jobs: - nightly: - uses: charmbracelet/meta/.github/workflows/nightly.yml@main - secrets: - docker_username: ${{ secrets.DOCKERHUB_USERNAME }} - docker_token: ${{ secrets.DOCKERHUB_TOKEN }} - goreleaser_key: ${{ secrets.GORELEASER_KEY }} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/.gitignore new/pop-0.2.1/.gitignore --- old/pop-0.2.0/.gitignore 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/.gitignore 1970-01-01 01:00:00.000000000 +0100 @@ -1,5 +0,0 @@ -*.gif -*.pdf -dist -completions -manpages diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/.golangci.yml new/pop-0.2.1/.golangci.yml --- old/pop-0.2.0/.golangci.yml 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/.golangci.yml 2026-04-28 16:16:02.000000000 +0200 @@ -1,25 +1,22 @@ +version: "2" run: tests: false - -issues: - include: - - EXC0001 - - EXC0005 - - EXC0011 - - EXC0012 - - EXC0013 - - max-issues-per-linter: 0 - max-same-issues: 0 - linters: enable: - bodyclose - - exportloopref - - goimports + - exhaustive + - goconst + - godot + - gomoddirectives + - goprintffuncname - gosec + - misspell + - nakedret + - nestif - nilerr - - predeclared + - noctx + - nolintlint + - prealloc - revive - rowserrcheck - sqlclosecheck @@ -27,3 +24,24 @@ - unconvert - unparam - whitespace + - wrapcheck + exclusions: + rules: + - text: '(slog|log)\.\w+' + linters: + - noctx + generated: lax + presets: + - common-false-positives + settings: + exhaustive: + default-signifies-exhaustive: true +issues: + max-issues-per-linter: 0 + max-same-issues: 0 +formatters: + enable: + - gofumpt + - goimports + exclusions: + generated: lax diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/.goreleaser.yml new/pop-0.2.1/.goreleaser.yml --- old/pop-0.2.0/.goreleaser.yml 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/.goreleaser.yml 2026-04-28 16:16:02.000000000 +0200 @@ -12,4 +12,4 @@ maintainer: "Maas Lalani <[email protected]>" brew_commit_author_name: "Maas Lalani" brew_commit_author_email: "[email protected]" - aur_project_name: charm-pop-bin + aur_project_name: charm-pop diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/README.md new/pop-0.2.1/README.md --- old/pop-0.2.0/README.md 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/README.md 2026-04-28 16:16:02.000000000 +0200 @@ -72,6 +72,9 @@ export [email protected] export POP_SIGNATURE="Sent with [Pop](https://github.com/charmbracelet/pop)!" ``` +> **Note**: +> If you wish to use a resend account without a custom domain, you can use +> `[email protected]` to send emails. ## Installation @@ -112,7 +115,7 @@ > Use the `--preview` flag to preview the email and make changes before > sending. ```bash -pop <<< '$(mods -f "Explain why CLIs are awesome")' \ +pop <<< "$(mods -f 'Explain why CLIs are awesome')" \ --subject "The command line is the best" \ --preview ``` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/attachments.go new/pop-0.2.1/attachments.go --- old/pop-0.2.0/attachments.go 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/attachments.go 2026-04-28 16:16:02.000000000 +0200 @@ -1,3 +1,4 @@ +// Package main implements Pop, a tool for sending emails from your terminal. package main import ( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/email.go new/pop-0.2.1/email.go --- old/pop-0.2.0/email.go 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/email.go 2026-04-28 16:16:02.000000000 +0200 @@ -4,6 +4,7 @@ "bytes" "crypto/tls" "errors" + "fmt" "os" "path/filepath" "strings" @@ -48,15 +49,21 @@ err = errors.New("[ERROR]: unknown delivery method") } if err != nil { + path, storeErr := saveTmp(m.Body.Value()) + if storeErr == nil { + err = fmt.Errorf("%w\nEmail saved to: %s", err, path) + } return sendEmailFailureMsg(err) } return sendEmailSuccessMsg{} } } -const gmailSuffix = "@gmail.com" -const gmailSMTPHost = "smtp.gmail.com" -const gmailSMTPPort = 587 +const ( + gmailSuffix = "@gmail.com" + gmailSMTPHost = "smtp.gmail.com" + gmailSMTPPort = 587 +) func sendSMTPEmail(to, cc, bcc []string, from, subject, body string, attachments []string) error { server := mail.NewSMTPClient() @@ -95,9 +102,8 @@ } smtpClient, err := server.Connect() - if err != nil { - return err + return fmt.Errorf("connecting to SMTP server: %w", err) } email := mail.NewMSG() @@ -123,10 +129,10 @@ }) } - return email.Send(smtpClient) + return fmt.Errorf("sending email: %w", email.Send(smtpClient)) } -func sendResendEmail(to, _, _ []string, from, subject, body string, attachments []string) error { +func sendResendEmail(to, cc, bcc []string, from, subject, body string, attachments []string) error { client := resend.NewClient(resendAPIKey) html := bytes.NewBufferString("") @@ -151,6 +157,8 @@ From: from, To: to, Subject: subject, + Cc: cc, + Bcc: bcc, Html: html.String(), Text: body, Attachments: makeAttachments(attachments), @@ -158,7 +166,7 @@ _, err := client.Emails.Send(request) if err != nil { - return err + return fmt.Errorf("sending email via Resend: %w", err) } return nil @@ -183,3 +191,20 @@ return attachments } + +// saveTmp is a helper function that stores a string in a temporary file. +// It returns the path of the file created. +func saveTmp(s string) (string, error) { + f, err := os.CreateTemp("", fmt.Sprintf("pop-%s-*.txt", time.Now().Format("2006-01-02"))) + if err != nil { + return "", fmt.Errorf("creating temp file: %w", err) + } + defer func() { _ = f.Close() }() + + _, err = f.WriteString(s) + if err != nil { + return "", fmt.Errorf("error writing to %s: %w", f.Name(), err) + } + + return f.Name(), nil +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/go.mod new/pop-0.2.1/go.mod --- old/pop-0.2.0/go.mod 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/go.mod 2026-04-28 16:16:02.000000000 +0200 @@ -1,44 +1,47 @@ module github.com/charmbracelet/pop -go 1.19 +go 1.25.9 require ( - github.com/charmbracelet/bubbles v0.16.2-0.20230711184233-0bdcc628fb8f - github.com/charmbracelet/bubbletea v0.24.3-0.20230710130425-c4c83ba757f8 - github.com/charmbracelet/lipgloss v0.7.1 - github.com/charmbracelet/x/exp/ordered v0.0.0-20230707174939-50fb4f48b5b3 - github.com/muesli/mango-cobra v1.2.0 + github.com/charmbracelet/bubbles v1.0.0 + github.com/charmbracelet/bubbletea v1.3.10 + github.com/charmbracelet/lipgloss v1.1.0 + github.com/charmbracelet/x/exp/ordered v0.1.0 + github.com/muesli/mango-cobra v1.3.0 github.com/muesli/roff v0.1.0 github.com/resendlabs/resend-go v1.7.0 - github.com/spf13/cobra v1.7.0 - github.com/xhit/go-simple-mail/v2 v2.15.0 - github.com/yuin/goldmark v1.5.5 + github.com/spf13/cobra v1.10.2 + github.com/xhit/go-simple-mail/v2 v2.16.0 + github.com/yuin/goldmark v1.8.2 ) require ( github.com/atotto/clipboard v0.1.4 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect - github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect + github.com/charmbracelet/colorprofile v0.4.3 // indirect + github.com/charmbracelet/x/ansi v0.11.7 // indirect + github.com/charmbracelet/x/cellbuf v0.0.15 // indirect + github.com/charmbracelet/x/term v0.2.2 // indirect + github.com/clipperhouse/displaywidth v0.11.0 // indirect + github.com/clipperhouse/uax29/v2 v2.7.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/go-test/deep v1.1.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/lucasb-eyer/go-colorful v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.22 // indirect github.com/mattn/go-localereader v0.0.1 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.23 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect - github.com/muesli/mango v0.1.0 // indirect - github.com/muesli/mango-pflag v0.1.0 // indirect - github.com/muesli/reflow v0.3.0 // indirect - github.com/muesli/termenv v0.15.2 // indirect - github.com/rivo/uniseg v0.4.4 // indirect - github.com/sahilm/fuzzy v0.1.1-0.20230530133925-c48e322e2a8f // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/toorop/go-dkim v0.0.0-20201103131630-e1cd1a0a5208 // indirect - golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/term v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect + github.com/muesli/mango v0.2.0 // indirect + github.com/muesli/mango-pflag v0.2.0 // indirect + github.com/muesli/termenv v0.16.0 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/sahilm/fuzzy v0.1.1 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/toorop/go-dkim v0.0.0-20250226130143-9025cce95817 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + golang.org/x/sys v0.43.0 // indirect + golang.org/x/text v0.36.0 // indirect ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/go.sum new/pop-0.2.1/go.sum --- old/pop-0.2.0/go.sum 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/go.sum 2026-04-28 16:16:02.000000000 +0200 @@ -1,84 +1,101 @@ +github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= +github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= -github.com/charmbracelet/bubbles v0.16.2-0.20230711184233-0bdcc628fb8f h1:LaLDdRQ4Ob5/J2s+FIjuW1v55HrtxAM9h4bws5cjsj8= -github.com/charmbracelet/bubbles v0.16.2-0.20230711184233-0bdcc628fb8f/go.mod h1:XUdibuVUiMfcfKTRla58bmY3TWsdjgF+Rp8pvimQLck= -github.com/charmbracelet/bubbletea v0.24.3-0.20230710130425-c4c83ba757f8 h1:rPWhtGCoYYodPCkDzC/BKEjape4a6uWAMFPd5lA0iv8= -github.com/charmbracelet/bubbletea v0.24.3-0.20230710130425-c4c83ba757f8/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg= -github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E= -github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c= -github.com/charmbracelet/x/exp/ordered v0.0.0-20230707174939-50fb4f48b5b3 h1:n1M8YLRcevMcCxr3vdLjtcrwVBwQpnbZU9IWvTxNhXw= -github.com/charmbracelet/x/exp/ordered v0.0.0-20230707174939-50fb4f48b5b3/go.mod h1:PHXDBVg6d66dpDTqESmefHTluiCgsCWPNtXA6g1ePGU= -github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= -github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/aymanbagabas/go-udiff v0.3.1 h1:LV+qyBQ2pqe0u42ZsUEtPiCaUoqgA9gYRDs3vj1nolY= +github.com/aymanbagabas/go-udiff v0.3.1/go.mod h1:G0fsKmG+P6ylD0r6N/KgQD/nWzgfnl8ZBcNLgcbrw8E= +github.com/charmbracelet/bubbles v1.0.0 h1:12J8/ak/uCZEMQ6KU7pcfwceyjLlWsDLAxB5fXonfvc= +github.com/charmbracelet/bubbles v1.0.0/go.mod h1:9d/Zd5GdnauMI5ivUIVisuEm3ave1XwXtD1ckyV6r3E= +github.com/charmbracelet/bubbletea v1.3.10 h1:otUDHWMMzQSB0Pkc87rm691KZ3SWa4KUlvF9nRvCICw= +github.com/charmbracelet/bubbletea v1.3.10/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4= +github.com/charmbracelet/colorprofile v0.4.3 h1:QPa1IWkYI+AOB+fE+mg/5/4HRMZcaXex9t5KX76i20Q= +github.com/charmbracelet/colorprofile v0.4.3/go.mod h1:/zT4BhpD5aGFpqQQqw7a+VtHCzu+zrQtt1zhMt9mR4Q= +github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= +github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= +github.com/charmbracelet/x/ansi v0.11.7 h1:kzv1kJvjg2S3r9KHo8hDdHFQLEqn4RBCb39dAYC84jI= +github.com/charmbracelet/x/ansi v0.11.7/go.mod h1:9qGpnAVYz+8ACONkZBUWPtL7lulP9No6p1epAihUZwQ= +github.com/charmbracelet/x/cellbuf v0.0.15 h1:ur3pZy0o6z/R7EylET877CBxaiE1Sp1GMxoFPAIztPI= +github.com/charmbracelet/x/cellbuf v0.0.15/go.mod h1:J1YVbR7MUuEGIFPCaaZ96KDl5NoS0DAWkskup+mOY+Q= +github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91 h1:payRxjMjKgx2PaCWLZ4p3ro9y97+TVLZNaRZgJwSVDQ= +github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= +github.com/charmbracelet/x/exp/ordered v0.1.0 h1:55/qLwjIh0gL0Vni+QAWk7T/qRVP6sBf+2agPBgnOFE= +github.com/charmbracelet/x/exp/ordered v0.1.0/go.mod h1:5UHwmG+is5THxMyCJHNPCn2/ecI07aKNrW+LcResjJ8= +github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk= +github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= +github.com/clipperhouse/displaywidth v0.11.0 h1:lBc6kY44VFw+TDx4I8opi/EtL9m20WSEFgwIwO+UVM8= +github.com/clipperhouse/displaywidth v0.11.0/go.mod h1:bkrFNkf81G8HyVqmKGxsPufD3JhNl3dSqnGhOoSD/o0= +github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= +github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= -github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lucasb-eyer/go-colorful v1.4.0 h1:UtrWVfLdarDgc44HcS7pYloGHJUjHV/4FwW4TvVgFr4= +github.com/lucasb-eyer/go-colorful v1.4.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4= +github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.23 h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw= +github.com/mattn/go-runewidth v0.0.23/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= -github.com/muesli/mango v0.1.0 h1:DZQK45d2gGbql1arsYA4vfg4d7I9Hfx5rX/GCmzsAvI= -github.com/muesli/mango v0.1.0/go.mod h1:5XFpbC8jY5UUv89YQciiXNlbi+iJgt29VDC5xbzrLL4= -github.com/muesli/mango-cobra v1.2.0 h1:DQvjzAM0PMZr85Iv9LIMaYISpTOliMEg+uMFtNbYvWg= -github.com/muesli/mango-cobra v1.2.0/go.mod h1:vMJL54QytZAJhCT13LPVDfkvCUJ5/4jNUKF/8NC2UjA= -github.com/muesli/mango-pflag v0.1.0 h1:UADqbYgpUyRoBja3g6LUL+3LErjpsOwaC9ywvBWe7Sg= -github.com/muesli/mango-pflag v0.1.0/go.mod h1:YEQomTxaCUp8PrbhFh10UfbhbQrM/xJ4i2PB8VTLLW0= -github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= -github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= +github.com/muesli/mango v0.2.0 h1:iNNc0c5VLQ6fsMgAqGQofByNUBH2Q2nEbD6TaI+5yyQ= +github.com/muesli/mango v0.2.0/go.mod h1:5XFpbC8jY5UUv89YQciiXNlbi+iJgt29VDC5xbzrLL4= +github.com/muesli/mango-cobra v1.3.0 h1:vQy5GvPg3ndOSpduxutqFoINhWk3vD5K2dXo5E8pqec= +github.com/muesli/mango-cobra v1.3.0/go.mod h1:Cj1ZrBu3806Qw7UjxnAUgE+7tllUBj1NCLQDwwGx19E= +github.com/muesli/mango-pflag v0.2.0 h1:QViokgKDZQCzKhYe1zH8D+UlPJzBSGoP9yx0hBG0t5k= +github.com/muesli/mango-pflag v0.2.0/go.mod h1:X9LT1p/pbGA1wjvEbtwnixujKErkP0jVmrxwrw3fL0Y= github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8= github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig= -github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= -github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= +github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= +github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/resendlabs/resend-go v1.7.0 h1:DycOqSXtw2q7aB+Nt9DDJUDtaYcrNPGn1t5RFposas0= github.com/resendlabs/resend-go v1.7.0/go.mod h1:yip1STH7Bqfm4fD0So5HgyNbt5taG5Cplc4xXxETyLI= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sahilm/fuzzy v0.1.1-0.20230530133925-c48e322e2a8f h1:MvTmaQdww/z0Q4wrYjDSCcZ78NoftLQyHBSLW/Cx79Y= -github.com/sahilm/fuzzy v0.1.1-0.20230530133925-c48e322e2a8f/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/sahilm/fuzzy v0.1.1 h1:ceu5RHF8DGgoi+/dR5PsECjCDH1BE3Fnmpo7aVXOdRA= +github.com/sahilm/fuzzy v0.1.1/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/toorop/go-dkim v0.0.0-20201103131630-e1cd1a0a5208 h1:PM5hJF7HVfNWmCjMdEfbuOBNXSVF2cMFGgQTPdKCbwM= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/toorop/go-dkim v0.0.0-20201103131630-e1cd1a0a5208/go.mod h1:BzWtXXrXzZUvMacR0oF/fbDDgUPO8L36tDMmRAf14ns= -github.com/xhit/go-simple-mail/v2 v2.15.0 h1:qMXeqcZErUW/Dw6EXxmPuxHzVI8MdxWnEnu2xcisohU= -github.com/xhit/go-simple-mail/v2 v2.15.0/go.mod h1:b7P5ygho6SYE+VIqpxA6QkYfv4teeyG4MKqB3utRu98= -github.com/yuin/goldmark v1.5.5 h1:IJznPe8wOzfIKETmMkd06F8nXkmlhaHqFRM9l1hAGsU= -github.com/yuin/goldmark v1.5.5/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea h1:vLCWI/yYrdEHyN2JzIzPO3aaQJHQdp89IZBA/+azVC4= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +github.com/toorop/go-dkim v0.0.0-20250226130143-9025cce95817 h1:q0hKh5a5FRkhuTb5JNfgjzpzvYLHjH0QOgPZPYnRWGA= +github.com/toorop/go-dkim v0.0.0-20250226130143-9025cce95817/go.mod h1:BzWtXXrXzZUvMacR0oF/fbDDgUPO8L36tDMmRAf14ns= +github.com/xhit/go-simple-mail/v2 v2.16.0 h1:ouGy/Ww4kuaqu2E2UrDw7SvLaziWTB60ICLkIkNVccA= +github.com/xhit/go-simple-mail/v2 v2.16.0/go.mod h1:b7P5ygho6SYE+VIqpxA6QkYfv4teeyG4MKqB3utRu98= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/yuin/goldmark v1.8.2 h1:kEGpgqJXdgbkhcOgBxkC0X0PmoPG1ZyoZ117rDVp4zE= +github.com/yuin/goldmark v1.8.2/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/go.work new/pop-0.2.1/go.work --- old/pop-0.2.0/go.work 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/go.work 1970-01-01 01:00:00.000000000 +0100 @@ -1,5 +0,0 @@ -go 1.19 - -use ( - . -) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/go.work.sum new/pop-0.2.1/go.work.sum --- old/pop-0.2.0/go.work.sum 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/go.work.sum 1970-01-01 01:00:00.000000000 +0100 @@ -1,20 +0,0 @@ -github.com/toorop/go-dkim v0.0.0-20201103131630-e1cd1a0a5208 h1:PM5hJF7HVfNWmCjMdEfbuOBNXSVF2cMFGgQTPdKCbwM= -github.com/toorop/go-dkim v0.0.0-20201103131630-e1cd1a0a5208/go.mod h1:BzWtXXrXzZUvMacR0oF/fbDDgUPO8L36tDMmRAf14ns= -github.com/xhit/go-simple-mail/v2 v2.15.0 h1:qMXeqcZErUW/Dw6EXxmPuxHzVI8MdxWnEnu2xcisohU= -github.com/xhit/go-simple-mail/v2 v2.15.0/go.mod h1:b7P5ygho6SYE+VIqpxA6QkYfv4teeyG4MKqB3utRu98= -github.com/yuin/goldmark v1.5.4/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.5.5 h1:IJznPe8wOzfIKETmMkd06F8nXkmlhaHqFRM9l1hAGsU= -github.com/yuin/goldmark v1.5.5/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb h1:xIApU0ow1zwMa2uL1VDNeQlNVFTWMQxZUZCMDy0Q4Us= -golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/main.go new/pop-0.2.1/main.go --- old/pop-0.2.0/main.go 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/main.go 2026-04-28 16:16:02.000000000 +0200 @@ -1,6 +1,7 @@ package main import ( + "errors" "fmt" "io" "os" @@ -42,7 +43,7 @@ const PopSMTPPassword = "POP_SMTP_PASSWORD" //nolint:gosec // PopSMTPEncryption is the encryption type for the SMTP server if the user is using the SMTP delivery method. -const PopSMTPEncryption = "POP_SMTP_ENCRYPTION" //nolint:gosec +const PopSMTPEncryption = "POP_SMTP_ENCRYPTION" // PopSMTPInsecureSkipVerify is whether or not to skip TLS verification for the // SMTP server if the user is using the SMTP delivery method. @@ -72,26 +73,41 @@ Use: "pop", Short: "Send emails from your terminal", Long: `Pop is a tool for sending emails from your terminal.`, - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(cmd *cobra.Command, _ []string) error { var deliveryMethod DeliveryMethod switch { + case resendAPIKey != "" && smtpUsername != "" && smtpPassword != "": + deliveryMethod = Unknown case resendAPIKey != "": deliveryMethod = Resend case smtpUsername != "" && smtpPassword != "": deliveryMethod = SMTP - from = smtpUsername + if from == "" { + from = smtpUsername + } } - if deliveryMethod == None { + switch deliveryMethod { + case None: fmt.Printf("\n %s %s %s\n\n", errorHeaderStyle.String(), inlineCodeStyle.Render(ResendAPIKey), "environment variable is required.") fmt.Printf(" %s %s\n\n", commentStyle.Render("You can grab one at"), linkStyle.Render("https://resend.com/api-keys")) - return nil + cmd.SilenceUsage = true + cmd.SilenceErrors = true + return errors.New("missing required environment variable") + case Unknown: + fmt.Printf("\n %s Unknown delivery method.\n", errorHeaderStyle.String()) + fmt.Printf("\n You have set both %s and %s delivery methods.", inlineCodeStyle.Render(ResendAPIKey), inlineCodeStyle.Render("POP_SMPT_*")) + fmt.Printf("\n Set only one of these environment variables.\n\n") + cmd.SilenceUsage = true + cmd.SilenceErrors = true + return errors.New("unknown delivery method") + case Resend, SMTP: } - if hasStdin() { + if body == "" && hasStdin() { b, err := io.ReadAll(os.Stdin) if err != nil { - return err + return fmt.Errorf("reading stdin: %w", err) } body = string(b) } @@ -123,6 +139,8 @@ p := tea.NewProgram(NewModel(resend.SendEmailRequest{ From: from, To: to, + Bcc: bcc, + Cc: cc, Subject: subject, Text: body, Attachments: makeAttachments(attachments), @@ -130,7 +148,7 @@ m, err := p.Run() if err != nil { - return err + return fmt.Errorf("running program: %w", err) } mm := m.(Model) if !mm.abort { @@ -150,36 +168,13 @@ // Version stores the build version of VHS at the time of package through // -ldflags. // - // go build -ldflags "-s -w -X=main.Version=$(VERSION)" + // go build -ldflags "-s -w -X=main.Version=$(VERSION)". Version string // CommitSHA stores the git commit SHA at the time of package through -ldflags. CommitSHA string ) -// CompletionCmd is the cobra command for generating completion scripts. -var CompletionCmd = &cobra.Command{ - Use: "completion [bash|zsh|fish|powershell]", - Short: "Generate completion script", - Long: `To load completions`, - DisableFlagsInUseLine: true, - ValidArgs: []string{"bash", "zsh", "fish", "powershell"}, - Args: cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs), - RunE: func(cmd *cobra.Command, args []string) error { - switch args[0] { - case "bash": - return rootCmd.GenBashCompletion(os.Stdout) - case "zsh": - return rootCmd.GenZshCompletion(os.Stdout) - case "fish": - return rootCmd.GenFishCompletion(os.Stdout, true) - case "powershell": - return rootCmd.GenPowerShellCompletion(os.Stdout) - } - return nil - }, -} - // ManCmd is the cobra command for the manual. var ManCmd = &cobra.Command{ Use: "man", @@ -187,10 +182,10 @@ Long: `To generate the man page`, Args: cobra.NoArgs, Hidden: true, - RunE: func(cmd *cobra.Command, args []string) error { - page, err := mcobra.NewManPage(1, rootCmd) // . + RunE: func(_ *cobra.Command, _ []string) error { + page, err := mcobra.NewManPage(1, rootCmd) if err != nil { - return err + return fmt.Errorf("generating man page: %w", err) } page = page.WithSection("Copyright", "© 2023 Charmbracelet, Inc.\n"+"Released under MIT License.") @@ -200,7 +195,7 @@ } func init() { - rootCmd.AddCommand(CompletionCmd, ManCmd) + rootCmd.AddCommand(ManCmd) rootCmd.Flags().StringSliceVar(&bcc, "bcc", []string{}, "BCC recipients") rootCmd.Flags().StringSliceVar(&cc, "cc", []string{}, "CC recipients") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/model.go new/pop-0.2.1/model.go --- old/pop-0.2.0/model.go 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/model.go 2026-04-28 16:16:02.000000000 +0200 @@ -23,6 +23,8 @@ const ( editingFrom State = iota editingTo + editingCc + editingBcc editingSubject editingBody editingAttachments @@ -41,6 +43,9 @@ Resend // SMTP uses an SMTP server to send an email. SMTP + // Unknown is set when the user has not chosen a single delivery method. + // i.e. multiple delivery methods are set. + Unknown ) // Model is Pop's application model. @@ -65,8 +70,9 @@ // This is a list of file paths which are picked with a filepicker. Attachments list.Model - Cc textinput.Model - Bcc textinput.Model + showCc bool + Cc textinput.Model + Bcc textinput.Model // filepicker is used to pick file attachments. filepicker filepicker.Model @@ -83,7 +89,6 @@ from := textinput.New() from.Prompt = "From " from.Placeholder = "[email protected]" - from.PromptStyle = labelStyle.Copy() from.PromptStyle = labelStyle from.TextStyle = textStyle from.Cursor.Style = cursorStyle @@ -92,16 +97,34 @@ to := textinput.New() to.Prompt = "To " - to.PromptStyle = labelStyle.Copy() + to.PromptStyle = labelStyle to.Cursor.Style = cursorStyle to.PlaceholderStyle = placeholderStyle to.TextStyle = textStyle to.Placeholder = "[email protected]" to.SetValue(strings.Join(defaults.To, ToSeparator)) + cc := textinput.New() + cc.Prompt = "Cc " + cc.PromptStyle = labelStyle + cc.Cursor.Style = cursorStyle + cc.PlaceholderStyle = placeholderStyle + cc.TextStyle = textStyle + cc.Placeholder = "[email protected]" + cc.SetValue(strings.Join(defaults.Cc, ToSeparator)) + + bcc := textinput.New() + bcc.Prompt = "Bcc " + bcc.PromptStyle = labelStyle + bcc.Cursor.Style = cursorStyle + bcc.PlaceholderStyle = placeholderStyle + bcc.TextStyle = textStyle + bcc.Placeholder = "[email protected]" + bcc.SetValue(strings.Join(defaults.Bcc, ToSeparator)) + subject := textinput.New() subject.Prompt = "Subject " - subject.PromptStyle = labelStyle.Copy() + subject.PromptStyle = labelStyle subject.Cursor.Style = cursorStyle subject.PlaceholderStyle = placeholderStyle subject.TextStyle = textStyle @@ -169,6 +192,9 @@ state: state, From: from, To: to, + showCc: len(cc.Value()) > 0 || len(bcc.Value()) > 0, + Cc: cc, + Bcc: bcc, Subject: subject, Body: body, Attachments: attachments, @@ -194,7 +220,7 @@ type clearErrMsg struct{} func clearErrAfter(d time.Duration) tea.Cmd { - return tea.Tick(d, func(t time.Time) tea.Msg { + return tea.Tick(d, func(_ time.Time) tea.Msg { return clearErrMsg{} }) } @@ -210,7 +236,7 @@ m.state = editingFrom m.focusActiveInput() m.err = msg - return m, clearErrAfter(5 * time.Second) + return m, clearErrAfter(10 * time.Second) case clearErrMsg: m.err = nil case tea.KeyMsg: @@ -222,6 +248,14 @@ m.state = editingTo m.To.Focus() case editingTo: + if m.showCc { + m.state = editingCc + } else { + m.state = editingSubject + } + case editingCc: + m.state = editingBcc + case editingBcc: m.state = editingSubject case editingSubject: m.state = editingBody @@ -231,6 +265,7 @@ m.state = hoveringSendButton case hoveringSendButton: m.state = editingFrom + case pickingFile, sendingEmail: } m.focusActiveInput() @@ -241,14 +276,23 @@ m.state = hoveringSendButton case editingTo: m.state = editingFrom - case editingSubject: + case editingCc: m.state = editingTo + case editingBcc: + m.state = editingCc + case editingSubject: + if m.showCc { + m.state = editingBcc + } else { + m.state = editingTo + } case editingBody: m.state = editingSubject case editingAttachments: m.state = editingBody case hoveringSendButton: m.state = editingAttachments + case pickingFile, sendingEmail: } m.focusActiveInput() @@ -283,6 +327,12 @@ cmds = append(cmds, cmd) m.To, cmd = m.To.Update(msg) cmds = append(cmds, cmd) + if m.showCc { + m.Cc, cmd = m.Cc.Update(msg) + cmds = append(cmds, cmd) + m.Bcc, cmd = m.Bcc.Update(msg) + cmds = append(cmds, cmd) + } m.Subject, cmd = m.Subject.Update(msg) cmds = append(cmds, cmd) m.Body, cmd = m.Body.Update(msg) @@ -304,6 +354,7 @@ case sendingEmail: m.loadingSpinner, cmd = m.loadingSpinner.Update(msg) cmds = append(cmds, cmd) + case editingFrom, editingTo, editingCc, editingBcc, editingSubject, editingBody, hoveringSendButton: } m.help, cmd = m.help.Update(msg) @@ -317,8 +368,18 @@ m.To.Blur() m.Subject.Blur() m.Body.Blur() + if m.showCc { + m.Cc.Blur() + m.Bcc.Blur() + } m.From.PromptStyle = labelStyle m.To.PromptStyle = labelStyle + if m.showCc { + m.Cc.PromptStyle = labelStyle + m.Cc.TextStyle = textStyle + m.Bcc.PromptStyle = labelStyle + m.Bcc.TextStyle = textStyle + } m.Subject.PromptStyle = labelStyle m.From.TextStyle = textStyle m.To.TextStyle = textStyle @@ -339,6 +400,16 @@ m.To.TextStyle = activeTextStyle m.To.Focus() m.To.CursorEnd() + case editingCc: + m.Cc.PromptStyle = activeLabelStyle + m.Cc.TextStyle = activeTextStyle + m.Cc.Focus() + m.Cc.CursorEnd() + case editingBcc: + m.Bcc.PromptStyle = activeLabelStyle + m.Bcc.TextStyle = activeTextStyle + m.Bcc.Focus() + m.Bcc.CursorEnd() case editingSubject: m.Subject.PromptStyle = activeLabelStyle m.Subject.TextStyle = activeTextStyle @@ -350,6 +421,7 @@ case editingAttachments: m.Attachments.Styles.Title = activeLabelStyle m.Attachments.SetDelegate(attachmentDelegate{true}) + case hoveringSendButton, pickingFile, sendingEmail: } } @@ -365,6 +437,7 @@ "\n\n" + m.filepicker.View() case sendingEmail: return "\n " + m.loadingSpinner.View() + "Sending email" + case editingFrom, editingTo, editingCc, editingBcc, editingSubject, editingBody, editingAttachments, hoveringSendButton: } var s strings.Builder @@ -373,6 +446,12 @@ s.WriteString("\n") s.WriteString(m.To.View()) s.WriteString("\n") + if m.showCc { + s.WriteString(m.Cc.View()) + s.WriteString("\n") + s.WriteString(m.Bcc.View()) + s.WriteString("\n") + } s.WriteString(m.Subject.View()) s.WriteString("\n\n") s.WriteString(m.Body.View()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pop-0.2.0/style.go new/pop-0.2.1/style.go --- old/pop-0.2.0/style.go 2023-08-01 14:32:31.000000000 +0200 +++ new/pop-0.2.1/style.go 2026-04-28 16:16:02.000000000 +0200 @@ -1,3 +1,4 @@ +// Package main implements Pop, a tool for sending emails from your terminal. package main import ( @@ -6,12 +7,14 @@ "github.com/charmbracelet/lipgloss" ) -const accentColor = lipgloss.Color("99") -const yellowColor = lipgloss.Color("#ECFD66") -const whiteColor = lipgloss.Color("255") -const grayColor = lipgloss.Color("241") -const darkGrayColor = lipgloss.Color("236") -const lightGrayColor = lipgloss.Color("247") +const ( + accentColor = lipgloss.Color("99") + yellowColor = lipgloss.Color("#ECFD66") + whiteColor = lipgloss.Color("255") + grayColor = lipgloss.Color("241") + darkGrayColor = lipgloss.Color("236") + lightGrayColor = lipgloss.Color("247") +) var ( activeTextStyle = lipgloss.NewStyle().Foreground(whiteColor) ++++++ vendor.tar.gz ++++++ ++++ 100781 lines of diff (skipped)
