Skip to content

feat: add verbose migrator mode and default target#170

Merged
ReneWerner87 merged 7 commits into
masterfrom
codex/2025-08-23-15-05-02
Aug 23, 2025
Merged

feat: add verbose migrator mode and default target#170
ReneWerner87 merged 7 commits into
masterfrom
codex/2025-08-23-15-05-02

Conversation

@ReneWerner87
Copy link
Copy Markdown
Member

@ReneWerner87 ReneWerner87 commented Aug 23, 2025

Summary

  • run lint and tests by default
  • add verbose flag to migrations and print skip info only when enabled
  • default migration target to latest Fiber version when not specified

Testing

  • go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.0 run ./... (fails: can't load config: the Go language version (go1.23) used to build golangci-lint is lower than the targeted Go version (1.25))
  • go run gotest.tools/gotestsum@latest -f testname -- ./... -race -count=1 -shuffle=on

https://chatgpt.com/codex/tasks/task_e_68a9d60ef28c8326ba8676d97aa139d6

Summary by CodeRabbit

  • New Features

    • Added a --verbose (-v) option to show detailed migration output (including skipped steps).
    • Migrations now default to targeting the latest available release when no target is provided; help text updated.
  • Documentation

    • Added repository guidelines recommending Makefile commands and enforcing lint/test runs.
  • Tests

    • Added tests for verbose migration output and default-to-latest behavior.
    • Adjusted test helper argument handling to ensure empty-args are passed explicitly.
  • Chores

    • Makefile: introduced a TOOLCHAIN variable and updated lint invocation.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Aug 23, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Adds AGENTS.md and a verbose flag to the migrate CLI and migration internals; migrate defaults to the latest Fiber release when --to is omitted. Updates DoMigration signature to accept verbose, changes skip-path logging to honor verbose, and adds tests for verbose output and default-target resolution.

Changes

Cohort / File(s) Summary
Documentation
AGENTS.md
New repository guidelines doc with three bullets recommending use of Makefile commands and running make lint and make test.
Migration engine internals
cmd/internal/migrations/.../lists.go
DoMigration signature extended with verbose bool; skip-path logging now emits messages only when verbose is true; core migration behavior otherwise unchanged.
CLI migrate command
cmd/migrate.go
Adds --verbose / -v flag and MigrateOptions.Verbose; when --to is omitted, resolves latest Fiber via LatestFiberVersion() and errors on failure; passes verbose into DoMigration; help text updated.
Tests
cmd/internal/migrations/lists_test.go, cmd/migrate_test.go, cmd/tester_test.go
New Test_DoMigration_Verbose (silent vs verbose output); new Test_Migrate_DefaultTarget (stubs GitHub release to assert default-target and go.mod update); runCobraCmd adjusted to call SetArgs([]string{}) when no args.
Build tooling
Makefile
Adds TOOLCHAIN ?= go1.25.0 and prefixes lint invocation with GOTOOLCHAIN=$(TOOLCHAIN); minor help-target whitespace tweak.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User
  participant CLI as Cobra CLI
  participant RunE as migrateRunE
  participant GH as LatestFiberVersion()
  participant Mig as migrations.DoMigration
  participant FS as filesystem / go.mod

  User->>CLI: run "migrate [--to X] [-v] [--skip-go-mod]"
  CLI->>RunE: parse flags (to, verbose, skip-go-mod)
  alt target provided
    RunE->>RunE: use provided target
  else target omitted
    RunE->>GH: fetch latest Fiber release (HTTP)
    GH-->>RunE: semver or error
    alt fetch success
      RunE->>RunE: set target = latest
    else fetch fail
      RunE-->>User: error and exit
    end
  end
  RunE->>Mig: DoMigration(cmd, cwd, curr, target, skipGoMod, verbose)
  alt verbose = true
    Mig->>CLI: log skip messages and migration steps
  else verbose = false
    Mig->>CLI: suppress skip messages
  end
  Mig->>FS: possibly update go.mod (if not skipped)
  Mig-->>RunE: result
  RunE-->>User: final status
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

I twitch my whiskers, hop and prance,
Verbose or quiet, I give change a glance.
If "to" is missing, I sniff and find,
The latest Fiber neatly left behind.
Skip notes sing when I declare—hip hop hooray! 🐇✨

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch codex/2025-08-23-15-05-02

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai or @coderabbitai title anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-actions github-actions Bot added the ✏️ Feature New feature or request label Aug 23, 2025
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary of Changes

Hello @ReneWerner87, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request enhances the migrate command by introducing a verbose mode for more detailed output during migrations and by making the target version optional, defaulting to the latest Fiber version if not specified. Additionally, it introduces a new AGENTS.md file to document repository guidelines for linting and testing.

Highlights

  • Enhanced Migration Output: The migrate command now supports a --verbose flag, allowing users to see detailed information, such as skipped migrations, during the migration process.
  • Flexible Migration Targeting: The --to flag for the migrate command is no longer mandatory; if omitted, the command will automatically determine and apply migrations to the latest available Fiber version.
  • New Repository Contribution Guidelines: A new AGENTS.md file has been added, providing clear instructions for running golangci-lint and gotestsum to ensure code quality and test coverage.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a verbose mode for migrations and sets the latest Fiber version as the default migration target. These are valuable additions that improve the user experience of the CLI. The implementation is solid, with good error handling and comprehensive tests for the new functionality. I have one suggestion for the newly added AGENTS.md file to ensure the provided commands are runnable.

Comment thread AGENTS.md Outdated
@@ -0,0 +1,3 @@
# Repository Guidelines
- Always run `go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.0 run ./...`
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The specified golangci-lint version v1.62.0 appears to be incorrect and will cause the command to fail due to Go version incompatibility, as noted in the pull request description. The project targets Go 1.25, but this version of the linter is built with Go 1.23. To ensure the command works, please use a golangci-lint version compatible with Go 1.25. Using @latest is a good practice to avoid such issues in the future.

Suggested change
- Always run `go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.0 run ./...`
- Always run `go run github.com/golangci/golangci-lint/cmd/golangci-lint@latest run ./...`

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
AGENTS.md (1)

1-4: Fix markdownlint failures (MD022, MD032) by adding blank lines around heading and list.

The pipeline is red due to missing blank lines before/after the heading and around the list. Apply the diff below.

-# Repository Guidelines
-- Always run `go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.0 run ./...`
-- Always run `go run gotest.tools/gotestsum@latest -f testname -- ./... -race -count=1 -shuffle=on`
+# Repository Guidelines
+
+- Always run `go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.0 run ./...`
+- Always run `go run gotest.tools/gotestsum@latest -f testname -- ./... -race -count=1 -shuffle=on`
+
🧹 Nitpick comments (5)
AGENTS.md (1)

2-3: Prevent golangci-lint Go toolchain mismatch; document a reliable invocation.

Given the PR description’s failure (“Go version used to build golangci-lint is lower than targeted 1.25”), make the guidance resilient across environments by pinning/forcing the toolchain when running via go run.

- - Always run `go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.0 run ./...`
+ - Always run `GOTOOLCHAIN=go1.25 go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.0 run ./...`
- - Always run `go run gotest.tools/gotestsum@latest -f testname -- ./... -race -count=1 -shuffle=on`
+ - Always run `GOTOOLCHAIN=go1.25 go run gotest.tools/gotestsum@latest -f testname -- ./... -race -count=1 -shuffle=on`

Optionally add a note under the list:

+
+Note: If you encounter “can't load config: the Go language version used to build golangci-lint is lower than the targeted Go version”, ensure your local Go toolchain is ≥ 1.25 or prefix the commands with `GOTOOLCHAIN=go1.25` as shown above.
cmd/internal/migrations/lists.go (1)

93-95: Verbose-only skip logging looks good; consider printing executed steps when verbose.

You print skipped migrations when verbose is on. For symmetry and better traceability, optionally also print the names of executed migration functions when verbose.

-        if fromC.Check(curr) && toC.Check(target) {
-            for _, fn := range m.Functions {
+        if fromC.Check(curr) && toC.Check(target) {
+            if verbose {
+                cmd.Printf("Running migration from %s to %s (%d step(s))\n", m.From, m.To, len(m.Functions))
+            }
+            for _, fn := range m.Functions {
                 if err := fn(cmd, cwd, curr, target); err != nil {
                     return err
                 }
             }
cmd/internal/migrations/lists_test.go (1)

15-38: Parallelize subtests for better concurrency.

Top-level t.Parallel() is good; also mark each subtest with t.Parallel() to avoid accidental serialization.

 t.Run("silent", func(t *testing.T) {
+    t.Parallel()
     var buf bytes.Buffer
     cmd := &cobra.Command{}
     cmd.SetOut(&buf)
     require.NoError(t, migrations.DoMigration(cmd, dir, curr, target, true, false))
     assert.Equal(t, "", buf.String())
 })
 
 t.Run("verbose", func(t *testing.T) {
+    t.Parallel()
     var buf bytes.Buffer
     cmd := &cobra.Command{}
     cmd.SetOut(&buf)
     require.NoError(t, migrations.DoMigration(cmd, dir, curr, target, true, true))
     out := buf.String()
     assert.Contains(t, out, "Skipping migration from >=1.0.0 to >=0.0.0-0")
     assert.Contains(t, out, "Skipping migration from >=2.0.0 to <4.0.0-0")
 })
cmd/migrate.go (2)

31-35: Avoid network call during command construction; simplify help text.

Fetching the latest version in newMigrateCmd() makes command creation perform network I/O and can cause test fragility/offline flakiness. The runtime already resolves latest when the flag is empty, so keep the help text static.

-    latestFiberVersion, err := LatestFiberVersion()
-    if err != nil {
-        latestFiberVersion = ""
-    }
-
-    cmd.Flags().StringVarP(&targetVersionS, "to", "t", "", "Migrate to a specific version. Default: latest ("+latestFiberVersion+")")
+    cmd.Flags().StringVarP(&targetVersionS, "to", "t", "", "Migrate to a specific version. Default: latest")

91-97: Guard prevMajor under force path (edge-case hardening).

If ever used with a target major of 0 or 1, prevMajor := targetVersion.Major() - 1 could underflow or become invalid. Not an issue for Fiber v2→v3, but cheap to harden.

-    prevMajor := targetVersion.Major() - 1
+    prevMajor := targetVersion.Major() - 1
+    if prevMajor < 0 {
+        return fmt.Errorf("invalid previous major version computed from target %s", opts.TargetVersionS)
+    }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between d4d9bb7 and 633ca4e.

📒 Files selected for processing (5)
  • AGENTS.md (1 hunks)
  • cmd/internal/migrations/lists.go (2 hunks)
  • cmd/internal/migrations/lists_test.go (1 hunks)
  • cmd/migrate.go (5 hunks)
  • cmd/migrate_test.go (2 hunks)
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: 2024-11-15T07:56:21.623Z
Learnt from: ReneWerner87
PR: gofiber/fiber#3161
File: app.go:923-932
Timestamp: 2024-11-15T07:56:21.623Z
Learning: In the Fiber framework, breaking changes are acceptable when moving from version 2 to version 3, including modifications to method signatures such as in the `Test` method in `app.go`.

Applied to files:

  • cmd/migrate_test.go
📚 Learning: 2024-10-08T19:06:06.583Z
Learnt from: sixcolors
PR: gofiber/fiber#2922
File: middleware/cors/utils.go:63-71
Timestamp: 2024-10-08T19:06:06.583Z
Learning: The project uses the testify/assert package for assertions in unit tests.

Applied to files:

  • cmd/migrate_test.go
📚 Learning: 2024-10-02T23:03:31.727Z
Learnt from: sixcolors
PR: gofiber/fiber#3016
File: middleware/session/store.go:164-167
Timestamp: 2024-10-02T23:03:31.727Z
Learning: Unit tests in this project use testify require.

Applied to files:

  • cmd/migrate_test.go
🧬 Code graph analysis (2)
cmd/internal/migrations/lists_test.go (1)
cmd/internal/migrations/lists.go (1)
  • DoMigration (76-105)
cmd/migrate.go (2)
cmd/version.go (1)
  • LatestFiberVersion (67-69)
cmd/internal/migrations/lists.go (1)
  • DoMigration (76-105)
🪛 LanguageTool
AGENTS.md

[grammar] ~1-~1: There might be a mistake here.
Context: # Repository Guidelines - Always run `go run github.com/golangci/golangci-li...

(QB_NEW_EN)

🪛 GitHub Check: markdownlint
AGENTS.md

[failure] 2-2: Lists should be surrounded by blank lines
AGENTS.md:2 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "- Always run `go run github.co..."] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md032.md


[failure] 1-1: Headings should be surrounded by blank lines
AGENTS.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "# Repository Guidelines"] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md022.md

🪛 GitHub Actions: markdownlint
AGENTS.md

[error] 1-1: MD022: Headings should be surrounded by blank lines. Context: '# Repository Guidelines'

🪛 GitHub Check: lint
cmd/internal/migrations/lists.go

[failure] 76-76:
File is not properly formatted (gofumpt)

cmd/internal/migrations/lists_test.go

[failure] 15-15:
Test_DoMigration_Verbose's subtests should call t.Parallel (tparallel)

🪛 GitHub Actions: golangci-lint
cmd/internal/migrations/lists.go

[error] 76-76: golangci-lint run: File is not properly formatted (gofumpt) in cmd/internal/migrations/lists.go.

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build (1.25.x, windows-latest)
🔇 Additional comments (6)
cmd/internal/migrations/lists.go (2)

76-76: DoMigration signature usage verified

All call sites have been updated to include the new verbose parameter:

  • cmd/migrate.go (line 99):
    err = migrations.DoMigration(cmd, wd, migrateFrom, targetVersion, opts.SkipGoMod, opts.Verbose)
  • cmd/internal/migrations/lists_test.go (lines 25 & 33):
    require.NoError(t, migrations.DoMigration(cmd, dir, curr, target, true, false))
    require.NoError(t, migrations.DoMigration(cmd, dir, curr, target, true, true))

No other calls to DoMigration were found without six arguments.


76-105: Formatting Violation: gofumpt/gofmt Required

CI is flagging cmd/internal/migrations/lists.go as not formatted according to gofumpt/gofmt. Please run the following locally and commit the resulting changes to unblock the pipeline:

  • gofumpt -l -w cmd/internal/migrations/lists.go
  • gofmt -s -w cmd/internal/migrations/lists.go
cmd/migrate_test.go (2)

116-155: Solid default-target E2E test with HTTP mock.

  • Activating httpmock before creating the command ensures both command init and run-time fetches are intercepted.
  • Assertions confirm both CLI output and go.mod changes.

4-11: Imports and mocking setup are appropriate.

Using net/http for method constants and jarcoal/httpmock for responder registration is clean and idiomatic.

cmd/migrate.go (2)

67-72: Default-to-latest logic is correct and error-aware.

Gracefully falls back to fetching the latest version only when --to is empty and surfaces a clear error if the lookup fails.


99-102: Wiring verbose through to DoMigration looks good.

The additional boolean is propagated correctly; output behavior is covered by unit tests.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (4)
cmd/internal/migrations/lists.go (2)

93-95: Verbose skip output: include the reason and actual versions to reduce noise during debugging.

Currently it prints only the constraint pair, which can be ambiguous. Suggest emitting which constraint failed against the concrete curr/target.

Apply this minimal, explicit change:

-        } else if verbose {
-            cmd.Printf("Skipping migration from %s to %s\n", m.From, m.To)
-        }
+        } else if verbose {
+            satFrom := fromC.Check(curr)
+            satTo := toC.Check(target)
+            switch {
+            case !satFrom && !satTo:
+                cmd.Printf("Skipping migration: curr=%s not in %q AND target=%s not in %q\n", curr, m.From, target, m.To)
+            case !satFrom:
+                cmd.Printf("Skipping migration: curr=%s not in %q\n", curr, m.From)
+            default:
+                cmd.Printf("Skipping migration: target=%s not in %q\n", target, m.To)
+            }
+        }

