refactor goctl-compare (#4290)

This commit is contained in:
kesonan 2024-08-03 12:26:24 +08:00 committed by GitHub
parent 8689a6247e
commit c6348b9855
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 332 additions and 658 deletions

1
tools/goctl/compare/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
build

View File

@ -0,0 +1,151 @@
syntax = "v1"
@server (
group: base
)
service test {
@handler root
get /
@handler ping
get /ping
@handler postRoot
post /
@handler postPing
post /ping
}
type (
Subject {
Id int64 `json:"id"`
Name string `json:"name"`
}
Grade {
Id int64 `json:"id"`
Name string `json:"name"`
}
Class {
Id int64 `json:"id"`
Name string `json:"name"`
GradeId int64 `json:"gradeId"`
Teachers []*Teacher `json:"teachers"`
Master {
UserId int64 `json:"userId"`
Temp bool `json:"temp"`
} `json:"master"`
}
User {
Id int64 `json:"id"`
Name string `json:"name"`
Gender int `json:"gender"`
Active bool `json:"active"`
Hobby []string `json:"hobby"`
}
Teacher {
UserId int64 `json:"userId"`
Id int64 `json:"id"`
Name string `json:"name"`
SubjectId int64 `json:"subjectId"`
Class map[int64]*Class `json:"class"`
}
Student {
UserId int64 `json:"userId"`
StudentId int64 `json:"studentId"`
Number string `json:"number"`
ClassId int64 `json:"classId"`
SubjectId []int64 `json:"subjectId"`
SubjectTop3 [3]int64 `json:"subjectTop3"`
Extra map[string]interface{} `json:"extra"`
}
Base {
Code int64 `json:"code"`
Msg string `json:"msg"`
}
)
type (
LoginReq {
Username string `json:"username"`
Password string `json:"password"`
}
LoginResp {
Base
Data *User `json:"data"`
}
)
@server (
group: user
prefix: /user
)
service test {
@handler login
post /login (LoginReq) returns (LoginReq)
}
type (
UserInfoReq {
Id int64 `path:"id"`
}
UserInfoResp {
Base
Data *User `json:"data"`
}
)
@server (
group: user
prefix: /user
jwt: JWT
middleware: Auth
)
service test {
@handler userInfo
post /info/:id (UserInfoReq) returns (UserInfoResp)
}
type (
StudentClassNameListReq {
Id int64 `string:"id"`
}
StudentInfoReq {
Id int64 `path:"id"`
}
SutdentInfoResp {
Base
Data *Student `json:"data"`
}
UpdateStudentInfoReq {
UserId int64 `form:"userId"`
StudentId int64 `form:"studentId"`
Number string `form:"number"`
ClassId int64 `form:"classId"`
SubjectId []int64 `form:"subjectId"`
SubjectTop3 [3]int64 `form:"subjectTop3"`
Extra map[string]interface{} `form:"extra"`
}
UpdateSutdentInfoResp {
Base
Data *Student `json:"data"`
}
)
@server (
group: student
prefix: /student
jwt: JWT
middleware: Auth
)
service test {
@handler studentInfo
get /info/:id (StudentInfoReq) returns (SutdentInfoResp)
@handler updateStudentInfo
post /info/update (UpdateStudentInfoReq) returns (UpdateSutdentInfoResp)
@handler studentClassNameList
post /class/name/list (StudentClassNameListReq) returns ([]string)
}

View File

@ -1,23 +0,0 @@
package cmd
import (
"github.com/spf13/cobra"
"github.com/zeromicro/go-zero/tools/goctl/compare/testdata"
"github.com/zeromicro/go-zero/tools/goctl/util/console"
)
var rootCmd = &cobra.Command{
Use: "compare",
Short: "Compare the goctl commands generated results between urfave and cobra",
Args: cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs),
Run: func(cmd *cobra.Command, args []string) {
dir := args[0]
testdata.MustRun(dir)
},
}
func Execute() {
if err := rootCmd.Execute(); err != nil {
console.Error("%+v", err)
}
}

View File

