Skip to content

Commit 2682556

Browse files
authored
Merge branch 'master' into codex/2025-08-24-06-41-42
2 parents edd6746 + f62b139 commit 2682556

File tree

8 files changed

+173
-14
lines changed

8 files changed

+173
-14
lines changed

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@ go install github.com/gofiber/cli/fiber@latest
1414

1515
## Commands
1616

17+
The Fiber CLI provides several commands to enhance development workflows:
18+
19+
- `fiber dev` – Rerun the project whenever watched files change
20+
- `fiber serve` – Serve static files with optional TLS and caching
21+
- `fiber new` – Generate a new Fiber project from templates
22+
- `fiber migrate` – Migrate an existing project to a newer Fiber version
23+
- `fiber upgrade` – Upgrade the CLI itself to the latest release
24+
- `fiber version` – Print the local and latest available CLI versions
25+
1726
## fiber
1827

1928
### Synopsis
@@ -142,6 +151,8 @@ fiber new PROJECT [module name] [flags]
142151

143152
Migrate Fiber project version to a newer version
144153

154+
See the [Migration guide](docs/guide/migrate.md) for more details.
155+
145156
```bash
146157
fiber migrate --to 3.0.0
147158
```
@@ -152,6 +163,8 @@ fiber migrate --to 3.0.0
152163
-t, --to string Migrate to a specific version e.g:3.0.0 Format: X.Y.Z
153164
-f, --force Force migration even if already on the version
154165
-s, --skip_go_mod Skip running go mod tidy, download and vendor
166+
--hash string Commit hash for Fiber version
167+
-v, --verbose Enable verbose output
155168
-h, --help help for migrate
156169
```
157170

cmd/internal/migrations/common.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
)
1515

1616
var (
17-
pkgRegex = regexp.MustCompile(`(github\.com/gofiber/fiber/)(v\d+)( *?)(v[\w.-]+)`)
17+
pkgRegex = regexp.MustCompile(`(?m)^(\s*require\s+)?(github\.com/gofiber/fiber/)(v\d+)(\s+)(v[\w.-]+)$`)
1818
fiberImportRegex = regexp.MustCompile(`(^|")github\.com/gofiber/fiber/v\d+`)
1919
)
2020

@@ -37,7 +37,7 @@ func MigrateGoPkgs(cmd *cobra.Command, cwd string, _, target *semver.Version) er
3737
// replace old version with new version in go.mod file
3838
fileContentStr := pkgRegex.ReplaceAllString(
3939
string(fileContent),
40-
"${1}v"+strconv.FormatUint(target.Major(), 10)+"${3}v"+target.String(),
40+
"${1}${2}v"+strconv.FormatUint(target.Major(), 10)+"${4}v"+target.String(),
4141
)
4242

4343
if fileContentStr != string(fileContent) {

cmd/internal/migrations/lists.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ type Migration struct {
3030
// Example structure:
3131
// {"from": ">=2.0.0", "to": "<=3.*.*", "fn": [MigrateFN, MigrateFN]}
3232
var Migrations = []Migration{
33-
{From: ">=1.0.0", To: ">=0.0.0-0", Functions: []MigrationFn{MigrateGoPkgs, MigrateDependencies}},
33+
{From: ">=1.0.0-0", To: ">=0.0.0-0", Functions: []MigrationFn{MigrateGoPkgs, MigrateDependencies}},
3434
{
35-
From: ">=2.0.0",
35+
From: ">=2.0.0-0",
3636
To: "<4.0.0-0",
3737
Functions: []MigrationFn{
3838
v3migrations.MigrateHandlerSignatures,

cmd/internal/migrations/lists_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ func Test_DoMigration_Verbose(t *testing.T) {
3838
cmd.SetOut(&buf)
3939
require.NoError(t, migrations.DoMigration(cmd, dir, curr, target, true, true))
4040
out := buf.String()
41-
assert.Contains(t, out, "Skipping migration from >=1.0.0 to >=0.0.0-0")
42-
assert.Contains(t, out, "Skipping migration from >=2.0.0 to <4.0.0-0")
41+
assert.Contains(t, out, "Skipping migration from >=1.0.0-0 to >=0.0.0-0")
42+
assert.Contains(t, out, "Skipping migration from >=2.0.0-0 to <4.0.0-0")
4343
})
4444
}
4545

@@ -67,7 +67,7 @@ require github.com/valyala/fasthttp v1.0.0`
6767
require.NoError(t, migrations.DoMigration(cmd, dir, curr, target, true, true))
6868
out := buf.String()
6969
assert.Contains(t, out, "MigrateGoPkgs: no changes")
70-
assert.Contains(t, out, "Skipping migration from >=2.0.0 to <4.0.0-0")
70+
assert.Contains(t, out, "Skipping migration from >=2.0.0-0 to <4.0.0-0")
7171
})
7272

7373
t.Run("changes", func(t *testing.T) {
@@ -92,6 +92,6 @@ require github.com/valyala/fasthttp v1.0.0`
9292
out := buf.String()
9393
assert.Contains(t, out, "Migrating Go packages")
9494
assert.Contains(t, out, "MigrateGoPkgs: changed")
95-
assert.Contains(t, out, "Skipping migration from >=2.0.0 to <4.0.0-0")
95+
assert.Contains(t, out, "Skipping migration from >=2.0.0-0 to <4.0.0-0")
9696
})
9797
}