98-102: Optional: verbose hint around go mod step.

In verbose mode, a one-liner before running internal.RunGoMod improves traceability of the post-migration step.

-    if !skipGoMod {
-        if err := internal.RunGoMod(cwd); err != nil {
+    if !skipGoMod {
+        if verbose {
+            cmd.Printf("Running go module maintenance (go mod tidy, etc.)...\n")
+        }
+        if err := internal.RunGoMod(cwd); err != nil {
             return fmt.Errorf("go mod: %w", err)
         }
     }
Makefile (2)

1-1: Toolchain selector: good addition; consider making it universal and documenting typical values.

  • Today only lint honors TOOLCHAIN via GOTOOLCHAIN=$(TOOLCHAIN). To avoid similar version-mismatch issues elsewhere, consider exporting it once so all targets inherit it.
  • Document common values (e.g., go1.25.0, auto, local) and an example invocation in AGENTS.md/README.

Add near the top (outside any target):

# Use the same Go toolchain for every target unless overridden:
export GOTOOLCHAIN ?= $(TOOLCHAIN)

Then lint, test, coverage, etc. automatically benefit without repeating the prefix.


42-42: Ensure consistent GOTOOLCHAIN usage in Makefile targets

For clarity and to avoid mismatches between your host Go version and CI/tool runs, lint is already wrapped with:

GOTOOLCHAIN=$(TOOLCHAIN) go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.0 run ./...

Please apply the same pattern (or export once) for all other go run …@latest invocations:

• audit (govulncheck)
• coverage (gotestsum)
• test (gotestsum)

Suggested approaches:

  • Prefix each command:
    audit:
  • go run golang.org/x/vuln/cmd/govulncheck@latest ./...
  • GOTOOLCHAIN=$(TOOLCHAIN) go run golang.org/x/vuln/cmd/govulncheck@latest ./...
    coverage:
  • go run gotest.tools/gotestsum@latest …
  • GOTOOLCHAIN=$(TOOLCHAIN) go run gotest.tools/gotestsum@latest …
    test:
  • go run gotest.tools/gotestsum@latest …
  • GOTOOLCHAIN=$(TOOLCHAIN) go run gotest.tools/gotestsum@latest …
- Or export once at the top:
```makefile
export GOTOOLCHAIN := $(TOOLCHAIN)

then drop per-target prefixes.

Lastly, add a brief note in your README/CONTRIBUTING docs:

To pin a Go version for CI or local runs:
  make lint TOOLCHAIN=go1.25.0
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 633ca4e and 71d1e29.

📒 Files selected for processing (4)
  • AGENTS.md (1 hunks)
  • Makefile (2 hunks)
  • cmd/internal/migrations/lists.go (2 hunks)
  • cmd/internal/migrations/lists_test.go (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • cmd/internal/migrations/lists_test.go
  • AGENTS.md
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Build (1.25.x, windows-latest)
  • GitHub Check: Build (1.25.x, macos-13)
🔇 Additional comments (2)
cmd/internal/migrations/lists.go (1)

76-76: Verified: All DoMigration call sites include the new verbose parameter

All invocations of DoMigration have been updated to pass six arguments (including the new verbose flag), and no outdated five-argument calls remain.

Makefile (1)

6-7: Help banner tweak — LGTM.

Cosmetic only; no functional impact.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (6)
AGENTS.md (1)

3-5: Clarify Makefile-first workflow; call out toolchain pinning to avoid linter Go-version mismatch

Make the guidelines more actionable and remove redundancy. Explicitly recommend running both targets pre-push, and note that the Makefile sets the Go toolchain (GOTOOLCHAIN/TOOLCHAIN) to prevent version mismatches (e.g., golangci-lint vs Go 1.25). This aligns with the repo learning to “run make lint” and with the Makefile updates in this PR.

 - Use the Makefile commands for common tasks (e.g., `make lint`, `make test`)
- - Always run `make lint`
- - Always run `make test`
+ - Prefer the Makefile targets for common tasks (e.g., `make lint`, `make test`).
+ - Before committing or opening a PR, run:
+   - `make lint && make test`
+ - The Makefile configures the Go toolchain (via `GOTOOLCHAIN`/`TOOLCHAIN`) and pins tool versions.
+   Avoid invoking tools directly (e.g., `golangci-lint`) to prevent Go version mismatches.
+ - CI runs the same targets, so local results should match CI.
cmd/migrate.go (5)

26-26: Make “latest” even easier to select with -t alone (NoOptDefVal).

Allow -t without a value to imply “latest” and keep the help text truthful. This is a small UX win for speed-typing.

Apply near the flag setup:

 cmd.Flags().StringVarP(&targetVersionS, "to", "t", "", "Migrate to a specific version. Default: latest")
+if f := cmd.Flags().Lookup("to"); f != nil {
+	f.NoOptDefVal = "latest"
+}

62-67: Default-to-latest resolution: inject a resolver for testability and determinism.

Resolving the latest version via a hardwired function call makes tests rely on network or global state. Injecting a resolver via options lets tests stub it cleanly and makes behavior explicit.

Apply this refactor:

 type MigrateOptions struct {
 	CurrentVersionFile string
 	TargetVersionS     string
 	Force              bool
 	SkipGoMod          bool
-	Verbose            bool
+	Verbose            bool
+	// LatestVersionResolver returns the latest Fiber version string (e.g., "2.52.0").
+	// If nil, LatestFiberVersion will be used.
+	LatestVersionResolver func() (string, error)
 }
 
@@
-	if opts.TargetVersionS == "" {
-		opts.TargetVersionS, err = LatestFiberVersion()
-		if err != nil {
-			return fmt.Errorf("failed to determine latest fiber version: %w", err)
-		}
-	}
+	if opts.TargetVersionS == "" {
+		resolver := opts.LatestVersionResolver
+		if resolver == nil {
+			resolver = LatestFiberVersion
+		}
+		opts.TargetVersionS, err = resolver()
+		if err != nil {
+			return fmt.Errorf("failed to determine latest Fiber version: %w", err)
+		}
+	}

Optionally, in newMigrateCmd set LatestVersionResolver: nil (default) so behavior is unchanged in production, while tests can supply a stub resolver.

Also applies to: 46-52


95-97: Tiny nit: add colon in wrapped error for readability.

“migration failed %w” → “migration failed: %w”.

-		return fmt.Errorf("migration failed %w", err)
+		return fmt.Errorf("migration failed: %w", err)

85-92: Force re-run edge case: guard against prevMajor < 1.

If someone forces with target v0.x.x (or an unusual history), prevMajor := targetVersion.Major() - 1 can go negative and generate an invalid semver like “-1.0.0”. Add a small guard.

 	if opts.Force && !targetVersion.GreaterThan(currentVersion) {
 		prevMajor := targetVersion.Major() - 1
+		if prevMajor < 1 {
+			return fmt.Errorf("cannot force re-run for target major %d: no prior major exists", targetVersion.Major())
+		}
 		migrateFrom, err = semver.NewVersion(fmt.Sprintf("%d.0.0", prevMajor))

If Fiber never had a v0, this path won’t trigger in practice, but the guard prevents surprising behavior.


21-24: Optional: avoid usage spam on expected errors.

For a smoother CLI UX, consider silencing usage on runtime errors (e.g., network when resolving latest).

 cmd := &cobra.Command{
 	Use:   "migrate",
 	Short: "Migrate Fiber project version to a newer version",
 }
+cmd.SilenceUsage = true

Also applies to: 31-31

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 71d1e29 and 55d99ed.

📒 Files selected for processing (3)
  • AGENTS.md (1 hunks)
  • Makefile (2 hunks)
  • cmd/migrate.go (4 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • Makefile
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-07-19T15:13:10.652Z
Learnt from: CR
PR: gofiber/fiber#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-07-19T15:13:10.652Z
Learning: Run `make lint` for static analysis when modifying code

Applied to files:

  • AGENTS.md
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Build (1.25.x, windows-latest)
  • GitHub Check: Build (1.25.x, macos-13)
🔇 Additional comments (4)
AGENTS.md (1)

1-5: Document migrate CLI verbose flag and default target behavior in user docs

The current README.md’s “## fiber migrate” section lists the --to, --force, --skip_go_mod, and --help flags but lacks any mention of the new --verbose (-v) option and the fact that --to now defaults to the latest Fiber release when omitted. Please update the user-facing docs accordingly:

  • In README.md, under ## fiber migrate (around lines 139–156):

    • Add a description for -v, --verbose (e.g., “Output detailed logs during migration”).
    • Clarify that omitting --to will automatically migrate to the latest Fiber release.
    • Update the usage examples to include both behaviors:
      # Migrate to the latest release with verbose output
      fiber migrate --verbose
      
      # Migrate to the latest release (default target)
      fiber migrate
  • If a dedicated docs/migrate.md (or similar CLI reference) exists, apply the same additions there.

This ensures users can discover and correctly use the new verbose mode and understand the default target behavior.

⛔ Skipped due to learnings
Learnt from: CR
PR: gofiber/fiber#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-07-19T15:13:10.652Z
Learning: Run `make lint` for static analysis when modifying code
cmd/migrate.go (3)

19-19: Verbose flag plumbing is correct end-to-end.

The flag variable, binding, option field, and propagation into options are all consistent. No issues spotted.

Also applies to: 29-29, 37-37, 51-51


99-103: Success message formatting reads well.

Clear summary with colorized output; good touch.


94-94: DoMigration signature verified

Verified that the DoMigration function in cmd/internal/migrations/lists.go defines the verbose bool parameter and that all call sites supply the correct six arguments:

  • Definition at cmd/internal/migrations/lists.go:76 includes skipGoMod, verbose bool.
  • Invocation in cmd/migrate.go:94 passes opts.SkipGoMod, opts.Verbose.
  • Test invocations in cmd/internal/migrations/lists_test.go:27 and :37 also pass six parameters.

No mismatched or stray call sites were found.

@ReneWerner87 ReneWerner87 merged commit 1935422 into master Aug 23, 2025
12 of 13 checks passed
@ReneWerner87 ReneWerner87 deleted the codex/2025-08-23-15-05-02 branch August 23, 2025 16:49
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
cmd/tester_test.go (1)

124-129: Minor: reset args and standardize SilenceErrors for symmetry with parent branch

To avoid leaking state when the same command instance is reused across tests and to keep behavior consistent with the parent path, reset args back to nil and temporarily force SilenceErrors = false (mirroring the parent branch). Also, you can simplify the empty-args handling with an idiomatic one-liner.

 } else {
-    if len(args) == 0 {
-        cmd.SetArgs([]string{})
-    } else {
-        cmd.SetArgs(args)
-    }
+    // Ensure empty (not nil) args to avoid falling back to os.Args.
+    cmd.SetArgs(append([]string{}, args...))
+
+    // Match parent-branch behavior and avoid leaking state across tests.
+    origSilence := cmd.SilenceErrors
+    cmd.SilenceErrors = false
+    defer func() {
+        cmd.SetArgs(nil)
+        cmd.SilenceErrors = origSilence
+    }()
 }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 55d99ed and 4d010cd.

📒 Files selected for processing (1)
  • cmd/tester_test.go (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build (1.25.x, windows-latest)
🔇 Additional comments (1)
cmd/tester_test.go (1)

124-128: Good fix: prevent os.Args leakage for root commands

Explicitly setting an empty arg slice when no args are passed avoids Cobra falling back to os.Args[1:], which could make tests flaky. This is the right move.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

codex ✏️ Feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant