Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
23 changes: 23 additions & 0 deletions internal/cli/cli_unit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,29 @@ 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")
}
Comment thread
satococoa marked this conversation as resolved.
}

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