#!/bin/bash
# Copyright 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 -eu

GIT_URL="git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git"
CGIT_URL="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/plain"

usage() {
  cat <<EOF
Usage: $0 [linux version]

Helper script to quickly update the bundled checkpatch.pl script.
EOF

  if [[ $# -ne 0 ]]; then
    echo "ERROR: $*" 2>&1
    exit 1
  else
    exit 0
  fi
}

# Return the latest kernel release version.
get_latest_version() {
  local output

  # Parse the git tag output to find the latest version.
  # Example output:
  # 0fc80a1fc05dd08762fda6e8efafbb54e88608f4        refs/tags/v4.5
  # b562e44f507e863c6792946e4e1b1449fbbac85d        refs/tags/v4.5^{}
  # b13adfcdf288a00a7e58556f326ecb56fbb53b92        refs/tags/v4.5-rc1

  output=$(git ls-remote --tags "${GIT_URL}")
  # Filter out rc/signed tags.
  output=$(echo "${output}" | grep -v -e '-rc' -e '\^{}')
  # The output might not be sorted based on versions, so do so ourselves and
  # grab the last entry.
  output=$(echo "${output}" | cut -d/ -f3 | sort -V | tail -1)
  # Chop the leading "v" bit.
  echo "${output#v}"
}

# Download checkpatch.pl & data for the specified kernel version.
download() {
  local version="$1"
  local url

  # First the main checkpatch.pl file.
  url="${CGIT_URL}/scripts/checkpatch.pl?h=v${version}"
  wget "${url}" -O checkpatch.pl
  chmod a+rx checkpatch.pl

  # Then any data it uses.
  url="${CGIT_URL}/scripts/spelling.txt?h=v${version}"
  wget "${url}" -O spelling.txt

  # Then any data it uses.
  url="${CGIT_URL}/scripts/const_structs.checkpatch?h=v${version}"
  wget "${url}" -O const_structs.checkpatch
}

main() {
  local version=''
  while [[ $# -gt 0 ]]; do
    case $1 in
    -h|--help) usage;;
    -x) set -x;;
    -*) usage "Unknown option: $1";;
    *) version=${1#v};;
    esac
    shift
  done

  if [[ -z "${version}" ]]; then
     printf 'Detecting latest kernel version ... '
     version=$(get_latest_version)
     echo "${version}"
  fi

  download "${version}"
}
main "$@"
