#!/usr/bin/env bash

# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------


export PATH=$PATH:$HOME/usr/local/bin
export PROTO_HOME=protocol/all_protocol
export COLLECT_PROTOCOL_HOME=protocol/skywalking-data-collect-protocol
export SATELLITE_PROTOCOL_HOME=protocol/satellite-protocol
export GEN_CODE_PATH=protocol/gen-codes

export COLLECT_PROTOCOL_MODULE=skywalking/network

export GO111MODULE=on
go get google.golang.org/protobuf/cmd/protoc-gen-go@v1.26.0
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1.0
export PATH="$PATH:$(go env GOPATH)/bin"

# generate codes by merged proto files
rm -rf $GEN_CODE_PATH && rm -rf $PROTO_HOME
mkdir ${PROTO_HOME} && mkdir $GEN_CODE_PATH
cp -R ${COLLECT_PROTOCOL_HOME}/* ${PROTO_HOME} && cp -R ${SATELLITE_PROTOCOL_HOME}/* ${PROTO_HOME}
rm -rf ${PROTO_HOME}/*/*Compat.proto && rm -rf ${PROTO_HOME}/*/*compat.proto
protoc -I=${PROTO_HOME} --go_out=${GEN_CODE_PATH} --go-grpc_out=${GEN_CODE_PATH} ${PROTO_HOME}/*/*.proto
rm -rf ${PROTO_HOME}

# init  go modules
cd ${GEN_CODE_PATH}/${COLLECT_PROTOCOL_MODULE}||exit 1
go mod init ${COLLECT_PROTOCOL_MODULE}
go mod edit -replace=google.golang.org/grpc=github.com/grpc/grpc-go@v1.36.1
go mod edit -replace=google.golang.org/protobuf=github.com/golang/protobuf@v1.4.3
go mod tidy
go mod vendor
go build -mod=vendor
cd -|| exit 1