cmd/migrate.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func migrateRunE(cmd *cobra.Command, opts MigrateOptions) error {
9494
}
9595
}
9696

97-
if !targetVersion.GreaterThan(currentVersion) && !(opts.Force && targetVersion.Equal(currentVersion)) {
97+
if !targetVersion.GreaterThan(currentVersion) && !opts.Force {
9898
return fmt.Errorf("target version v%s is not greater than current version v%s", opts.TargetVersionS, currentVersionS)
9999
}
100100

@@ -152,12 +152,16 @@ func pseudoVersionFromHash(base *semver.Version, hash string) (string, error) {
152152
Date time.Time `json:"date"`
153153
} `json:"committer"`
154154
} `json:"commit"`
155+
SHA string `json:"sha"`
155156
}
156157
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
157158
return "", fmt.Errorf("decode response: %w", err)
158159
}
159160

160-
short := hash
161+
short := data.SHA
162+
if short == "" {
163+
short = hash
164+
}
161165
if len(short) > 12 {
162166
short = short[:12]
163167
}

cmd/migrate_test.go

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -356,17 +356,97 @@ func Test_Migrate_WithHash(t *testing.T) {
356356
defer func() { require.NoError(t, os.Chdir(cwd)) }()
357357

358358
hash := "abcdef1234567890abcdef1234567890abcdef12"
359+
short := hash[:7]
359360
httpmock.Activate()
360361
defer httpmock.DeactivateAndReset()
361-
commitURL := "https://api.github.com/repos/gofiber/fiber/commits/" + hash
362-
httpmock.RegisterResponder(http.MethodGet, commitURL, httpmock.NewBytesResponder(200, []byte(`{"commit":{"committer":{"date":"2020-01-02T03:04:05Z"}}}`)))
362+
commitURL := "https://api.github.com/repos/gofiber/fiber/commits/" + short
363+
httpmock.RegisterResponder(http.MethodGet, commitURL, httpmock.NewBytesResponder(200, []byte(`{"sha":"`+hash+`","commit":{"committer":{"date":"2020-01-02T03:04:05Z"}}}`)))
363364

364365
cmd := newMigrateCmd()
365366
setupCmd()
366367
defer teardownCmd()
367-
_, err = runCobraCmd(cmd, "-t=3.0.0", "--hash="+hash)
368+
_, err = runCobraCmd(cmd, "-t=3.0.0", "--hash="+short)
368369
require.NoError(t, err)
369370

370371
gm := readFileTB(t, filepath.Join(dir, "go.mod"))
371372
assert.Contains(t, gm, "github.com/gofiber/fiber/v3 v3.0.1-0.20200102030405-abcdef123456")
372373
}
374+
375+
func Test_Migrate_WithHash_UpdatePseudoVersion(t *testing.T) {
376+
dir, err := os.MkdirTemp("", "migrate_hash_update")
377+
require.NoError(t, err)
378+
defer func() { require.NoError(t, os.RemoveAll(dir)) }()
379+
380+
goMod := "module example\n\n" +
381+
"go 1.20\n\n" +
382+
"require github.com/gofiber/fiber/v3\tv3.0.1-0.20200102030405-abcdef123456\n"
383+
require.NoError(t, os.WriteFile(filepath.Join(dir, "go.mod"), []byte(goMod), 0o600))
384+
require.NoError(t, os.WriteFile(filepath.Join(dir, "main.go"), []byte("package main"), 0o600))
385+
386+
cwd, err := os.Getwd()
387+
require.NoError(t, err)
388+
require.NoError(t, os.Chdir(dir))
389+
defer func() { require.NoError(t, os.Chdir(cwd)) }()
390+
391+
hash := "fedcba654321fedcba654321fedcba654321fedc"
392+
short := hash[:7]
393+
httpmock.Activate()
394+
defer httpmock.DeactivateAndReset()
395+
commitURL := "https://api.github.com/repos/gofiber/fiber/commits/" + short
396+
httpmock.RegisterResponder(http.MethodGet, commitURL, httpmock.NewBytesResponder(200, []byte(`{"sha":"`+hash+`","commit":{"committer":{"date":"2020-01-03T03:04:05Z"}}}`)))
397+
398+
cmd := newMigrateCmd()
399+
setupCmd()
400+
defer teardownCmd()
401+
_, err = runCobraCmd(cmd, "-t=3.0.0", "--hash="+short, "-f")
402+
require.NoError(t, err)
403+
404+
gm := readFileTB(t, filepath.Join(dir, "go.mod"))
405+
assert.Contains(t, gm, "v3.0.1-0.20200103030405-fedcba654321")
406+
assert.NotContains(t, gm, "abcdef123456")
407+
}
408+
409+
func Test_Migrate_WithHash_DowngradeWithForce(t *testing.T) {
410+
dir, err := os.MkdirTemp("", "migrate_hash_downgrade")
411+
require.NoError(t, err)
412+
defer func() { require.NoError(t, os.RemoveAll(dir)) }()
413+
414+
goMod := "module example\n\n" +
415+
"go 1.20\n\n" +
416+
"require github.com/gofiber/fiber/v3\tv3.0.1-0.20200103030405-fedcba654321\n"
417+
require.NoError(t, os.WriteFile(filepath.Join(dir, "go.mod"), []byte(goMod), 0o600))
418+
require.NoError(t, os.WriteFile(filepath.Join(dir, "main.go"), []byte("package main"), 0o600))
419+
420+
cwd, err := os.Getwd()
421+
require.NoError(t, err)
422+
require.NoError(t, os.Chdir(dir))
423+
defer func() { require.NoError(t, os.Chdir(cwd)) }()
424+
425+
hash := "abcdef1234567890abcdef1234567890abcdef12"
426+
short := hash[:7]
427+
httpmock.Activate()
428+
defer httpmock.DeactivateAndReset()
429+
commitURL := "https://api.github.com/repos/gofiber/fiber/commits/" + short
430+
httpmock.RegisterResponder(http.MethodGet, commitURL, httpmock.NewBytesResponder(200, []byte(`{"sha":"`+hash+`","commit":{"committer":{"date":"2020-01-02T03:04:05Z"}}}`)))
431+
432+
t.Run("without force", func(t *testing.T) {
433+
cmd := newMigrateCmd()
434+
setupCmd()
435+
defer teardownCmd()
436+
out, err := runCobraCmd(cmd, "-t=3.0.0", "--hash="+short)
437+
require.Error(t, err)
438+
assert.Contains(t, out, "not greater")
439+
})
440+
441+
t.Run("force", func(t *testing.T) {
442+
cmd := newMigrateCmd()
443+
setupCmd()
444+
defer teardownCmd()
445+
_, err := runCobraCmd(cmd, "-t=3.0.0", "--hash="+short, "-f")
446+
require.NoError(t, err)
447+
448+
gm := readFileTB(t, filepath.Join(dir, "go.mod"))
449+
assert.Contains(t, gm, "v3.0.1-0.20200102030405-abcdef123456")
450+
assert.NotContains(t, gm, "fedcba654321")
451+
})
452+
}

