• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2#
3# Copyright (C) 2016 The Android Open-Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#      http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16#
17
18set -e -u
19
20base_dir=$(realpath $(dirname $0))
21cd "${base_dir}"
22
23UPSTREAM_GIT="https://github.com/curl/curl"
24UPSTREAM="github_curl"
25README_FILE="README.version"
26
27TEMP_FILES=()
28cleanup() {
29  trap - INT TERM ERR EXIT
30  if [[ ${#TEMP_FILES[@]} -ne 0 ]]; then
31    rm -f "${TEMP_FILES[@]}"
32  fi
33}
34trap cleanup INT TERM ERR EXIT
35
36# Prints the URL to the package for the passed version.
37upstream_url() {
38  local version="$1"
39  echo "https://curl.haxx.se/download/curl-${version}.tar.gz"
40}
41
42# Update the contents of the README.version with the new version string passed
43# as the first parameter.
44update_readme() {
45  local version="$1"
46  local sha="$2"
47  local tmp_readme=$(mktemp update_readme.XXXXXX)
48  TEMP_FILES+=("${tmp_readme}")
49  local url
50  url=$(upstream_url "${version}")
51
52  cat >"${tmp_readme}" <<EOF
53URL: ${url}
54Version: ${version}
55Upstream commit: ${sha}
56EOF
57  grep -v -E '^(URL|Version|Upstream commit):' "${README_FILE}" \
58    >>"${tmp_readme}" 2>/dev/null || true
59  cp "${tmp_readme}" "${README_FILE}"
60}
61
62
63# Print the current branch name.
64git_current_branch() {
65  git rev-parse --abbrev-ref HEAD
66}
67
68# Setup and fetch the upstream remote. While we have mirroring setup of the
69# remote, we need to fetch all the tags from upstream to identify the latest
70# release.
71setup_git() {
72  local current_branch
73  current_branch=$(git_current_branch)
74  if [[ "${current_branch}" == "HEAD" ]]; then
75    echo "Not working on a branch, please run 'repo start [branch_name] .'" \
76      " first." >&2
77    exit 1
78  fi
79
80  # Setup and fetch the remote.
81  if ! git remote show | grep "^${UPSTREAM}\$" >/dev/null; then
82    echo "Adding remote ${UPSTREAM} to ${UPSTREAM_GIT}"
83    git remote add -t master "${UPSTREAM}" "${UPSTREAM_GIT}"
84  fi
85
86  TRACKING_BRANCH=$(git rev-parse --abbrev-ref --symbolic-full-name @{u})
87  OUR_REMOTE="${TRACKING_BRANCH%/*}"
88
89  echo "Fetching latest upstream code..."
90  git fetch --quiet "${UPSTREAM}" master
91}
92
93
94main() {
95  setup_git
96
97  # Load the current version's upstream hash.
98  local current_sha current_version
99  current_version=$(grep '^Version: ' "${README_FILE}" | cut -d ' ' -f 2-)
100  current_sha=$(grep '^Upstream commit: ' "${README_FILE}" | cut -d ' ' -f 3)
101
102  if [[ -z "${current_sha}" ]]; then
103    echo "Couldn't determine the upstream commit the current code is at." \
104      "Please update ${README_FILE} to include it." >&2
105    exit 1
106  fi
107
108  local target_sha target_versio
109  target_sha="${1:-}"
110  if [[ -z "${target_sha}" ]]; then
111    cat >&2 <<EOF
112Usage: $0 [target_sha]
113
114Pass the upstream commit SHA of the release you want to update to.
115Candidate values are:
116EOF
117    # Find the list of potential target_version values.
118    git --no-pager log "${UPSTREAM}/master" --not "${current_sha}" --oneline \
119      --grep=RELEASE-NOTES --grep=THANKS -- RELEASE-NOTES docs/THANKS
120    exit 1
121  fi
122
123  # Expand the hash to the full value:
124  target_sha=$(git rev-list -n 1 "${target_sha}")
125  target_version=$(git show ${target_sha}:include/curl/curlver.h | \
126    grep '^#define LIBCURL_VERSION ')
127  target_version=$(echo "${target_version}" | cut -f 2 -d '"')
128  target_version="${target_version%-DEV}"
129
130  # Sanity check that the passed hash is forward in the chain.
131  if [[ $(git log --oneline "${target_sha}" --not "${current_sha}" | wc -l) \
132      == 0 ]]; then
133    echo "The target SHA (${target_sha}) is not forward from ${current_sha}.">&2
134    exit 1
135  fi
136
137  echo "Current version: ${current_version} / ${current_sha}"
138  echo "Target version:  ${target_version} / ${target_sha}"
139  echo
140
141  # Generate the log message.
142  local log_message=$(mktemp log_message.XXXXXX)
143  TEMP_FILES+=("${log_message}")
144
145  (cat <<EOF
146Update libcurl from ${current_version} to ${target_version}.
147
148Bug: COMPLETE
149Test: COMPLETE
150
151Note: This patch includes the following squashed commits from upstream:
152
153EOF
154   git --no-pager log "${target_sha}" \
155     --not "${current_sha}")>"${log_message}"
156
157  # Land the changes and commit.
158  update_readme "${target_version}" "${target_sha}"
159  git add "README.version"
160
161  git cherry-pick --no-commit "${target_sha}" --not "${current_sha}"
162  git commit --file="${log_message}"
163
164  cat <<EOF
165
166  Run:
167    git commit --amend
168
169  edit the message to add the bug number and test it.
170
171EOF
172}
173
174main "$@"
175