diff --git a/.buildkite/all-succeeded.sh b/.buildkite/all-succeeded.sh new file mode 120000 index 0000000000..f65a1ca21e --- /dev/null +++ b/.buildkite/all-succeeded.sh @@ -0,0 +1 @@ +../.sorbet-buildkite/all-succeeded.sh \ No newline at end of file diff --git a/.buildkite/hooks/pre-command b/.buildkite/hooks/pre-command new file mode 100755 index 0000000000..81fc90367d --- /dev/null +++ b/.buildkite/hooks/pre-command @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +set -e + +if echo "$BUILDKITE_PLUGINS" | grep "cache-buildkite-plugin"; then + if ! which aws; then + echo "pwd: $PWD" + ls + + AWS_TEMPDIR="$(mktemp -d -t "awscli-XXXXXXXX")" + pushd "$AWS_TEMPDIR" + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" + unzip awscliv2.zip + sudo ./aws/install + ls + popd + rm -rf "$AWS_TEMPDIR" + + echo "pwd: $PWD" + ls + + # From https://sourcegraph.sourcegraph.com/github.com/sourcegraph/sourcegraph/-/blob/enterprise/cmd/server/pre-build.sh?L40-47 + AWS_CONFIG_DIR_PATH="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/buildkite/.aws" + mkdir -p "$AWS_CONFIG_DIR_PATH" + AWS_CONFIG_FILE="$AWS_CONFIG_DIR_PATH/config" + export AWS_CONFIG_FILE + AWS_SHARED_CREDENTIALS_FILE="/buildkite/.aws/credentials" + export AWS_SHARED_CREDENTIALS_FILE + aws configure set aws_access_key_id "$BUILDKITE_HMAC_KEY" --profile buildkite + aws configure set aws_secret_access_key "$BUILDKITE_HMAC_SECRET" --profile buildkite + fi +fi diff --git a/.buildkite/linters.sh b/.buildkite/linters.sh new file mode 100755 index 0000000000..345095a185 --- /dev/null +++ b/.buildkite/linters.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +set -euo pipefail +export JOB_NAME=linters + +# shellcheck source=SCRIPTDIR/tools/setup-bazel.sh +source .buildkite/tools/setup-bazel.sh + +set -x +globalErr=0 + +echo "~~~ Checking build files" +if ! ./tools/scripts/format_build_files.sh -t &> buildifier; then + globalErr=1 + echo "^^^ +++" + buildkite-agent annotate --context tools/scripts/format_build_files.sh --style error --append < buildifier +fi + +echo "~~~ Checking c++ formatting" +if ! ./tools/scripts/format_cxx.sh -t &> format_cxx; then + globalErr=1 + echo "^^^ +++" + buildkite-agent annotate --context tools/scripts/format_cxx.sh --style error --append < format_cxx +fi + +echo "~~~ Checking that the compilation db builds" +if ! ./tools/scripts/build_compilation_db.sh &> compdb; then + globalErr=1 + echo "^^^ +++" + buildkite-agent annotate --context tools/scripts/build_compilation_db.sh --style error --append < compdb +fi + +# Skip this because bazel query is failing due to third-party stuff +# echo "~~~ Checking compilation db targets" +# if ! ./tools/scripts/generate_compdb_targets.sh -t &> compdb-targets; then +# globalErr=1 +# echo "^^^ +++" +# buildkite-agent annotate --context tools/scripts/generate_compdb_targets.sh --style error --append < compdb-targets +# fi + +echo "~~~ Linting uses of \`using namespace std\`" +if ! ./tools/scripts/check_using_namespace_std.sh &> std_check; then + globalErr=1 + echo "^^^ +++" + buildkite-agent annotate --context tools/scripts/check_using_namespace_std.sh --style error --append < std_check +fi + +echo "~~~ Checking ErrorClass error code numbers" +if ! ./tools/scripts/check_error_classes.sh &> error_class_check; then + globalErr=1 + echo "^^^ +++" + buildkite-agent annotate --context tools/scripts/check_error_classes.sh --style error --append < error_class_check +fi + +echo "~~~ Running shellcheck" +if ! ./tools/scripts/lint_sh.sh -t &> lint_sh; then + globalErr=1 + echo "^^^ +++" + buildkite-agent annotate --context tools/scripts/lint_sh.sh --style error --append < lint_sh +fi + +echo "~~~" +if [ "$globalErr" -ne 0 ]; then + exit $globalErr +fi diff --git a/.buildkite/pipeline.sh b/.buildkite/pipeline.sh new file mode 100755 index 0000000000..482a5a7289 --- /dev/null +++ b/.buildkite/pipeline.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +# Largely based off .sorbet-buildkite/pipeline.sh + +set -euo pipefail + +whitelisted=0 + +echo "BUILDKITE_PULL_REQUEST=$BUILDKITE_PULL_REQUEST" +echo "BUILDKITE_PULL_REQUEST_REPO=$BUILDKITE_PULL_REQUEST_REPO" + +if [[ "$BUILDKITE_PULL_REQUEST" == "false" ]]; then + # whitelist commits that are triggered in branch builds of github.com/sourcegraph/scip-ruby + echo "Automatically running build for non-PR commit pushed to sourcegraph/scip-ruby" + whitelisted=1 +fi + +if [[ "$BUILDKITE_PULL_REQUEST_REPO" == "git://github.com/sourcegraph/scip-ruby.git" ]] || + [[ "$BUILDKITE_PULL_REQUEST_REPO" == "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/sourcegraph/scip-ruby.git" ]]; then + # whitelist folks with write access to github.com/sorbet/sorbet + echo "Automatically running build for non-fork PR created against sourcegraph/scip-ruby" + whitelisted=1 +fi + +if [[ "${whitelisted}" -ne 1 ]] ; then + (echo -e "steps:\\n - block: \":key: Needs contributor approval!\"\\n - wait: ~\\n"; + grep -v "steps:" .buildkite/pipeline.yaml ) | buildkite-agent pipeline upload +else + buildkite-agent pipeline upload +fi diff --git a/.buildkite/pipeline.yaml b/.buildkite/pipeline.yaml new file mode 100644 index 0000000000..aa11e32748 --- /dev/null +++ b/.buildkite/pipeline.yaml @@ -0,0 +1,52 @@ +# Loosely based off .sorbet-buildkite/pipeline.yaml + +s3-settings: &s3-settings + backend: s3 + s3: + bucket: sourcegraph_buildkite_cache + endpoint: https://storage.googleapis.com + profile: buildkite + region: us-central1 + tarball: {} + +bazel-repo-cache: &bazel-repo-cache + id: bazel-repos + key: "bazel-repos-{{ checksum WORKSPACE }}" + restore-keys: + - "bazel-repos-{{ checksum WORKSPACE }}" + - "bazel-repos-" + paths: + - /usr/local/var/bazelcache/repos + <<: *s3-settings + +bazel-build-cache: &bazel-build-cache + id: bazel-build + key: "bazel-build-{{ env.BUILDKITE_COMMIT }}" + restore-keys: + - "bazel-build-{{ env.BUILDKITE_COMMIT }}" + - "bazel-build-" + paths: + - /usr/local/var/bazelcache/build + <<: *s3-settings + +steps: + - label: ":linux: test-indexer.sh" + command: .buildkite/test-indexer.sh + artifact_paths: + - "_out_/profile*.json" + agents: + queue: stateless + env: + AWS_CONFIG_FILE: /buildkite/.aws/config + AWS_SHARED_CREDENTIALS_FILE: /buildkite/.aws/credentials + plugins: + - https://github.com/sourcegraph/cache-buildkite-plugin.git#master: *bazel-repo-cache + - https://github.com/sourcegraph/cache-buildkite-plugin.git#master: *bazel-build-cache + + - wait: ~ + +# Success Phase - Allow the PR to be merged + - label: "All tests and builds succeeded" + command: .buildkite/all-succeeded.sh + + - wait: ~ diff --git a/.buildkite/test-indexer.sh b/.buildkite/test-indexer.sh new file mode 100755 index 0000000000..1a5377e48c --- /dev/null +++ b/.buildkite/test-indexer.sh @@ -0,0 +1,128 @@ +#!/usr/bin/env bash + +# Largely based off test-compiler.sh from the Sorbet buildkite config. + +get_date() { + date '+%s' +} +PREV_TIME="$(get_date)" +PREV_CMD="" +print_time_elapsed() { + CUR_TIME="$(get_date)" + local DELTA=$(( CUR_TIME - PREV_TIME )) + if [ "$DELTA" -ne 0 ]; then + echo "Ran in ${DELTA}s: $PREV_CMD\n" + fi + PREV_CMD="$BASH_COMMAND" + PREV_TIME="$CUR_TIME" +} +trap print_time_elapsed DEBUG + +set -euo pipefail + +unameOut="$(uname -s)" +case "${unameOut}" in + Linux*) platform="linux";; + Darwin*) platform="mac";; + *) exit 1 +esac + +if [[ "linux" == "$platform" ]]; then + apt-get update + apt-get install -yy libncurses5-dev libncursesw5-dev xxd +elif [[ "mac" == "$platform" ]]; then + if ! [ -x "$(command -v wget)" ]; then + brew install wget + fi +fi + +export JOB_NAME=test +source .buildkite/tools/setup-bazel.sh + +err=0 + +echo "--- Building" + +mkdir -p _out_ + +# `-c opt` is required, otherwise the tests are too slow +# forcedebug is really the ~only thing in `--config=dbg` we care about. +# must come after `-c opt` because `-c opt` will define NDEBUG on its own +build_args=( + "//main:scip-ruby" + "//test:scip_test_runner" + "-c" "opt" + "--config=forcedebug" + "--spawn_strategy=local" +) + +./bazel build \ + --experimental_generate_json_trace_profile \ + --profile=_out_/profile_build.json \ + "${build_args[@]}" || err=$? + +echo "+++ Running snapshot tests" + +test_args=( + "//test/scip" + "-c" "opt" + "--config=forcedebug" + "--spawn_strategy=local" +) + +./bazel test \ + --experimental_generate_json_trace_profile \ + --profile=_out_/profile_snapshot_tests.json \ + --test_summary=terse \ + --test_output=errors \ + "${test_args[@]}" || err=$? + +echo "--- Installing Ruby" + +# From https://github.com/asdf-vm/asdf-ruby/issues/125#issuecomment-958941354 +rm -rf .asdf/shims +OPENSSL_CFLAGS=-Wno-error=implicit-function-declaration asdf install ruby +asdf global ruby 2.7.0 + +echo "+++ Running repo tests" + +test_args=( + "//test/scip/repos" + "-c" "opt" + "--test_env" "PATH=${PATH}" + "--test_env" "HOME=${HOME}" + "--config=forcedebug" + "--spawn_strategy=local" +) + +./bazel test \ + --experimental_generate_json_trace_profile \ + --profile=_out_/profile_repo_tests.json \ + --test_summary=terse \ + --test_output=errors \ + "${test_args[@]}" || err=$? + +if [ "$err" -ne 0 ]; then + echo "--- annotating build result" + failing_tests="$(mktemp)" + + echo 'Run this command to run failing tests locally:' >> "$failing_tests" + echo >> "$failing_tests" + echo '```bash' >> "$failing_tests" + echo "./bazel test \\" >> "$failing_tests" + + # Take the lines that start with target labels. + # Lines look like "//foo FAILED in 10s" + { ./bazel test --test_summary=terse "${test_args[@]}" || true ; } | \ + grep '^//' | \ + sed -e 's/ .*/ \\/' | \ + sed -e 's/^/ /' >> "$failing_tests" + + # Put this last as an easy way to not have a `\` on the last line. + echo ' -c opt --config=forcedebug' >> "$failing_tests" + echo '```' >> "$failing_tests" + + buildkite-agent annotate --context "test-indexer.sh" --style error --append < "$failing_tests" + + exit "$err" +fi diff --git a/.buildkite/tools b/.buildkite/tools new file mode 120000 index 0000000000..76620aa7ff --- /dev/null +++ b/.buildkite/tools @@ -0,0 +1 @@ +../.sorbet-buildkite/tools/ \ No newline at end of file diff --git a/.buildkite/unused-hooks/gh-status b/.buildkite/unused-hooks/gh-status new file mode 100755 index 0000000000..652f1e5390 --- /dev/null +++ b/.buildkite/unused-hooks/gh-status @@ -0,0 +1,64 @@ +#!/usr/bin/env bash + +set -e +[ -z "$DEBUG" ] || set -x; + +usage() { + echo "$0 " >&2; +} + +if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then + usage + cat >&2 < +Generate this access token at https://github.com/settings/tokens and make sure +it has access to the \`"repo"\` scope. +EOS + exit 1; +fi + +[ -n "$5" ] || (usage; exit 1); + +REPO="$1" +shift + +COMMIT="$1" +shift + +STATE="$1" +shift + +TARGET_URL="$1" +shift + +CONTEXT="$1" +shift + +BODY="" +[ -t 0 ] || BODY=$(cat); + +payload=$( + jq --null-input \ + --arg state "$STATE" \ + --arg target_url "$TARGET_URL" \ + --arg description "$DESCRIPTION" \ + --arg context "$CONTEXT" \ + '{ state: $state, target_url: $target_url, description: $description, context: $context}' +) + +response=$( + curl --fail \ + --netrc \ + --silent \ + --location \ + --data "$payload" \ + "https://api.github.com/repos/${REPO}/statuses/${COMMIT}" +) diff --git a/.buildkite/unused-hooks/post-command b/.buildkite/unused-hooks/post-command new file mode 100755 index 0000000000..9f02713c69 --- /dev/null +++ b/.buildkite/unused-hooks/post-command @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -euo pipefail +if [ "HEAD" == "${BUILDKITE_COMMIT}" ]; then + echo "not using commit marks as this is HEAD build" +else + if [ "$BUILDKITE_COMMAND_EXIT_STATUS" -ne 0 ]; then + .buildkite/hooks/gh-status sourcegraph/scip-ruby "${BUILDKITE_COMMIT}" failure "${BUILDKITE_BUILD_URL}#${BUILDKITE_JOB_ID}" "${BUILDKITE_LABEL}" + else + .buildkite/hooks/gh-status sourcegraph/scip-ruby "${BUILDKITE_COMMIT}" success "${BUILDKITE_BUILD_URL}#${BUILDKITE_JOB_ID}" "${BUILDKITE_LABEL}" + fi +fi diff --git a/.buildkite/unused-hooks/pre-command b/.buildkite/unused-hooks/pre-command new file mode 100755 index 0000000000..5f32e1dfc2 --- /dev/null +++ b/.buildkite/unused-hooks/pre-command @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -euo pipefail +if [ "HEAD" == "${BUILDKITE_COMMIT}" ]; then + echo "not using commit marks as this is HEAD build" +else + .buildkite/hooks/gh-status sourcegraph/scip-ruby "${BUILDKITE_COMMIT}" pending "${BUILDKITE_BUILD_URL}#${BUILDKITE_JOB_ID}" "${BUILDKITE_LABEL}" +fi diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000000..44d859d8d6 --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +ruby 2.7.0 diff --git a/cfg/builder/builder_walk.cc b/cfg/builder/builder_walk.cc index 3e0b5887cf..01f268b801 100644 --- a/cfg/builder/builder_walk.cc +++ b/cfg/builder/builder_walk.cc @@ -103,7 +103,7 @@ pair unresolvedIdent2Local(CFGContext cctx, const ast::Unresolve } return {fnd->second.variable, hasError && isAssign}; } else { - return {global2Local(cctx, sym, id.loc), false}; + return {global2Local(cctx, sym, id.loc), false}; } } diff --git a/main/BUILD b/main/BUILD index 4555e9e2ca..6d1a98b192 100644 --- a/main/BUILD +++ b/main/BUILD @@ -60,8 +60,8 @@ cc_binary( visibility = ["//visibility:public"], deps = [ "realmain", - "//scip_indexer:scip_indexer", "//payload", + "//scip_indexer", ], ) diff --git a/scip_indexer/BUILD b/scip_indexer/BUILD index a7f094f65a..9fd9429011 100644 --- a/scip_indexer/BUILD +++ b/scip_indexer/BUILD @@ -4,14 +4,14 @@ cc_library( visibility = ["//visibility:public"], deps = [ "//main/pipeline/semantic_extension:interface", - ] + ], ) cc_library( name = "scip_utils", srcs = [ - "SCIPUtils.h", "SCIPUtils.cc", + "SCIPUtils.h", ], linkstatic = select({ "@com_stripe_ruby_typer//tools/config:linkshared": 0, @@ -45,10 +45,10 @@ cc_library( "//main/lsp", "//proto", "//sorbet_version", - "@com_google_absl//absl/synchronization", "@com_google_absl//absl/status", "@com_google_absl//absl/status:statusor", + "@com_google_absl//absl/synchronization", "@cxxopts", "@spdlog", ], -) \ No newline at end of file +) diff --git a/test/BUILD b/test/BUILD index 34a9460192..1469d84be4 100644 --- a/test/BUILD +++ b/test/BUILD @@ -61,14 +61,18 @@ cc_binary( name = "scip_test_runner", testonly = 1, srcs = [ - "scip_test_runner.cc" + "scip_test_runner.cc", ], linkstatic = select({ "//tools/config:linkshared": 0, "//conditions:default": 1, }), - visibility = ["//tools:__pkg__", "//test/scip:__pkg__"], - deps = [ # TODO(varun): Revisit dependencies after rewriting test runner. + visibility = [ + "//test/scip:__pkg__", + "//tools:__pkg__", + ], + deps = [ + # TODO(varun): Revisit dependencies after rewriting test runner. "//ast/desugar", "//ast/treemap", "//cfg/builder", @@ -78,20 +82,20 @@ cc_binary( "//definition_validator", "//infer", "//local_vars", - "//main/autogen", # TODO(varun): why is this needed? + "//main/autogen", # TODO(varun): why is this needed? "//namer", "//payload", "//proto", "//resolver", "//rewriter", "//scip_indexer:interface", - "//scip_indexer:scip_indexer", + "//scip_indexer", "//test/helpers", "@com_google_absl//absl/strings", "@cxxopts", "@doctest", "@doctest//:doctest_custom_main", - ] + ], ) cc_binary( diff --git a/test/scip/BUILD b/test/scip/BUILD index de4082bcaa..d4cae216e3 100644 --- a/test/scip/BUILD +++ b/test/scip/BUILD @@ -1,3 +1,9 @@ load(":scip_test.bzl", "scip_test_suite") -scip_test_suite(paths = glob(["testdata/*"], exclude_directories = 1), multifile_paths = glob(["testdata/multifile/*/*"])) +scip_test_suite( + multifile_paths = glob(["testdata/multifile/*/*"]), + paths = glob( + ["testdata/*"], + exclude_directories = 1, + ), +) diff --git a/test/scip/repos/index_oss_repo.sh b/test/scip/repos/index_oss_repo.sh index f488ba0fca..2af179ae82 100755 --- a/test/scip/repos/index_oss_repo.sh +++ b/test/scip/repos/index_oss_repo.sh @@ -51,8 +51,8 @@ rm -rf repo mkdir repo pushd repo -git clone "$CLONE_URL" . --branch "$GIT_TAG" --depth=1 -if [ "$(git rev-parse HEAD)" -ne "$GIT_SHA" ]; then +git clone -q "$CLONE_URL" . --branch "$GIT_TAG" --depth=1 +if [ "$(git rev-parse HEAD)" != "$GIT_SHA" ]; then echo "Expected SHA: $GIT_SHA" echo "Obtained SHA: $(git rev-parse HEAD)" exit 1 @@ -60,7 +60,7 @@ fi eval "$PREP_CMD" -if [ ! -z "$PATCH_ABSPATH" ]; then +if [ -n "$PATCH_ABSPATH" ]; then git apply "$PATCH_ABSPATH" git diff -U0 fi diff --git a/test/scip/repos/scip_repos_test.bzl b/test/scip/repos/scip_repos_test.bzl index ee5133d962..c005aae952 100644 --- a/test/scip/repos/scip_repos_test.bzl +++ b/test/scip/repos/scip_repos_test.bzl @@ -1,54 +1,54 @@ -_data = [ +_data = [ { "name": "brew", "clone_url": "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/Homebrew/brew.git", "tag": "3.5.7", "git_sha": "ce8ef89ec0cfe875c48c3a83a843af9074c05930", - "prep_cmd": ("pushd Library/Homebrew" - + " && gem install bundler:1.17.3" - + " && popd" - + " && ./bin/brew typecheck"), - "run_cmd": ("pushd Library/Homebrew" - + " && $$(find . -name srb -type f) | while IFS= read -r line ; do cp $${TEST_DIR}/$(location //main:scip-ruby) $$line ; done" - + " && popd" - + " && ./bin/brew typecheck") - } + "prep_cmd": ("pushd Library/Homebrew" + + " && gem install bundler:1.17.3" + + " && popd" + + " && ./bin/brew typecheck"), + "run_cmd": ("pushd Library/Homebrew" + + " && $$(find . -name srb -type f) | while IFS= read -r line ; do cp $${TEST_DIR}/$(location //main:scip-ruby) $$line ; done" + + " && popd" + + " && ./bin/brew typecheck"), + }, ] def scip_repos_test_suite(patch_paths): - patch_paths = { p: None for p in patch_paths } + patch_paths = {p: None for p in patch_paths} test_names = [] for testdata in _data: - test_name = testdata["name"] - patch_path = "{}-{}.patch".format(test_name, testdata["tag"]) - patch_dep = [] - patch_arg = [] - if patch_path in patch_paths: - patch_dep.append(patch_path) - patch_arg.append("$(location {})".format(patch_path)) - patch_paths.pop(patch_path, None) + test_name = testdata["name"] + patch_path = "{}-{}.patch".format(test_name, testdata["tag"]) + patch_dep = [] + patch_arg = [] + if patch_path in patch_paths: + patch_dep.append(patch_path) + patch_arg.append("$(location {})".format(patch_path)) + patch_paths.pop(patch_path, None) - native.sh_test( - name = test_name, - size = "medium", # Should finish in 5 minutes - srcs = ["index_oss_repo.sh"], - deps = [], - data = ["//main:scip-ruby"] + patch_dep, - args = [ - testdata["name"], - testdata["clone_url"], - testdata["tag"], - testdata["git_sha"], - "'{}'".format(testdata["prep_cmd"]), - "'{}'".format(testdata["run_cmd"]), - ] + patch_arg, - ) - test_names.append(test_name) + native.sh_test( + name = test_name, + size = "medium", # Should finish in 5 minutes + srcs = ["index_oss_repo.sh"], + deps = [], + data = ["//main:scip-ruby"] + patch_dep, + args = [ + testdata["name"], + testdata["clone_url"], + testdata["tag"], + testdata["git_sha"], + "'{}'".format(testdata["prep_cmd"]), + "'{}'".format(testdata["run_cmd"]), + ] + patch_arg, + ) + test_names.append(test_name) if len(patch_paths) != 0: - fail("Patches {} were not used by any tests".format(patch_paths)) + fail("Patches {} were not used by any tests".format(patch_paths)) native.test_suite( - name = "repos", - tests = test_names, + name = "repos", + tests = test_names, ) diff --git a/test/scip/scip_test.bzl b/test/scip/scip_test.bzl index 1abe736eef..4a98f9d7ea 100644 --- a/test/scip/scip_test.bzl +++ b/test/scip/scip_test.bzl @@ -42,7 +42,7 @@ def scip_test_suite(paths, multifile_paths): ) def scip_test(path): - if not path.endswith(".rb") or path.endswith(".snapshot.rb"): + if not path.endswith(".rb") or path.endswith(".snapshot.rb"): return None test_name = basename(path)[:-3] snapshot_path = path[:-3] + ".snapshot.rb" @@ -57,7 +57,7 @@ def scip_multifile_test(dir, filepaths): path_without_ext, ext = split_extension(filepath) if (ext == "rb" or ext == "rbi") and not path_without_ext.endswith(".snapshot"): data.append(filepath) - if not filepath.endswith("scip-ruby-args.rb"): # Special file for reading Gem-level args. + if not filepath.endswith("scip-ruby-args.rb"): # Special file for reading Gem-level args. data.append(path_without_ext + ".snapshot." + ext) if not dir.startswith("testdata/multifile/"): fail("Expected directory to be under multifile/") @@ -85,4 +85,4 @@ def _make_test(test_name, args, data): tags = ["manual"], size = "small", ) - return (test_name, update_test_name) \ No newline at end of file + return (test_name, update_test_name)