feat!: rebuild tea on Cobra with explicit noun/verb commands (#1126)

- **switch tea to the Cobra command tree:** `internal/app` wires the packages from parts 1–4 into explicit noun/verb commands with `--repo`, `--json` / `--jq`, `--sudo` and `--debug`; `main.go` points at it. Build, release and docs tooling (`tools/cli-docs`, Makefile, goreleaser, snap, CI) and README / CONTRIBUTING are updated.
- **remove the urfave/cli command tree:** deletes `cmd/`, `modules/`, the old integration tests, contrib completion scripts and the generated `docs/CLI.md`, and drops their dependencies. This commit only deletes.

## Breaking changes

This is a breaking release. It requires Gitea 28 or newer; configuration moves to separate `config.yml` and `hosts.yml` files and requires fresh authentication, and command names, aliases, flags and output formats change. `docs/migration-1.0.md` maps every old command, flag and environment variable to its replacement.

## Issues

fixes #1118
fixes #1116
fixes #1115
fixes #1094
fixes #1091
fixes #1073
fixes #1052
fixes #1032
fixes #1023
fixes #966
fixes #908
fixes #833
fixes #831
fixes #817
fixes #804
fixes #779
fixes #770
fixes #737
fixes #697
fixes #726
fixes #677
fixes #672
fixes #633
fixes #632
fixes #560
fixes #556
fixes #523
fixes #516
fixes #510
fixes #504
fixes #500
fixes #482
fixes #406
fixes #403
fixes #373
fixes #351
fixes #344
fixes #326
fixes #325
fixes #323
fixes #246
fixes #240
fixes #232
fixes #197
fixes #172
fixes #141
fixes #69
fixes #1110
fixes #569
fixes #480
fixes #666
fixes #670
fixes #457
fixes #643
fixes #498
fixes #490
fixes #1069
fixes #834
fixes #602
fixes #328
fixes #417
fixes #571
fixes #1029
fixes #489
fixes #1050
fixes #162
fixes #430
fixes #1087
fixes #683

Reviewed-on: https://gitea.com/gitea/tea/pulls/1126
Reviewed-by: TheFox0x7 <95654+thefox0x7@noreply.gitea.com>
This commit is contained in:
bircni committed 2026-10-11 17:23:06 +00:00
1 parent 12e415a7a7
commit f02245449b
456 files changed
+18892 -34015

No files matched your search

-31
View File
@@ -1,31 +0,0 @@
// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package theme
import (
"os"
"charm.land/lipgloss/v2"
"golang.org/x/term"
)
// defaultDarkBackground is the background to assume when we cannot detect one. It
// matches the default lipgloss falls back to.
const defaultDarkBackground = true
// HasDarkBackground reports whether the terminal has a dark background.
//
// It only asks the terminal when stdin and stdout are both terminals. Detection
// works by writing an escape sequence to the output and waiting for the terminal
// to answer on the input, and nothing answers when stdio is redirected, so asking
// means waiting on a reply that never comes. On Windows that wait is unbounded:
// lipgloss opens the console directly rather than giving up, which is why tea used
// to hang at start-up under a service or a CI runner.
func HasDarkBackground() bool {
if !term.IsTerminal(int(os.Stdin.Fd())) || !term.IsTerminal(int(os.Stdout.Fd())) {
return defaultDarkBackground
}
return lipgloss.HasDarkBackground(os.Stdin, os.Stdout)
}
-29
View File
@@ -1,29 +0,0 @@
// Copyright 2025 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package theme
import (
"charm.land/huh/v2"
"charm.land/lipgloss/v2"
)
// TeaTheme implements the huh.Theme interface with tea-cli styling.
type TeaTheme struct{}
// Theme implements the huh.Theme interface.
func (t TeaTheme) Theme(isDark bool) *huh.Styles {
theme := huh.ThemeCharm(isDark)
lightDark := lipgloss.LightDark(isDark)
title := lightDark(lipgloss.Color("#02BA84"), lipgloss.Color("#02BF87"))
theme.Focused.Title = theme.Focused.Title.Foreground(title).Bold(true)
theme.Blurred = theme.Focused
return theme
}
// GetTheme returns the default theme for huh prompts.
func GetTheme() TeaTheme {
var t TeaTheme
return t
}
-64
View File
@@ -1,64 +0,0 @@
// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package theme
import (
"os/exec"
"slices"
"strings"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// compatPkg detects the terminal background from package-level vars, so importing
// it anywhere makes tea query the terminal before main() runs. On Windows that
// query can block forever when stdio is redirected, which hung every tea command,
// including tea --version.
//
// lipgloss.LightDark covers what we need without the package-level detection, so
// nothing in tea should depend on compat again.
const compatPkg = "charm.land/lipgloss/v2/compat"
func TestBinaryDoesNotImportLipglossCompat(t *testing.T) {
if _, err := exec.LookPath("go"); err != nil {
t.Skip("go is not on PATH")
}
out, err := exec.Command("go", "list", "-deps", "gitea.dev/tea").Output()
require.NoError(t, err, "go list -deps")
imported := slices.Contains(strings.Fields(string(out)), compatPkg)
assert.False(t, imported,
"%s is back in tea's import graph. It detects the terminal background from "+
"package-level vars, so tea queries the terminal before main() runs, and on "+
"Windows that hangs at start-up when stdio is redirected.", compatPkg)
}
// Under go test neither stdin nor stdout is a terminal, so HasDarkBackground must
// take the default and return, rather than querying and waiting for an answer.
func TestHasDarkBackgroundDoesNotBlockWithoutTTY(t *testing.T) {
done := make(chan bool, 1)
go func() {
done <- HasDarkBackground()
}()
select {
case got := <-done:
assert.Equal(t, defaultDarkBackground, got)
case <-time.After(5 * time.Second):
t.Fatal("HasDarkBackground blocked when stdio is not a terminal")
}
}
// The title color has to come from the isDark we are handed. It used to come from
// a process-wide value that compat detected at init, which ignored this argument.
func TestThemeHonorsIsDark(t *testing.T) {
dark := GetTheme().Theme(true).Focused.Title.GetForeground()
light := GetTheme().Theme(false).Focused.Title.GetForeground()
assert.NotEqual(t, dark, light, "Theme ignored isDark when picking the title color")
}