@ -1,11 +0,0 @@
package main
import "github.com/zeromicro/go-zero/tools/goctl/compare/cmd"
// EXPERIMENTAL: compare goctl generated code results between old and new, it will be removed in the feature.
// TODO: BEFORE RUNNING: export DSN=$datasource, the database must be gozero, and there has no limit for tables.
// TODO: AFTER RUNNING: diff --recursive old_fs new_fs
func main() {
cmd.Execute()
}

View File

@ -0,0 +1,97 @@
#!/bin/bash
# local compare test
# compare goctl between latest and newest version if exists different.
execute_command() {
local command="$1"
echo "=> $command"
eval "$command"
}
has_diff (){
local command="$1"
if $command &> /dev/null; then
return 0
else
return 1
fi
}
echo "=======================env init============================="
WD=$(readlink -f $(dirname $0))/build
BIN=$WD/bin
PROJECT_DIR=$WD/project
OLD_CODE=$PROJECT_DIR/old
NEW_CODE=$PROJECT_DIR/new
if [ -d $WD ]; then
execute_command "rm -rf $WD"
fi
execute_command "mkdir -p $BIN $PROJECT_DIR $OLD_CODE $NEW_CODE"
execute_command 'export GOPROXY="https://goproxy.cn,direct"'
execute_command "export GOBIN=$BIN"
echo "=======================install goctl============================="
# install latest goctl
execute_command "go install github.com/zeromicro/go-zero/tools/goctl@master"
execute_command "mv $BIN/goctl $BIN/goctl.old"
execute_command "$BIN/goctl.old env"
execute_command "$BIN/goctl.old env -w GOCTL_EXPERIMENTAL=on"
# install newest goctl
execute_command "cd .."
execute_command "go build -o goctl.new ."
execute_command "mv goctl.new $BIN/goctl.new"
execute_command "cd -"
execute_command "$BIN/goctl.new env"
execute_command "$BIN/goctl.new env -w GOCTL_EXPERIMENTAL=on"
echo "=======================go mod tidy============================="
# go mod init
execute_command "cd $OLD_CODE"
execute_command "go mod init demo"
execute_command "cd -"
execute_command "cd $NEW_CODE"
execute_command "go mod init demo"
execute_command "cd -"
echo "=======================generate api============================="
execute_command "cd api"
# generate api by goctl.old
execute_command "$BIN/goctl.old api go --api test.api --dir $OLD_CODE/api"
# generate api by goctl.new
execute_command "$BIN/goctl.new api go --api test.api --dir $NEW_CODE/api"
execute_command "cd -"
echo "=======================generate rpc============================="
execute_command "cd rpc"
# generate rpc by goctl.old
execute_command "$BIN/goctl.old rpc protoc test.proto --go_out=$OLD_CODE/rpc --go-grpc_out=$OLD_CODE/rpc --zrpc_out=$OLD_CODE/rpc"
# generate rpc by goctl.new
execute_command "$BIN/goctl.new rpc protoc test.proto --go_out=$NEW_CODE/rpc --go-grpc_out=$NEW_CODE/rpc --zrpc_out=$NEW_CODE/rpc"
execute_command "cd -"
echo "=======================generate model============================="
execute_command "cd model"
# generate model by goctl.old
execute_command "$BIN/goctl.old model mysql ddl --src user.sql --dir $OLD_CODE/cache -c"
execute_command "$BIN/goctl.old model mysql ddl --src user.sql --dir $OLD_CODE/nocache"
# generate model by goctl.new
execute_command "$BIN/goctl.new model mysql ddl --src user.sql --dir $NEW_CODE/cache -c"
execute_command "$BIN/goctl.new model mysql ddl --src user.sql --dir $NEW_CODE/nocache"
execute_command "cd -"
echo "=======================diff compare============================="
# compare and diff
if has_diff "diff -rq $OLD_CODE $NEW_CODE"; then
echo "no diff"
exit 0
else
echo "a diff found"
execute_command "diff -r $OLD_CODE $NEW_CODE"
exit 1
fi

View File

@ -1,7 +0,0 @@
#!/bin/bash
wd=`dirname $0`
GOBIN="$GOPATH/bin"
EXE=goctl-compare
go build -o $EXE $wd
mv $EXE $GOBIN

View File

