blob: 70003d2801d1331ba01de38c68f142a8efdd876c [file] [log] [blame]
#!/bin/bash
#
# Copyright 2017 The Bazel Authors. All rights reserved.
#
# 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.
#
# Tests the patching functionality of external repositories.
set -euo pipefail
# --- begin runfiles.bash initialization ---
if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
if [[ -f "$0.runfiles_manifest" ]]; then
export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest"
elif [[ -f "$0.runfiles/MANIFEST" ]]; then
export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST"
elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
export RUNFILES_DIR="$0.runfiles"
fi
fi
if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash"
elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \
"$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)"
else
echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash"
exit 1
fi
# --- end runfiles.bash initialization ---
source "$(rlocation "io_bazel/src/test/shell/integration_test_setup.sh")" \
|| { echo "integration_test_setup.sh not found!" >&2; exit 1; }
# `uname` returns the current platform, e.g "MSYS_NT-10.0" or "Linux".
# `tr` converts all upper case letters to lower case.
# `case` matches the result if the `uname | tr` expression to string prefixes
# that use the same wildcards as names do in Bash, i.e. "msys*" matches strings
# starting with "msys", and "*" matches everything (it's the default case).
case "$(uname -s | tr [:upper:] [:lower:])" in
msys*)
# As of 2019-01-15, Bazel on Windows only supports MSYS Bash.
declare -r is_windows=true
;;
*)
declare -r is_windows=false
;;
esac
if "$is_windows"; then
# Disable MSYS path conversion that converts path-looking command arguments to
# Windows paths (even if they arguments are not in fact paths).
export MSYS_NO_PATHCONV=1
export MSYS2_ARG_CONV_EXCL="*"
fi
if $is_windows; then
export MSYS_NO_PATHCONV=1
export MSYS2_ARG_CONV_EXCL="*"
fi
set_up() {
WRKDIR=$(mktemp -d "${TEST_TMPDIR}/testXXXXXX")
cd "${WRKDIR}"
# create an archive file with files interesting for patching
mkdir ext-0.1.2
cat > ext-0.1.2/foo.sh <<'EOF'
#!/usr/bin/env sh
echo Here be dragons...
EOF
zip ext.zip ext-0.1.2/*
rm -rf ext-0.1.2
}
function get_extrepourl() {
if $is_windows; then
echo "file:///$(cygpath -m $1)"
else
echo "file://$1"
fi
}
test_patch_file() {
EXTREPODIR=`pwd`
EXTREPOURL="$(get_extrepourl ${EXTREPODIR})"
# Test that the patches attribute of http_archive is honored
mkdir main
cd main
cat > patch_foo.sh <<'EOF'
--- foo.sh.orig 2018-01-15 10:39:20.183909147 +0100
+++ foo.sh 2018-01-15 10:43:35.331566052 +0100
@@ -1,3 +1,3 @@
#!/usr/bin/env sh
-echo Here be dragons...
+echo There are dragons...
EOF
cat > WORKSPACE <<EOF
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name="ext",
strip_prefix="ext-0.1.2",
urls=["${EXTREPOURL}/ext.zip"],
build_file_content="exports_files([\"foo.sh\"])",
patches = ["//:patch_foo.sh"],
patch_cmds = ["find . -name '*.sh' -exec sed -i.orig '1s|#!/usr/bin/env sh\$|/bin/sh\$|' {} +"],
)
EOF
cat > BUILD <<'EOF'
genrule(
name = "foo",
outs = ["foo.sh"],
srcs = ["@ext//:foo.sh"],
cmd = "cp $< $@; chmod u+x $@",
executable = True,
)
EOF
bazel build :foo.sh
foopath=`bazel info bazel-genfiles`/foo.sh
grep -q 'There are' $foopath || fail "expected patch to be applied"
grep env $foopath && fail "expected patch commands to be executed" || :
# Verify that changes to the patch files trigger enough rebuilding
cat > patch_foo.sh <<'EOF'
--- foo.sh.orig 2018-01-15 10:39:20.183909147 +0100
+++ foo.sh 2018-01-15 10:43:35.331566052 +0100
@@ -1,3 +1,3 @@
#!/usr/bin/env sh
-echo Here be dragons...
+echo completely differently patched
EOF
bazel build :foo.sh
foopath=`bazel info bazel-genfiles`/foo.sh
grep -q 'differently patched' $foopath \
|| fail "expected the new patch to be applied"
# Verify that changes to the patches attribute trigger enough rebuilding
cat > WORKSPACE <<EOF
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name="ext",
strip_prefix="ext-0.1.2",
urls=["${EXTREPOURL}/ext.zip"],
build_file_content="exports_files([\"foo.sh\"])",
)
EOF
bazel build :foo.sh
foopath=`bazel info bazel-genfiles`/foo.sh
grep -q 'Here be' $foopath || fail "expected unpatched file"
grep -q 'env' $foopath || fail "expected unpatched file"
}
test_patch_failed() {
EXTREPODIR=`pwd`
EXTREPOURL="$(get_extrepourl ${EXTREPODIR})"
cat > my_patch_tool <<'EOF'
#!/bin/sh
echo Helpful message
exit 1
EOF
chmod u+x my_patch_tool
# Test that the patches attribute of http_archive is honored
mkdir main
cd main
echo "ignored anyway" > patch_foo.sh
cat > WORKSPACE <<EOF
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name="ext",
strip_prefix="ext-0.1.2",
urls=["${EXTREPOURL}/ext.zip"],
build_file_content="exports_files([\"foo.sh\"])",
patches = ["//:patch_foo.sh"],
patch_tool = "${EXTREPODIR}/my_patch_tool",
)
EOF
touch BUILD
bazel build @ext//... >"${TEST_log}" 2>&1 && fail "expected failure" || :
expect_log 'Helpful message'
}
test_patch_git() {
EXTREPODIR=`pwd`
if $is_windows; then
EXTREPODIR="$(cygpath -m ${EXTREPODIR})"
fi
export GIT_CONFIG_NOSYSTEM=YES
mkdir extgit
(cd extgit && git init \
&& git config user.email 'me@example.com' \
&& git config user.name 'E X Ample' )
cat > extgit/foo.sh <<'EOF'
#!/usr/bin/env sh
echo Here be dragons...
EOF
(cd extgit
git add .
git commit --author="A U Thor <author@example.com>" -m 'initial commit'
git tag mytag)
# Test that the patches attribute of git_repository is honored
mkdir main
cd main
cat > patch_foo.sh <<'EOF'
--- foo.sh.orig 2018-01-15 10:39:20.183909147 +0100
+++ foo.sh 2018-01-15 10:43:35.331566052 +0100
@@ -1,3 +1,3 @@
#!/usr/bin/env sh
-echo Here be dragons...
+echo There are dragons...
EOF
cat > WORKSPACE <<EOF
load("@bazel_tools//tools/build_defs/repo:git.bzl", "new_git_repository")
new_git_repository(
name="ext",
remote="${EXTREPODIR}/extgit/.git",
tag="mytag",
build_file_content="exports_files([\"foo.sh\"])",
patches = ["//:patch_foo.sh"],
patch_cmds = ["find . -name '*.sh' -exec sed -i.orig '1s|#!/usr/bin/env sh\$|/bin/sh\$|' {} +"],
)
EOF
cat > BUILD <<'EOF'
genrule(
name = "foo",
outs = ["foo.sh"],
srcs = ["@ext//:foo.sh"],
cmd = "cp $< $@; chmod u+x $@",
executable = True,
)
EOF
bazel build :foo.sh
foopath=`bazel info bazel-genfiles`/foo.sh
grep -q 'There are' $foopath || fail "expected patch to be applied"
grep env $foopath && fail "expected patch commands to be executed" || :
# Verify that changes to the patch files trigger enough rebuilding
cat > patch_foo.sh <<'EOF'
--- foo.sh.orig 2018-01-15 10:39:20.183909147 +0100
+++ foo.sh 2018-01-15 10:43:35.331566052 +0100
@@ -1,3 +1,3 @@
#!/usr/bin/env sh
-echo Here be dragons...
+echo completely differently patched
EOF
bazel build :foo.sh
foopath=`bazel info bazel-genfiles`/foo.sh
grep -q 'differently patched' $foopath \
|| fail "expected the new patch to be applied"
# Verify that changes to the patches attribute trigger enough rebuilding
cat > WORKSPACE <<EOF
load("@bazel_tools//tools/build_defs/repo:git.bzl", "new_git_repository")
new_git_repository(
name="ext",
remote="${EXTREPODIR}/extgit/.git",
tag="mytag",
build_file_content="exports_files([\"foo.sh\"])",
)
EOF
bazel build :foo.sh
foopath=`bazel info bazel-genfiles`/foo.sh
grep -q 'Here be' $foopath || fail "expected unpatched file"
grep -q 'env' $foopath || fail "expected unpatched file"
}
test_override_buildfile() {
## Verify that the BUILD file of an external repository can be overridden
## via the http_archive rule.
EXTREPODIR=`pwd`
EXTREPOURL="$(get_extrepourl ${EXTREPODIR})"
mkdir withbuild
cat > withbuild/BUILD <<'EOF'
genrule(
name="target",
srcs=["file.txt"],
outs=["target.txt"],
cmd="cp $< $@ && echo BAD >> $@",
)
EOF
cat > withbuild/file.txt <<'EOF'
from external repo
EOF
zip withbuild.zip withbuild/*
rm -rf withbuild
mkdir main
cd main
cat > WORKSPACE <<EOF
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name="withbuild",
strip_prefix="withbuild",
urls=["${EXTREPOURL}/withbuild.zip"],
build_file="@//:ext.BUILD",
)
EOF
cat > BUILD <<'EOF'
genrule(
name = "local",
outs = ["local.txt"],
srcs = ["@withbuild//:target"],
cmd = "cp $< $@",
)
EOF
cat > ext.BUILD <<'EOF'
genrule(
name="target",
srcs=["file.txt"],
outs=["target.txt"],
cmd="cp $< $@ && echo GOOD >> $@",
visibility=["//visibility:public"],
)
EOF
bazel build //:local || fail "Expected success"
cat `bazel info bazel-genfiles`/local.txt > "${TEST_log}"
expect_log "from external repo"
expect_log "GOOD"
expect_not_log "BAD"
}
test_override_buildfile_content() {
## Verify that the BUILD file of an external repository can be overridden
## via specified content in the http_archive rule.
EXTREPODIR=`pwd`
EXTREPOURL="$(get_extrepourl ${EXTREPODIR})"
mkdir withbuild
cat > withbuild/BUILD <<'EOF'
genrule(
name="target",
srcs=["file.txt"],
outs=["target.txt"],
cmd="cp $< $@ && echo BAD >> $@",
)
EOF
cat > withbuild/file.txt <<'EOF'
from external repo
EOF
zip withbuild.zip withbuild/*
rm -rf withbuild
mkdir main
cd main
cat > WORKSPACE <<EOF
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name="withbuild",
strip_prefix="withbuild",
urls=["${EXTREPOURL}/withbuild.zip"],
build_file_content="""
genrule(
name="target",
srcs=["file.txt"],
outs=["target.txt"],
cmd="cp \$< \$@ && echo GOOD >> \$@",
visibility=["//visibility:public"],
)
""",
)
EOF
cat > BUILD <<'EOF'
genrule(
name = "local",
outs = ["local.txt"],
srcs = ["@withbuild//:target"],
cmd = "cp $< $@",
)
EOF
bazel build //:local || fail "Expected success"
cat `bazel info bazel-genfiles`/local.txt > "${TEST_log}"
expect_log "from external repo"
expect_log "GOOD"
expect_not_log "BAD"
}
test_override_buildfile_git() {
## Verify that the BUILD file of an external repository can be overridden
## via the git_repository rule.
EXTREPODIR=`pwd`
if $is_windows; then
EXTREPODIR="$(cygpath -m ${EXTREPODIR})"
fi
export GIT_CONFIG_NOSYSTEM=YES
mkdir withbuild
(cd withbuild && git init \
&& git config user.email 'me@example.com' \
&& git config user.name 'E X Ample' )
cat > withbuild/BUILD.bazel <<'EOF'
genrule(
name="target",
srcs=["file.txt"],
outs=["target.txt"],
cmd="cp $< $@ && echo BAD >> $@",
visibility=["//visibility:public"],
)
EOF
cat > withbuild/file.txt <<'EOF'
from external repo
EOF
(cd withbuild
git add .
git commit --author="A U Thor <author@example.com>" -m 'initial commit'
git tag mytag)
mkdir main
cd main
cat > WORKSPACE <<EOF
load("@bazel_tools//tools/build_defs/repo:git.bzl", "new_git_repository")
new_git_repository(
name="withbuild",
remote="${EXTREPODIR}/withbuild/.git",
tag="mytag",
build_file="@//:ext.BUILD",
)
EOF
cat > BUILD <<'EOF'
genrule(
name = "local",
outs = ["local.txt"],
srcs = ["@withbuild//:target"],
cmd = "cp $< $@",
)
EOF
cat > ext.BUILD <<'EOF'
genrule(
name="target",
srcs=["file.txt"],
outs=["target.txt"],
cmd="cp $< $@ && echo GOOD >> $@",
visibility=["//visibility:public"],
)
EOF
bazel build //:local || fail "Expected success"
cat `bazel info bazel-genfiles`/local.txt > "${TEST_log}"
expect_log "from external repo"
expect_log "GOOD"
expect_not_log "BAD"
}
test_override_buildfilecontents_git() {
## Verify that the BUILD file of an external repository can be overridden
## via specified content in the git_repository rule.
EXTREPODIR=`pwd`
if $is_windows; then
EXTREPODIR="$(cygpath -m ${EXTREPODIR})"
fi
export GIT_CONFIG_NOSYSTEM=YES
mkdir withbuild
(cd withbuild && git init \
&& git config user.email 'me@example.com' \
&& git config user.name 'E X Ample' )
cat > withbuild/BUILD.bazel <<'EOF'
genrule(
name="target",
srcs=["file.txt"],
outs=["target.txt"],
cmd="cp $< $@ && echo BAD >> $@",
visibility=["//visibility:public"],
)
EOF
cat > withbuild/file.txt <<'EOF'
from external repo
EOF
(cd withbuild
git add .
git commit --author="A U Thor <author@example.com>" -m 'initial commit'
git tag mytag)
mkdir main
cd main
cat > WORKSPACE <<EOF
load("@bazel_tools//tools/build_defs/repo:git.bzl", "new_git_repository")
new_git_repository(
name="withbuild",
remote="${EXTREPODIR}/withbuild/.git",
tag="mytag",
build_file_content="""
genrule(
name="target",
srcs=["file.txt"],
outs=["target.txt"],
cmd="cp \$< \$@ && echo GOOD >> \$@",
visibility=["//visibility:public"],
)
""",
)
EOF
cat > BUILD <<'EOF'
genrule(
name = "local",
outs = ["local.txt"],
srcs = ["@withbuild//:target"],
cmd = "cp $< $@",
)
EOF
bazel build //:local || fail "Expected success"
cat `bazel info bazel-genfiles`/local.txt > "${TEST_log}"
expect_log "from external repo"
expect_log "GOOD"
expect_not_log "BAD"
}
test_build_file_build_bazel() {
## Verify that the BUILD file of an external repository can be overridden
## via the http_archive rule.
EXTREPODIR=`pwd`
EXTREPOURL="$(get_extrepourl ${EXTREPODIR})"
mkdir withbuild
cat > withbuild/BUILD.bazel <<'EOF'
genrule(
name="target",
srcs=["file.txt"],
outs=["target.txt"],
cmd="cp $< $@ && echo BAD >> $@",
)
EOF
cat > withbuild/file.txt <<'EOF'
from external repo
EOF
zip withbuild.zip withbuild/*
rm -rf withbuild
mkdir main
cd main
cat > WORKSPACE <<EOF
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name="withbuild",
strip_prefix="withbuild",
urls=["${EXTREPOURL}/withbuild.zip"],
build_file="@//:ext.BUILD",
)
EOF
cat > BUILD <<'EOF'
genrule(
name = "local",
outs = ["local.txt"],
srcs = ["@withbuild//:target"],
cmd = "cp $< $@",
)
EOF
cat > ext.BUILD <<'EOF'
genrule(
name="target",
srcs=["file.txt"],
outs=["target.txt"],
cmd="cp $< $@ && echo GOOD >> $@",
visibility=["//visibility:public"],
)
EOF
bazel build //:local || fail "Expected success"
cat `bazel info bazel-genfiles`/local.txt > "${TEST_log}"
expect_log "from external repo"
expect_log "GOOD"
expect_not_log "BAD"
}
test_git_format_patch() {
EXTREPODIR=`pwd`
EXTREPOURL="$(get_extrepourl ${EXTREPODIR})"
# Verify that a patch in the style of git-format-patch(1) can be handled.
mkdir main
cd main
ls -al
cat > 0001-foo.sh-remove-dragons.patch <<'EOF'
From a8c0f9248dd85feac9d08b017776b5aedd1e7be8 Mon Sep 17 00:00:00 2001
From: Klaus Aehlig <aehlig@google.com>
Date: Wed, 13 Jun 2018 11:32:39 +0200
Subject: [PATCH] foo.sh: remove dragons
---
foo.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/foo.sh b/foo.sh
index 1f4c41e..9d548ff 100644
--- a/foo.sh
+++ b/foo.sh
@@ -1,3 +1,3 @@
#!/usr/bin/env sh
-echo Here be dragons...
+echo New version of foo.sh, no more dangerous animals...
--
2.18.0.rc1.244.gcf134e6275-goog
EOF
cat > WORKSPACE <<EOF
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name="ext",
strip_prefix="ext-0.1.2",
urls=["${EXTREPOURL}/ext.zip"],
build_file_content="exports_files([\"foo.sh\"])",
patches = ["//:0001-foo.sh-remove-dragons.patch"],
patch_args = ["-p1"],
patch_cmds = ["find . -name '*.sh' -exec sed -i.orig '1s|#!/usr/bin/env sh\$|/bin/sh\$|' {} +"],
)
EOF
cat > BUILD <<'EOF'
genrule(
name = "foo",
outs = ["foo.sh"],
srcs = ["@ext//:foo.sh"],
cmd = "cp $< $@; chmod u+x $@",
executable = True,
)
EOF
bazel build :foo.sh
foopath=`bazel info bazel-genfiles`/foo.sh
grep -q 'New version' $foopath || fail "expected patch to be applied"
}
run_suite "external patching tests"