# Flamego Migration Checklist
This checklist provides a step-by-step guide for executing the migration from Macaron to Flamego.
## Pre-Migration
### 1. Team Preparation
- [ ] Review migration guide with entire team
- [ ] Ensure all developers understand Flamego basics
- [ ] Allocate 3-4 weeks for migration effort
- [ ] Schedule regular sync meetings during migration
- [ ] Identify rollback champion
### 2. Documentation Review
- [ ] Read [Flamego documentation](https://flamego.dev/)
- [ ] Review [migration examples](./flamego_migration_examples.md)
- [ ] Review [middleware documentation](https://flamego.dev/middleware/)
- [ ] Understand Flamego's dependency injection
### 3. Environment Setup
- [ ] Create feature branch: `feature/flamego-migration`
- [ ] Set up local development environment
- [ ] Verify current tests pass: `go test ./...`
- [ ] Document current test coverage: `go test -cover ./...`
- [ ] Benchmark current performance (optional)
### 4. Backup and Safety
- [ ] Tag current stable version: `git tag v0.14.0-pre-flamego`
- [ ] Create backup branch: `git branch backup/before-flamego`
- [ ] Document current behavior (screenshots, videos)
- [ ] Ensure CI/CD can roll back quickly
## Phase 1: Dependencies (Day 1)
### 1.1 Update go.mod
- [ ] Add Flamego core
```bash
go get github.com/flamego/flamego@latest
```
- [ ] Add Flamego middleware
```bash
go get github.com/flamego/binding@latest
go get github.com/flamego/cache@latest
go get github.com/flamego/captcha@latest
go get github.com/flamego/csrf@latest
go get github.com/flamego/gzip@latest
go get github.com/flamego/i18n@latest
go get github.com/flamego/session@latest
go get github.com/flamego/template@latest
```
- [ ] Run `go mod tidy`
- [ ] Verify no conflicts
- [ ] Commit: `git commit -m "Add Flamego dependencies"`
### 1.2 Import Updates
- [ ] Create find-and-replace script
- [ ] Test script on sample file
- [ ] Document import mapping
## Phase 2: Core Framework (Days 2-3)
### 2.1 Main Application Setup
File: `internal/cmd/web.go`
- [ ] Update imports
```go
// Remove
"gopkg.in/macaron.v1"
"github.com/go-macaron/*"
// Add
"github.com/flamego/flamego"
"github.com/flamego/session"
"github.com/flamego/csrf"
// etc...
```
- [ ] Rename function: `newMacaron()` → `newFlamego()`
- [ ] Update initialization: `macaron.New()` → `flamego.New()`
- [ ] Update logger: `macaron.Logger()` → `flamego.Logger()`
- [ ] Update recovery: `macaron.Recovery()` → `flamego.Recovery()`
- [ ] Update gzip: Keep similar pattern
- [ ] Update static file serving
```go
// Change from macaron.Static() to flamego.Static()
f.Use(flamego.Static(...))
```
- [ ] Update renderer setup
```go
// Change from macaron.Renderer() to template.Templater()
f.Use(template.Templater(template.Options{...}))
```
- [ ] Test compilation: `go build`
- [ ] Fix any compilation errors
- [ ] Commit: `git commit -m "Migrate main app setup to Flamego"`
### 2.2 Middleware Configuration
Still in `internal/cmd/web.go`:
- [ ] Update i18n middleware
- Change `Langs` → `Languages`
- Change `DefaultLang` → `DefaultLanguage`
- Change `SubURL` → `URLPrefix`
- [ ] Update cache middleware
- Change from string adapter to config struct
- Update method calls: `Put()` → `Set()`
- [ ] Update captcha middleware
- Verify options compatibility
- Test captcha generation
- [ ] Update toolbox functionality
- Remove toolbox middleware
- Create custom health check endpoint
```go
f.Get("/-/health", func(c flamego.Context) {
if err := database.Ping(); err != nil {
c.ResponseWriter().WriteHeader(500)
return
}
c.ResponseWriter().WriteHeader(200)
})
```
- [ ] Update session middleware
- Change `Provider` → Use config structs
- Change interface: `session.Store` → `session.Session`
- Test session persistence
- [ ] Update CSRF middleware
- Verify options compatibility
- Test token generation
- Update method calls: `GetToken()` → `Token()`
- [ ] Test server starts: `go run gogs.go web`
- [ ] Verify middleware loads in correct order
- [ ] Commit: `git commit -m "Migrate middleware to Flamego"`
### 2.3 Route Definitions
Still in `internal/cmd/web.go`:
- [ ] Update basic routes: `:param` → ``
- [ ] Update regex routes: `^:name(a|b)$` → ``
- [ ] Test route compilation
- [ ] Verify route pattern matching
Routes to update:
- [ ] Home route: `/`
- [ ] Explore routes: `/explore/*`
- [ ] Install routes: `/install`
- [ ] User routes: `/user/*`
- [ ] Admin routes: `/admin/*`
- [ ] Org routes: `/org/*`
- [ ] Repo routes: `/:username/:reponame/*`
- [ ] API routes: `/api/*`
- [ ] Commit: `git commit -m "Update route syntax to Flamego"`
## Phase 3: Context System (Days 4-5)
### 3.1 Context Wrapper
File: `internal/context/context.go`
- [ ] Update imports
```go
"github.com/flamego/flamego"
"github.com/flamego/cache"
"github.com/flamego/csrf"
"github.com/flamego/session"
```
- [ ] Update Context struct
```go
type Context struct {
flamego.Context // Embedded interface
cache cache.Cache
csrf csrf.CSRF
flash *session.Flash
session session.Session
// ... other fields
}
```
- [ ] Add accessor methods
```go
func (c *Context) Cache() cache.Cache { return c.cache }
func (c *Context) CSRF() csrf.CSRF { return c.csrf }
func (c *Context) Session() session.Session { return c.session }
```
- [ ] Update Contexter middleware signature
```go
func Contexter(store Store) flamego.Handler {
return func(
ctx flamego.Context,
cache cache.Cache,
sess session.Session,
// ... other injectables
) {
// ...
}
}
```
- [ ] Update response methods
- `c.HTML()` - needs template parameter or stored reference
- `c.JSON()` - use ResponseWriter directly
- `c.Redirect()` - should work as-is
- `c.PlainText()` - use ResponseWriter
- `c.ServeContent()` - use ResponseWriter
- [ ] Update parameter access
- All `c.Params(":name")` → `c.Param("name")`
- [ ] Test compilation: `go build`
- [ ] Commit: `git commit -m "Migrate Context wrapper to Flamego"`
### 3.2 Other Context Files
Files in `internal/context/`:
- [ ] `auth.go` - Update handler signatures
- [ ] `api.go` - Update APIContext
- [ ] `user.go` - Update user context helpers
- [ ] `repo.go` - Update repository context
- Fix all `c.Params()` calls
- Update middleware signatures
- [ ] `org.go` - Update organization context
- [ ] `go_get.go` - Update go-get handler
For each file:
- [ ] Update imports
- [ ] Change `macaron.Handler` → `flamego.Handler`
- [ ] Change `*macaron.Context` → `flamego.Context` or `*Context`
- [ ] Update `c.Params(":name")` → `c.Param("name")`
- [ ] Fix compilation errors
- [ ] Commit after each file or group
- [ ] Final commit: `git commit -m "Complete context system migration"`
## Phase 4: Form Binding (Days 6-7)
### 4.1 Form Package
File: `internal/form/form.go`
- [ ] Update imports
```go
"github.com/flamego/binding"
```
- [ ] Update custom validators
```go
// Register custom validators with go-playground/validator
binding.RegisterValidation("alphaDashDot", validatorFunc)
```
- [ ] Update `SetNameMapper` if used
- [ ] Test validator registration
### 4.2 Form Structs
Files: `internal/form/*.go`
For each file:
- [ ] `auth.go` - Update auth forms
- [ ] `admin.go` - Update admin forms
- [ ] `user.go` - Update user forms
- [ ] `repo.go` - Update repo forms
- [ ] `org.go` - Update org forms
For each form:
- [ ] Change `binding:"Required"` → `validate:"required"`
- [ ] Change `binding:"MaxSize(100)"` → `validate:"max=100"`
- [ ] Change `binding:"MinSize(5)"` → `validate:"min=5"`
- [ ] Update custom validators
- [ ] Test form validation
Pattern replacements:
- `binding:"Required"` → `validate:"required"`
- `binding:"AlphaDashDot"` → `validate:"alphaDashDot"`
- `binding:"MaxSize(N)"` → `validate:"max=N"`
- `binding:"MinSize(N)"` → `validate:"min=N"`
- `binding:"Email"` → `validate:"email"`
- `binding:"Url"` → `validate:"url"`
- [ ] Commit: `git commit -m "Migrate form binding to Flamego"`
## Phase 5: Route Handlers (Days 8-14)
### 5.1 User Routes
Files: `internal/route/user/*.go`
- [ ] `user.go` - Basic user handlers
- Update handler signatures
- Add template parameters
- Fix parameter access
- [ ] `auth.go` - Login/logout handlers
- Update session access: `sess.Get()` etc.
- Fix CSRF token access
- [ ] `setting.go` - User settings
- Update form binding usage
- Fix template rendering
- [ ] Test user flows:
- [ ] User registration
- [ ] User login
- [ ] User logout
- [ ] Profile view
- [ ] Settings update
- [ ] Commit: `git commit -m "Migrate user routes to Flamego"`
### 5.2 Repository Routes
Files: `internal/route/repo/*.go`
Priority files:
- [ ] `repo.go` - Main repo handler
- [ ] `home.go` - Repository home
- [ ] `issue.go` - Issue management
- [ ] `pull.go` - Pull requests
- [ ] `release.go` - Releases
- [ ] `webhook.go` - Webhooks
- [ ] `setting.go` - Repo settings
- [ ] `http.go` - HTTP Git operations
For each file:
- [ ] Update imports
- [ ] Update handler signatures
- [ ] Add template parameters where needed
- [ ] Fix `c.Params()` calls
- [ ] Update form binding calls
- [ ] Test repository flows:
- [ ] Create repository
- [ ] View repository
- [ ] Create issue
- [ ] Create pull request
- [ ] Push via HTTP
- [ ] Commit: `git commit -m "Migrate repository routes to Flamego"`
### 5.3 Admin Routes
Files: `internal/route/admin/*.go`
- [ ] `admin.go` - Admin dashboard
- [ ] `user.go` - User management
- [ ] `org.go` - Organization management
- [ ] `repo.go` - Repository management
- [ ] `auth.go` - Auth source management
- [ ] `notice.go` - System notices
- [ ] Test admin flows:
- [ ] Admin dashboard
- [ ] Create user
- [ ] Delete user
- [ ] Manage auth sources
- [ ] Commit: `git commit -m "Migrate admin routes to Flamego"`
### 5.4 Organization Routes
Files: `internal/route/org/*.go`
- [ ] `org.go` - Organization handlers
- [ ] `team.go` - Team management
- [ ] `setting.go` - Org settings
- [ ] Test organization flows:
- [ ] Create organization
- [ ] Manage teams
- [ ] Org settings
- [ ] Commit: `git commit -m "Migrate organization routes to Flamego"`
### 5.5 API Routes
Files: `internal/route/api/v1/*.go`
- [ ] `api.go` - API router setup
- [ ] `user/*.go` - User API endpoints
- [ ] `repo/*.go` - Repository API endpoints
- [ ] `org/*.go` - Organization API endpoints
- [ ] `admin/*.go` - Admin API endpoints
For API handlers:
- [ ] Update JSON response methods
- [ ] Ensure authentication works
- [ ] Test error responses
- [ ] Test API endpoints:
- [ ] GET /api/v1/user
- [ ] GET /api/v1/users/:username
- [ ] GET /api/v1/repos/:owner/:repo
- [ ] Create/Update operations
- [ ] Commit: `git commit -m "Migrate API routes to Flamego"`
### 5.6 LFS Routes
Files: `internal/route/lfs/*.go`
- [ ] `route.go` - LFS router
- [ ] `basic.go` - Basic auth
- [ ] `batch.go` - Batch API
- [ ] Update tests in `*_test.go`
- [ ] Test LFS operations
- [ ] Commit: `git commit -m "Migrate LFS routes to Flamego"`
### 5.7 Other Routes
Files: `internal/route/*.go`
- [ ] `home.go` - Home page
- [ ] `install.go` - Installation
- [ ] `dev/*.go` - Development tools
- [ ] Commit: `git commit -m "Migrate remaining routes to Flamego"`
## Phase 6: Testing (Days 15-18)
### 6.1 Unit Tests
- [ ] Update test helpers
- Create mock flamego.Context
- Update test fixtures
- [ ] Run unit tests: `go test ./internal/context/...`
- [ ] Run unit tests: `go test ./internal/form/...`
- [ ] Run unit tests: `go test ./internal/route/...`
- [ ] Fix failing tests one by one
- [ ] Document test changes
- [ ] Commit: `git commit -m "Fix unit tests for Flamego"`
### 6.2 Integration Tests
- [ ] Update integration test setup
- [ ] Test complete user flows
- [ ] Registration → Login → Create Repo → Push → Pull
- [ ] Test admin flows
- [ ] Admin login → User management
- [ ] Test API flows
- [ ] Token auth → API calls
- [ ] Commit: `git commit -m "Fix integration tests for Flamego"`
### 6.3 Manual Testing
Create test plan document covering:
Web UI:
- [ ] Homepage loads
- [ ] User registration works
- [ ] User login works
- [ ] User logout works
- [ ] Profile viewing works
- [ ] Repository creation works
- [ ] Repository viewing works
- [ ] Issue creation works
- [ ] Issue commenting works
- [ ] Pull request creation works
- [ ] Pull request merging works
- [ ] Webhooks work
- [ ] LFS operations work
- [ ] File uploads work
- [ ] Avatar uploads work
- [ ] Admin panel works
- [ ] Organization creation works
- [ ] Team management works
Git Operations:
- [ ] HTTP clone works
- [ ] HTTP push works
- [ ] HTTP pull works
- [ ] SSH clone works
- [ ] SSH push works
- [ ] SSH pull works
API:
- [ ] Authentication works
- [ ] All v1 endpoints work
- [ ] Error responses correct
Security:
- [ ] CSRF protection works
- [ ] Session security works
- [ ] Auth required endpoints protected
Localization:
- [ ] Language switching works
- [ ] Translations load correctly
- [ ] Document any issues found
- [ ] Create issues for bugs
- [ ] Commit fixes as they're made
### 6.4 Performance Testing
- [ ] Benchmark homepage
- [ ] Benchmark repository view
- [ ] Benchmark API endpoints
- [ ] Compare with pre-migration benchmarks
- [ ] Document performance differences
- [ ] Optimize if needed
## Phase 7: Cleanup (Days 19-20)
### 7.1 Remove Old Code
- [ ] Remove all Macaron imports
```bash
grep -r "gopkg.in/macaron.v1" .
grep -r "github.com/go-macaron/" .
```
- [ ] Remove from go.mod
```bash
go mod edit -droprequire gopkg.in/macaron.v1
go mod edit -droprequire github.com/go-macaron/binding
# etc...
```
- [ ] Run `go mod tidy`
- [ ] Verify unused dependencies removed
- [ ] Commit: `git commit -m "Remove Macaron dependencies"`
### 7.2 Code Quality
- [ ] Run linter: `golangci-lint run`
- [ ] Fix linter issues
- [ ] Run `go fmt ./...`
- [ ] Run `go vet ./...`
- [ ] Check for TODO/FIXME comments
- [ ] Commit: `git commit -m "Code quality improvements"`
### 7.3 Documentation
- [ ] Update README.md if needed
- [ ] Update CONTRIBUTING.md if needed
- [ ] Update development documentation
- [ ] Document migration in CHANGELOG.md
- [ ] Create migration announcement
- [ ] Commit: `git commit -m "Update documentation for Flamego"`
### 7.4 Final Review
- [ ] Review all changes
- [ ] Ensure no debug code left
- [ ] Verify test coverage maintained
- [ ] Check for security issues
- [ ] Run final test suite: `go test ./...`
- [ ] Run final manual tests
## Phase 8: Deployment (Days 21-22)
### 8.1 Pre-Deployment
- [ ] Create release candidate tag
- [ ] Deploy to staging environment
- [ ] Run smoke tests on staging
- [ ] Performance test on staging
- [ ] Security scan
- [ ] Get team approval
### 8.2 Deployment
- [ ] Schedule deployment window
- [ ] Notify users of maintenance
- [ ] Take backup of production
- [ ] Deploy new version
- [ ] Monitor logs
- [ ] Run smoke tests on production
- [ ] Monitor performance metrics
### 8.3 Post-Deployment
- [ ] Monitor for issues (24-48 hours)
- [ ] Check error rates
- [ ] Verify all features working
- [ ] Collect user feedback
- [ ] Address any urgent issues
## Rollback Procedure
If critical issues occur:
### Quick Rollback
1. [ ] Stop application
2. [ ] Restore from backup
3. [ ] Start application
4. [ ] Verify functionality
5. [ ] Notify users
### Git Rollback
1. [ ] Identify last good commit
2. [ ] `git revert `
3. [ ] `git push`
4. [ ] Deploy reverted version
### Issues to Watch For
- [ ] Session persistence issues
- [ ] CSRF token validation failures
- [ ] Form validation errors
- [ ] Template rendering errors
- [ ] Performance degradation
- [ ] Memory leaks
- [ ] Authentication bypass
## Success Criteria
Migration is successful when:
- [ ] All tests pass
- [ ] All manual test cases pass
- [ ] Performance is equal or better
- [ ] No security regressions
- [ ] No functionality lost
- [ ] Code quality maintained
- [ ] Documentation updated
- [ ] Team trained on new code
## Notes Section
Use this section to track:
- Issues encountered
- Solutions found
- Time spent on each phase
- Lessons learned
- Tips for future migrations
---
**Migration Started:** _____________
**Migration Completed:** _____________
**Total Time:** _____________
**Team Members:** _____________
**Issues Created:** _____________
**Issues Resolved:** _____________