Skip to content

Commit

Permalink
Add compare.sh
Browse files Browse the repository at this point in the history
  • Loading branch information
kesonan authored and kevwan committed Aug 2, 2024
1 parent e4b6f6a commit 5152671
Show file tree
Hide file tree
Showing 6 changed files with 358 additions and 0 deletions.
1 change: 1 addition & 0 deletions tools/goctl/compare/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
build
151 changes: 151 additions & 0 deletions tools/goctl/compare/api/test.api
Original file line number Diff line number Diff line change
@@ -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)
}

97 changes: 97 additions & 0 deletions tools/goctl/compare/compare.sh
Original file line number Diff line number Diff line change
@@ -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
36 changes: 36 additions & 0 deletions tools/goctl/compare/model/user.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
-- 用户表 --
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',
`nickname` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户昵称',
`type` tinyint(1) COLLATE utf8mb4_general_ci DEFAULT 0 COMMENT '用户类型',
`create_time` timestamp NULL,
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `name_index` (`name`),
UNIQUE KEY `name_index2` (`name`),
UNIQUE KEY `user_index` (`user`),
UNIQUE KEY `type_index` (`type`),
UNIQUE KEY `mobile_index` (`mobile`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `student`
(
`type` bigint NOT NULL,
`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,
`delete_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
8 changes: 8 additions & 0 deletions tools/goctl/compare/rpc/base/common.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
syntax = "proto3";

package common;
option go_package="./common";

message User {
string name = 1;
}
65 changes: 65 additions & 0 deletions tools/goctl/compare/rpc/test.proto
Original file line number Diff line number Diff line change
@@ -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);
}

0 comments on commit 5152671

Please sign in to comment.