| #!/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 "$@" |