@ -4,6 +4,7 @@ CREATE TABLE `user`
`id` bigint(10) NOT NULL AUTO_INCREMENT,
`user` varchar(50) NOT NULL DEFAULT '' COMMENT '用户',
`name` varchar(255) COLLATE utf8mb4_general_ci NULL COMMENT '用户\t名称',
`age` tinyint(3) unsigned NOT NULL DEFAULT 0 COMMENT '年龄',
`password` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户\n密码',
`mobile` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '手机号',
`gender` char(5) COLLATE utf8mb4_general_ci NOT NULL COMMENT '男|女|未公\r开',
@ -22,13 +23,14 @@ CREATE TABLE `user`
CREATE TABLE `student`
(
`type` bigint NOT NULL,
`class` varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
`name` varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
`class` varchar(255) NOT NULL DEFAULT '',
`name` varchar(255) NOT NULL DEFAULT '',
`age` tinyint DEFAULT NULL,
`score` float(10, 0
) DEFAULT NULL,
`amount` decimal DEFAULT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`type`) USING BTREE,
UNIQUE KEY `class_name_index` (`class`,`name`)
`delete_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

View File

@ -0,0 +1,8 @@
syntax = "proto3";
package common;
option go_package="./common";
message User {
string name = 1;
}

View File

@ -0,0 +1,65 @@
// test proto
syntax = "proto3";
package test;
import "base/common.proto";
option go_package = "github.com/test";
message Req {
string in = 1;
common.User user = 2;
}
message Reply {
string out = 1;
}
message snake_req {}
message snake_reply {}
message CamelReq{}
message CamelReply{}
message EnumMessage {
enum Enum {
unknown = 0;
male = 1;
female = 2;
}
}
message CommonReply{}
message MapReq{
map<string, string> m = 1;
}
message RepeatedReq{
repeated string id = 1;
}
service Test_Service {
// service
rpc Service (Req) returns (Reply);
// greet service
rpc GreetService (Req) returns (Reply);
// case snake
rpc snake_service (snake_req) returns (snake_reply);
// case camel
rpc CamelService (CamelReq) returns (CamelReply);
// case enum
rpc EnumService (EnumMessage) returns (CommonReply);
// case map
rpc MapService (MapReq) returns (CommonReply);
// case repeated
rpc RepeatedService (RepeatedReq) returns (CommonReply);
// server stream
rpc ServerStream (Req) returns (stream Reply);
// client stream
rpc ClientStream (stream Req) returns (Reply);
// stream
rpc Stream(stream Req) returns (stream Reply);
}

View File

@ -1,17 +0,0 @@
syntax = "v1"
info(
title: "type title here"
desc: "type desc here"
author: "type author here"
email: "type email here"
version: "type version here"
)
type req{}
type reply{}
service kotlin-api{
@handler ping
post /ping
}

View File

@ -1,470 +0,0 @@
package testdata
import _ "embed"
var (
//go:embed unformat.api
unformatApi string
//go:embed kotlin.api
kotlinApi string
//go:embed user.sql
userSql string
list = Files{
{
IsDir: true,
Path: "version",
Cmd: "goctl --version",
},
{
IsDir: true,
Path: "api/sample_file/local",
Cmd: "goctl api --o sample.api",
},
{
IsDir: true,
Path: "api/sample_file/local/assign",
Cmd: "goctl api --o=sample.api",
},
{
IsDir: true,
Path: "api/sample_file/local/assign/shorthand",
Cmd: "goctl api -o=sample.api",
},
{
IsDir: true,
Path: "api/sample_file/remote",
Cmd: "goctl api --o sample.api --remote https://github.com/zeromicro/go-zero-template --branch main",
},
{
IsDir: true,
Path: "api/sample_file/remote/shorthand",
Cmd: "goctl api -o sample.api -remote https://github.com/zeromicro/go-zero-template -branch main",
},
{
IsDir: true,
Path: "api/sample_file/remote/assign",
Cmd: "goctl api --o=sample.api --remote https://github.com/zeromicro/go-zero-template --branch=main",
},
{
IsDir: true,
Path: "api/sample_file/remote/assign/shorthand",
Cmd: "goctl api -o=sample.api -remote https://github.com/zeromicro/go-zero-template -branch=main",
},
{
IsDir: true,
Path: "api/dart/legacy/true",
Cmd: "goctl api --o sample.api && goctl api dart --api sample.api --dir . --hostname 127.0.0.1 --legacy true",
},
{
IsDir: true,
Path: "api/dart/legacy/true/shorthand",
Cmd: "goctl api -o sample.api && goctl api dart -api sample.api -dir . -hostname 127.0.0.1 -legacy true",
},
{
IsDir: true,
Path: "api/dart/legacy/true/assign",
Cmd: "goctl api --o=sample.api && goctl api dart --api=sample.api --dir=. --hostname=127.0.0.1 --legacy=true",
},
{
IsDir: true,
Path: "api/dart/legacy/true/assign/shorthand",
Cmd: "goctl api -o=sample.api && goctl api dart -api=sample.api -dir=. -hostname=127.0.0.1 -legacy=true",
},
{
IsDir: true,
Path: "api/dart/legacy/false",
Cmd: "goctl api --o sample.api && goctl api dart --api sample.api --dir . --hostname 127.0.0.1 --legacy true",
},
{
IsDir: true,
Path: "api/dart/legacy/false/shorthand",
Cmd: "goctl api -o sample.api && goctl api dart -api sample.api -dir . -hostname 127.0.0.1 -legacy true",
},
{
IsDir: true,
Path: "api/dart/legacy/false/assign",
Cmd: "goctl api --o=sample.api && goctl api dart --api=sample.api --dir=. --hostname=127.0.0.1 --legacy=true",
},
{
IsDir: true,
Path: "api/dart/legacy/false/assign/shorthand",
Cmd: "goctl api -o=sample.api && goctl api dart -api=sample.api -dir=. -hostname=127.0.0.1 -legacy=true",
},
{
IsDir: true,
Path: "api/doc",
Cmd: "goctl api --o sample.api && goctl api doc --dir . --o .",
},
{
IsDir: true,
Path: "api/doc/shorthand",
Cmd: "goctl api -o sample.api && goctl api doc -dir . -o .",
},
{
IsDir: true,
Path: "api/doc/assign",
Cmd: "goctl api --o=sample.api && goctl api doc --dir=. --o=.",
},
{
IsDir: true,
Path: "api/doc/assign/shorthand",
Cmd: "goctl api -o=sample.api && goctl api doc -dir=. -o=.",
},
{
Path: "api/format/unformat.api",
Content: unformatApi,
Cmd: "goctl api format --dir . --iu",
},
{
Path: "api/format/shorthand/unformat.api",
Content: unformatApi,
Cmd: "goctl api format -dir . -iu",
},
{
Path: "api/format/assign/unformat.api",
Content: unformatApi,
Cmd: "goctl api format --dir=. --iu",
},
{
Path: "api/format/assign/shorthand/unformat.api",
Content: unformatApi,
Cmd: "goctl api format -dir=. -iu",
},
{
IsDir: true,
Path: "api/go/style/default",
Cmd: "goctl api --o sample.api && goctl api go --api sample.api --dir .",
},
{
IsDir: true,
Path: "api/go/style/default/shorthand",
Cmd: "goctl api -o sample.api && goctl api go -api sample.api -dir .",
},
{
IsDir: true,
Path: "api/go/style/assign/default",
Cmd: "goctl api --o=sample.api && goctl api go --api=sample.api --dir=.",
},
{
IsDir: true,
Path: "api/go/style/assign/default/shorthand",
Cmd: "goctl api -o=sample.api && goctl api go -api=sample.api -dir=.",
},
{
IsDir: true,
Path: "api/go/style/goZero",
Cmd: "goctl api --o sample.api && goctl api go --api sample.api --dir . --style goZero",
},
{
IsDir: true,
Path: "api/go/style/goZero/shorthand",
Cmd: "goctl api -o sample.api && goctl api go -api sample.api -dir . -style goZero",
},
{
IsDir: true,
Path: "api/go/style/goZero/assign",
Cmd: "goctl api --o=sample.api && goctl api go --api=sample.api --dir=. --style=goZero",
},
{
IsDir: true,
Path: "api/go/style/goZero/assign/shorthand",
Cmd: "goctl api -o=sample.api && goctl api go -api=sample.api -dir=. -style=goZero",
},
{
IsDir: true,
Path: "api/java",
Cmd: "goctl api --o sample.api && goctl api java --api sample.api --dir .",
},
{
IsDir: true,
Path: "api/java/shorthand",
Cmd: "goctl api -o sample.api && goctl api java -api sample.api -dir .",
},
{
IsDir: true,
Path: "api/java/assign",
Cmd: "goctl api --o=sample.api && goctl api java --api=sample.api --dir=.",
},
{
IsDir: true,
Path: "api/java/shorthand/assign",
Cmd: "goctl api -o=sample.api && goctl api java -api=sample.api -dir=.",
},
{
IsDir: true,
Path: "api/new/style/default",
Cmd: "goctl api new greet",
},
{
IsDir: true,
Path: "api/new/style/goZero",
Cmd: "goctl api new greet --style goZero",
},
{
IsDir: true,
Path: "api/new/style/goZero/assign",
Cmd: "goctl api new greet --style=goZero",
},
{
IsDir: true,
Path: "api/new/style/goZero/shorthand",
Cmd: "goctl api new greet -style goZero",
},
{
IsDir: true,
Path: "api/new/style/goZero/shorthand/assign",
Cmd: "goctl api new greet -style=goZero",
},
{
IsDir: true,
Path: "api/ts",
Cmd: "goctl api --o sample.api && goctl api ts --api sample.api --dir . --unwrap --webapi .",
},
{
IsDir: true,
Path: "api/ts/shorthand",
Cmd: "goctl api -o sample.api && goctl api ts -api sample.api -dir . -unwrap -webapi .",
},
{
IsDir: true,
Path: "api/ts/assign",
Cmd: "goctl api --o=sample.api && goctl api ts --api=sample.api --dir=. --unwrap --webapi=.",
},
{
IsDir: true,
Path: "api/ts/shorthand/assign",
Cmd: "goctl api -o=sample.api && goctl api ts -api=sample.api -dir=. -unwrap -webapi=.",
},
{
IsDir: true,
Path: "api/validate",
Cmd: "goctl api --o sample.api && goctl api validate --api sample.api",
},
{
IsDir: true,
Path: "api/validate/shorthand",
Cmd: "goctl api -o sample.api && goctl api validate -api sample.api",
},
{
IsDir: true,
Path: "api/validate/assign",
Cmd: "goctl api --o=sample.api && goctl api validate --api=sample.api",
},
{
IsDir: true,
Path: "api/validate/shorthand/assign",
Cmd: "goctl api -o=sample.api && goctl api validate -api=sample.api",
},
{
IsDir: true,
Path: "env/show",
Cmd: "goctl env > env.txt",
},
{
IsDir: true,
Path: "env/check",
Cmd: "goctl env check -f -v",
},
{
IsDir: true,
Path: "env/install",
Cmd: "goctl env install -v",
},
{
IsDir: true,
Path: "kube",
Cmd: "goctl kube deploy --image alpine --name foo --namespace foo --o foo.yaml --port 8888",
},
{
IsDir: true,
Path: "kube/shorthand",
Cmd: "goctl kube deploy -image alpine -name foo -namespace foo -o foo.yaml -port 8888",
},
{
IsDir: true,
Path: "kube/assign",
Cmd: "goctl kube deploy --image=alpine --name=foo --namespace=foo --o=foo.yaml --port=8888",
},
{
IsDir: true,
Path: "kube/shorthand/assign",
Cmd: "goctl kube deploy -image=alpine -name=foo -namespace=foo -o=foo.yaml -port=8888",
},
{
IsDir: true,
Path: "model/mongo/cache",
Cmd: "goctl model mongo --dir . --type user --style goZero -c",
},
{
IsDir: true,
Path: "model/mongo/cache/shorthand",
Cmd: "goctl model mongo -dir . -type user -style goZero -c",
},
{
IsDir: true,
Path: "model/mongo/cache/assign",
Cmd: "goctl model mongo --dir=. --type=user --style=goZero -c",
},
{
IsDir: true,
Path: "model/mongo/cache/shorthand/assign",
Cmd: "goctl model mongo -dir=. -type=user -style=goZero -c",
},
{
IsDir: true,
Path: "model/mongo/nocache",
Cmd: "goctl model mongo --dir . --type user",
},
{
IsDir: true,
Path: "model/mongo/nocache/shorthand",
Cmd: "goctl model mongo -dir . -type user",
},
{
IsDir: true,
Path: "model/mongo/nocache/assign",
Cmd: "goctl model mongo --dir=. --type=user",
},
{
IsDir: true,
Path: "model/mongo/nocache/shorthand/assign",
Cmd: "goctl model mongo -dir=. -type=user",
},
{
Content: userSql,
Path: "model/mysql/ddl/user.sql",
Cmd: "goctl model mysql ddl --database user --dir cache --src user.sql -c",
},
{
Content: userSql,
Path: "model/mysql/ddl/shorthand/user.sql",
Cmd: "goctl model mysql ddl -database user -dir cache -src user.sql -c",
},
{
Content: userSql,
Path: "model/mysql/ddl/assign/user.sql",
Cmd: "goctl model mysql ddl --database=user --dir=cache --src=user.sql -c",
},
{
Content: userSql,
Path: "model/mysql/ddl/shorthand/assign/user.sql",
Cmd: "goctl model mysql ddl -database=user -dir=cache -src=user.sql -c",
},
{
Content: userSql,
Path: "model/mysql/ddl/user.sql",
Cmd: "goctl model mysql ddl --database user --dir nocache --src user.sql",
},
{
Content: userSql,
Path: "model/mysql/ddl/shorthand/user.sql",
Cmd: "goctl model mysql ddl -database user -dir nocache -src user.sql",
},
{
Content: userSql,
Path: "model/mysql/ddl/assign/user.sql",
Cmd: "goctl model mysql ddl --database=user --dir=nocache --src=user.sql",
},
{
Content: userSql,
Path: "model/mysql/ddl/shorthand/assign/user.sql",
Cmd: "goctl model mysql ddl -database=user -dir=nocache -src=user.sql",
},
{
IsDir: true,
Path: "model/mysql/datasource",
Cmd: `goctl model mysql datasource --url $DSN --dir cache --table "*" -c`,
},
{
IsDir: true,
Path: "model/mysql/datasource/shorthand",
Cmd: `goctl model mysql datasource -url $DSN -dir cache -table "*" -c`,
},
{
IsDir: true,
Path: "model/mysql/datasource/shorthand2",
Cmd: `goctl model mysql datasource -url $DSN -dir cache -t "*" -c`,
},
{
IsDir: true,
Path: "model/mysql/datasource/assign",
Cmd: `goctl model mysql datasource --url=$DSN --dir=cache --table="*" -c`,
},
{
IsDir: true,
Path: "model/mysql/datasource/shorthand/assign",
Cmd: `goctl model mysql datasource -url=$DSN -dir=cache -table="*" -c`,
},
{
IsDir: true,
Path: "model/mysql/datasource/shorthand2/assign",
Cmd: `goctl model mysql datasource -url=$DSN -dir=cache -t="*" -c`,
},
{
IsDir: true,
Path: "model/mysql/datasource",
Cmd: `goctl model mysql datasource --url $DSN --dir nocache --table "*" -c`,
},
{
IsDir: true,
Path: "model/mysql/datasource/shorthand",
Cmd: `goctl model mysql datasource -url $DSN -dir nocache -table "*" -c`,
},
{
IsDir: true,
Path: "model/mysql/datasource/shorthand2",
Cmd: `goctl model mysql datasource -url $DSN -dir nocache -t "*" -c`,
},
{
IsDir: true,
Path: "model/mysql/datasource/assign",
Cmd: `goctl model mysql datasource --url=$DSN --dir=nocache --table="*" -c`,
},
{
IsDir: true,
Path: "model/mysql/datasource/shorthand/assign",
Cmd: `goctl model mysql datasource -url=$DSN -dir=nocache -table="*" -c`,
},
{
IsDir: true,
Path: "model/mysql/datasource/shorthand2/assign",
Cmd: `goctl model mysql datasource -url=$DSN -dir=nocache -t="*" -c`,
},
{
IsDir: true,
Path: "rpc/new",
Cmd: "goctl rpc new greet",
},
{
IsDir: true,
Path: "rpc/template",
Cmd: "goctl rpc template --o greet.proto",
},
{
IsDir: true,
Path: "rpc/template/shorthand",
Cmd: "goctl rpc template -o greet.proto",
},
{
IsDir: true,
Path: "rpc/template/assign",
Cmd: "goctl rpc template --o=greet.proto",
},
{
IsDir: true,
Path: "rpc/template/shorthand/assign",
Cmd: "goctl rpc template -o=greet.proto",
},
{
IsDir: true,
Path: "rpc/protoc",
Cmd: "goctl rpc template --o greet.proto && goctl rpc protoc greet.proto --go_out . --go-grpc_out . --zrpc_out .",
},
{
IsDir: true,
Path: "rpc/protoc/assign",
Cmd: "goctl rpc template --o=greet.proto && goctl rpc protoc greet.proto --go_out=. --go-grpc_out=. --zrpc_out=.",
},
}
)

View File

@ -1,119 +0,0 @@
package testdata
import (
"fmt"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
"github.com/gookit/color"
"github.com/zeromicro/go-zero/tools/goctl/util/pathx"
)
type (
File struct {
IsDir bool
Path string
AbsolutePath string
Content string
Cmd string
}
Files []File
)
func (f File) execute(goctl string) error {
printDir := f.Path
dir := f.AbsolutePath
if !f.IsDir {
printDir = filepath.Dir(printDir)
dir = filepath.Dir(dir)
}
printCommand := strings.ReplaceAll(fmt.Sprintf("cd %s && %s", printDir, f.Cmd), "goctl", filepath.Base(goctl))
command := strings.ReplaceAll(fmt.Sprintf("cd %s && %s", dir, f.Cmd), "goctl", goctl)
fmt.Println(color.LightGreen.Render(printCommand))
cmd := exec.Command("sh", "-c", command)
cmd.Env = os.Environ()
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
func (fs Files) execute(goctl string) error {
for _, f := range fs {
err := f.execute(goctl)
if err != nil {
return err
}
}
return nil
}
func mustGetTestData(baseDir string) (Files, Files) {
if len(baseDir) == 0 {
dir, err := os.Getwd()
if err != nil {
log.Fatalln(err)
}
baseDir = dir
}
baseDir, err := filepath.Abs(baseDir)
if err != nil {
return nil, nil
}
createFile := func(baseDir string, data File) (File, error) {
fp := filepath.Join(baseDir, data.Path)
dir := filepath.Dir(fp)
if data.IsDir {
dir = fp
}
if err := pathx.MkdirIfNotExist(dir); err != nil {
return data, err
}
data.AbsolutePath = fp
if data.IsDir {
return data, nil
}
return data, os.WriteFile(fp, []byte(data.Content), os.ModePerm)
}
oldDir := filepath.Join(baseDir, "old_fs")
newDir := filepath.Join(baseDir, "new_fs")
os.RemoveAll(oldDir)
os.RemoveAll(newDir)
var oldFiles, newFiles []File
for _, data := range list {
od, err := createFile(oldDir, data)
if err != nil {
log.Fatalln(err)
}
oldFiles = append(oldFiles, od)
nd, err := createFile(newDir, data)
if err != nil {
log.Fatalln(err)
}
newFiles = append(newFiles, nd)
}
return oldFiles, newFiles
}
func MustRun(baseDir string) {
oldFiles, newFiles := mustGetTestData(baseDir)
goctlOld, err := exec.LookPath("goctl.old")
must(err)
goctlNew, err := exec.LookPath("goctl")
must(err)
fmt.Println(color.LightBlue.Render("========================goctl.old======================="))
must(oldFiles.execute(goctlOld))
fmt.Println()
fmt.Println(color.LightBlue.Render("========================goctl.new======================="))
must(newFiles.execute(goctlNew))
}
func must(err error) {
if err != nil {
log.Fatalln(err)
}
}

View File

@ -1,3 +0,0 @@
syntax = "v1"
type Foo struct{}