mirror of
https://gitea.com/gitea/tea.git
synced 2026-10-26 11:01:25 +01:00
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:
1 parent
12e415a7a7
commit
f02245449b
456 files changed
+18892
-34015
No files matched your search
@@ -1,213 +0,0 @@
|
||||
// Copyright 2025 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package variables
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestValidateVariableName(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
input string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "valid name",
|
||||
input: "VALID_VARIABLE_NAME",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "valid name with numbers",
|
||||
input: "VARIABLE_123",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "valid lowercase",
|
||||
input: "valid_variable",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "valid mixed case",
|
||||
input: "Mixed_Case_Variable",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "invalid - spaces",
|
||||
input: "INVALID VARIABLE",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "invalid - special chars",
|
||||
input: "INVALID-VARIABLE!",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "invalid - starts with number",
|
||||
input: "1INVALID",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "invalid - empty",
|
||||
input: "",
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
err := validateVariableName(tt.input)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("validateVariableName(%q) error = %v, wantErr %v", tt.input, err, tt.wantErr)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetVariableSourceArgs(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
args []string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "valid args",
|
||||
args: []string{"VALID_VARIABLE", "variable_value"},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "valid lowercase",
|
||||
args: []string{"valid_variable", "value"},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "missing name",
|
||||
args: []string{},
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "too many args",
|
||||
args: []string{"VARIABLE_NAME", "value", "extra"},
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "invalid variable name",
|
||||
args: []string{"invalid-variable", "value"},
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
// Test argument validation only
|
||||
if len(tt.args) == 0 {
|
||||
if !tt.wantErr {
|
||||
t.Error("Expected error for empty args")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if len(tt.args) > 2 {
|
||||
if !tt.wantErr {
|
||||
t.Error("Expected error for too many args")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Test variable name validation
|
||||
err := validateVariableName(tt.args[0])
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("validateVariableName() error = %v, wantErr %v", err, tt.wantErr)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestVariableNameValidation(t *testing.T) {
|
||||
// Test that variable names follow GitHub Actions/Gitea Actions conventions
|
||||
validNames := []string{
|
||||
"VALID_VARIABLE",
|
||||
"API_URL",
|
||||
"DATABASE_HOST",
|
||||
"VARIABLE_123",
|
||||
"mixed_Case_Variable",
|
||||
"lowercase_variable",
|
||||
"UPPERCASE_VARIABLE",
|
||||
}
|
||||
|
||||
invalidNames := []string{
|
||||
"Invalid-Dashes",
|
||||
"INVALID SPACES",
|
||||
"123_STARTS_WITH_NUMBER",
|
||||
"", // Empty
|
||||
"INVALID!@#", // Special chars
|
||||
}
|
||||
|
||||
for _, name := range validNames {
|
||||
t.Run("valid_"+name, func(t *testing.T) {
|
||||
err := validateVariableName(name)
|
||||
if err != nil {
|
||||
t.Errorf("validateVariableName(%q) should be valid, got error: %v", name, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
for _, name := range invalidNames {
|
||||
t.Run("invalid_"+name, func(t *testing.T) {
|
||||
err := validateVariableName(name)
|
||||
if err == nil {
|
||||
t.Errorf("validateVariableName(%q) should be invalid, got no error", name)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestVariableValueValidation(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
value string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "valid value",
|
||||
value: "variable123",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "valid complex value",
|
||||
value: "https://api.example.com/v1",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "valid multiline value",
|
||||
value: "line1\nline2\nline3",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "empty value allowed",
|
||||
value: "",
|
||||
wantErr: false, // Variables can be empty unlike secrets
|
||||
},
|
||||
{
|
||||
name: "whitespace only allowed",
|
||||
value: " \t\n ",
|
||||
wantErr: false, // Variables can contain whitespace
|
||||
},
|
||||
{
|
||||
name: "very long value",
|
||||
value: strings.Repeat("a", 65537), // Over 64KB
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
err := validateVariableValue(tt.value)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("validateVariableValue() error = %v, wantErr %v", err, tt.wantErr)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user