mirror of
https://github.com/valitydev/thrift.git
synced 2024-11-06 10:25:18 +00:00
330 lines
10 KiB
Bash
Executable File
330 lines
10 KiB
Bash
Executable File
x#!/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.
|
|
#
|
|
|
|
#
|
|
# The veralign script sets the appropriate versions in all of
|
|
# the package configuration files for all of the supported
|
|
# languages. It is used to prepare a release or move master
|
|
# forward to the next anticipated version.
|
|
#
|
|
# USAGE
|
|
# -----------------------------------------------------------
|
|
# usage: veralign.sh <oldVersion> <newVersion>
|
|
#
|
|
# EXAMPLE
|
|
# -----------------------------------------------------------
|
|
# $ ./veralign.sh 0.12.0 1.0.0
|
|
# $ ./veralign.sh 1.0.0 1.1.0
|
|
#
|
|
# IMPORTANT USAGE NOTE
|
|
# -----------------------------------------------------------
|
|
# Define the environment variable DRYRUN to have the script
|
|
# print out all matches to the oldVersion hilighted so that
|
|
# you can verify it will change the right things.
|
|
#
|
|
|
|
declare -A FILES
|
|
|
|
# These files require a manual touch:
|
|
FILES[CHANGES.md]=manual
|
|
FILES[debian/changelog]=manual
|
|
FILES[doap.rdf]=manual
|
|
|
|
# These files can be updated automatically:
|
|
FILES[ApacheThrift.nuspec]=simpleReplace
|
|
FILES[appveyor.yml]=simpleReplace
|
|
FILES[bower.json]=jsonReplace
|
|
FILES[CMakeLists.txt]=simpleReplace
|
|
FILES[compiler/cpp/src/thrift/version.h]=simpleReplace
|
|
FILES[configure.ac]=configureReplace
|
|
FILES[contrib/Rebus/Properties/AssemblyInfo.cs]=simpleReplace
|
|
FILES[contrib/thrift.spec]=simpleReplace
|
|
FILES[contrib/zeromq/csharp/AssemblyInfo.cs]=simpleReplace
|
|
FILES[contrib/thrift-maven-plugin/pom.xml]=pomReplace
|
|
FILES[doc/specs/idl.md]=simpleReplace
|
|
FILES[lib/d/src/thrift/base.d]=simpleReplace
|
|
FILES[lib/dart/pubspec.yaml]=pubspecReplace
|
|
FILES[lib/delphi/src/Thrift.pas]=simpleReplace
|
|
FILES[lib/erl/src/thrift.app.src]=simpleReplace
|
|
FILES[lib/haxe/haxelib.json]=simpleReplace
|
|
FILES[lib/java/gradle.properties]=simpleReplace
|
|
FILES[lib/js/package-lock.json]=jsonReplace
|
|
FILES[lib/js/package.json]=jsonReplace
|
|
FILES[lib/js/src/thrift.js]=simpleReplace
|
|
FILES[lib/lua/Thrift.lua]=simpleReplace
|
|
FILES[lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj]=simpleReplace
|
|
FILES[lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj]=simpleReplace
|
|
FILES[lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj]=simpleReplace
|
|
FILES[lib/netstd/Thrift/Properties/AssemblyInfo.cs]=simpleReplace
|
|
FILES[lib/netstd/Thrift/Thrift.csproj]=simpleReplace
|
|
FILES[lib/ocaml/_oasis]=simpleReplace
|
|
FILES[lib/perl/lib/Thrift.pm]=simpleReplace
|
|
FILES[lib/py/setup.py]=simpleReplace
|
|
FILES[lib/rb/thrift.gemspec]=simpleReplace
|
|
FILES[lib/rs/Cargo.toml]=simpleReplace
|
|
FILES[lib/st/package.xml]=simpleReplace
|
|
FILES[lib/swift/Sources/Thrift.swift]=simpleReplace
|
|
FILES[lib/swift/Tests/ThriftTests/ThriftTests.swift]=simpleReplace
|
|
FILES[lib/ts/package-lock.json]=jsonReplace
|
|
FILES[lib/ts/package.json]=jsonReplace
|
|
FILES[package-lock.json]=jsonReplace
|
|
FILES[package.json]=jsonReplace
|
|
FILES[sonar-project.properties]=simpleReplace
|
|
FILES[test/dart/test_client/pubspec.yaml]=pubspecReplace
|
|
FILES[test/erl/src/thrift_test.app.src]=simpleReplace
|
|
FILES[test/netstd/Client/Client.csproj]=simpleReplace
|
|
FILES[test/netstd/Server/Server.csproj]=simpleReplace
|
|
FILES[Thrift.podspec]=simpleReplace
|
|
FILES[tutorial/dart/client/pubspec.yaml]=pubspecReplace
|
|
FILES[tutorial/dart/console_client/pubspec.yaml]=pubspecReplace
|
|
FILES[tutorial/dart/server/pubspec.yaml]=pubspecReplace
|
|
FILES[tutorial/delphi/DelphiClient/DelphiClient.dproj]=simpleReplace
|
|
FILES[tutorial/delphi/DelphiServer/DelphiServer.dproj]=simpleReplace
|
|
FILES[tutorial/netstd/Client/Client.csproj]=simpleReplace
|
|
FILES[tutorial/netstd/Interfaces/Interfaces.csproj]=simpleReplace
|
|
FILES[tutorial/netstd/Server/Server.csproj]=simpleReplace
|
|
FILES[tutorial/ocaml/_oasis]=simpleReplace
|
|
|
|
|
|
|
|
if [ ! -f "CHANGES.md" ]; then
|
|
>&2 echo "error: run veralign.sh while in the thrift root directory"
|
|
exit 1
|
|
fi
|
|
|
|
if [ $# -ne 2 ]; then
|
|
>&2 echo "usage: veralign.sh <oldVersion> <newVersion>"
|
|
exit 1
|
|
fi
|
|
|
|
jq --version 1>/dev/null 2>/dev/null
|
|
if [ $? -ne 0 ]; then
|
|
>&2 echo "error: the 'jq' package is not installed"
|
|
exit 1
|
|
fi
|
|
|
|
#
|
|
# validateVersion: check that a version matches the major.minor.patch
|
|
# format which is the lowest common denominator supported by all
|
|
# project systems.
|
|
# \param $1 the version
|
|
# \returns 0 if the version is compliant
|
|
#
|
|
function validateVersion
|
|
{
|
|
local result
|
|
local valid
|
|
valid=$(echo "$1" | sed '/^[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+$/!{q22}')
|
|
result=$?
|
|
if [ $result -eq 22 ]; then
|
|
>&2 echo "error: version '$1' does not conform to the required major.minor.patch format"
|
|
return ${result}
|
|
fi
|
|
}
|
|
|
|
OLDVERSION=$1
|
|
NEWVERSION=$2
|
|
validateVersion "${OLDVERSION}" || exit $?
|
|
validateVersion "${NEWVERSION}" || exit $?
|
|
|
|
#
|
|
# escapeVersion: escape the version for use as a sed search
|
|
# \param $1 the version to escape
|
|
# \output the escaped string
|
|
# \returns 0
|
|
# \example VERSEARCH=$(escapeVersion "[1.0.0]"); echo $VERSEARCH; => "\[1\.0\.0\]"
|
|
#
|
|
function escapeVersion
|
|
{
|
|
echo "$(echo "$1" | sed 's/\./\\./g' | sed 's/\[/\\\[/g' | sed 's/\]/\\\]/g')"
|
|
}
|
|
|
|
# Set up verbose hilighting if running interactive
|
|
if [ "$(tput colors)" -ne 0 ]; then
|
|
reverse=$(tput rev)
|
|
red=$(tput setaf 1)
|
|
green=$(tput setaf 2)
|
|
yellow=$(tput setaf 3)
|
|
normal=$(tput sgr0)
|
|
fi
|
|
|
|
declare -A MANUAL
|
|
|
|
#
|
|
# manual: note that update of said file is manual
|
|
# \param $1 filename to do replacements on
|
|
# \returns 0
|
|
#
|
|
function manual
|
|
{
|
|
MANUAL["$1"]=""
|
|
return 0
|
|
}
|
|
|
|
#
|
|
# configureReplace: replace the AC_INIT field in configure.ac
|
|
# \param $1 filename to do replacements on
|
|
# \returns 0 on success
|
|
#
|
|
|
|
function configureReplace
|
|
{
|
|
replace "$1" "[thrift], [${OLDVERSION}]" "[thrift], [${NEWVERSION}]"
|
|
}
|
|
|
|
#
|
|
# jsonReplace: replace a specific version field in a JSON file
|
|
# must be a top level "version" field in the json structure
|
|
# \param $1 filename to do replacements on
|
|
# \returns 0 on success
|
|
#
|
|
|
|
function jsonReplace
|
|
{
|
|
local result
|
|
local output
|
|
if [ ! -z "$DRYRUN" ]; then
|
|
output=$(jq -e ".version" "$1")
|
|
else
|
|
output=$(jq -e ".version = \"${NEWVERSION}\"" "$1" > tmp.$$.json && mv tmp.$$.json "$1")
|
|
fi
|
|
result=$?
|
|
if [ $? -ne 0 ]; then
|
|
printf "%-60s | %5d | ${red}ERROR${normal}: version tag not found" "$1" "$count"
|
|
echo
|
|
return 1
|
|
elif [ ! -z "$DRYRUN" ]; then
|
|
output=${output%\"}
|
|
output=${output#\"}
|
|
printf "%-60s | %5d | MATCHES: version: \"${reverse}${green}${output}${normal}\"" "$1" 1
|
|
echo
|
|
return 0
|
|
fi
|
|
printf "%-60s | %5d | ${green}OK${normal}" "$1" 1
|
|
echo
|
|
return 0
|
|
}
|
|
|
|
#
|
|
# pubspecReplace: replace a specific version field in a YAML file
|
|
# must be a top level "version" field in the yaml structure
|
|
# did not find a package that preserves comments so this is
|
|
# somewhat brain-dead, but it gets the job done
|
|
# \param $1 filename to do replacements on
|
|
# \returns 0 on success
|
|
#
|
|
|
|
function pubspecReplace
|
|
{
|
|
replace "$1" "version: ${OLDVERSION}" "version: ${NEWVERSION}"
|
|
}
|
|
|
|
#
|
|
# pomReplace: replace a specific version field in a maven pom file
|
|
# must be a top level "version" field in the xml structure
|
|
# \param $1 filename to do replacements on
|
|
# \returns 0 on success
|
|
#
|
|
|
|
function pomReplace
|
|
{
|
|
replace "$1" "^ <version>${OLDVERSION}<\/version>" " <version>${NEWVERSION}<\/version>"
|
|
}
|
|
|
|
#
|
|
# replace: replace occurrences of one string with another
|
|
# the file specified must contain the old string at least once
|
|
# in order to be successful.
|
|
# \param $1 filename to do replacements on
|
|
# \param $2 the "old" string to be replaced
|
|
# \param $3 the "new" striing to replace it with
|
|
# \returns 0 on success
|
|
#
|
|
function replace
|
|
{
|
|
local result
|
|
local output
|
|
local oldString="$2"
|
|
local newString="$3"
|
|
local oldRegex=$(escapeVersion "${oldString}")
|
|
local count=$(grep -Ec "${oldRegex}" "$1")
|
|
local verbose
|
|
if [ $count -eq 0 ]; then
|
|
printf "%-60s | %5d | ${red}NOT FOUND${normal}: ${oldString}" "$1" 0
|
|
echo
|
|
return 1
|
|
elif [ ! -z "$DRYRUN" ]; then
|
|
printf "%-60s | %5d | MATCHES:" "$1" "$count"
|
|
echo
|
|
while read -r line; do
|
|
echo " > $(echo "$line" | sed "s/${oldRegex}/${reverse}${green}${oldString}${normal}/g")"
|
|
done < <(grep -E "${oldRegex}" "$1")
|
|
return 0
|
|
fi
|
|
output=$(sed -i "s/${oldRegex}/${newString}/g" "$1")
|
|
result=$?
|
|
if [ $result -ne 0 ]; then
|
|
printf "%-60s | %5d | ${red}ERROR${normal}: %s" "$1" "$count" "$output"
|
|
echo
|
|
return 1
|
|
fi
|
|
printf "%-60s | %5d | ${green}OK${normal}" "$1" "$count"
|
|
echo
|
|
return 0
|
|
}
|
|
|
|
#
|
|
# simpleReplace: replace occurrences of ${OLDVERSION} with ${NEWVERSION}
|
|
# the file specified must contain OLDVERSION at least once
|
|
# in order to be successful.
|
|
# \param $1 filename to do replacements on
|
|
# \param $2 the "old" string to be replaced
|
|
# \param $3 the "new" striing to replace it with
|
|
# \returns 0 on success
|
|
#
|
|
function simpleReplace
|
|
{
|
|
replace "$1" "${OLDVERSION}" "${NEWVERSION}"
|
|
}
|
|
|
|
echo ""
|
|
echo "Apache Thrift Version Alignment Tool"
|
|
echo "------------------------------------"
|
|
echo ""
|
|
echo "Previous Version: ${OLDVERSION}"
|
|
echo " New Version: ${NEWVERSION}"
|
|
echo ""
|
|
echo "-------------------------------------------------------------+-------+----------------------"
|
|
echo "Filename | Count | Status "
|
|
echo "-------------------------------------------------------------+-------+----------------------"
|
|
|
|
for file in $(echo "${!FILES[@]}" | sort); do
|
|
${FILES[$file]} $file || exit $?
|
|
done
|
|
|
|
echo
|
|
echo "Files that must be modified manually:"
|
|
echo
|
|
for manu in $(echo "${!MANUAL[@]}" | sort); do
|
|
echo " > ${yellow}${manu}${normal}"
|
|
done
|
|
|
|
exit 0
|