Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .goreleaser.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ builds:
flags:
- -trimpath
ldflags:
- -s -w
- -s -w -X github.com/satococoa/git-worktreeinclude/internal/cli.Version={{ .Version }}

archives:
- id: default
Expand Down
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,15 @@ Example:

## Commands

### `git-worktreeinclude --version`

Print the installed version.

```sh
git-worktreeinclude --version
git-worktreeinclude -v
```

### `git-worktreeinclude apply`

Uses the current worktree as target and copies from source worktree.
Expand Down
4 changes: 4 additions & 0 deletions internal/cli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ type App struct {
engine *engine.Engine
}

// Version is injected at build time via ldflags. Default is for local builds.
var Version = "dev"

func New(stdout, stderr io.Writer) *App {
return &App{
stdout: stdout,
Expand Down Expand Up @@ -51,6 +54,7 @@ func (a *App) newRootCommand() *ucli.Command {
return &ucli.Command{
Name: "git-worktreeinclude",
Usage: "apply ignored files listed in .worktreeinclude between Git worktrees",
Version: Version,
Writer: a.stdout,
ErrWriter: a.stderr,
OnUsageError: a.onUsageError,
Expand Down
23 changes: 23 additions & 0 deletions internal/cli/cli_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,29 @@ func TestRootCommandHelpAndNoImplicitApply(t *testing.T) {
}
}

func TestRootVersionFlags(t *testing.T) {
fx := setupFixture(t)
prefix := "git-worktreeinclude version "

for _, args := range [][]string{{"--version"}, {"-v"}} {
stdout, stderr, code := runCmd(t, fx.wt, nil, testBinary, args...)
if code != 0 {
t.Fatalf("version command failed for %v: code=%d stderr=%s", args, code, stderr)
}
if strings.TrimSpace(stderr) != "" {
t.Fatalf("expected empty stderr for %v, got %q", args, stderr)
}

line := strings.TrimSpace(stdout)
if !strings.HasPrefix(line, prefix) {
t.Fatalf("unexpected version output for %v: %q", args, line)
}
if strings.TrimSpace(strings.TrimPrefix(line, prefix)) == "" {
t.Fatalf("version value is empty for %v: %q", args, line)
}
}
}

func TestUnknownSubcommandAtRoot(t *testing.T) {
fx := setupFixture(t)

Expand Down
38 changes: 38 additions & 0 deletions internal/cli/cli_unit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,44 @@ func TestRunRootHelp(t *testing.T) {
}
}

func TestRunRootVersion(t *testing.T) {
oldVersion := Version
Version = "test-version"
defer func() {
Version = oldVersion
}()

var stdout bytes.Buffer
var stderr bytes.Buffer
app := New(&stdout, &stderr)

code := app.Run([]string{"--version"})
if code != exitcode.OK {
t.Fatalf("Run returned %d, want %d", code, exitcode.OK)
}
if strings.TrimSpace(stderr.String()) != "" {
t.Fatalf("stderr should be empty: %q", stderr.String())
}
if got := strings.TrimSpace(stdout.String()); got != "git-worktreeinclude version test-version" {
t.Fatalf("stdout = %q, want %q", got, "git-worktreeinclude version test-version")
}

stdout.Reset()
stderr.Reset()
app = New(&stdout, &stderr)

code = app.Run([]string{"-v"})
if code != exitcode.OK {
t.Fatalf("Run returned %d for -v, want %d", code, exitcode.OK)
}
if strings.TrimSpace(stderr.String()) != "" {
t.Fatalf("stderr should be empty for -v: %q", stderr.String())
}
if got := strings.TrimSpace(stdout.String()); got != "git-worktreeinclude version test-version" {
t.Fatalf("stdout for -v = %q, want %q", got, "git-worktreeinclude version test-version")
}
}

func TestRunApplyRejectsQuietVerbose(t *testing.T) {
var stdout bytes.Buffer
var stderr bytes.Buffer
Expand Down