blob: b628babeae529fc92b1088043327fb3bfe28bb02 [file] [log] [blame]
#!/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 "$@"