Add migration count check (#27)
Add checks for no matching of migration functions count and the length of `migrations` defined in `migrations.go` For example, for `v284 -> v285` ![image](/attachments/e43c465e-d41f-4755-950d-d3565690ea2a) remove line 556: ![image](/attachments/a8598239-f123-415a-8090-3bdb781ce6ab) run `make lint-go-vet`: ![image](/attachments/7a55b7be-6c19-41b5-995f-98d4aa5a7100) Reviewed-on: https://gitea.com/gitea/gitea-vet/pulls/27 Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: yp05327 <576951401@qq.com> Co-committed-by: yp05327 <576951401@qq.com>
This commit is contained in:
parent
54da2444a7
commit
621ce6ac7b
|
@ -4,7 +4,9 @@
|
||||||
package checks
|
package checks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"errors"
|
"errors"
|
||||||
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -24,6 +26,8 @@ var (
|
||||||
migrationImpBlockList = []string{
|
migrationImpBlockList = []string{
|
||||||
"code.gitea.io/gitea/modules/structs",
|
"code.gitea.io/gitea/modules/structs",
|
||||||
}
|
}
|
||||||
|
migrationImpPrefix = "code.gitea.io/gitea/models/migrations/v"
|
||||||
|
migrationFile = "migrations.go"
|
||||||
)
|
)
|
||||||
|
|
||||||
func checkMigrations(pass *analysis.Pass) (interface{}, error) {
|
func checkMigrations(pass *analysis.Pass) (interface{}, error) {
|
||||||
|
@ -56,13 +60,39 @@ func checkMigrations(pass *analysis.Pass) (interface{}, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
imps := strings.Split(string(impsOut), "\n")
|
imps := strings.Split(string(impsOut), "\n")
|
||||||
|
migrationCount := 0
|
||||||
for _, imp := range imps {
|
for _, imp := range imps {
|
||||||
if stringInSlice(imp, migrationImpBlockList) {
|
if stringInSlice(imp, migrationImpBlockList) {
|
||||||
pass.Reportf(0, "code.gitea.io/gitea/models/migrations cannot import the following packages: %s", migrationImpBlockList)
|
pass.Reportf(0, "code.gitea.io/gitea/models/migrations cannot import the following packages: %s", migrationImpBlockList)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(imp, migrationImpPrefix) {
|
||||||
|
goFilesCmd := exec.Command("go", "list", "-f", `{{join .GoFiles "\n"}}`, imp)
|
||||||
|
goFilesOut, err := goFilesCmd.Output()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// the last item is empty we need to ignore it
|
||||||
|
migrationCount += len(strings.Split(string(goFilesOut), "\n")) - 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mf, err := os.Open(migrationFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer mf.Close()
|
||||||
|
|
||||||
|
l := bufio.NewScanner(mf)
|
||||||
|
for l.Scan() {
|
||||||
|
if strings.Contains(l.Text(), "NewMigration(\"") {
|
||||||
|
migrationCount--
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if migrationCount != 0 {
|
||||||
|
pass.Reportf(0, "migration files count does not match migrations lengths in %s", migrationFile)
|
||||||
|
}
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue