blob: aba79c2dbf553a6cee668fbe5801104eb3087bba [file] [log] [blame] [edit]
#!/bin/bash
# --- begin runfiles.bash initialization ---
# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash).
set -euo pipefail
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 ---
die () {
echo "$1" 1>&2
exit 1
}
[[ "$1" =~ external/* ]] && buildozer="${{1#external/}}" || buildozer="$TEST_WORKSPACE/$1"
buildozer="$(rlocation "$buildozer")"
source $TEST_SRCDIR/_main/buildozer/test_common.sh
## TEST INPUTS
no_deps='go_library(
name = "edit",
)'
empty_deps='go_library(
name = "edit",
deps = [],
)'
one_dep='go_library(
name = "edit",
deps = ["//buildifier:build"],
)'
two_deps='go_library(
name = "edit",
deps = [
":local",
"//buildifier:build",
],
)'
two_deps_with_select='go_library(
name = "edit",
deps = [
":local",
"//buildifier:build",
] + select({
"//tools/some:condition": [
"//some:value",
"//some/other:value",
],
"//tools/other:condition": [
"//yet/another:value",
],
}),
)'
quoted_deps='go_library(
name = "edit",
deps = [
"//buildifier:build",
"//foo",
"//bar",
"\"//baz\"",
],
)'
## TESTS
function test_add_one_dep() {
run "$one_dep" 'add deps //foo' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [
"//buildifier:build",
"//foo",
],
)'
}
function test_add_dep_no_deps() {
run "$no_deps" 'add deps //foo' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = ["//foo"],
)'
}
function test_add_dep_quotes() {
run "$no_deps" 'add deps "//foo"' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = ["//foo"],
)'
}
function test_add_dep_empty_deps() {
run "$empty_deps" 'add deps //foo' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = ["//foo"],
)'
}
function test_add_dep_two_deps() {
run "$two_deps" 'add deps :local2' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [
":local",
":local2",
"//buildifier:build",
],
)'
}
function test_add_existing_dep() {
in='go_library(
name = "edit",
deps = [":local"],
)'
ERROR=3 run "$in" 'add deps //pkg:local' '//pkg:edit'
assert_equals "$in"
}
function test_add_existing_dep2() {
in='go_library(
name = "edit",
deps = ["//pkg:local"],
)'
ERROR=3 run "$in" 'add deps //pkg:local' '//pkg:edit'
assert_equals "$in"
}
function test_add_shortened_dep() {
in='go_library(
name = "edit",
)'
run "$in" 'add deps //pkg:local' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [":local"],
)'
}
function test_sorted_deps() {
in='go_library(
name = "edit",
deps = [
":c",
# comment that prevents buildifier reordering
":x",
"//foo",
],
)'
run "$in" 'add deps :z :a :e //last' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [
":a",
":c",
":e",
# comment that prevents buildifier reordering
":x",
":z",
"//foo",
"//last",
],
)'
}
function test_noshorten_labels_flag() {
in='go_library(
name = "edit",
)'
run "$in" --shorten_labels=false 'add deps //pkg:local' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = ["//pkg:local"],
)'
}
function test_add_duplicate_label() {
# "build" and ":build" labels are equivalent
in='go_library(
name = "edit",
deps = ["build"],
)'
ERROR=3 run "$in" 'add deps :build' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = ["build"],
)'
}
function test_add_duplicate_label2() {
# "build" and ":build" labels are equivalent
in='go_library(
name = "edit",
deps = [":build"],
)'
ERROR=3 run "$in" 'add deps build' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [":build"],
)'
}
function test_remove_last_dep() {
run "$one_dep" 'remove deps //buildifier:build' '//pkg:edit'
assert_equals 'go_library(name = "edit")'
}
function test_remove_all_attrs() {
run "$one_dep" 'remove *' '//pkg:edit'
assert_equals 'go_library(name = "edit")'
}
function test_remove_all_attrs_none() {
ERROR=3 run "$no_deps" 'remove *' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
)'
}
function test_remove_dep() {
run "$two_deps" 'remove deps //buildifier:build' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [":local"],
)'
}
function test_remove_dep_outside_of_select() {
run "$two_deps_with_select" 'remove deps //buildifier:build' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [":local"] + select({
"//tools/some:condition": [
"//some:value",
"//some/other:value",
],
"//tools/other:condition": [
"//yet/another:value",
],
}),
)'
}
function test_remove_all_deps_outside_of_select() {
run "$two_deps_with_select" 'remove deps //buildifier:build :local' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = select({
"//tools/some:condition": [
"//some:value",
"//some/other:value",
],
"//tools/other:condition": [
"//yet/another:value",
],
}),
)'
}
function test_remove_dep_in_select() {
run "$two_deps_with_select" 'remove deps //some:value' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [
":local",
"//buildifier:build",
] + select({
"//tools/some:condition": ["//some/other:value"],
"//tools/other:condition": [
"//yet/another:value",
],
}),
)'
}
function test_remove_deps_in_select() {
run "$two_deps_with_select" 'remove deps //some:value //some/other:value' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [
":local",
"//buildifier:build",
] + select({
"//tools/some:condition": [],
"//tools/other:condition": [
"//yet/another:value",
],
}),
)'
}
function test_remove_all_deps_in_select() {
run "$two_deps_with_select" 'remove deps //some:value //some/other:value //yet/another:value' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [
":local",
"//buildifier:build",
],
)'
}
function test_remove_all_deps() {
run "$two_deps_with_select" 'remove deps //some:value //some/other:value //yet/another:value :local //buildifier:build' '//pkg:edit'
assert_equals 'go_library(name = "edit")'
}
function test_remove_dep_quotes() {
run "$two_deps" 'remove deps "//buildifier:build"' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [":local"],
)'
}
function test_remove_local_dep() {
run "$two_deps" 'remove deps local' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = ["//buildifier:build"],
)'
}
function test_remove_two_deps() {
run "$two_deps" 'remove deps //buildifier:build :local' '//pkg:edit'
assert_equals 'go_library(name = "edit")'
}
function test_remove_dep_using_long_label() {
run "$two_deps" 'remove deps //pkg:local' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = ["//buildifier:build"],
)'
}
function test_remove_nonexistent_item() {
run "$two_deps" 'remove deps //foo:bar :local' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = ["//buildifier:build"],
)'
}
function test_remove_item_with_comment() {
commented_deps='go_library(
name = "edit",
deps = [
# Do not remove!!!!11111!!!
":local",
"//buildifier:build", #fixdeps: keep
"//remove:me",
],
)'
run "$commented_deps" 'remove deps //buildifier:build //remove:me :local' '//pkg:edit'
assert_equals 'go_library(name = "edit")'
}
function test_remove_src() {
in='go_library(
name = "edit",
srcs = ["file" + ".go", "other.go"],
)'
run "$in" 'remove srcs other.go' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
srcs = ["file" + ".go"],
)'
}
function test_remove_dep_without_colon() {
in='go_library(
name = "edit",
deps = ["local", "//base"],
)'
run "$in" 'remove deps //pkg:local' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = ["//base"],
)'
}
function test_remove_attribute() {
run "$two_deps" 'remove deps' '//pkg:edit'
assert_equals 'go_library(name = "edit")'
}
function test_remove_concatenated_attribute() {
in='cc_library(name = "a", deps = ["//my/"] + ["foo"])'
run "$in" 'remove deps :foo' '//pkg:a'
assert_equals 'cc_library(
name = "a",
deps = ["//my/"],
)'
}
function test_remove_from_all_attributes() {
in='java_library(name = "a", data = ["b","c"], exports = ["c"], deps = ["c","d"])'
run "$in" 'remove * c' '//pkg:a'
assert_equals 'java_library(
name = "a",
data = ["b"],
deps = ["d"],
)'
}
function test_remove_from_all_rules() {
in='cc_library(name = "a", visibility = ["//visibility:private"])
cc_library(name = "b")
exports_files(["a.cc"], visibility = ["//visibility:private"])'
run "$in" 'remove visibility' '//pkg:all'
assert_equals 'cc_library(name = "a")
cc_library(name = "b")
exports_files(["a.cc"])'
}
function test_remove_package_attribute() {
in='package(default_visibility = ["//visibility:public"])'
run "$in" 'remove default_visibility' '//pkg:__pkg__'
[ $(wc -c < "$root/pkg/BUILD") -eq 0 ] || fail "Expected empty file"
}
function test_remove_if_equal_label() {
in='go_library(
name = "edit",
shared_library = ":local", # Suffix comment.
)'
run "$in" 'remove_if_equal shared_library :local' '//pkg:edit'
assert_equals 'go_library(name = "edit")'
}
function test_remove_if_equal_label_does_not_match() {
in='go_library(
name = "edit",
shared_library = ":local", # Suffix comment.
)'
ERROR=3 run "$in" 'remove_if_equal shared_library :global' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
shared_library = ":local", # Suffix comment.
)'
}
function test_remove_if_equal_label_full_path() {
in='go_library(
name = "edit",
shared_library = ":local", # Suffix comment.
)'
run "$in" 'remove_if_equal shared_library //pkg:local' '//pkg:edit'
assert_equals 'go_library(name = "edit")'
}
function test_remove_if_equal_ident() {
in='go_library(
name = "edit",
flag = True,
)'
run "$in" 'remove_if_equal flag True' '//pkg:edit'
assert_equals 'go_library(name = "edit")'
}
function test_remove_if_equal_ident_does_not_match() {
in='go_library(
name = "edit",
flag = True,
)'
ERROR=3 run "$in" 'remove_if_equal flag False' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
flag = True,
)'
}
function test_remove_if_equal_string() {
in='go_library(
name = "edit",
flag = "True",
)'
run "$in" 'remove_if_equal flag True' '//pkg:edit'
assert_equals 'go_library(name = "edit")'
}
function test_remove_if_equal_string_does_not_match() {
in='go_library(
name = "edit",
flag = "False",
)'
ERROR=3 run "$in" 'remove_if_equal flag True' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
flag = "False",
)'
}
function test_remove_if_equal_string_attr_string() {
in='go_library(
name = "edit",
toolchain = "something",
)'
run "$in" 'remove_if_equal toolchain something' '//pkg:edit'
assert_equals 'go_library(name = "edit")'
}
function test_move_last_dep() {
run "$one_dep" 'move deps runtime_deps //buildifier:build' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
runtime_deps = ["//buildifier:build"],
)'
}
function test_move_dep() {
run "$two_deps" 'move deps runtime_deps //buildifier:build' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
runtime_deps = ["//buildifier:build"],
deps = [":local"],
)'
}
function test_move_two_deps() {
run "$two_deps" 'move deps runtime_deps //buildifier:build :local' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
runtime_deps = [
":local",
"//buildifier:build",
],
)'
}
function test_move_dep_using_long_label() {
run "$two_deps" 'move deps runtime_deps //pkg:local' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
runtime_deps = [":local"],
deps = ["//buildifier:build"],
)'
}
function test_move_dep_with_comment() {
local input='go_library(
name = "edit",
deps = [
":local", # needed at runtime for some obscure reason
"//buildifier:build",
],
)'
run "$input" 'move deps runtime_deps :local' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
runtime_deps = [
":local", # needed at runtime for some obscure reason
],
deps = ["//buildifier:build"],
)'
}
function test_move_nonexistent_item() {
run "$two_deps" 'move deps runtime_deps //foo:bar :local' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
runtime_deps = [":local"],
deps = ["//buildifier:build"],
)'
}
function test_move_all_deps_to_new_attribute() {
run "$two_deps" 'move deps runtime_deps *' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
runtime_deps = [
":local",
"//buildifier:build",
],
)'
}
function test_move_all_deps_to_existing_attribute() {
local input='go_library(
name = "edit",
runtime_deps = [":remote"],
deps = [
":local",
"//buildifier:build",
],
)'
run "$input" 'move deps runtime_deps *' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
runtime_deps = [
":local",
":remote",
"//buildifier:build",
],
)'
}
function test_rename_attribute() {
run "$two_deps" 'rename deps data' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
data = [
":local",
"//buildifier:build",
],
)'
}
function test_rename_attribute_already_exist() {
in='cc_library(
name = "edit",
srcs = ["b.h"],
hdrs = ["a.h"],
)'
ERROR=2 run "$in" 'rename srcs hdrs' '//pkg:edit'
assert_equals "$in"
assert_err "attribute hdrs already exists in rule edit"
}
function test_rename_attribute_does_not_exist() {
ERROR=2 run "$two_deps" 'rename data resources' '//pkg:edit'
assert_equals "$two_deps"
assert_err "no attribute data found in rule edit"
}
function test_with_python_code() {
in='# test that Python code is preserved and does not crash
top_files = [
"lgpl.txt",
"README",
]
boom_files = top_files
boom_files.extend(glob(["**/*.hpp"]))
boom_files.remove("src/math/special_functions.hpp")
# comment for foo
def foo(x):
x += [1, 2]
foo(boom_files)'
run "$in" 'add default_visibility //visibility:public' '//pkg:__pkg__'
assert_equals "package(default_visibility = [\"//visibility:public\"])
$in"
}
function test_replace_string_attr() {
in='go_library(
name = "edit",
shared_library = ":local", # Suffix comment.
)'
run "$in" 'replace shared_library :local :new' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
shared_library = ":new", # Suffix comment.
)'
}
function test_replace_string_attr_quotes() {
in='go_library(
name = "edit",
shared_library = ":local", # Suffix comment.
)'
run "$in" 'replace shared_library ":local" ":new"' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
shared_library = ":new", # Suffix comment.
)'
}
function test_replace_string_attr_no_match() {
in='go_library(
name = "edit",
library = ":no_match", # Suffix comment.
)'
ERROR=3 run "$in" 'replace library :local :new' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
library = ":no_match", # Suffix comment.
)'
}
function test_replace_concatenated_lists() {
in='go_library(
name = "edit",
deps = [":local"] + CONSTANT,
)'
run "$in" 'replace deps :local :new' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [":new"] + CONSTANT,
)'
}
function test_replace_dep() {
in='go_library(
name = "edit",
deps = [
# Before-comment.
":local", # Suffix comment.
"//buildifier:build",
] + select({
"//tools/some:condition": [
"//some:value",
],
}),
)'
run "$in" 'replace deps :local :new' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [
# Before-comment.
":new", # Suffix comment.
"//buildifier:build",
] + select({
"//tools/some:condition": [
"//some:value",
],
}),
)'
}
function test_replace_dep_select() {
# Replace a dep inside a select statement
in='go_library(
name = "edit",
deps = [":dep"] + select({
"//tools/some:condition": [
"//some/other:value",
],
"//tools/other:condition": [
"//yet/another:value",
],
"//conditions:default": SOME_CONSTANT,
}),
)'
run "$in" 'replace deps //some/other:value :new' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [":dep"] + select({
"//tools/some:condition": [
":new",
],
"//tools/other:condition": [
"//yet/another:value",
],
"//conditions:default": SOME_CONSTANT,
}),
)'
}
function test_replace_dep_using_long_label() {
run "$two_deps" 'replace deps //pkg:local //pkg:new' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [
":new",
"//buildifier:build",
],
)'
}
function test_replace_in_all_attributes() {
in='java_library(name = "a", data = ["b","c"], exports = ["c"], deps = ["c","d"])'
run "$in" 'replace * c e' '//pkg:a'
assert_equals 'java_library(
name = "a",
data = [
"b",
"e",
],
exports = ["e"],
deps = [
"d",
"e",
],
)'
}
function test_substitute_dep() {
in='go_library(
name = "edit",
deps = [
# Before-comment.
"//some:value", # Suffix comment.
"//some:value2", # Suffix comment.
"//buildifier:build",
]
)'
run "$in" 'substitute deps //some:(.*) //new:${1}' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [
# Before-comment.
"//new:value", # Suffix comment.
"//new:value2", # Suffix comment.
"//buildifier:build",
],
)'
}
function test_substitute_dep_select() {
# Replace a dep inside a select statement
in='go_library(
name = "edit",
deps = [":dep"] + select({
"//tools/some:condition": [
"//some/other:value",
"//some/other:value2",
],
"//tools/other:condition": [
"//yet/another:value",
"//yet/another:value2",
],
"//conditions:default": SOME_CONSTANT,
}),
)'
run "$in" 'substitute deps //some/other:(.*) :${1}' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [":dep"] + select({
"//tools/some:condition": [
":value",
":value2",
],
"//tools/other:condition": [
"//yet/another:value",
"//yet/another:value2",
],
"//conditions:default": SOME_CONSTANT,
}),
)'
}
function test_delete_rule_all() {
in='cc_library(name = "all")
cc_library(name = "b")'
run "$in" 'delete' '//pkg:all'
assert_equals 'cc_library(name = "b")'
}
function test_delete_rule_star() {
in='cc_library(name = "all")
cc_library(name = "b")'
run "$in" 'delete' '//pkg:*'
[ $(wc -c < "$root/pkg/BUILD") -eq 0 ] || fail "Expected empty file"
}
function test_delete_rule() {
in='cc_library(name = "a")
cc_library(name = "b")
# Comment to make sure it is preserved
a = 42
cc_library(name = "c")'
run "$in" 'delete' '//pkg:b'
assert_equals 'cc_library(name = "a")
# Comment to make sure it is preserved
a = 42
cc_library(name = "c")'
}
function test_delete_package() {
in='package(default_visibility = ["//visibility:public"])
cc_library(name = "a")'
run "$in" 'delete' '//pkg:__pkg__'
assert_equals 'cc_library(name = "a")'
}
function test_delete_missing_package() {
in='cc_library(name = "a")'
ERROR=3 run "$in" 'delete' '//pkg:__pkg__'
assert_equals "$in"
}
function test_delete_target_without_name() {
in='load("/path/f", "a")
a(arg1 = "foo")'
run "$in" 'delete' '//pkg:%a'
assert_equals 'load("/path/f", "a")'
}
function test_delete_using_line_number() {
in='load("/path/f", "a")
a(arg1 = "foo")'
run "$in" 'delete' '//pkg:%3'
assert_equals 'load("/path/f", "a")'
}
function test_copy() {
in='proto_library(name = "from", visibility = ["://foo"] + CONST)
cc_binary(name = "to")'
run "$in" 'copy visibility from' '//pkg:to'
assert_equals 'proto_library(
name = "from",
visibility = ["://foo"] + CONST,
)
cc_binary(
name = "to",
visibility = ["://foo"] + CONST,
)'
}
function test_copy_overwrite() {
in='proto_library(name = "from", testonly = 1)
cc_binary(name = "to", testonly = 2)'
run "$in" 'copy testonly from' '//pkg:to'
assert_equals 'proto_library(
name = "from",
testonly = 1,
)
cc_binary(
name = "to",
testonly = 1,
)'
}
function test_copy_no_overwrite() {
in='proto_library(name = "from", visibility = ["://foo"] + CONST)
cc_binary(name = "to")'
run "$in" 'copy_no_overwrite visibility from' '//pkg:to'
assert_equals 'proto_library(
name = "from",
visibility = ["://foo"] + CONST,
)
cc_binary(
name = "to",
visibility = ["://foo"] + CONST,
)'
}
function test_copy_no_overwrite_no_overwrite() {
in='proto_library(name = "from", testonly = 1)
cc_binary(name = "to", testonly = 2)'
run "$in" 'copy_no_overwrite testonly from' '//pkg:to'
assert_equals 'proto_library(
name = "from",
testonly = 1,
)
cc_binary(
name = "to",
testonly = 2,
)'
}
function test_copy_no_from_rule() {
in='go_binary(name = "to")'
ERROR=2 run "$in" 'copy visibility from' '//pkg:to'
assert_err "could not find rule 'from'"
}
function test_copy_no_attribute() {
in='go_binary(name = "from")
go_binary(name = "to")'
ERROR=2 run "$in" 'copy visibility from' '//pkg:to'
assert_err "rule 'from' does not have attribute 'visibility'"
}
function test_set_kind() {
in='cc_library(name = "a")'
run "$in" 'set kind java_library' '//pkg:a'
assert_equals 'java_library(name = "a")'
}
function test_set_list() {
in='cc_library(name = "a")'
run "$in" 'set copts foo' '//pkg:a'
assert_equals 'cc_library(
name = "a",
copts = ["foo"],
)'
}
function test_set_list() {
in='cc_library(name = "a")'
run "$in" 'set copts foo bar baz' '//pkg:a'
assert_equals 'cc_library(
name = "a",
copts = [
"foo",
"bar",
"baz",
],
)'
}
function test_set_string() {
in='cc_library(name = "a")'
run "$in" 'set name b' '//pkg:a'
assert_equals 'cc_library(name = "b")'
}
function test_set_int() {
in='cc_test(name = "a")'
run "$in" 'set shard_count 8' '//pkg:a'
assert_equals 'cc_test(
name = "a",
shard_count = 8,
)'
}
function test_set_if_absent_absent() {
in='soy_js(name = "a")'
run "$in" 'set_if_absent allowv1syntax 1' '//pkg:a'
assert_equals 'soy_js(
name = "a",
allowv1syntax = 1,
)'
}
function test_set_if_absent_present() {
in='soy_js(
name = "a",
allowv1syntax = 0
)'
run "$in" 'set_if_absent allowv1syntax 1' '//pkg:a'
assert_equals 'soy_js(
name = "a",
allowv1syntax = 0,
)'
}
function test_set_custom_code() {
in='cc_test(name = "a")'
run "$in" 'set attr foo(a=1,b=2)' '//pkg:a'
assert_equals 'cc_test(
name = "a",
attr = foo(
a = 1,
b = 2,
),
)'
}
function assert_output() {
echo "$1" > "expected"
diff -u "expected" "$log" || fail "Output didn't match"
}
function assert_output_any_order() {
echo "$1" | sort > "expected"
sort < "$log" > "log_sorted"
diff -u "expected" "log_sorted" || fail "Output didn't match"
}
function test_print_all_functions() {
in='package(default_visibility = ["//visibility:public"])
cc_test(name = "a")
java_binary(name = "b")
exports_files(["a.cc"])'
run "$in" 'print kind' '//pkg:all'
assert_output 'package
cc_test
java_binary
exports_files'
}
function test_print_java_libraries() {
in='cc_test(name = "a")
java_library(name = "b")
java_library(name = "c")'
run "$in" 'print' '//pkg:%java_library'
assert_output 'b java_library
c java_library'
}
function test_refer_to_rule_by_location() {
in='cc_test(name = "a")
java_library(name = "b")
java_library(name = "c")'
run "$in" 'print label' '//pkg:%2'
assert_output '//pkg:b'
}
function test_refer_to_rule_by_location_no_such_rule() {
in='cc_test(name = "a")
java_library(name = "b")
java_library(name = "c")'
ERROR=2 run "$in" 'print label' '//pkg:%999'
assert_err "rule '%999' not found"
}
function test_visibility_exported_file() {
in='exports_files(["a.txt", "b.txt"])'
run "$in" 'set visibility //foo:__pkg__' '//pkg:b.txt'
assert_equals 'exports_files(
[
"a.txt",
"b.txt",
],
visibility = ["//foo:__pkg__"],
)'
}
function test_print_srcs() {
in='cc_test(name = "a", srcs = ["foo.cc"])
java_library(name = "b")
java_library(name = "c", srcs = ["foo.java", "bar.java"])'
run "$in" 'print name kind srcs' '//pkg:*'
assert_output 'a cc_test [foo.cc]
b java_library (missing)
c java_library [foo.java bar.java]'
assert_err 'rule "//pkg:b" has no attribute "srcs"'
}
function test_print_empty_list() {
in='package()
java_library(name = "b", deps = [])'
run "$in" 'print deps' '//pkg:b'
assert_output '[]'
}
function test_print_label() {
in='package()
java_library(name = "b")'
run "$in" 'print label kind' '//pkg:*'
assert_output '//pkg:b java_library'
}
function test_print_label_json() {
in='package()
java_library(name = "b")'
run --output_json "$in" 'print label kind' '//pkg:*'
assert_output '{"records":[{"fields":[{"text":"//pkg:b"},{"text":"java_library"}]}]}'
}
function test_print_label_ellipsis() {
mkdir -p "ellipsis_test/foo/bar"
echo 'java_library(name = "test")' > "ellipsis_test/BUILD"
echo 'java_library(name = "foo")' > "ellipsis_test/foo/BUILD"
echo 'java_library(name = "foobar"); java_library(name = "bar");' > "ellipsis_test/foo/bar/BUILD"
in='package()
java_library(name = "b")'
run "$in" 'print label' '//ellipsis_test/...:*'
assert_output_any_order '//ellipsis_test:test
//ellipsis_test/foo
//ellipsis_test/foo/bar:foobar
//ellipsis_test/foo/bar'
}
function test_print_startline() {
in='package()
java_library(name = "b")'
run "$in" 'print startline label' '//pkg:*'
assert_output '2 //pkg:b'
}
function test_print_endline() {
in='package()
java_library(
name = "b"
)'
run "$in" 'print endline label' '//pkg:*'
assert_output '4 //pkg:b'
}
function test_print_rule() {
in='cc_library(name = "a")
# Comment before
cc_test(
name = "b",
copts = [
# comment before
"foo", # comment after
],
)
cc_library(name = "c")'
run "$in" 'print rule' '//pkg:b'
assert_output '# Comment before
cc_test(
name = "b",
copts = [
# comment before
"foo", # comment after
],
)'
}
function test_print_version() {
in='gendeb(name = "foobar", version = "12345")'
run "$in" 'print version' '//pkg:*'
assert_output '12345'
}
function test_print_attrs() {
in='package()
cc_library(
name = "a",
srcs = ["a.cc"],
deps = ["//foo"],
)'
run "$in" 'print attrs' '//pkg:*'
assert_output '[]
[name srcs deps]'
}
function test_new_cc_library() {
in='cc_test(name = "a")
# end of file comment'
run "$in" 'new cc_library foo' '//pkg:__pkg__'
assert_equals 'cc_test(name = "a")
cc_library(name = "foo")
# end of file comment'
}
function test_new_cc_library_after_other_libraries() {
in='cc_library(name = "l")
cc_test(name = "a")'
run "$in" 'new cc_library foo' '//pkg:__pkg__'
assert_equals 'cc_library(name = "l")
cc_library(name = "foo")
cc_test(name = "a")'
}
function test_new_cc_library_empty_file() {
in=''
run "$in" 'new cc_library foo' '//pkg:__pkg__'
assert_equals 'cc_library(name = "foo")'
}
function test_new_java_library() {
in='cc_test(name = "a")'
run "$in" 'new java_library foo' 'pkg/BUILD'
assert_equals 'cc_test(name = "a")
java_library(name = "foo")'
}
function test_new_already_exists() {
in='cc_test(name = "a")'
ERROR=2 run "$in" 'new cc_library a' '//pkg:__pkg__'
assert_err "rule 'a' already exists"
}
function test_new_before_first() {
in='cc_test(name = "a")'
run "$in" 'new java_library foo before a' 'pkg/BUILD'
assert_equals 'java_library(name = "foo")
cc_test(name = "a")'
}
function test_new_before_last() {
in='cc_test(name = "a")
cc_test(name = "b")'
run "$in" 'new java_library foo before b' 'pkg/BUILD'
assert_equals 'cc_test(name = "a")
java_library(name = "foo")
cc_test(name = "b")'
}
function test_new_before_nonexistent_rule() {
in='cc_test(name = "a")
cc_test(name = "b")'
run "$in" 'new java_library foo before bar' 'pkg/BUILD'
assert_equals 'cc_test(name = "a")
cc_test(name = "b")
java_library(name = "foo")'
}
function test_new_before_already_exists() {
in='cc_test(name = "foo")
cc_test(name = "new_rule")'
ERROR=2 run "$in" 'new java_library new_rule before foo' 'pkg/BUILD'
assert_err "rule 'new_rule' already exists"
}
function test_new_after_first() {
in='cc_test(name = "a")'
run "$in" 'new java_library foo after a' 'pkg/BUILD'
assert_equals 'cc_test(name = "a")
java_library(name = "foo")'
}
function test_new_after_last() {
in='cc_test(name = "a")
cc_test(name = "b")'
run "$in" 'new java_library foo after b' 'pkg/BUILD'
assert_equals 'cc_test(name = "a")
cc_test(name = "b")
java_library(name = "foo")'
}
function test_new_after_by_location() {
in='
cc_test(name = "a")
cc_test(name = "b")'
run "$in" 'new java_library foo after %2' 'pkg/BUILD'
assert_equals 'cc_test(name = "a")
java_library(name = "foo")
cc_test(name = "b")'
}
function test_new_after_package() {
in='
load("/foo/bar", "x", "y", "z")
package(default_visibility = "//visibility:public")
cc_test(name = "a")
cc_test(name = "b")'
run "$in" 'new java_library foo after __pkg__' 'pkg/BUILD'
assert_equals 'load("/foo/bar", "x", "y", "z")
package(default_visibility = "//visibility:public")
java_library(name = "foo")
cc_test(name = "a")
cc_test(name = "b")'
}
function test_not_enough_arguments() {
ERROR=1 run "$one_dep" 'add foo' '//pkg:edit'
assert_err "Too few arguments for command 'add', expected at least 2."
}
function test_too_many_arguments() {
ERROR=1 run "$one_dep" 'delete foo' '//pkg:edit'
assert_err "Too many arguments for command 'delete', expected at most 0."
}
function test_package_name_missing() {
ERROR=2 run "$one_dep" 'add deps //dep' ':edit'
assert_err "file not found"
}
function test_nonexistent_package_name() {
ERROR=2 run "$one_dep" 'add deps //dep' '//doesnt_exist:edit'
assert_err "file not found"
}
function test_nonexistent_rule_name() {
ERROR=2 run "$one_dep" 'add deps //dep' '//pkg:doesnt_exist'
assert_err "rule 'doesnt_exist' not found"
}
function test_keep_going() {
ERROR=2 run "$one_dep" -k 'add deps //dep' 'new cc_library edit' '//pkg:doesnt_exist' '//pkg:edit'
assert_err "rule 'doesnt_exist' not found"
assert_err "rule 'edit' already exists"
# Make sure the commands are in the error message.
assert_err "add deps //dep"
assert_err "new cc_library edit"
# Make sure the full targets are in the error message.
assert_err "//pkg:doesnt_exist"
assert_equals 'go_library(
name = "edit",
deps = [
"//buildifier:build",
"//dep",
],
)'
}
function test_buildifier_missing() {
ERROR=2 run "$one_dep" '--buildifier=doesnt_exist' 'add deps //dep' '//pkg:edit'
assert_err "executable file not found in \$PATH"
}
function test_buildifier_return_error() {
ERROR=2 run "$one_dep" '--buildifier=false' 'add deps //dep' '//pkg:edit'
assert_err "running buildifier: exit status 1"
}
function test_add_deps_to_targets_in_same_package() {
in='cc_library(name = "smurf")
cc_library(name = "smorf")'
run "$in" 'add deps //foo:bar' //pkg:smurf //pkg:smorf
assert_equals 'cc_library(
name = "smurf",
deps = ["//foo:bar"],
)
cc_library(
name = "smorf",
deps = ["//foo:bar"],
)'
}
function test_rule_comment() {
in='cc_library(name = "a")'
run "$in" 'comment Hello' //pkg:a
assert_equals '# Hello
cc_library(name = "a")'
}
function test_attribute_comment() {
in='cc_library(
name = "a",
srcs = ["a.cc"],
)'
run "$in" 'comment srcs Hello\ World' //pkg:a
assert_equals 'cc_library(
name = "a",
srcs = ["a.cc"], # Hello World
)'
}
function test_attribute_comment_no_eol() {
in='cc_library(
name = "a",
srcs = ["a.cc"],
)'
run "$in" --eol-comments=false 'comment srcs Hello\ World' //pkg:a
assert_equals 'cc_library(
name = "a",
# Hello World
srcs = ["a.cc"],
)'
}
function test_value_comment() {
in='cc_library(
name = "a",
srcs = [
"a.cc",
"b.cc", # Old
],
)'
run "$in" 'comment srcs a.cc Hello' 'comment srcs b.cc New' //pkg:a
assert_equals 'cc_library(
name = "a",
srcs = [
"a.cc", # Hello
"b.cc", # New
],
)'
}
function test_value_multiline_comment() {
in='cc_library(
name = "a",
srcs = [
"a.cc",
"b.cc",
],
)'
run "$in" 'comment srcs b.cc Just\ a\
multiline\ comment' //pkg:a
assert_equals 'cc_library(
name = "a",
srcs = [
"a.cc",
# Just a
# multiline comment
"b.cc",
],
)'
run "$in" 'comment srcs b.cc Another\nmultiline\ comment' //pkg:a
assert_equals 'cc_library(
name = "a",
srcs = [
"a.cc",
# Another
# multiline comment
"b.cc",
],
)'
}
function test_rule_print_comment() {
in='# Hello
cc_library(name = "a")'
run "$in" 'print_comment' //pkg:a
assert_output 'Hello'
}
function test_rule_print_comment_with_suffix_and_after() {
in='# Hello Before
cc_library(name = "a") # Hello Suffix
# Hello After'
run "$in" 'print_comment' //pkg:a
assert_output 'Hello Before Hello Suffix Hello After'
}
function test_attribute_print_comment() {
in='cc_library(
name = "a",
srcs = ["a.cc"], # Hello World
)'
run "$in" 'print_comment srcs' //pkg:a
assert_output 'Hello World'
}
function test_attribute_print_comment_no_eol() {
in='cc_library(
name = "a",
# Hello World
srcs = ["a.cc"],
)'
run "$in" --eol-comments=false 'print_comment srcs' //pkg:a
assert_output 'Hello World'
}
function test_value_print_comment() {
in='cc_library(
name = "a",
srcs = [
"a.cc", # World
"b.cc", # Hello
],
)'
run "$in" 'print_comment srcs b.cc' 'print_comment srcs a.cc' //pkg:a
assert_output 'Hello
World'
}
function test_value_multiline_print_comment() {
in='cc_library(
name = "a",
srcs = [
"a.cc",
# Just a
# multiline comment
"b.cc",
],
)'
run "$in" 'print_comment srcs b.cc' //pkg:a
assert_output 'Just a multiline comment'
}
function test_value_inside_select_print_comment() {
in='cc_library(
name = "a",
srcs = [
"a.cc", # World
"b.cc", # Hello
] + select({
"foo": [
"c.cc", # hello
"d.cc", # world
],
}),
)'
run "$in" 'print_comment srcs c.cc' 'print_comment srcs d.cc' //pkg:a
assert_output 'hello
world'
}
# Test both absolute and relative package names
function test_path() {
mkdir -p "java/com/foo/myproject"
echo 'java_library(name = "foo")' > "java/com/foo/myproject/BUILD"
$buildozer --buildifier= 'add deps a' "java/com/foo/myproject:foo"
cd java
$buildozer --buildifier= 'add deps b' "com/foo/myproject:foo"
cd com
$buildozer --buildifier= 'add deps c' "//java/com/foo/myproject:foo"
cd foo
$buildozer --buildifier= 'add deps d' "myproject:foo"
cd myproject
$buildozer --buildifier= 'add deps e' ":foo"
# Check that all dependencies have been added
echo -n 'java_library(name="foo",deps=["a","b","c","d","e",],)' > expected
tr -d ' \n' < "BUILD" > result
diff -u "expected" "result" || fail "Output didn't match"
}
function setup_file_test() {
mkdir -p "a/pkg1"
mkdir -p "a/pkg2"
cat > a/pkg1/BUILD <<EOF
cc_library(name = "foo")
cc_library(name = "bar")
EOF
cat > a/pkg2/BUILD << EOF
cc_library(name = "foo")
cc_library(name = "bar")
EOF
echo -n "
new cc_library baz|//a/pkg1:__pkg__
add deps a|//a/pkg1:baz
add deps a|a/pkg1:foo
add deps x#|a/pkg2:foo
# add deps y|a/pkg1:foo
# add deps y|a/pkg2:foo
add deps y|a/pkg2:bar|add deps c|a/pkg1:foo
add deps z|a/pkg2:bar
add deps a|//a/pkg1:bar
add deps b|a/pkg1:foo" > commands
}
function check_file_test() {
# Check that all dependencies have been added
cat > expected_pkg_1 <<EOF
cc_library(
name = "foo",
deps = [
"a",
"b",
"c",
"y",
],
)
cc_library(
name = "bar",
deps = ["a"],
)
cc_library(
name = "baz",
deps = ["a"],
)
EOF
diff -u expected_pkg_1 a/pkg1/BUILD || fail "Output didn't match"
cat > expected_pkg_2 <<EOF
cc_library(
name = "foo",
deps = ["x#"],
)
cc_library(
name = "bar",
deps = [
"c",
"y",
"z",
],
)
EOF
diff -u expected_pkg_2 a/pkg2/BUILD || fail "Output didn't match"
}
# Test reading commands from stdin
function test_file() {
setup_file_test
$buildozer --buildifier= -f - < commands
check_file_test
setup_file_test
$buildozer --buildifier= -f commands
check_file_test
}
# Test for selectively adding to specific rule types
function test_add_dep_filtered() {
in='go_library(
name = "edit",
deps = ["//pkg:a"],
)'
ERROR=3 run "$in" -types='cc_library' 'add deps //pkg:b' '//pkg:edit'
assert_equals "$in"
}
function test_add_dep_unfiltered() {
in='cc_library(
name = "edit",
deps = ["//pkg:a"],
)'
run "$in" -types='cc_library' 'add deps //pkg:b' '//pkg:edit'
assert_equals 'cc_library(
name = "edit",
deps = [
":b",
"//pkg:a",
],
)'
}
function test_add_library_always_unfiltered() {
in='cc_library(
name = "edit",
deps = ["//pkg:a"],
)'
run "$in" -types='go_library' 'new cc_library a' '//pkg:__pkg__'
assert_equals 'cc_library(
name = "edit",
deps = ["//pkg:a"],
)
cc_library(name = "a")'
}
function test_new_load_after_package() {
in='# Comment
package(default_visibility = ["//visibility:public"])
x(
name="x",
srcs=["x.cc"],
)'
run "$in" 'new_load /foo/bar x y z' '//pkg:x'
assert_equals '# Comment
load("/foo/bar", "x", "y", "z")
package(default_visibility = ["//visibility:public"])
x(
name = "x",
srcs = ["x.cc"],
)'
}
function test_new_load_no_package() {
in='x(
name="x",
srcs=["x.cc"],
)'
run "$in" 'new_load /foo/bar x y z' '//pkg:x'
assert_equals 'load("/foo/bar", "x", "y", "z")
x(
name = "x",
srcs = ["x.cc"],
)'
}
function test_new_load_empty_file() {
run '' 'new_load /foo/bar x y z' pkg/BUILD
assert_equals 'load("/foo/bar", "x", "y", "z")'
}
function test_new_load_only_comments() {
in='# Just comments
# And more comments'
run "$in" 'new_load /foo/bar x y z' pkg/BUILD
assert_equals '# Just comments
# And more comments
load("/foo/bar", "x", "y", "z")'
}
function test_new_load_after_workspace() {
in='# A comment
workspace(name = "blah")'
run "$in" 'new_load /foo/bar x y z' pkg/BUILD
assert_equals '# A comment
workspace(name = "blah")
load("/foo/bar", "x", "y", "z")'
}
function test_new_load_existing() {
in='load("/foo/bar", "y")
'
run "$in" 'new_load /foo/bar z x y' pkg/BUILD
assert_equals 'load("/foo/bar", "x", "y", "z")'
}
function test_new_load_existing_multiple() {
in='load("/foo/bar", "x")
load("/foo/bar", "y")
'
run "$in" 'new_load /foo/bar x y z' pkg/BUILD
assert_equals 'load("/foo/bar", "x", "y", "z")'
}
function test_new_load_wrong_location() {
in='load("/foo/bar", "x")
'
run "$in" 'new_load /baz/bam y z' pkg/BUILD
assert_equals 'load("/baz/bam", "y", "z")
load("/foo/bar", "x")'
}
function test_print_attribute_value_with_spaces() {
in='cc_test(name = "a", deprecation = "one two three")'
run "$in" 'print deprecation' '//pkg:a'
assert_output '"one two three"'
}
function test_insert_into_variable() {
in='some_var = ["a"]
some_rule(name="r", deps=some_var)'
run "$in" --edit-variables 'add deps b' '//pkg:r'
assert_equals 'some_var = [
"a",
"b",
]
some_rule(
name = "r",
deps = some_var,
)'
}
function test_insert_into_variable_by_adding() {
in='some_var = glob(["x"])
some_rule(name="r", deps=some_var)'
run "$in" --edit-variables "add deps b" '//pkg:r'
assert_equals 'some_var = glob(["x"]) + ["b"]
some_rule(
name = "r",
deps = some_var,
)'
}
function test_insert_into_same_variable_twice() {
in='some_var = ["a"]
some_rule(name="r1", deps=some_var)
some_rule(name="r2", deps=some_var)'
run "$in" --edit-variables "add deps b" '//pkg:r1' '//pkg:r2'
assert_equals 'some_var = [
"a",
"b",
]
some_rule(
name = "r1",
deps = some_var,
)
some_rule(
name = "r2",
deps = some_var,
)'
}
function test_pkg_recursive_wildcard() {
mkdir -p foo/bar/baz
mkdir -p foo/abc
cat > foo/BUILD <<EOF
matching_rule(name = "r1", deps = [":bar"])
EOF
cat > foo/bar/BUILD <<EOF
non_matching_rule(name = "r2", deps = [":bar"])
EOF
cat > foo/bar/baz/BUILD <<EOF
matching_rule(name = "r3", deps = [":bar"])
EOF
cat > foo/abc/BUILD <<EOF
matching_rule(name = "r4", deps = [":bar"])
EOF
run_with_current_workspace "$buildozer --buildifier=" "add deps new_dep" "//foo/...:%matching_rule"
assert_no_err "rule '%matching_rule' not found"
assert_equals 'matching_rule(
name = "r1",
deps = [
"new_dep",
":bar",
],
)' foo
assert_equals 'non_matching_rule(name = "r2", deps = [":bar"])' foo/bar
assert_equals 'matching_rule(
name = "r3",
deps = [
"new_dep",
":bar",
],
)' foo/bar/baz
assert_equals 'matching_rule(
name = "r4",
deps = [
"new_dep",
":bar",
],
)' foo/abc
}
function test_add_dep_string() {
# Add a string without quotes, a quoted string (should be unquoted automatically)
# and a quoted string with quotes inside (should be unquoted just once).
run "$one_dep" 'add deps //foo "//bar" "\"//baz\""' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = [
"\"//baz\"",
"//bar",
"//buildifier:build",
"//foo",
],
)'
}
function test_remove_dep_string() {
# Remove quoted and unquoted strings to make sure that `add` and `remove`
# unquote them equally
run "$quoted_deps" 'remove deps //foo "//bar" "\"//baz\""' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
deps = ["//buildifier:build"],
)'
}
function test_set_config_string() {
run "$one_dep" 'set config "foo"' '//pkg:edit'
assert_equals 'go_library(
name = "edit",
config = "foo",
deps = ["//buildifier:build"],
)'
}
function test_fix_unused_load() {
run 'load(":a.bzl", "a")
# TODO: refactor
# begin loads
load(":foo.bzl", "foo") # foo
load(":foobar.bzl", "foobar") # this one is actually used
load(":baz.bzl", "baz") # this is @unused
load(":bar.bzl", "bar") # bar
# end loads
# before
load(":qux.bzl", "qux")
# after
foobar()
load(":somewhere_else.bzl", "foobar")
foobar()
load(":somewhere_else.bzl", "foobar")
foobar()' 'fix unusedLoads' 'pkg/BUILD'
assert_equals '# TODO: refactor
# begin loads
load(":baz.bzl", "baz") # this is @unused
load(":foobar.bzl", "foobar") # this one is actually used
# end loads
# before
# after
load(":somewhere_else.bzl", "foobar")
foobar()
foobar()
foobar()'
}
function test_commands_with_targets() {
mkdir -p pkg1
mkdir -p pkg2
cat > pkg1/BUILD <<EOF
rule(name = "r1", deps = [":bar"], compatible_with=["//env:a"])
EOF
cat > pkg2/BUILD <<EOF
rule(name = "r2", compatible_with=["//env:a"])
EOF
cat > commands <<EOF
remove compatible_with //env:a|*
add deps :baz|*
EOF
$buildozer --buildifier= -f commands pkg1:* pkg2:*
assert_equals 'rule(
name = "r1",
deps = [
":bar",
":baz",
],
)' pkg1
assert_equals 'rule(
name = "r2",
deps = [":baz"],
)' pkg2
}
function test_module_bazel() {
cat > MODULE.bazel <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
use_repo(go_deps, "com_example_foo")
EOF
cat > MODULE.bazel.expected <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
EOF
$buildozer 'delete' //MODULE.bazel:%10
diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match"
}
function test_module_bazel_segment() {
cat > go.MODULE.bazel <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
use_repo(go_deps, "com_example_foo")
EOF
cat > go.MODULE.bazel.expected <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
EOF
$buildozer 'delete' //go.MODULE.bazel:%10
diff -u go.MODULE.bazel.expected go.MODULE.bazel || fail "Output didn't match"
}
function test_module_bazel_new() {
cat > MODULE.bazel <<EOF
bazel_dep(name = "gazelle", version = "0.30.0")
EOF
cat > MODULE.bazel.expected <<EOF
bazel_dep(name = "gazelle", version = "0.30.0")
bazel_dep(name = "rules_go")
EOF
$buildozer 'new bazel_dep rules_go after gazelle' //MODULE.bazel:__pkg__
diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match"
}
function test_use_repo_add() {
cat > MODULE.bazel <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
use_repo(go_deps, "com_example_foo")
go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True)
go_dev_deps.from_file(go_mod = "//:go_dev.mod")
EOF
cat > MODULE.bazel.expected <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
use_repo(go_deps, "com_example_foo", "org_example_bar")
go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True)
go_dev_deps.from_file(go_mod = "//:go_dev.mod")
EOF
$buildozer 'use_repo_add @gazelle//:extensions.bzl go_deps org_example_bar com_example_foo' //MODULE.bazel:all
diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match"
}
function test_use_repo_add_dev() {
cat > MODULE.bazel <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
use_repo(go_deps, "com_example_foo")
go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True)
go_dev_deps.from_file(go_mod = "//:go_dev.mod")
EOF
cat > MODULE.bazel.expected <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
use_repo(go_deps, "com_example_foo")
go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True)
go_dev_deps.from_file(go_mod = "//:go_dev.mod")
use_repo(go_dev_deps, "org_example_bar", "org_example_foo")
EOF
$buildozer 'use_repo_add dev @gazelle//:extensions.bzl go_deps org_example_foo org_example_bar' //MODULE.bazel:all
diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match"
}
function test_use_repo_remove() {
cat > MODULE.bazel <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
use_repo(go_deps, "com_example_foo")
go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True)
go_dev_deps.from_file(go_mod = "//:go_dev.mod")
EOF
cat > MODULE.bazel.expected <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True)
go_dev_deps.from_file(go_mod = "//:go_dev.mod")
EOF
$buildozer 'use_repo_remove @gazelle//:extensions.bzl go_deps bar_example com_example_foo' //MODULE.bazel:all
diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match"
}
function test_use_repo_remove_dev() {
cat > MODULE.bazel <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
use_repo(go_deps, "com_example_foo")
go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True)
go_dev_deps.from_file(go_mod = "//:go_dev.mod")
use_repo(go_dev_deps, "invalid_foo")
use_repo(
go_dev_deps,
# group these
"org_example_quz",
"org_example_foo",
"org_example_bar",
# and these
"com_example_quz",
my_com_example_baz = "com_example_baz",
"com_example_bar",
)
EOF
cat > MODULE.bazel.expected <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
use_repo(go_deps, "com_example_foo")
go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True)
go_dev_deps.from_file(go_mod = "//:go_dev.mod")
use_repo(
go_dev_deps,
# group these
"org_example_foo",
"org_example_quz",
# and these
"com_example_bar",
"com_example_quz",
)
EOF
$buildozer 'use_repo_remove dev @gazelle//:extensions.bzl go_deps com_example_baz org_example_bar invalid_foo' //MODULE.bazel:all
diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match"
}
function test_use_repo_add_isolated() {
cat > MODULE.bazel <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
use_repo(go_deps, "com_example_foo")
go_isolated_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", isolate = True)
go_isolated_deps.from_file(go_mod = "//:go_tool_deps.mod")
use_repo(go_isolated_deps, "com_example_foo")
go_isolated_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True, isolate = True)
go_isolated_dev_deps.from_file(go_mod = "//:go_more_tool_deps.mod")
use_repo(go_isolated_dev_deps, "com_example_foo")
go_more_isolated_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", isolate = True)
go_more_isolated_deps.from_file(go_mod = "//:go_more_tool_deps.mod")
use_repo(go_more_isolated_deps, "com_example_foo")
EOF
cat > MODULE.bazel.expected <<EOF
module(
name = "foo",
version = "0.27.0",
)
bazel_dep(name = "gazelle", version = "0.30.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
use_repo(go_deps, "com_example_foo")
go_isolated_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", isolate = True)
go_isolated_deps.from_file(go_mod = "//:go_tool_deps.mod")
use_repo(go_isolated_deps, "com_example_foo")
go_isolated_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True, isolate = True)
go_isolated_dev_deps.from_file(go_mod = "//:go_more_tool_deps.mod")
use_repo(go_isolated_dev_deps, "com_example_foo", "org_example_bar")
go_more_isolated_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", isolate = True)
go_more_isolated_deps.from_file(go_mod = "//:go_more_tool_deps.mod")
use_repo(go_more_isolated_deps, "com_example_foo")
EOF
$buildozer 'use_repo_add go_isolated_dev_deps org_example_bar com_example_foo' //MODULE.bazel:all
diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match"
}
function test_format() {
cat > MODULE.bazel <<EOF
module(
name = "foo", version = "0.27.0",
)
EOF
cat > MODULE.bazel.expected <<EOF
module(
name = "foo",
version = "0.27.0",
)
EOF
$buildozer 'format' //MODULE.bazel:all
diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match"
}
run_suite "buildozer tests"