#!/usr/bin/env bash #===- llvm/utils/docker/scripts/checkout.sh ---------------------===// # # The LLVM Compiler Infrastructure # # This file is distributed under the University of Illinois Open Source # License. See LICENSE.TXT for details. # #===-----------------------------------------------------------------------===// set -e function show_usage() { cat << EOF Usage: checkout.sh [options] Checkout svn sources into /tmp/clang-build/src. Used inside a docker container. Available options: -h|--help show this help message -b|--branch svn branch to checkout, i.e. 'trunk', 'branches/release_40' (default: 'trunk') -r|--revision svn revision to checkout -c|--cherrypick revision to cherry-pick. Can be specified multiple times. Cherry-picks are performed in the sorted order using the following command: 'svn patch <(svn diff -c \$rev)'. -p|--llvm-project name of an svn project to checkout. For clang, please use 'clang', not 'cfe'. Project 'llvm' is always included and ignored, if specified. Can be specified multiple times. EOF } LLVM_SVN_REV="" CHERRYPICKS="" LLVM_BRANCH="" # We always checkout llvm LLVM_PROJECTS="llvm" function contains_project() { local TARGET_PROJ="$1" local PROJ for PROJ in $LLVM_PROJECTS; do if [ "$PROJ" == "$TARGET_PROJ" ]; then return 0 fi done return 1 } while [[ $# -gt 0 ]]; do case "$1" in -r|--revision) shift LLVM_SVN_REV="$1" shift ;; -c|--cherrypick) shift CHERRYPICKS="$CHERRYPICKS $1" shift ;; -b|--branch) shift LLVM_BRANCH="$1" shift ;; -p|--llvm-project) shift PROJ="$1" shift if [ "$PROJ" == "cfe" ]; then PROJ="clang" fi if ! contains_project "$PROJ" ; then if [ "$PROJ" == "clang-tools-extra" ] && [ ! contains_project "clang" ]; then echo "Project 'clang-tools-extra' specified before 'clang'. Adding 'clang' to a list of projects first." LLVM_PROJECTS="$LLVM_PROJECTS clang" fi LLVM_PROJECTS="$LLVM_PROJECTS $PROJ" else echo "Project '$PROJ' is already enabled, ignoring extra occurrences." fi ;; -h|--help) show_usage exit 0 ;; *) echo "Unknown option: $1" exit 1 esac done if [ "$LLVM_BRANCH" == "" ]; then LLVM_BRANCH="trunk" fi if [ "$LLVM_SVN_REV" != "" ]; then SVN_REV_ARG="-r$LLVM_SVN_REV" echo "Checking out svn revision r$LLVM_SVN_REV." else SVN_REV_ARG="" echo "Checking out latest svn revision." fi # Sort cherrypicks and remove duplicates. CHERRYPICKS="$(echo "$CHERRYPICKS" | xargs -n1 | sort | uniq | xargs)" function apply_cherrypicks() { local CHECKOUT_DIR="$1" [ "$CHERRYPICKS" == "" ] || echo "Applying cherrypicks" pushd "$CHECKOUT_DIR" # This function is always called on a sorted list of cherrypicks. for CHERRY_REV in $CHERRYPICKS; do echo "Cherry-picking r$CHERRY_REV into $CHECKOUT_DIR" local PATCH_FILE="$(mktemp)" svn diff -c $CHERRY_REV > "$PATCH_FILE" svn patch "$PATCH_FILE" rm "$PATCH_FILE" done popd } CLANG_BUILD_DIR=/tmp/clang-build # Get the sources from svn. echo "Checking out sources from svn" mkdir -p "$CLANG_BUILD_DIR/src" for LLVM_PROJECT in $LLVM_PROJECTS; do if [ "$LLVM_PROJECT" == "clang" ]; then SVN_PROJECT="cfe" else SVN_PROJECT="$LLVM_PROJECT" fi if [ "$SVN_PROJECT" != "clang-tools-extra" ]; then CHECKOUT_DIR="$CLANG_BUILD_DIR/src/$LLVM_PROJECT" else CHECKOUT_DIR="$CLANG_BUILD_DIR/src/clang/tools/extra" fi echo "Checking out https://llvm.org/svn/llvm-project/$SVN_PROJECT to $CHECKOUT_DIR" svn co -q $SVN_REV_ARG \ "https://llvm.org/svn/llvm-project/$SVN_PROJECT/$LLVM_BRANCH" \ "$CHECKOUT_DIR" # We apply cherrypicks to all repositories regardless of whether the revision # changes this repository or not. For repositories not affected by the # cherrypick, applying the cherrypick is a no-op. apply_cherrypicks "$CHECKOUT_DIR" done CHECKSUMS_FILE="/tmp/checksums/checksums.txt" if [ -f "$CHECKSUMS_FILE" ]; then echo "Validating checksums for LLVM checkout..." python "$(dirname $0)/llvm_checksum/llvm_checksum.py" -c "$CHECKSUMS_FILE" \ --partial --multi_dir "$CLANG_BUILD_DIR/src" else echo "Skipping checksumming checks..." fi echo "Done"