Skip to content

Commit

Permalink
feat: tool for comparing different ignite versions (#3718)
Browse files Browse the repository at this point in the history
* Add gen-migdoc script

* Fix gen-migdoc script

* Add gen-mig-docs tool

* Add exceptions and more test cases to migdoc

* Add diff subtraction and cleanup

* Minor improvements

* Remove gen-migdoc bash script

* Move exception files to different file

* Change the diff subtraction algorithm

* Clean up error handling

* Add diff package

* Add Subtract to diff package

* Cleanup gen-mig-diffs

* Fix bugs

* Fix bugs

* Add more test to subtract test cases

* Update the subtract lines algorithm

* go mod tidy

* Add changelog

* Fix lint errors

* Fix bugs

* Fix lint

* make format

* Fix cleanup

* Update ignite/internal/tools/gen-mig-diffs/migdiff/gen.go

Co-authored-by: Danilo Pantani <[email protected]>

* Update ignite/internal/tools/gen-mig-diffs/migdiff/gen.go

Co-authored-by: Danilo Pantani <[email protected]>

* Fix lint

* Use cliui instead of log package

* add gen options

* code clean

* improve error log

* reset and clean the repo before the checkout to avoid conflicts

* use https for repo url

* draft refactor

* improve the logs

* remove useless code

* add pkg options

* pass the context to the commands

* add cache file

* create Scaffold struct

* fix wrong output

* add the scaffold cache

* fix folder search for diffs

* improve the logs and comments

* remove unused temp folder creation

* fix binaries path

* generate migration docs inside a doc template

* format the markdown file

* unhandled error

* fix changelog

* markdown breakline

* add CI to generate migration docs for each release

* skip diff if is empty

* use script to gen mig file

* fix link for the genesis file

---------

Co-authored-by: Danilo Pantani <[email protected]>
Co-authored-by: Danny <[email protected]>
Co-authored-by: Pantani <Pantani>
  • Loading branch information
3 people authored Apr 19, 2024
1 parent e7ec582 commit 95e7a4b
Show file tree
Hide file tree
Showing 26 changed files with 2,247 additions and 0 deletions.
34 changes: 34 additions & 0 deletions .github/workflows/gen-docs-migration.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Generate Migration Docs
on:
release:
types: [ published ]

jobs:
cli:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-go@v5
with:
go-version: 'stable'

- name: Generate Scaffold Migration Docs
run: ./scripts/gen-mig-diffs

- name: Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v6
with:
title: "docs(migration): update generated docs"
commit-message: "docs(migration): update generated docs"
body: ""
branch: feat/gen-migration-docs
add-paths: |
docs/
- name: Check outputs
run: |
echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
1 change: 1 addition & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
- [#4001](https://github.com/ignite/cli/pull/4001) Improve `xgenny` dry run
- [#3967](https://github.com/ignite/cli/issues/3967) Add HD wallet parameters `address index` and `account number` to the chain account config
- [#4004](https://github.com/ignite/cli/pull/4004) Remove all import placeholders using the `xast` pkg
- [#3718](https://github.com/ignite/cli/pull/3718) Add `gen-mig-diffs` tool app to compare scaffold output of two versions of ignite
- [#4077](https://github.com/ignite/cli/pull/4077) Merge the swagger files manually instead use nodetime `swagger-combine`

### Changes
Expand Down
183 changes: 183 additions & 0 deletions ignite/internal/tools/gen-mig-diffs/cmd/root.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
package cmd

import (
"fmt"
"path/filepath"

"github.com/Masterminds/semver/v3"
"github.com/spf13/cobra"

"github.com/ignite/cli/v29/ignite/pkg/cliui"
"github.com/ignite/cli/v29/ignite/pkg/errors"
"github.com/ignite/cli/v29/ignite/pkg/xgenny"

"github.com/ignite/cli/ignite/internal/tools/gen-mig-diffs/pkg/diff"
"github.com/ignite/cli/ignite/internal/tools/gen-mig-diffs/pkg/repo"
"github.com/ignite/cli/ignite/internal/tools/gen-mig-diffs/pkg/scaffold"
"github.com/ignite/cli/ignite/internal/tools/gen-mig-diffs/templates/doc"
)

const (
flagFrom = "from"
flagTo = "to"
flagOutput = "output"
flagSource = "repo-source"
flagRepoURL = "repo-url"
flagRepoOutput = "repo-output"
flagScaffoldOutput = "scaffold-output"
flagScaffoldCache = "scaffold-cache"

defaultDocPath = "docs/docs/06-migration"
)

// NewRootCmd creates a new root command.
func NewRootCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "gen-mig-diffs",
Short: "GenerateBinaries migration diffs",
Long: "This tool is used to generate migration diff files for each of ignites scaffold commands",
RunE: func(cmd *cobra.Command, args []string) error {
session := cliui.New()
defer session.End()

var (
from, _ = cmd.Flags().GetString(flagFrom)
to, _ = cmd.Flags().GetString(flagTo)
repoSource, _ = cmd.Flags().GetString(flagSource)
output, _ = cmd.Flags().GetString(flagOutput)
repoURL, _ = cmd.Flags().GetString(flagRepoURL)
repoOutput, _ = cmd.Flags().GetString(flagRepoOutput)
scaffoldOutput, _ = cmd.Flags().GetString(flagScaffoldOutput)
scaffoldCache, _ = cmd.Flags().GetString(flagScaffoldCache)
)
fromVer, err := semver.NewVersion(from)
if err != nil && from != "" {
return errors.Wrapf(err, "failed to parse from version %s", from)
}
toVer, err := semver.NewVersion(to)
if err != nil && to != "" {
return errors.Wrapf(err, "failed to parse to version %s", to)
}

// Check or download the source and generate the binaries for each version.
repoOptions := make([]repo.Options, 0)
if repoSource != "" {
repoOptions = append(repoOptions, repo.WithSource(repoSource))
}
if repoURL != "" {
repoOptions = append(repoOptions, repo.WithRepoURL(repoURL))
}
if repoOutput != "" {
repoOptions = append(repoOptions, repo.WithRepoOutput(repoOutput))
}

igniteRepo, err := repo.New(fromVer, toVer, session, repoOptions...)
if err != nil {
return err
}
defer igniteRepo.Cleanup()

releaseDescription, err := igniteRepo.ReleaseDescription()
if err != nil {
return errors.Wrapf(err, "failed to fetch the release tag %s description", igniteRepo.To.Original())
}

fromBin, toBin, err := igniteRepo.GenerateBinaries(cmd.Context())
if err != nil {
return err
}

// Scaffold the default commands for each version.
scaffoldOptions := make([]scaffold.Options, 0)
if scaffoldOutput != "" {
scaffoldOptions = append(scaffoldOptions, scaffold.WithOutput(scaffoldOutput))
}
if scaffoldCache != "" {
scaffoldOptions = append(scaffoldOptions, scaffold.WithCachePath(scaffoldCache))
}

session.StartSpinner(fmt.Sprintf("Running scaffold commands for %s...", igniteRepo.From.Original()))
sFrom, err := scaffold.New(fromBin, igniteRepo.From, scaffoldOptions...)
if err != nil {
return err
}
defer sFrom.Cleanup()

if err := sFrom.Run(cmd.Context()); err != nil {
return err
}
session.StopSpinner()
session.EventBus().SendInfo(fmt.Sprintf("Scaffolded code for %s at %s", igniteRepo.From.Original(), sFrom.Output))

session.StartSpinner(fmt.Sprintf("Running scaffold commands for %s...", igniteRepo.To.Original()))
sTo, err := scaffold.New(toBin, igniteRepo.To, scaffoldOptions...)
if err != nil {
return err
}
defer sTo.Cleanup()

if err := sTo.Run(cmd.Context()); err != nil {
return err
}
session.StopSpinner()
session.EventBus().SendInfo(fmt.Sprintf("Scaffolded code for %s at %s", igniteRepo.To.Original(), sTo.Output))

// Calculate and save the diffs from the scaffolded code.
session.StartSpinner("Calculating diff...")
diffs, err := diff.CalculateDiffs(sFrom.Output, sTo.Output)
if err != nil {
return errors.Wrap(err, "failed to calculate diff")
}

formatedDiffs, err := diff.FormatDiffs(diffs)
if err != nil {
return errors.Wrap(err, "failed to save diff map")
}
session.StopSpinner()
session.EventBus().SendInfo("Diff calculated successfully")

output, err = filepath.Abs(output)
if err != nil {
return errors.Wrap(err, "failed to find the abs path")
}

// Generate the docs file.
g, err := doc.NewGenerator(doc.Options{
Path: output,
FromVersion: igniteRepo.From,
ToVersion: igniteRepo.To,
Diffs: string(formatedDiffs),
Description: releaseDescription,
})
if err != nil {
return errors.Wrap(err, "failed to create the doc generator object")
}

sm, err := xgenny.NewRunner(cmd.Context(), output).RunAndApply(g)
if err != nil {
return err
}

files := append(sm.CreatedFiles(), sm.ModifiedFiles()...)
if len(files) == 0 {
return errors.Errorf("migration doc not created at %s", output)
}
session.EventBus().SendInfo(
fmt.Sprintf("Migration doc generated successfully at %s", files[0]),
)

return nil
},
}

cmd.Flags().StringP(flagFrom, "f", "", "Version of Ignite or path to Ignite source code to generate the diff from")
cmd.Flags().StringP(flagTo, "t", "", "Version of Ignite or path to Ignite source code to generate the diff to")
cmd.Flags().StringP(flagOutput, "o", defaultDocPath, "Output directory to save the migration document")
cmd.Flags().StringP(flagSource, "s", "", "Path to Ignite source code repository. Set the source automatically set the cleanup to false")
cmd.Flags().String(flagRepoURL, repo.DefaultRepoURL, "Git URL for the Ignite repository")
cmd.Flags().String(flagRepoOutput, "", "Output path to clone the Ignite repository")
cmd.Flags().String(flagScaffoldOutput, "", "Output path to clone the Ignite repository")
cmd.Flags().String(flagScaffoldCache, "", "Path to cache directory")

return cmd
}
93 changes: 93 additions & 0 deletions ignite/internal/tools/gen-mig-diffs/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
module github.com/ignite/cli/ignite/internal/tools/gen-mig-diffs

go 1.22.2

replace github.com/ignite/cli/v29 => ../../../../

require (
github.com/Masterminds/semver/v3 v3.2.1
github.com/go-git/go-git/v5 v5.12.0
github.com/gobuffalo/genny/v2 v2.1.0
github.com/gobuffalo/plush/v4 v4.1.19
github.com/gobwas/glob v0.2.3
github.com/hexops/gotextdiff v1.0.3
github.com/ignite/cli/v29 v29.0.0-00010101000000-000000000000
github.com/spf13/cobra v1.8.0
github.com/stretchr/testify v1.9.0
)

require (
dario.cat/mergo v1.0.0 // indirect
github.com/AlecAivazis/survey/v2 v2.3.7 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/ProtonMail/go-crypto v1.0.0 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/briandowns/spinner v1.23.0 // indirect
github.com/charmbracelet/lipgloss v0.10.0 // indirect
github.com/chzyer/readline v1.5.1 // indirect
github.com/cloudflare/circl v1.3.7 // indirect
github.com/cockroachdb/errors v1.11.1 // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/emicklei/proto v1.13.2 // indirect
github.com/emicklei/proto-contrib v0.16.0 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/fatih/color v1.16.0 // indirect
github.com/fatih/structs v1.1.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
github.com/go-git/go-billy/v5 v5.5.0 // indirect
github.com/gobuffalo/flect v1.0.2 // indirect
github.com/gobuffalo/github_flavored_markdown v1.1.4 // indirect
github.com/gobuffalo/helpers v0.6.7 // indirect
github.com/gobuffalo/logger v1.0.7 // indirect
github.com/gobuffalo/packd v1.0.2 // indirect
github.com/gobuffalo/tags/v3 v3.1.4 // indirect
github.com/gobuffalo/validate/v3 v3.3.3 // indirect
github.com/gofrs/uuid v4.4.0+incompatible // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/gorilla/css v1.0.1 // indirect
github.com/iancoleman/strcase v0.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/manifoldco/promptui v0.9.0 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
github.com/microcosm-cc/bluemonday v1.0.26 // indirect
github.com/muesli/reflow v0.3.0 // indirect
github.com/muesli/termenv v0.15.2 // indirect
github.com/pjbgf/sha1cd v0.3.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/skeema/knownhosts v1.2.2 // indirect
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d // indirect
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
golang.org/x/crypto v0.22.0 // indirect
golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/net v0.24.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/term v0.19.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.20.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
Loading

0 comments on commit 95e7a4b

Please sign in to comment.