174 lines
4.7 KiB
Bash
Executable file
174 lines
4.7 KiB
Bash
Executable file
#!/bin/bash
|
|
#
|
|
# Copyright (C) 2016 The Android Open-Source Project
|
|
#
|
|
# Licensed 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.
|
|
#
|
|
|
|
set -e -u
|
|
|
|
base_dir=$(realpath $(dirname $0))
|
|
cd "${base_dir}"
|
|
|
|
UPSTREAM_GIT="https://github.com/curl/curl"
|
|
UPSTREAM="github_curl"
|
|
README_FILE="README.version"
|
|
|
|
TEMP_FILES=()
|
|
cleanup() {
|
|
trap - INT TERM ERR EXIT
|
|
if [[ ${#TEMP_FILES[@]} -ne 0 ]]; then
|
|
rm -f "${TEMP_FILES[@]}"
|
|
fi
|
|
}
|
|
trap cleanup INT TERM ERR EXIT
|
|
|
|
# Prints the URL to the package for the passed version.
|
|
upstream_url() {
|
|
local version="$1"
|
|
echo "https://curl.haxx.se/download/curl-${version}.tar.gz"
|
|
}
|
|
|
|
# Update the contents of the README.version with the new version string passed
|
|
# as the first parameter.
|
|
update_readme() {
|
|
local version="$1"
|
|
local sha="$2"
|
|
local tmp_readme=$(mktemp update_readme.XXXXXX)
|
|
TEMP_FILES+=("${tmp_readme}")
|
|
local url
|
|
url=$(upstream_url "${version}")
|
|
|
|
cat >"${tmp_readme}" <<EOF
|
|
URL: ${url}
|
|
Version: ${version}
|
|
Upstream commit: ${sha}
|
|
EOF
|
|
grep -v -E '^(URL|Version|Upstream commit):' "${README_FILE}" \
|
|
>>"${tmp_readme}" 2>/dev/null || true
|
|
cp "${tmp_readme}" "${README_FILE}"
|
|
}
|
|
|
|
|
|
# Print the current branch name.
|
|
git_current_branch() {
|
|
git rev-parse --abbrev-ref HEAD
|
|
}
|
|
|
|
# Setup and fetch the upstream remote. While we have mirroring setup of the
|
|
# remote, we need to fetch all the tags from upstream to identify the latest
|
|
# release.
|
|
setup_git() {
|
|
local current_branch
|
|
current_branch=$(git_current_branch)
|
|
if [[ "${current_branch}" == "HEAD" ]]; then
|
|
echo "Not working on a branch, please run 'repo start [branch_name] .'" \
|
|
" first." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Setup and fetch the remote.
|
|
if ! git remote show | grep "^${UPSTREAM}\$" >/dev/null; then
|
|
echo "Adding remote ${UPSTREAM} to ${UPSTREAM_GIT}"
|
|
git remote add -t master "${UPSTREAM}" "${UPSTREAM_GIT}"
|
|
fi
|
|
|
|
TRACKING_BRANCH=$(git rev-parse --abbrev-ref --symbolic-full-name @{u})
|
|
OUR_REMOTE="${TRACKING_BRANCH%/*}"
|
|
|
|
echo "Fetching latest upstream code..."
|
|
git fetch --quiet "${UPSTREAM}" master
|
|
}
|
|
|
|
|
|
main() {
|
|
setup_git
|
|
|
|
# Load the current version's upstream hash.
|
|
local current_sha current_version
|
|
current_version=$(grep '^Version: ' "${README_FILE}" | cut -d ' ' -f 2-)
|
|
current_sha=$(grep '^Upstream commit: ' "${README_FILE}" | cut -d ' ' -f 3)
|
|
|
|
if [[ -z "${current_sha}" ]]; then
|
|
echo "Couldn't determine the upstream commit the current code is at." \
|
|
"Please update ${README_FILE} to include it." >&2
|
|
exit 1
|
|
fi
|
|
|
|
local target_sha target_versio
|
|
target_sha="${1:-}"
|
|
if [[ -z "${target_sha}" ]]; then
|
|
cat >&2 <<EOF
|
|
Usage: $0 [target_sha]
|
|
|
|
Pass the upstream commit SHA of the release you want to update to.
|
|
Candidate values are:
|
|
EOF
|
|
# Find the list of potential target_version values.
|
|
git --no-pager log "${UPSTREAM}/master" --not "${current_sha}" --oneline \
|
|
--grep=RELEASE-NOTES --grep=THANKS -- RELEASE-NOTES docs/THANKS
|
|
exit 1
|
|
fi
|
|
|
|
# Expand the hash to the full value:
|
|
target_sha=$(git rev-list -n 1 "${target_sha}")
|
|
target_version=$(git show ${target_sha}:include/curl/curlver.h | \
|
|
grep '^#define LIBCURL_VERSION ')
|
|
target_version=$(echo "${target_version}" | cut -f 2 -d '"')
|
|
target_version="${target_version%-DEV}"
|
|
|
|
# Sanity check that the passed hash is forward in the chain.
|
|
if [[ $(git log --oneline "${target_sha}" --not "${current_sha}" | wc -l) \
|
|
== 0 ]]; then
|
|
echo "The target SHA (${target_sha}) is not forward from ${current_sha}.">&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "Current version: ${current_version} / ${current_sha}"
|
|
echo "Target version: ${target_version} / ${target_sha}"
|
|
echo
|
|
|
|
# Generate the log message.
|
|
local log_message=$(mktemp log_message.XXXXXX)
|
|
TEMP_FILES+=("${log_message}")
|
|
|
|
(cat <<EOF
|
|
Update libcurl from ${current_version} to ${target_version}.
|
|
|
|
Bug: COMPLETE
|
|
Test: COMPLETE
|
|
|
|
Note: This patch includes the following squashed commits from upstream:
|
|
|
|
EOF
|
|
git --no-pager log "${target_sha}" \
|
|
--not "${current_sha}")>"${log_message}"
|
|
|
|
# Land the changes and commit.
|
|
update_readme "${target_version}" "${target_sha}"
|
|
git add "README.version"
|
|
|
|
git cherry-pick --no-commit "${target_sha}" --not "${current_sha}"
|
|
git commit --file="${log_message}"
|
|
|
|
cat <<EOF
|
|
|
|
Run:
|
|
git commit --amend
|
|
|
|
edit the message to add the bug number and test it.
|
|
|
|
EOF
|
|
}
|
|
|
|
main "$@"
|