cmd/version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func versionRun(cmd *cobra.Command, _ []string) {
4040
}
4141

4242
var (
43-
currentVersionRegexp = regexp.MustCompile(`github\.com/gofiber/fiber[^\n]*? (.*)\n`)
43+
currentVersionRegexp = regexp.MustCompile(`github\.com/gofiber/fiber[^\n]*?\s+(.*)\n`)
4444
currentVersionFile = "go.mod"
4545
)
4646

docs/guide/migrate.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
---
2+
id: migrate
3+
title: "\U0001F501 Migration"
4+
sidebar_position: 10
5+
---
6+
7+
The `fiber migrate` command upgrades an existing Fiber project to a newer
8+
[github.com/gofiber/fiber](https://github.com/gofiber/fiber) release.
9+
It determines the current version from your `go.mod` file and applies any
10+
necessary migration steps.
11+
12+
## Usage
13+
14+
```bash
15+
fiber migrate --to 3.0.0
16+
```
17+
18+
## Flags
19+
20+
- `-t`, `--to` – Target version to migrate to. Defaults to the latest release
21+
- `--hash` – Commit hash for the Fiber version when migrating to a pseudo version
22+
- `-f`, `--force` – Force migration even if already on the target version
23+
- `-s`, `--skip_go_mod` – Skip running `go mod tidy`, `go mod download`, and `go mod vendor`
24+
- `-v`, `--verbose` – Enable verbose output during migration
25+
26+
## Examples
27+
28+
Upgrade to the latest Fiber version:
29+
30+
```bash
31+
fiber migrate
32+
```
33+
34+
Migrate to a specific release:
35+
36+
```bash
37+
fiber migrate --to 3.0.0
38+
```
39+
40+
Use a commit hash for unreleased versions:
41+
42+
```bash
43+
fiber migrate --to 3.0.0 --hash abcdef123456
44+
```
45+
46+
Force re-running migrations even if the version matches:
47+
48+
```bash
49+
fiber migrate --to 3.0.0 --force
50+
```
51+
52+
Skip `go mod` commands for offline environments:
53+
54+
```bash
55+
fiber migrate --skip_go_mod
56+
```
57+
58+
Verbose mode prints detailed progress and executed steps:
59+
60+
```bash
61+
fiber migrate --verbose
62+
```

0 commit comments

Comments
 (0)